From 722b62ca5a276c8828cac5006585f8d036fe9bf3 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Tue, 3 Mar 2020 12:51:09 -0700 Subject: [PATCH 01/56] Add course preview for admins --- app/controllers/admin/courses_controller.rb | 7 +- app/models/course.rb | 4 +- app/models/organization.rb | 4 ++ app/policies/course_policy.rb | 6 ++ .../courses/_sortable_import_list.html.erb | 6 +- config/routes.rb | 3 +- .../admin/courses_controller_spec.rb | 22 ++++-- spec/features/admin/course_preview_spec.rb | 24 +++++++ spec/models/course/course_spec.rb | 4 +- spec/models/organization_spec.rb | 69 +++++++++---------- spec/policies/course_policy_spec.rb | 31 +++++++++ 11 files changed, 126 insertions(+), 54 deletions(-) create mode 100644 spec/features/admin/course_preview_spec.rb diff --git a/app/controllers/admin/courses_controller.rb b/app/controllers/admin/courses_controller.rb index 156f5b10..e07af98e 100644 --- a/app/controllers/admin/courses_controller.rb +++ b/app/controllers/admin/courses_controller.rb @@ -3,7 +3,7 @@ module Admin class CoursesController < BaseController - before_action :set_course, only: %i[show edit update destroy] + before_action :set_course, only: %i[preview edit update destroy] before_action :set_maximums, only: %i[new edit] before_action :set_category_options, only: %i[new edit create update] @@ -16,7 +16,7 @@ def index enable_sidebar end - def show + def preview authorize @course render 'courses/show' end @@ -135,7 +135,8 @@ def set_maximums end def set_course - @course = Course.friendly.find(params[:id]) + id_param = params[:id] || params[:course_id] + @course = Course.friendly.find(id_param) end def course_params diff --git a/app/models/course.rb b/app/models/course.rb index 193ac060..6a74d5c8 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -147,9 +147,9 @@ def published? end def find_or_create_category - return true unless category_name.present? + return true if category_name.blank? - existing_category = self.organization.categories.where('lower(name) = ?', category_name.downcase).first + existing_category = self.organization.categories.find_by('lower(name) = ?', category_name.downcase) self.category = existing_category || self.organization.categories.find_or_create_by(name: category_name) end end diff --git a/app/models/organization.rb b/app/models/organization.rb index 842358d4..18a65978 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -78,4 +78,8 @@ def clean_up_paperclip_errors errors.delete(:footer_logo_content_type) errors.delete(:footer_logo_file_size) end + + def self.pla + find_by(subdomain: 'www') + end end diff --git a/app/policies/course_policy.rb b/app/policies/course_policy.rb index 407a9a24..eabb7e70 100644 --- a/app/policies/course_policy.rb +++ b/app/policies/course_policy.rb @@ -18,6 +18,12 @@ def track? record.organization == user.organization && record.published? end + def preview? + return false unless user.admin? + + record.organization == Organization.pla + end + class Scope < Scope def resolve courses = scope.includes(:lessons).where(organization: user.organization) diff --git a/app/views/admin/courses/_sortable_import_list.html.erb b/app/views/admin/courses/_sortable_import_list.html.erb index 2df39445..b6bac939 100644 --- a/app/views/admin/courses/_sortable_import_list.html.erb +++ b/app/views/admin/courses/_sortable_import_list.html.erb @@ -8,7 +8,8 @@
Course
Topic
Language
-
Publication Status
+
+
diff --git a/config/routes.rb b/config/routes.rb index efc73e39..787de3c6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -100,9 +100,10 @@ get 'users/export_user_info', to: 'users#export_user_info', as: :export_user_info - resources :courses do + resources :courses, except: [:show] do put :sort, on: :collection patch 'update_pub_status' + get :preview resources :lessons, except: [:index, :show] do collection do diff --git a/spec/controllers/admin/courses_controller_spec.rb b/spec/controllers/admin/courses_controller_spec.rb index 070186fc..429ab180 100644 --- a/spec/controllers/admin/courses_controller_spec.rb +++ b/spec/controllers/admin/courses_controller_spec.rb @@ -49,13 +49,6 @@ end end - describe 'GET #show' do - it 'assigns the requested course as @course' do - get :show, params: { id: course1.to_param } - expect(assigns(:course)).to eq(course1) - end - end - describe 'GET #new' do it 'assigns a new course as @course' do get :new @@ -63,6 +56,21 @@ end end + describe 'GET #preview' do + let(:pla) { FactoryBot.create(:default_organization) } + let(:pla_course) { FactoryBot.create(:course, organization: pla) } + + it 'assigns the requested course as @course' do + get :preview, params: { course_id: pla_course.to_param } + expect(assigns(:course)).to eq(pla_course) + end + + it 'renders course show' do + get :preview, params: { course_id: pla_course.to_param } + expect(response).to render_template('courses/show') + end + end + describe 'PATCH #update_pub_status' do it 'updates the status' do patch :update_pub_status, params: { course_id: course1.id.to_param, value: 'P' } diff --git a/spec/features/admin/course_preview_spec.rb b/spec/features/admin/course_preview_spec.rb new file mode 100644 index 00000000..ca456fb1 --- /dev/null +++ b/spec/features/admin/course_preview_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'feature_helper' + +feature 'Admin previews a PLA course' do + let(:pla) { FactoryBot.create(:default_organization) } + let(:subsite_admin) { FactoryBot.create(:user, :admin) } + let(:org) { subsite_admin.organization } + + let!(:pla_course) { FactoryBot.create(:course_with_lessons, organization: pla) } + + before do + switch_to_subdomain(org.subdomain) + login_as subsite_admin + visit admin_dashboard_index_path + end + + scenario 'admin clicks course preview link from course import view' do + click_link 'Import DigitalLearn Courses' + click_link 'Preview Course' + expect(current_path).to eq(admin_course_preview_path(pla_course.id)) + + end +end diff --git a/spec/models/course/course_spec.rb b/spec/models/course/course_spec.rb index 19eb11a0..b9417a65 100644 --- a/spec/models/course/course_spec.rb +++ b/spec/models/course/course_spec.rb @@ -31,7 +31,7 @@ it 'should not create a new category' do expect do course.update(category_name: category.name) - end.to_not change { org.categories.count } + end.to_not(change { org.categories.count }) end it 'should add course to existing category' do @@ -42,7 +42,7 @@ it 'should add course to existing category in case-insensitive manner' do expect do - course.update(category_name: "eXisting categorY") + course.update(category_name: 'eXisting categorY') end.to change { category.courses.count }.by(1) end end diff --git a/spec/models/organization_spec.rb b/spec/models/organization_spec.rb index a0dec91f..cd0aee69 100644 --- a/spec/models/organization_spec.rb +++ b/spec/models/organization_spec.rb @@ -3,75 +3,68 @@ require 'rails_helper' RSpec.describe Organization, type: :model do - before do - @org = create(:organization) - other_org = create(:default_organization) - @user1 = create(:user, organization: @org) - @user1.add_role('admin', @org) - - @user2 = create(:user, organization: @org) - @user2.add_role('admin', @org) - - @user3 = create(:user, organization: @org) - @user3.add_role('user', @org) - - @user4 = create(:user, organization: other_org) - @user4.add_role('user', other_org) - end + let(:org) { FactoryBot.create(:organization) } + let!(:pla) { FactoryBot.create(:default_organization) } + let!(:admin1) { FactoryBot.create(:user, :admin, organization: org) } + let!(:admin2) { FactoryBot.create(:user, :admin, organization: org) } + let!(:user1) { FactoryBot.create(:user, organization: org) } + let!(:user2) { FactoryBot.create(:user) } it { should have_many(:cms_pages) } it { should have_many(:library_locations) } describe 'scopes' do + let(:parent_course) { FactoryBot.create(:course_with_lessons) } + describe 'using_lesson' do - it 'includes only orgs using the passed lesson' do - lesson_org = create(:organization) - create(:organization) - parent = create(:lesson) - lesson = create(:lesson, parent_id: parent.id, course: create(:course)) - lesson_org.courses << lesson.course + let(:parent_lesson) { parent_course.lessons.first } + let(:subsite_course) { FactoryBot.create(:course, organization: org) } + let!(:lesson) { FactoryBot.create(:lesson, parent_id: parent_lesson.id, course: subsite_course) } - expect(Organization.using_lesson(parent.id)).to eq([lesson_org]) + it 'includes only orgs using the passed lesson' do + expect(Organization.using_lesson(parent_lesson.id)).to eq([org]) end end describe 'using_course' do - it 'includes only orgs using the passed course' do - course_org = create(:organization) - create(:organization) - parent_course = create(:course) - course = create(:course, parent_id: parent_course.id) - course_org.courses << course + let!(:course) { FactoryBot.create(:course, parent_id: parent_course.id, organization: org) } - expect(Organization.using_course(parent_course.id)).to eq([course_org]) + it 'includes only orgs using the passed course' do + expect(Organization.using_course(parent_course.id)).to eq([org]) end end end describe 'validations' do it 'requires a name' do - @org.name = nil - expect(@org).to_not be_valid + org.name = nil + expect(org).to_not be_valid end it 'requires a subdomain' do - @org.subdomain = nil - expect(@org).to_not be_valid + org.subdomain = nil + expect(org).to_not be_valid end end describe '#users_count' do it 'returns the count of its users' do - expect(@org.user_count).to eq(3) + expect(org.user_count).to eq(3) end end describe '#admin_user_emails' do it 'returns emails of the admins' do - expect(@org.admin_user_emails).to include(@user1.email) - expect(@org.admin_user_emails).to include(@user2.email) - expect(@org.admin_user_emails).not_to include(@user3.email) - expect(@org.admin_user_emails).not_to include(@user4.email) + expect(org.admin_user_emails).to include(admin1.email) + expect(org.admin_user_emails).to include(admin2.email) + expect(org.admin_user_emails).not_to include(user1.email) + expect(org.admin_user_emails).not_to include(user2.email) + end + end + + describe '#pla' do + it 'returns PLA organization' do + expect(Organization.pla).to eq(pla) end end end diff --git a/spec/policies/course_policy_spec.rb b/spec/policies/course_policy_spec.rb index 2cc5c6de..db999e34 100644 --- a/spec/policies/course_policy_spec.rb +++ b/spec/policies/course_policy_spec.rb @@ -46,6 +46,37 @@ end end + permissions :preview? do + let(:pla) { FactoryBot.create(:default_organization) } + let(:guest_user) { GuestUser.new(organization: organization) } + let(:user) { FactoryBot.create(:user, organization: organization) } + let(:admin) { FactoryBot.create(:user, :admin, organization: organization) } + let(:course) { FactoryBot.create(:course, organization: pla) } + let(:subsite_course) { FactoryBot.create(:course) } + + context 'guest_user' do + it 'denies access' do + expect(subject).to_not permit(guest_user, course) + end + end + + context 'subsite user' do + it 'denies access' do + expect(subject).to_not permit(user, course) + end + end + + context 'subsite admin' do + it 'allows access to pla course' do + expect(subject).to permit(admin, course) + end + + it 'denies access to non PLA courses' do + expect(subject).to_not permit(admin, subsite_course) + end + end + end + permissions :show? do let(:guest_user) { GuestUser.new(organization: organization) } let(:user) { FactoryBot.create(:user, organization: organization) } From a983b96a1e793d9e0bc4d84b4b83df2e77751ced Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Tue, 3 Mar 2020 13:27:52 -0700 Subject: [PATCH 02/56] Display course progress in line with banner callout --- app/assets/stylesheets/mixins/_banner.scss | 19 +++++++++++++------ app/views/shared/layout/_banner.html.erb | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/mixins/_banner.scss b/app/assets/stylesheets/mixins/_banner.scss index ff5e9abd..2181aeea 100644 --- a/app/assets/stylesheets/mixins/_banner.scss +++ b/app/assets/stylesheets/mixins/_banner.scss @@ -8,23 +8,30 @@ text-align: $slogan_alignment; } + .callout { + flex-grow: 1; + } + .banner { background-color: $background_color; margin-bottom: 2em; padding: 1em 0 2em 0; min-height: 2em; + .banner-content { + display: flex; + justify-content: space-between; + align-content: center; + flex-wrap: wrap-reverse; + } + h1 { font-family: $font-secondary; color: $text_color; - font-size: 2em; + font-size: 3.3em; font-weight: 100; margin-bottom: 0; - margin-top: 13px; - - @media (min-width: $breakpoint-tablet) { - font-size: 3.3em; - } + margin-top: 0.25em; &.slogan { @media (min-width: $breakpoint-tablet) { diff --git a/app/views/shared/layout/_banner.html.erb b/app/views/shared/layout/_banner.html.erb index baecf3df..98a379d3 100644 --- a/app/views/shared/layout/_banner.html.erb +++ b/app/views/shared/layout/_banner.html.erb @@ -1,5 +1,5 @@
-
- <%= f.label :pub_status, class: "text-color" do %> - Publication Status - <% end %> - <%= f.select(:pub_status, options_for_select([["Draft", "D"], ["Published", "P"]], @lesson.pub_status), { include_blank: "Select..." } ) %> -
-
<%= f.label :is_assessment, class: "text-color" do %> Assessment diff --git a/app/views/admin/lessons/edit.html.erb b/app/views/admin/lessons/edit.html.erb index 078b4f1c..baeae388 100644 --- a/app/views/admin/lessons/edit.html.erb +++ b/app/views/admin/lessons/edit.html.erb @@ -8,7 +8,7 @@

- <% @course.lessons.where.not(pub_status: "A").each do |lesson| %> + <% @course.lessons.each do |lesson| %> <%= render partial: "shared/lessons/admin_lesson_tile_link", locals: { course: @course, lesson: lesson } %> <% end %>
diff --git a/app/views/admin/lessons/new.html.erb b/app/views/admin/lessons/new.html.erb index 6b449d7b..40fc6a6d 100644 --- a/app/views/admin/lessons/new.html.erb +++ b/app/views/admin/lessons/new.html.erb @@ -1,6 +1,6 @@ <%= render "form" %> -<% unless @course.lessons.blank? %> +<% unless @course_lessons.blank? %>

Lessons

@@ -10,7 +10,7 @@

- <% @course.lessons.where.not(pub_status: "A").each do |lesson| %> + <% @course_lessons.each do |lesson| %> <%= render partial: "shared/lessons/admin_lesson_tile_link", locals: { course: @course, lesson: lesson } %> <% end %>
diff --git a/app/views/courses/show.html.erb b/app/views/courses/show.html.erb index 17376547..287c11a3 100644 --- a/app/views/courses/show.html.erb +++ b/app/views/courses/show.html.erb @@ -5,7 +5,7 @@
-
<%= @course.lessons.published.count %> <%= t('course_page.lessons') %>
+
<%= @course.lessons.count %> <%= t('course_page.lessons') %>
<%= @course.duration("#{t('course_page.minutes')}") %>
<%= t("course_page.#{@course.level.downcase}") %>
diff --git a/app/views/lessons/lesson_complete.html.erb b/app/views/lessons/lesson_complete.html.erb index aa605794..afbba244 100644 --- a/app/views/lessons/lesson_complete.html.erb +++ b/app/views/lessons/lesson_complete.html.erb @@ -1,13 +1,13 @@

<%= t("completed_lesson_page.congratulations") %>

- <%= t("completed_lesson_page.youve_completed_activity") %> <%= @current_lesson.published_lesson_order %>: <%= @current_lesson.title %> + <%= t("completed_lesson_page.youve_completed_activity") %> <%= @current_lesson.lesson_order %>: <%= @current_lesson.title %>

<%= t("completed_lesson_page.up_next") %>:

<%= "#{@next_lesson.title} - " %> <%= t("completed_lesson_page.activity") %> - <%= @next_lesson.published_lesson_order %> + <%= @next_lesson.lesson_order %>

<%= link_to t("completed_lesson_page.continue"), course_lesson_path(@course, @next_lesson, preview: @preview), class: "btn small button-color" %>   diff --git a/app/views/lessons/playlist/_grid.html.erb b/app/views/lessons/playlist/_grid.html.erb index 46bddb14..8744c19f 100644 --- a/app/views/lessons/playlist/_grid.html.erb +++ b/app/views/lessons/playlist/_grid.html.erb @@ -1,5 +1,5 @@
- <% @course.lessons.published.each_with_index do |lesson, i| %> + <% @course.lessons.each_with_index do |lesson, i| %> <%= render partial: "lessons/playlist/lesson_listing", locals: { lesson: lesson, lesson_number: i} %> <% end %>
\ No newline at end of file diff --git a/app/views/lessons/playlist/_header.html.erb b/app/views/lessons/playlist/_header.html.erb index bccb55e2..76492ed2 100644 --- a/app/views/lessons/playlist/_header.html.erb +++ b/app/views/lessons/playlist/_header.html.erb @@ -3,7 +3,7 @@
- <%= @course.lessons.published.count %> <%= t("course_page.lessons") %> + <%= @course.lessons.count %> <%= t("course_page.lessons") %>
diff --git a/app/views/lessons/show.html.erb b/app/views/lessons/show.html.erb index f40cc037..7d4a5810 100644 --- a/app/views/lessons/show.html.erb +++ b/app/views/lessons/show.html.erb @@ -5,7 +5,7 @@ <%= @lesson.summary %> <% end %> <%= content_for :callout, flush: true do %> -

<%="#{@lesson.published_lesson_order}. #{@lesson.title}" %>

+

<%="#{@lesson.lesson_order}. #{@lesson.title}" %>

<%= @lesson.duration_str %> <% end %> <%= content_for :course_progress do %> diff --git a/app/views/shared/courses/_course_progress.html.erb b/app/views/shared/courses/_course_progress.html.erb index 051ea049..2e3ffb09 100644 --- a/app/views/shared/courses/_course_progress.html.erb +++ b/app/views/shared/courses/_course_progress.html.erb @@ -6,9 +6,9 @@ <% else %> <% end %> - <% lesson_count = course.lessons.published.count %> + <% lesson_count = course.lessons.count %> <% spacing = 100.0 / lesson_count %> - <% arrow_position = lesson.published_lesson_order * spacing - (spacing / 2) - 6 %> + <% arrow_position = lesson.lesson_order * spacing - (spacing / 2) - 6 %> <% lesson_count.times do |i| %> <% if i >= 1 %> diff --git a/app/views/shared/lessons/_grid.html.erb b/app/views/shared/lessons/_grid.html.erb index a1f0178a..7757ce39 100644 --- a/app/views/shared/lessons/_grid.html.erb +++ b/app/views/shared/lessons/_grid.html.erb @@ -1,5 +1,5 @@
- <% @course.lessons.published.each do |l| %> + <% @course.lessons.each do |l| %> <%= render partial: "shared/lessons/lesson_tile_link", locals: { lesson: l, completed: lessons_completed(@course).include?(l.id) } %> <% end %> diff --git a/app/views/shared/lessons/_lesson_tile.html.erb b/app/views/shared/lessons/_lesson_tile.html.erb index c7a4789b..bdf4f07e 100644 --- a/app/views/shared/lessons/_lesson_tile.html.erb +++ b/app/views/shared/lessons/_lesson_tile.html.erb @@ -2,7 +2,7 @@ <% if completed %> <% else %> - <%= lesson.published_lesson_order %> + <%= lesson.lesson_order %> <% end %> <%= lesson.title %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 0be90b9d..3bd60b15 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -34,8 +34,6 @@ en: password: "Password" course: pub_status: "Publication Status" - lesson: - pub_status: "Publication Status" common: submit: "Submit" save: "Save" diff --git a/config/locales/es.yml b/config/locales/es.yml index 6b877803..05e21ec0 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -36,8 +36,6 @@ es: password: "Contraseña" course: pub_status: "Estado de la publicación" - lesson: - pub_status: "Estado de la publicación" errors: models: profile: diff --git a/db/migrate/20200327172506_remove_lesson_pub_status.rb b/db/migrate/20200327172506_remove_lesson_pub_status.rb new file mode 100644 index 00000000..023b53d4 --- /dev/null +++ b/db/migrate/20200327172506_remove_lesson_pub_status.rb @@ -0,0 +1,5 @@ +class RemoveLessonPubStatus < ActiveRecord::Migration[5.2] + def change + remove_column :lessons, :pub_status, :string, default: 'D' + end +end diff --git a/db/structure.sql b/db/structure.sql index 8a96963f..959df770 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -535,7 +535,6 @@ CREATE TABLE public.lessons ( story_line_content_type character varying, story_line_file_size bigint, story_line_updated_at timestamp without time zone, - pub_status character varying, parent_lesson_id integer, parent_id integer ); @@ -1834,6 +1833,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20191211193827'), ('20200120023743'), ('20200220181809'), -('20200220184942'); +('20200220184942'), +('20200327172506'); diff --git a/erd.pdf b/erd.pdf index db7b2cb0cf8b4428cecb8b354960583b06ea9742..29323775c087d8d1f49493a072e2e37d37708330 100644 GIT binary patch delta 45128 zcmV(-K-|Brngh9;1CUaG+ma-=k*4qCDN=XE3)N&qWX56dB+agw)+Aev*t*il#;78P z)NB`}?xr+DJ?uWqe!l~7AQF+0kyRy1V>EUlC@q8 z|9yJmQftlj&`pn1_~+^Q@Y8pPwhuS@!!&k}-E@ezSz~W~k?y=t4e#cwbj6?f_-(p$`0QY> ze;F<`4}VN|p8aY6R`u4iKONscJov}nf7bl&@a}&f{^vVjW)S}mU^HF+fe2*c9#CO7%ec|4|9&%;Sgbr_oQL&cBKZ1o|U49lAIVz1gXLWc&73<^H< zxgp^djH9Q3aV=dcAqJp!Bfx%+ORpcz`)ybr z+Cbs_IZse3OB#U)l0>roOB`bJ;M4eXA|am+RF=mG@k4Xr|8?HcMBd?FACBYWFr7pL zK7`CUJ|$3peDrm6_j3lVcG+&>@1jMdZmsIRL3(0VG`8i`%C zF{S%|-2gAOx4JXj+ImteeCg?s+iKZJ>{=L8xF1HXp2Ga{oNw@RFfH-({@6XX)A7WI zVds?q@sqS7>8~@-yvWav9nK*TAa1XgW;=;$o&#j9eU*Dw{Hq(f!)dIUr*n13ou_|G z_!wrSsW0A6k5({l9$p0FV#Dl5_-faJH$z*Y>h_LR zaE~n*uVdM1T7hw7jT_-!G*k-{~F1z8<~`PJDS4?+0lk4Z?A#XNwxzGo<8y zliZKCO%lboKpH5e_@tq2e_nvJL0MTL+`G^=fV6q=&0_ZilWCzn8345~s2|Gw{se&r)WGEM4VAEv~x{`Iqxx84c(_Hh`+>(Ou`({MrH zwb1`_VinF>y+=pe#2S2p{)ppxB??@BuF4HDw_X*5wRt?Znsmi8{QK93n8xe~Bij4j zD=;5%qGZ^@{Ck*z57~kE=_$$R&4UBK8n*K(N5D{GGdii`B~uz=;^;k!S4_x>v;_U=D|jUbVKu>S7U zi@FIiM$9UDU!PXo0E%hd7JAMDI>@P&AtJVhDO^c^pAN&^>X~LhoSd=k*xz%HP?}oy zm%Hh2xYHhyMD;R_`Jn!+!OaOJMA!7qWdqy5d5+ik1UC_8Y0UJld!c22X~)0lA=YAS zdRy~Jvw4ArG9dd7Q_q~|^W#{5k*J%nu9K)UPRH?&-~{A4@1w@UKm!4 z9+YV?7(V>r+wZ>m`m2ux`PgfBf5f08B{{BU6ipw#`u2<8zyIpXyXbR&F_-4uQ!$q_ z`dM$(VhVX!iAbvtzyISO-+%Q5#ObVHV=k50XER_wuh-Yf-Pd_3jOCpnFVhv)Q|(n} zRG@K&=Hi!|g)z5esWtBjR}4#d3sROX>ETCl{*6q`w^{mt31mK@#H10(oD9#{-&f|< z#X=1jb=q-)ofRNWNO$;uO^}< zd;3Idn$E0oZt4B8nP%B<)YCLeLDiQ+i~HWzNW#_JLNTA_bam=uPu+y6-oB*!sjb!^ z6N6m~t#Ch#T0MnX(ZA16hT0u_W})Ht=SQ3ADVu9u>T~Yu?8ila?vI}&=(x50+R|u} zqb7kCug_TfDkH5>zMGGSY0x5E3Zzb7PfuCY`Q-ev7Vfj1Io^8%g%f-|c2J}ZvD%wl zCUmBd#4aDP?@fLM_G;qe3YBiz;0toSmH~J> zo~JN^h_VaFzr>6q66j?WUdj?p0eOe2QDtzVI4NWZUlASd-;>rvhyINEIL}=e?2;H> zBsyfN#E`Fp!B@yv&nT-qhfQ_oQtP-TL+!`D_7N*TR96gtG-F>y`TrHKT-%b@iM^6U zWT2VPh}iboHI$2*&OPFd!P~qlOO(s1XvV2*x(^e21FniEqHQM-Nkdp768z?epkq9( z-Jt!u0K%Klu^IB0KrOs@z6n%&)!|;_XpJaLr9YvQO~n{8eqM)a^N=>F`%tyo%lm$M zJk1!SZ3J&DL?$_&%gh-FTeQiKC4hb!@}Iu z6K#RFibdBaswp|1ISO7twRuPvTxc{yqRZDiW}N|Sb3MsBxnwoPj_4ADOJ+_K&I&FD z+dTM7S5e@e-4auCdl-vhW)$!tWC_v{bCVn0BdZOM(-|kDjbLr#e4(s1qEICaNZhD- zkhTIflg_PI9y3NkW`jGLS8%9x^Rvw0Di7c$FF1 zoaTQ_js5(q8kr$@C*A!L!9O_|99bQhg2(-`ZYHa~MKI~0@%ZJt>@WKm*!oP5we*i1 zw2%4nzedwV-x}gj zUnNki+NFeL!(6EyFYqGNP(EUtloz4wKhxGzMcvLmZs`p>O?iFaJ)*5(Led1+*dM~! zW?!oy>xpy1N+`=!?v{C({dk8d?~Lk>jYvL^39}StDqJBVH`&l;_)t%TVWYT^VZs*z zp?H(n2_=7#&^B44jznJWjGV%8`#2%COd}i~l|0zAa6X;*InZ<5Uuqvmjks*5r{cV<-vFZ$UROhz5+{vTZE&!~L_8i1282adGMd{u|F6?p6x#~- zeA;Y%6aSdP+S1>je9BurPiMCOp*FBc-zr7pg!q*-8pm`)$-*0Xznv z;~-YyQ``;sOz~SfTVhYHl1GqwtaVZyiohp_V4Auku><9vP!R{M_lwGz<@RD8H;H=% zg2)#wF&K&-e-Y~1=PyOW{pwxYp}h2@!W7}_3tQ6*w7a-OM<~z|Y0?rkIX2Bfd9i;) zhlgED6ru0W?ukQl-n;IH-{iXl$p^mcbBbvGBEGxI+ihz)PRkI<=HZ*K{_yoT-@zf> z|GpQ=*1v+ZhwleDVw#rdwmK7x;p@B=O4cO?wh+Nvb7{F zqOIg-1fukzt4s1>U7{G!P%T%1$d!N8Y!Q3I#oR)`!i5~KB3_Rnw?Zu?PaqVxsco(4 zYyu+JLMz-4-dXh|5f~Da1KV2aKeihN5-xg!AR)Pf^$O8Qr|Oy~BDI&emtSYi+U2A2z;KmE$d+iePLRGCp;SrD6xj1_;#cLqJR z_e*#3C(8dg^>*89yk>W0YD<*%$(X0TQa(EG2e;7wiD_>hDRjY82zLw1k z-s-pF@-@5@m-md8tQTwuf6WS>R6FQ2<4){I0V~H+0k?U$*FqY6EGr{ekw^#$nNH}t z1vD1Gz3s25Iu&pWr&`)ViwJ)K2caXg*|c6`xSP7i(_oP|s~*L)icTxHY%J@ld^Oj3 zM*UZGNHO8JfM4Oj%kX=8&cQEh2IWiT#AOVJcTTZ%K&-}OSm67G5vA(5WOqdh=V#P2sxO@or za{W6LCp?+KFIIRm7hLNFnv>uzN8b{~e*53kErx0t++xLy_AXJDyrO^qP2FMwbK$GY zjPP&i6~nxX!h#HDpRRwz=Nl-Sh36gCl2w<3CSAJ%uQ_RMZ(ey{Ap~ANn$x2H#Y%@d z7#qY`7~nQmT4s*86aFY`#2;$)u96Zd?D2R!6Ife>JJoUEfcAiW~aSTJAw5Nc2OL;mdC?h%tmrW#~qrTKrmu z#ul5Y$V-)Tift>;bQR=~618+*J5fFu_-Xm+-4nGj*laItr&krfYSw2`{YTuUVe*ms z7b3uI#jomAC1G+nIy9Et7#pB;D~n59E|pR0CxF`#%;kTyBrvWz1`4_;90PkJ*KkrE z&!m}$xkPDZu{QVY2Y@#D{7Zx6Ybk#vD45dhs9wmC9Y`26HuuUoR zQGo^4((YsFk#QVRa9l!L-&d&wYnbN6Z^g>)b-6ls@_#?&mgv2rJ+`JwxEjp|n20zq#z-U5g$TYftxb>JGhfcDD!|!d@<4Av= z@g-C8P5xsotUFyeoBFG-S{26b9r;_YRixm~Eooe=4g-JfR=gpr?`CE7ws}Haon^4d zBfN8|VxMl;r>pF7(WZPPk#4bQ4}bdRkKeAOyWC?LW0$~TV6my*{elYaQG>c0YS3L8 zdl2@HXaI{z2X}NBRe^(nG5W^(dW=v*k2ztGM9fYDSb*h@miRcJ z6cz(pL9`F+0(g%u29^@kO$05q)g*|MN{EG!#UB)-IMX$%1fknRWKj7OHIpq1Ee}SM zKocZ?D^=k{?ON*|v(PQYlL7=v&sK^qf#f3tqbLDYI`PqV4Zcaf1udQw2|}g^4_JFN z?Mzok48q-cR!BJjIVneinC*GMMJ_@<9vO?=OGtyM80QK^C4A^{G+jCXVUFnT8c7t>4 zTJ{%(KmCn&FrwPK0EymY1JFC_pO$^E_)CpTly|$MI<~w^U4m$WO)dM|PEGtvZ=pr$ zCcVq3(=7I@rze(9#h=z~u(fjPHq#>^Ud120*h?FO=tZ94k%W~01|NvmC(XBWl$ zst-H!O`~>UVa3n8*G^{;EG@SVL6;W2sPo74VIRp40WREh9dTi`jrZ>bEg5I4Ju`uZ z61-7?d#bV{UTX1P6Io6j`5_qh;7fUbI6%qVSyjoV57^@+99&eP69+ir!Lsd&JxaWl z?nd#H0lTFFflg!`Ofn%36hI~qb#C}{G%vDI>3!<@kmoZ{p7(@Ge5SyhLW=2^8<<8F zP$c#Sx2Kz{{7J-pW_LUpHkNIP=;3N^;jzMf6tA+OiT_i@NG(-%hk1KDv}D_VEn4wD z8wgj`lf<-x^=~ci>#J%vHY&TCTd;Giso^a)Lnf-8LQ7vFzsjzvZ7my>x6*wZwe@7P z&hx*$|0ibX=0;g`Prc=Fb-6&b)AJ369M@|KHHHo>C$O5%snAVA-TP$S6NLA ztHF4vVndS9Tss-mdY&IC33on^5>Yw`f%zh~FxGkOF}$HeAg!O#=Qiwf}N zeYF69w{0N0=nW`Q<>PdJ4d~Edz13*+5y&uH;}8HfG#qcln;NWjp{e>ruR^AxE9e0^ zNnd4|lHE44TC}BKB&E!E#ZRB2P-JzBH?8&(fWizw5zxlqc&2^T$DD@e%BxAA$$*~C zKfX0*vF$>lD3bMDhCmgNKPHsOu=fe(KvRdkXVEF4Zq?8qRNqT6ldD@rl;hCWM1>Z% zWJ}>Ay(%ZzARa~bD@mx9vYj3dxsJEX*N%GILA5VS(O1w9`v;YzeV{o(-&g4x z8Wv?{oVH6eyeD{nD9it3Za$L4Q37uz3~37u17@T3CHs|D0+lh^aXj`SV^^Xt$3h3c zvk9LeYK(92FN8XKo(1*hL1n1BTCvX%UsUypM*6xe!u?s90vLMsyJtCMGu^tZ<8VTk zji0TM#6cJlzBoo_6X6~09P}C9!IQdAqg*9*q|Eum9vEhSXJ=SNEPY8y+9igaYnyh? z2zD}du++eG3xVt3{%}H22Tr! zWdV4{qoSgJv*UnchZCcdX9Pur``!%60xKkWamG(Ex_>~Pg+O)5vwWFe2Dv7u+h&uQ zgEx_bgSom>P;l@W+!0H5-D0*x({@CeIwBOykQ^}Qhd@*G`!`3^2(IR?lL{Q@zAfdQ z{nZKlD7#oC6f>4;V(f?Qu9|CWLNhUG7qBg=Rc;`Ea-p&~P#iZM6{|=DXCTG1(cbZP zdE*5yA<(ZIaD(J&W|-DIEE8EAlk;~U?v?XPiiof+d9hvr0sie==l-WzgP=?TPVhKgl;bD65JGYPqfSSkebh!SJ*IJQLUJ0c_No-P?LXK92#5gk>m8R2H!S> zYnoJ5Aftpz?q|7#^`5R_2B$V(gXvJA&I-3~CrrOozc^!gCPeyX1ojF0?8tPmUWZnH zGw_nGq`#Oa@eJD)!W%~zDu*935Pp{4Ix zba(uVLxJGv5bsUlcHY&Qeb!r(TKcOmr@y?TD~w6+YK&<0zWQpaKmbIlvwQM-&dHqbGC_5jpvfirMHm=6D|D#E@Md7Jx+`8xNr?XU^h(Bq4$F z3)t|nwMk0vW%`x5o(K{mjTP^rQiZ@RVBK%SxNb=-s=vnv*aL{0;jlt^CtLhP3>pqA zL&w;TB56iTi9>AvcvyP8O1IoK1axcpU|+F?8`Q3(zmN?*>lt%(#=ll5hFdB*!%WQ$ zYDeeliZ#MbIf1ML+;M7fsHhr$>NGa>UAvYV@~}|JF&E;l&n>;6EZ=h$SK{>8!%{1Xr=u4Pa(-!l8wW@8+gL8WO%jmh2gR z9-E4%vTLcq*k&at1URY6z|)D>jlARI&fln7{ME*d>X)u`tI2!;h62fbVb4yWH*KQ zGXOlY+%;Vp5M2X!JzW$r3*s+Ew+G(YceV=eO#)rwBJe&EjKt=Y^NSZE&kJnruqEP^ zkhE26r@->K<@s)Z{o*C??PVHI-^b= zGLs~>drikLGjG~_ii+@=mYs5|<&1*S>yy$Z1$tXpeJ+E4x0_sFv0D^1%va`{@%=&q zEW8g66E^^QBftLXDst})S|IF;>f=DD7;y!lYqjF`0jTDo2n=wsgn$`9e|0i;M&mpp za|VZl1Mjs)e~LJwyb*#{jH&{{$|h<|JpHiu(GxWBtO%)R%o-ZR;!liet1pWt+Za zBO*&d@6g65hH*-L#kRg~PuU$COSnVStiNGxe@gR8{c67SmEjen<1Jw=VV8@^3?>rT zq+fA=yo=xIZXA8Q7k*j4hO#zu^<=0WVYYzpRo$*eTB}M6&q0k}sU-XJn2766hAAPj zi#ZAV(%+v(Z04}X9C+_fI}c5dr@uc@VFgne9Kq6&a?Qi9(^nm7Ggr>xYN@OA_uXf* z4ovV*C$Mi5&gSxBey{p|Dbn3$wrL@WDl-IsPsnAzuPU`^L0qxIRwt(G)${Wv<#2Ie zrV%?-KKl0MV~={v4b4_tK8D`!Io@AWuJ;O~tQ_t#lQ4WN)!g4$ z7!7mJ#ozOq{>536&(xLM%_-kT+mdeZI}B1ObEW${<>W!}&n+qRLoINMk=cnyu&>ngS1Q;0}HMFTZ#?^!)t_q}z}OouLawnn6!Bv6GZ=gM+DZZgkMhNql0)?ZqKbc;@jn9C2yP9r7Gm${h}?aI6D#eh zWF29=*RfutA?sK#TzLqU$})m~26d_z9&tIO_mnxK>KHy2GLLku7aqu-a%B8`#5c$1 zaLth-D2E6Fu5!W|5#uI5YcqpN1dLP0raLH1-+nSvRm>-nnS0EVJbC|t(u8Qbk?SR@ z=rI(d837@j82D+-!AVyW*;n=xzm2ru#UnR7hmZi%!Lc&aIUUI(DdmfQGG8zi27CnO zxSLSwaGh}Enh*hZ&_J=dus8!R9*2RY09r>D1*beFHWk<;TatlsfxNchVjVTq5pYwl zjr1^`8^On@BES{0KaWSO7#y+&`1`4mKX#b$f^N#-cwxxy1gf2~Mgb`^U_})L9Naw= zn>$l402`L9z9e~(`*c=+ZT$_F@!NwZ-3?F3WYzgjC&JgB@q;ssULG*z^c|@a@E(wo=A#OE>XzKj zP4pA4DC%iw{=9``I`VC{lv$>de~?HYuQ#~~fLk2J z@p&vbY(~OOu3A&8sYm>WHNjcab-4^nw|0DpU#9n}PYN)aRYBj4Z9SELg~RFMQw)^8 z>@MqY6H?>@2F9rjdY_;XsnwkA} zzc2z^Bnk<68!pTqH6@m^?KMElNti`9ZEbqXqe6j8u4Eo!hq83OR!V@vM z_J~2S)i8oL^2G*B!R=Ygttqb;(@w%?x7Rz$WW$haF@$fIs_NeClyxkUV8m`Z7b8q) z^tv3cFmX71J@FMsMYe>wZO!MKiROg~ggp^ZMBKoC_GD~bm^46Y=OHe-r`7NgBw2nv ze>fUPZVTfJ&4N;15{97QVpLdFlXv{tXy-;$9d+cXVnJaLFx^yIh| zG*N3dkgjgQQF3^87P}&JIGAuS#n1Tn3SaR(Y-pA1QX5d^c5JfCWnA66*`U?~nk39D zn96+fJmP&2bl`gZA>X1LMh=;e1!%JMc_Xr-wln2Dm;x?3w+PUnS4LJHtsQID=lx=T zO#qGC@w1^aA{U;XUC8C2$<}wLw*S<@k5r??%9LC-0aP!GLdyz-v6$e9SXP4Y1^12Y#d=fZoyA8ngh_2$^?+<^O<^Hk zVxTUyCK9YnYtjJTNNEay9Ba)XGhg3*QaGev$jIYh&quGmkS%9$gEL5{W>4{d@kK&I zm-vr_(^~P8|g&%{2IY;vN7&8^^R)Q(ZtCO$O^EHA&O(c89CmIW?=$zIr52MP2O?TO|Q*DhQHc!2Sb8JIXojbHa)kWI?FgE6 zW*8pPJ35Zv;Tj*p7`|m%RmYk)Md<*P)F3Q_VcMhexwwQD!|*ljNfqmVxT3&dEI)bL z7=M9GWoRu8U$}D5sCp(XPHY>M;Bn<5oAO9thVnQ2Yk?}Lx z{0VX76gos=R0W0$21h)YsFiTE`mREoGwDJcsmZEi`5=#&^#rEM>(vTeU43D2dPqJY z@PO0h7$;~4-cV|q9alb4oD8UOc#d$n$qqx8va=vt$X$nRU>fE|1-nTv;Q^_*@=pnG z!=jokL#RCAH5og9R<(oO5OE|=9%*1b!0@_`BuhcAJ%Y<1cWtk;DOhMu7oy@N&M^pt zD>~#!P9tSJ6P+v;A|#Jlk}J5N*(%1bJL57@2~6_P?8G192~RrVQ2EXn^5wKs^dAMX zDV-?Wm4=eA;abOL4#4vS|HcLfH{oM&6`VIl_ann+&{$r7aY+g#0GfWIrt!mSIl^x+ zlX3DD?l{$w#chFi@Th|aDd3I6iUu^vFXIHXAqV>+D**a(m)WWMxbaJh@-$ol$_Rg4 zfogH{UB!jqE|6c)4xvKSnc%Zbg8WFl-eOOw-Ny`5(uRO-ELV?jlIb{j1ipI=sN7=n!&`rCXwdYA@9K5SWjqK!;;^!*y~nM z);0-$d8^pU*e+s=A%{!e5Gf%r=`lE%b~}wj4H%tnb{4D>uTkVV+@uk1@|((0)(0)^ zi+sUa)^lv@`?}bq25+<1ga;8#)Zheo8ngABTK1QLq`!KLXKcS8@eQ{=vrP`Upxqhv zK5O0Z)#p$#_m38dwr&|ocC*97^KGIB+dPXW~3#kTn>iI(r2|jBO7{> zjoCFE*M6L|N()CMyBAqF?$njmEFANogXXX=+eF{gz--`Kjly%)+&SKgBA(#rzzP?d zhc~J7hAo`nQ3_n6DvCOiV^cD=E<#?&B_iB?8MQ3 z;amrMjz@Asz)nKVN~^las>N!3~^ex76Ph?D86GzX{FYL zLlZ;9WC+TrQ6Qf9 ztR#8@+bDa$u)=ddczefC$2zl6N6N^5r<&V}LJL==3xpP&m`H?pmD5)#J;YlC7}65= z;=Z@lA^|VlS0Nz3Pn@Q%(i1UWYSDja@xHe;l5jP*o){mRq`ifmfcxsnTCxA!Rx6Au zw|L*KYSii}%p}kG)_zjZu{%K3$3WOAlSR_L;A_AB<9kei9)P^A^oB8OOzhcz1~s+c zHyd_smHdb z;9KZKB%r`gbX-h0=>90SQ9Q+eNx9|0RrMw5PI`^1J{E{dS7#k0Yy=qNP(l6y)lQF5 zvqA-}w$)3l1I}zv_Rx$ z4q_h)P5Tg5n3!G2ur8ZQRMfea>H27e$}|>Aw?;;1kE9=VJusl686IhW;xyD@;6Vi_ zZZRS3Fj_kPkn)dd6`SD->jBY}ks5_QmkhmuV7VDa5mXeLTHs6(w#J&aOq8&uf=#-( z0}QYUi%UgmWuD}3obU#%dp z;Im;0E9?h$w+-q`f9yVgvFe_%g)CMP=dRMMGS+EJUqmZxa-X+T#Ibytd{XkiePWd< z;%1&Bv|5%71*S`&TPo%KuK3@tg?t5D!30HFqsSXJx zURBti^#q%aU*f)hx77-x%B^rej9NW~nfRQyIfp^6c>Q%+Qh(SVaQ$03f1ua+eEo7VXlHPuEz@95{wb1 z?}hQwqI*d7_SZ_8*Wh=X#IURLPfyWxE=etLqrZsW9Rq5 z5)J+mUw15jsRP1AvJf;<)C=8W zF-v)WS6_|)aU(3Ob)P={XQjdC+^bi^4wJD7C1;<_ZrEMtcvo##((M);Pf0=q3$b5! zL*%#%ju(2mTYl7OONsMV(q(+2sN(5=Z#$*>OIvve4#7I|+}}^5SOcqII2y5Z(QEX;7ARZ5{}yBUjxUrO|Zz_bO^dn(E*r% zoB{c2lE+jXK;arpgcD6fGxC#?jQYJ}p7-caXYlMIV_~n1)xxO>E#*+)!)!yb7Mf8h8TEykUUR8a?_1d;9`_ue{*a zqR^Pg6o;B4-zS?!kz21t6nx5slV@gZ9{cUkL?s_Ga z-KzRhPBqNLhkX@*4glw2SwWP4r6~d|$6RLZ+acw!^S$BOdvmt%!ty8?FFD~|Dd-f7 z8k>R_)Hc}MVlMpwSV;)Kf65PQ}&t$4k&**m!T=on~E&J!I>C;V7%~BgZSEx ztF$5f?o>_l2`7Q%b*cVFpM9-^>;hueg+Dou@~BoP%B*!{an7Odbm}Rx4o-Zo!M}N@ z;8L+YG8562Nm1d9wqIRrg_4$?eOx~+nofB*Ur)0myVyi#}T(Q-=QN_Wek%7~V}>yUBu z^s&~4T^7Kn*3dy9)pP zuwYL!a6Yk9Z@z6TE}%>bbw865n5UPa%zhr2&-#Au+xPwEN^*yPt1asu8Qf!v<>XJ& zk;BO)pbA~@X)z`6 z(P79kR{;a!LkYAd(vm8hlrO+k+bWq~kr-6}(31f&n-S53hLTo8sHPJ8iPU6bq|H)c zP$@RVTgGw@lqRIE1&I=}r-x*Gk`7hrfspK@Qq5s31H}die2=+0;CFMTb~T;RlR}qU z`JJfS$Z3^-DgN`yqRyOGaXyi3LS<=Aejs<9>}S%tk0fgAgyW;45XsdcVf#p-b9yBL zwZC1dflQ?kF|MiwsjUgb%VpCh<^krEcT3Upp&6s+`9V0kevrb;a#$iw(Nr%M53f*D zKI9?r`X)h`T(u9yA0&*Y%eh5_sAv0dDy`x{6+x8NHq@)vg>na4#32h&l9UeE0Dk z(XY6F7@KvYyf@xs$j_1;LFMpjM3r(1KWJVf+3J)Pfzy;DSP@OG;UcNDBjNFo8aPO0 zAGQk0co2Z3)O74n#8;|x2@;v&}4B&dz18Vtc@gGvR7&%q)KYfQ|TfYZP#dP zphxYo>^rJ6G^wH?Altd`u*ETIb`-K5dO$9YY^Op1uu-RSa*P;oqx6X-F7Y%~;Q=af zeiYat%4s06^N3t{6HAasoc6{7cv+Ga0* zyIBrtWTz)}iLsIdFskM+*`JD_Rn?x6{gaGkfJ0dmBp3_Y4?`FgIOvchR2PR3D?@sm zv@Hk3hif`aMbrdEE0G4-hdN3(@r8sL$Qzl-@LeaWX!u~YGHQu;BKuFHhfgSf)t%x) ztTseNRt}YbqL`&xLG8I2NXj{KYz9=Wvl7_QDNdxiPeIJ0lmc*7jcAHcU8fEx9GOb_ zj;xWyERMBMGK|Stqr$*J2dZc!IqPg6(&4c^`~LilATS_OlbK2tcF_vf3*Ip=$p zd+#~l^WD##tXs2w5wVeWA`xT3ig~Mu_ypfV@!JI(*2OY)dw>vS*43-7S&^xGmJ?$7 z;+o~xU!AFk{zS+yW$~hU3o~`{e=W)pi_ws&(+ZUNi&w1Mn5hR_P_A0Oa=}1<=*Os! zS}||q!1KvpP>)?ZZ^fd__=Xx@U$t`Wx=j7@<0xBJtywfMo;DF;{ZEDbwe|;_387mL z4q3(rQltp^2dN=HAu3@+C#7UIA@X85o0w4N{U&zLz5lrL>|AHfm*%jUe_ur&{iv{* zm#@gHcAneQca2WWHdHNQJnz7D>X`m1WV}w!?KyXYo_P}Q8T>@{lUY*H-hx2%$cxet zavX_CLpqb$(fv}Pl-)TxYIIBSz3!|s=h&fA40kLQc?|hVq&-Lnkz_Jg%0aJ=d^1uz z(jKIPNJo$qLXh*`7}83le_cq&krXLgigd=J`q)A#h--sbuT%1qQ%Gqfi9`T$K#jkV zmm*C?nu~M~(k>)LjN>gUkv1b8L^_S65JU2J-dm2j`#bLt#ondM%S3fvrrOdfs(ZiJ zoGB+y&y;nSWrmH)3>#jNX})A!rYtPUlK_rR&72glphh#H5&T)>s7HJpKL8QY-r;rqO9N!P{eV@Hgoa{YP zid2g<7ikyLL8MbiDtiyP&VT;GDMsWRu0>+(FUWQFXDsW_$ervMpkwS{E}!`M-hLSmT7Q9Su5i6KoxYC~FuqyTyc&^x3ZX(!Tdq!bdU41c+f6k~57y@m7+ z8HQvaO+zxXBb|6mH#^)}FfKaQ$9~IxL;S$_A@*OQe2cv%$~W1sMfp0)9Q41zUhB+> zlCf6w6I`RC)KQkA-^6~kH{Tsik9Dzwz+e=4DN-%cRHV5`_aG_kAj|7q7uW)$4_AgVkoxcgo}JS({MPCz^> zxM2$*o)s+L0ElM=3zq`oS;3sSfOu9gbrv9G-R!5&=NCq+rY@tgu}*d!uyh@;bRDpC z9g*2}{7b%;`5YhaEG`Dd9x{?cilglZX#0z_eFklRl(sLT?SD7Z_ARu%hPGct+mp0C zLfdm_yFuGupd*2bc4~B8RIN4wwEYd*{tMc^mbMqr_5^Lur|mIXWpuOL&db1cDC$MA zcPwW*mb>@TF_1n^mJ5vLg64A}6AmIjjFc8N1A}6DnZdyvUgqsBuFcdh8CAA&>?HOI zE_?;s@Cx|=Nq@!$y#g|N1vhyGw{s$|MVgD$gLDchjig|79@cS>$eqYbk!q3VB5g)G zg`|k-oWfKXS&5uaagUf-De_vRsl3Ks!8Z@zT$XEO>k&PvPm=D5P-hOEnv>39RmA6m zTz0$6u5N1I_fPv*|Fjd!SPQ$G-9xgm5jzLUdpf_)j(>L32RaL0h>p#o_mdnMR7a~x z0ZpJBN!E&bC5f1Mdj*NGXHk}QMrPwOXJ4;5BO{}~ctZ@`f{uqeqc`(nU-YKP#OSh! z=vb8LxPNLbYKAj9qhL;S67E+QnIARQ;-34WwUMi$HJMSB{F;5yVVFWP0~TYlLn7j# z@f>l(#;R_**eFr&Q=8PO>Ik(=Em3pTsG6;YRj=7?*3AyH&8(TtX2mR27lHta~y3*^(-I_^JA&AGvnPnU5neb53U5Lz!_2T#s@2yudh%g(SqdgvBDp$&`=lSesv8*O8A5WBf6)R*YHe zk6k$CjReLdkYS9koxCB&yy0u-V^U+pZGR#W49P);Av8oHVn~FB#1Jv_4l$&3V94#~ zhukinBxPnJ#_$Zcu^%5CV?T~D7a;Qg4lWv(Owzrhn-{dyFN)W<#p@R#wWaRZusD!v zpC5~LENJE(v6NKMHh;llUd~&TYK||eOD%}k#X3fd>;9#?g?EpR*L9GV`dLjKEq}(M zy3WzY==%7)y5_wTr&Uy4^sL*@KdWNezj@X)ezOYxtcl{fe|c6F@1Dq?RmGoG#h*3N zm?)k_1dUH?>M)aW&Ev6uyxhyI8tAnxoZCFkr>`0#h<9{u;O6iFSSwEvYqB|Ii;qj$ zkvLrs9XoU^?*dQpE(e;O16_feM}Oyr574Iux^y(V;^Rni-TJlbNuYj7UFL5sK4@CE zo^M4aPx7{Z`@xX0-Fl!Fb(0?+g=>Tjg zt|ZnrV}WaFlCB-R8()WjNv4Hh*=q;Wy7dFl04~-Ilw#=GBuTCvM9JXok{nqg6S!KJ zglIDzAVH*%=}8il3kdw5^ruKCdD*`teUkU{l6?+A*FBI3d5ZjkE+M}l2g%FyG_Kl1 z_LDBcO`tmRW3q|-kZglmn}36r+sO=kO=$li4W_%`nLGl8`3O0LvEL&%lLN#@1L@Dm zX0lcK1FqUi>?DtjCDX`Cau>ZKy`Hp?59C`&6}f_3OIFeLbW{57^u6iF$A%u_ z#7aVB0ltUQUzq-s{tFq3D}F>CBp=XwEzc1HPie=3?g|=P-j@avkO% zlgZ=|?O{pWeG&PT2IwYfJnr&XI+cDEqavi0EG7?;1GJJ(WVxo6^yKs*;=?mG;;s*p zPO=Z*Zt@a2Ms23k>BrNjNsyF~%dnm<@>|*?_4jS*uLa&rz|s&>jh>a{Kgn;%5gMnz zVk=EHQ<=#y-H<*?ynkdkX~b-w#Fd}Wf3lnL-7LK(Pe_j=4&dbn9NXmAd4+*~9Fw(hudQ<=?CGu3>K%onA>7(@k_6{Q-TD z9->F+Nj8?vV$0YmX|c3gdPyFK?@W2Ee2eKe(;dpm{-*v{`+wK}&vaS(HZmRbum!XK z5&0=rwx1j(@8bIb`71S1D|O%-qq($^-iYtb^e*}+eTqI!yYQ4F^sn?YsH89HHw>DV zDJ%@*hnqlgwtof|<`3DA*C8bKKMrxK;VpiLvo%lW{eJF?I!*UvU zE;HR{+GTpm^sMP+(`m(~ejhsit#2ReEAD&0pY(677=s4 zgjKR}Y%0E2u|;e(jIn!J7kh`DlT^tnIi)PASehucN{gg*()H4PQc8MDdQbYRbXNKn z-?XgBQ8`a8kdyL6d9J)({;B+_{HdwM^rq=!MN?KNw<+Dqf5WO7qfS$&tF7ui>OS?T zxee6$3V(TyJP!&y|DngFEmFPo9J!m7%R#s>zXd(dB@3m=43x^AqTAU`w2S4NHY%gp zXgYzpH&ndxGk|L3S4gk?BG&d>+`$Z@e7v39PZ!G9kh@7a-9$bmPk<|i zn66cdl`Q%?TO#jZ9@<5i{4`cqP4lT_@{(I=tMrg^ioHwLlf$w`-j{xk*&k-VlqSok zO@A}!VsOAsd*R2a%dL`)80j=_km8>1)Wf z>3hjg$b)U^O}OJz4;|1a{aoAw87sVDGY-?7oZl7uZhF z0Qnr>Ut(v*m|h?|_|8i4ETLnUXRR`ld#}ZSacwK!e7{{f!jg+XLw=gwrdQ*K}I5)R>Xi18WUl5<4BHU6+ihm(wym(AX z8J|+cV`58SzD8fKiwEah{I zUj|Ds6NzQrP?!6rM${{ZmTc%|@%Sno z{xf$P$TZ+~Uh}9@pg%X4Z}1)62APjas(pG>rXC~n!=1z^g>B8+cu&t@PgW!EX&>x4 ze|cLRl-$MrS(2497k`}pbLu`%{o+w6>ifTRFUs^c%#1g{G>+BpXd9r~hFKTYGW{H( zz#IAopp<8PlN4rX;}8o=qBmn94-SF3++<713H&L7s26stW>BSQp|J@my=_t^Z`N{i z2YBZHby0WvG`~s|-(5DajMS*)z(h0CPK~~(e$n)7JEVqL5Pvxgmi>+$+C_aJwahFp z8z?~WaP)Iy<5Q#&oSDEMT#k`EHHT9MP==ma;3Co793H4%G%!4HQ8PZAI)|1_fXv*n zV?sPOVMp7JdEM#u`SF+@-?5*)%wFEHsvgoVLpa^(19yZ|6YgvV#un32U=K#db;RlR z=^X~$K66gfet(2GV%ujmbu!Avw~cG&+rq}rY8pU`*bq+o*h8F{fMU3gm)E90l-H8W zk#2+MHVx$jqz3ePP>w^|Mt?)L)8C{YML$Y%ivr!w+mY%9%1P`QvK9TcxGo=Uw*U^A zenWWhB^Rj(kqV34LNs_LHh41*;>3xJ zi@1pg`acWagC7<`5aUB6JTTWRw3pHc*fwdNJlYg8y{f#Z-i=7q4=u;FtE?Mr&Gu1_ zh~rb|Qr8&Q5%(_7FS9=KI|CA~hN|Swg^5311%h0;t^_hfsmQl6spnh6M7|+0xd%8) zf7lOOsDJ-&7#T8bw3e`t30~j$v4P|i{e=DrDV^Lqe3(?3n-!Ix?qBl#@8j;|^7KhL zB98&qtJqMZ#A3G;2koKaA@<_pYWs++s_>}d%Zgj=t;I|2ON!fu?XcfAT~@2oSO~xfa_EWRGe!G?FBH8RJY4kqtbg~4%ymAR)15wJxNJ71(e38B$;R_a z9(rr!P}Cm{Buk1bs^#jE%j8KVv(3%PtIbQ28*JNbuiL)1f1PwyRXC`um*!Xa%W}Pe zxkFYCVM8LNj#|e(j$Mwl!?eq>$8pLbIc!cRYjkv{Kkw3Y0h}?ibX{q5*z9)XiqnbQ z5r2{V-RzltfggDz5tZ=Sh4?&3eW6wsk*q`J>GOzUx3fl)$j$Fg|6SaS1BR8i=F2u4 z^6vBrEM5R-1QyWp7sJXQmoFZK`nO&D#`)dsO2biTkOI9RRxqq!Pl2f#a-hrMV2uUc z>38-CU^s6x>^bp@Vbwj=Yr3#jXJizCp z*!X04t~4qRzFbA;4_Ahd)XxqC2wGS7p6N~Mt*eu0Y3)5T7&oZtOMd(@sqL*jk*w|Q zJK=Iymx?ZoUyTa>s;SHEuO2>(wDJzR8U*ABh3d39j*9Sz33%P-k@`kSqn zj->AuMf9S{rIXsOoOz*ARhsHerrKyK%A(P{NO@#j zWL0!$R2k)|@zsQ`@LdsVHMiQEoUOjALQBod?Tek)`mPQ2MBlX?^B)WT)$@1%--91z zACIP^!I-JkS?V2Ts&yKsE1c6zSDTJye<`2SZF-hNRu~CK6qRaO5r;L9e}BYEb*o`* zv$k91sKIy3DrnRi5O8<;EGPtxP)>q|0G#RKR0`m@ARgXgl=A(wuA{DUB8ZR3ya6X< z3C4OT-AQ-T6g^GlD6K`@K%(90enGSVzBRHrc~L*La40Zq(X;2*|nx){+`uF|36-OaT%*<{K1Bw|7`t+pPLT!eRvf2#kTpV0dbHr{dQ%_FZJf)1FLJ}LD=UWMqK4#riMQQ_F^q<>B;H4sx;#bvZR zVpRhX8L@{f)y!9~iq)$SJb-n+dR0*Pp`)+yS@-I%wwCcUd|23+XtB{~WV~m*f2L=q zzs=L;f0#WiJ!F4ee>`L}+k@ItwnSQLT5nrrZ?`{Td(N^?d(LL_*>1Ca#3V=FT<1#X zW~bz&5HZH}!w8>L8-J#?lk6tP$!Vw!r_%~mIylD&rk?LGb7VX6!dPFvH5tWOFs0Ps zyi5(TJCnqogv6d)7Rky#tkS4jt1{KW2dNq#qzdt>4i8tn8b}JJ$F5|Uzje)kV#gr^ zw?KN=oJsbs5o-styQ)j|))V;S+qN3})=d4Jw~4F5jji+f)qeuMTNxIXYC5t{{qk7< zKi7PA`!D_y-4onAXZtgc-@5c}y4C;uVVX^~pHsGF&m-Yw%U}7!J1+|zGXZ<{0XWhH zj%+j@*O+Wi*emRHc2lLdGV(n(OPk@H8M%fnG%d0$@U}&IqDM_{d)^Cv?D^Px%Kx|E z$Aa^G(P%Qn*?+Ym#Ccb}gyq{W@r`1Y_6AmOpWwYL@;z;~{Tlnn%BQ|_^o&ENS(3x5 zJHe4w)kVOPk~L6HNy6n!==u>C)m?_G&DHJ#YjT>%FsRGTb%%?yor?=um%=H?B^Va1 z|G-dS+~wdHNBs-Ir2xJ%#_`>8t#jueR1d2ksA*N^TYofFmDC(Tazak4Ih^xV!F-%7 zv28;8sKK0yX%}!>>*~q9=edhBU5(zW_tl)>dsf5KcYLL_C{VISk&TJTXjtYUB z;WKIEqE|P+y?*J@TiWg`-P;%Y`T7k%d+NrGkKFdtJHL5s7nOEQAIlu)CNTF~Z~W@D zV{g66?SFy>NYNbdSr+zers0p0NEU09T1~B%M(ZMJnQ5hEk=2~VwV+rw0AmJ+vLie% zbiZpl=RF&ehr34wheyV`Cx^yHrn_5$Ga~ccD?;-k8{N!qBAowJpV%+# z)P*v!H95KO#1wsXGIKdre>S`_)X{%77boH7+7Sl<2 z8Gmtk)m$H!i!`@DC{gLE10`SV|E&KM_5S5;L{Psysda8$aA)5!Hr+OI_U)UVrnCKz zb_zreuqP-7IX;R)(TZ%dU9veN8YInPNv}u7J1N>OFZHH9hU`zsh|ApzvBZ%$ zd}IYLjbtQRv6GW+t|kzPPjuoEF{UUy<(B=0jS>3Fot0>}8 zg(lHsWSGz+?Qn;Vz!B(XHyLH7NW`ht=S6IqFRMIJt|bD2BYvv;4S$=z-7l8_<*czp z*d2Z$)`UeV#3-6yh&4Ybnl+;J^Nd*IqhM_giZuY=8kcjT_pfu(1j&o$A9Nmee&Cb% zuVR0DtYzcZ-LyU6pc_(uK7H-)?t1ZtCl>vA_kVu=;1f4(dg>Q9Y<#LIG(Azaa86a~ z4qEfx1C-wRK>N2#zdF3}S*iGUJqO=<<+WG12f7U|7e62K(s}!d4}_oPuaLOgBFyWA zT!|R_0lO@kM)`vkezVKw@=7L3oDq}iwQ7^uusbLp$E{_GkMp9xVnjvCciP8R`F8tK zzO+yFF>gZftD$2Kr?DP5(MMpDJh4!Jw-7KjO_pb@M4vCq6?X~SP|0#_>$cSMvPZVvIP>nC`d$D}ZpTKUOZdizjH@go_zI?4c3O5@QkEXe z2bR+ol~|&dRhD+ku7RfGmb68ST3}0O_+$hOWrM~sQYg=9ltMzR6u7y1amw}!@XC{Ho}EB4j^dt8jw z_6ilj)dVN`HLH`J%JM7;SlQmy)g}M!@ZoQ=471j&94;v>#tC_FEDtOx(^mu=f%NKN>tA(8c-=JoSUcadB zlhvelGWQ9vDmV8atA#7+Dlgxro59(fBFwt8z^rRwYH_HDl?aNUt$gi&w2Je4B{1Ms z!Q!`d^)JpF5v>~0RX+Cq%jC~~_q(ree9&>(y>iPpyI-BWkn<~OLHY`Kv9ftanES@i z*vf2Wjzx0X|Ci~kB3ZBo_{iMH;^Imh1i(z07O?V30|-zW8>Qd@^O_-~dk(OHf zRC}}BtTd_3mYd}3O%GaLQ+_YMqnuDaQ~#-aZO(FQnn{vmrYNe#Vn)ScHYZfYtE!45 z%L$X_HJLOG1S^{<$kL>!W^gRgWW2OxSWKWrL|5|6yp|gi-hl{z0jQy!Fo3KH!V>Tm z3F1Oi!8ssLW4PdbvExMSI1!Xg;2?t6g*$1uR}S5oNHYE>TRY=lJZUZt0)6W2LKh@Zmy9;-k}KJ&E8<4QOm6ovjps}3dn-h z&7gmTfep=4l3i_oF=uDjV8h<;%&tapv@<4(j@)XYG@4=gw$jyjdqTX0p`?2{bE~n5 zJ)J&Yyx*zw;k*zvn)JI z=tmM7NysZ&PI1PsfiyAvz{Ip#?0bWxYgm*)xyZ%u^hI9a>A zoX6pqoizMhJi8btYL^gWFbknW(RWU)l6!ArVtB8z)vyH;JHs?AZWlg(yRf(&>R%Wx ze!H;Hl40R^f1|ZOqnyKt?kJ6@XCi-Lem}hTT^>)+BLuv+o3JS1{3i+i6QLP$A^!=9 zOMHU=_+19J<&5FwHzq=j5Mh6iV1A;TZruB?5}5Bx4Lp(yLN*tK`XHhErU=;#?;pl9 zRF7a{uqzkPgNoYb^%Qt*t}u1mvj!FQfa`+&&EnRxf6vdejJg(f^o5H1k+LV2Zn!^s z^BX^XW^cS@%&H%DH7&ei%P6_vM^om`Z#uANUtb~n$@00Qe)M?X{j782#%T}zpzqxQ zdXYW>z4+)&hQ}l+9`=;pt$!qa>Nzc)^(fG#r;QpA%=J2bKtB>V9!Lk|nAz*_`rNR& zsN%D0e|Cq>kslCtRzTQXR$*;fg|!7mH(+g9h3dBE@y!%LHsRM>g|&tH*O?8q3Tq4X zvxX3dR$rpeG;)Bvzi~6TEr0%jL>&-ghi`p~015 z!S4(%nC95!jKP(O@$pBv|J8t-;@8hY2%Z0ce+%Ihq2;1hboW9Ub2|(=_`DV7Q(P9! ztf`u$=mm&wgsD?=4{UPr7H)2Xgv2fnL~+H&X0~|SqwC*mdt{ofbrmn0wDw84;Ql@J zt0tG-)VG%1cI}F>_rBHlB99%^A$CxRU9^)RUA8X^u@j}y!%qu1;N&d1mP0|&;a0Vv ze{G^N$vj(WHeaJGF`Fy&QSMQ`%0Ru|;BN5M2U<)mmKl1hyVW-%u)?&$vQS^)Ug299 zxQ=F76qEf*X_jf0cBO5(w8*qbTW-_*5m|LXWO(z#!uJUaGEljfBYYoK1ak%gfn2L| zc0>1RF+TzDeGmZGsQ`KmPky3em`aJNf2%QsbcTNb8Nu5xCvmelq5?yMdU)KsP6IGfBk3byYX*#e9+&!zjNDdoqM-#f9u3+ zGlh3==>M?q(BHmKbEy5TH{bf*uitzF6WWH8q+INvo8-{>#@#l3sD7#5pv$$fRE$Mq zLu~QvvaGV~aoMY4J7eZi{!!t}{g;QE%~#r5{4L?7=4G}e`U?NDa8K+H-uD9Uh5nFp z!h0g;cq|?B#pR@)%&L?}=@aD3fAu-~$JW1P_v==d1Hm62I#+xMofAhe|A(+MkFEPEeWBT+v(+@n> z|IHm&jOzPFdi>CU_xloK9bbyD4FINO} zLSP`i>J)(prwBx#6^c}Z5`0|qaZw>Ov>0A1q{lkf|BSEZb2j5~e^lfm2B8WDQ$@U7 z4QA(D9DVpVvDLma+ztDejUlV4Yak9T;zbBITohF;DZan)rT$YZ|8VoKS3la9`}2)! zpV+fu{bT)0n0fRRdI?o`_uulw-RH(jzc_U0mERnF=Qmu#ZN=8ShFx)y*NxGo9;(YU zE?3Co@p|Re@;X_uf4IyRv&HUlS?okIQ>$PJqFIV|nyEQ2=Aj;z=lVZ;_UCQAuMF1( zp1mRj(M1+T#<^F7B+3~1Q`{2=PY#3}fOa=E20e|FxYyiJz7Ew|=B;d!>?Wyx;whXVd#4JGgRO<~r^m|jM;K#RG> z(xSCkTWl@%rRJrUrP@;KQrl8{S3y^yv#=n)Fn`F1{5e{)bz#B6qIL0g`R)1tq5ar) zZ_)iFKN|M9fA+NPvBJmko5o)k_;7@su|)F*f%qVhKM06197|#h2gDc-h%p?Tu zbE@Z<3lla?4#f(xWa}l_A$|yy7cAk(j|OXlQ-gDZdxD39iZd7ut_*$LZi6x%Z^$x2b;=-hdiHvK6}&WblOw$q1}8#Dq2&{kKD{;=J{PGz zQcMATBIGTAlL+3jMged<0Qh_#lZ?GYe;*9GwZY*7!Fe$GKuD?=#H_;>S~F$f=sTHQ zjVS$h0V{D5hC#KxtHseb_iP}vMFFE2f3S`D@i!tCM&Zz$I0C-~F5RtrbVLnHuDgKHi`-@nv#^mB&ug~J1fb3iOI9AO>Kx;dlx8JyFV`bt$UVCur*pbCQ zn0eDnb6hFg+9jKo`h2C~TMynpd&z4z9e$Ty8d% zO2nsIl1>e(Te3R!Jd#K4?u3n|Rdc#cjA zd(M+A%6Vj$K4#IQY{8vWUEY7!oqhi?xg^AKbPHtJasJy1I(0t@0XG(S?kwiofTfsCW;i0UElliYS0)5lT)YK_5%^)?RI?D9gD{|9FoXyRO0}Eb zzUr~5y0y#dx_0{XyGM8ZxNFjisg-Nly?uM{8a{FQ%zL)8YJ^KE!4^p;u{#?5eBgZn zzsXEAvqBY(Ai`#%f6SE6$9W>%Pa z#vtkTqJ%&eB}V+ou;k=ckRoKLoir?n-b4_`XL zoX!|dE`v29LZuuRyiJ(194n%gnM^h-1YqfVN#F+QQ1Vccl-AawjlV5Xr6C5HuxMV3 zMZ*yxB8)gLf1#L&29w2XW{fJTW|0UrmD;E+&ukb5BJs@9O~cO_2xT!7Aj1-42FAN8BIp);$mEaLd^l>ex@* zK!P}rQ8O=ri5%!U+GT@Cf@VDl6BUpv#&dMwO)kWr&;ixTA(tWQnoFX@rl`QS6WFlZ zAh1}Y%|#i0>)}EqM?|MGg3g84Q4Sr_-#MfoO&;RZ#}O=ExXLVxGea00=%vN-5RF~# zy3%#Ge@k*fB?=$sxNuxCgA9Op)@j2M&8^TQ*_pVt@q9GDLRM@Rj}o>7-6s4fPqA98 z4zpV)9?7dl%wcObJlKRt>CHWvYv=bZvGq7q3}$6KxZ5VhPOk z&Sb5DPtJ1|=P&-n(gh~?VU6IuZIdtIoHoF47Z;$)Z4Sis9eNE<9OkJZ6`k4CWslin z>_xolPmvtyBVA;eGv)@3(vbrn{C}*sVkUk)X-*&MP=}!z4Y~N~WjWq2=dH&()L5p~ zjn*8|iW}{NDTsSRS{>EnB~m>eT`b~D5VKV#UB zX&v3?t|lc&VDJtP5A`<-mgB}BLwSRK?)BAT- zUb=5jf7c675BVbm%)=*KZ?J3o9(eN*yZW1BY}0e!9)_gJ#oGg4K+=ThKL_+sw&r!> zr(uzx)2&z)kKx8yx?zhsg=LNxHj<(DLV-gFdGkUzU_vB>_d4-E0k}e15veZn&UWt6 zB*ShvnKM>2tU~9RYO}a~_J4r8&{}9Kw2!cjuva=BbXkksMV?8%W_PovIcte~iDyaH z^~whO^{yMdH)L(K?{MAezSDEN_W|uG>x=pet^?lBwNJfY+WYjcz3E8KAS?Pj)<{@( z);Vv*;eYV_^u_$ZD;Yk5VsJWbI`{xuA?WpZ5^l|liqi%{Pgpg$IDeXlzYc6w`1(mi zkFe6n!3e|u6{vmA30xT7ZZ^xX*18Qho9jO4X6|k}Zl9Cpk@_%*epUusM$9(MHq|Cg zv!!j!h7o&9@je~y(G`wu0?`9`eXGxa+5^xkdT&5Kb0Vmpz-w`#fZi)065vK5r+j`~ zWxnvZieNb)=b9QbD1X`kN(z9IULZF7c-ERe$qDm39eLC5@2jfT@~W!w_VLN*vZ`Hq zS>o8J8AcIamBkTvYqO^iRwc}Me7{pq&<`*_H+x5y)J*cb3QX4i6)(S+%!?*J>gr!U zHh1UA8ZnPsZpLT9mA<~f#W`f|E} zEr3gXBVA{{(Q*gfYQEj_H9f<^L305eVoqAB%|A2$k*Yeh-Sc`@1q18AW;|-d;Uuw9 z7LDQDGC>)P0Dndy^AtAEl*AIXd3FLxea5f|Nu6|P49ApR5OgNx1%_iXqM}ordmw_d z+d+xLaI`tv9j6^8p!AG^5D(svTt~EozZE0_-b{i{eO>M*#4h+r^uW1f z9|uk(#oI!9A52iZIrK5i|BuCsb9}QQ)pW2#-`_k3k&zG{XOMi%mAP80FO z=JHCMXyxK^lP<*X zRR7&4f>cI{jKlA+>&XN%kxarbkuN6=_}%klG6g42)9_2z8TgIhEc^y}Hh!hpM4IvY z?H2t0nSUrEy*N|EN5StINK@0aN#kZG$F5m2Z~5d|{~H}Y7cY~(OB)3-Gd43blk`bG z21-FyM?_YWI7%NAIUq0~QXnr>Z&hw-V{c?-ATltM(1I$Hlu8f*GLwOm69O_ZlOKaL zlkQ656*4g(Fd%PYY6>zkGzw*IWN%_>3Ne#?k}L*FK~+aYR+AS@!;>mgHIolbl|cgt z8$ohFnG2Sju%B3u5O>&e1jy$DIuR(w#Co6M1cMp_8<>Ys#0=zvoh zY$Oj<1mPGPiHh(uvN1Wid1xw&s>Pa=lxo=OYDmjCis)Dh3-FnL%V==3a|?u;8Y+mY zc|=J1dC5e2Ye*<-8HsrEa!PU7y0S@dGQQIH)nQ`Plr$6NF*M@jQ;?U^@Dx?nZPw9{ zwbPcDRgp3eHgd4im(mfDVpo*q5EV9-*3~r=GmelAl@_&e6B7-V0fh!MeE(-Lz|s{+ z6aj$pj7;pMd6`B$Muz5KVMYcaXxOtc2s1EvIflBsglRh#6y&4^SLP<==M;mKLBb!z z5&&YE|4;xDfU_Bu#6f%jIu3eElOco?lTd;P12s1?ldMlY21Z9uR76&jp@JimLy*ATS_Olm3DylUGwge}ROA1ab)(m;zxC5;T|qVH6pJ zFbFg#vq%wS5FBt~6mtm?0u-eR1*)xR6%~itik1$kwm-BLxF>Jzb3+VyZ9o6$_j}*F zH*1gQp0oDaYpuQ3+WTa|{DqB3g_;qKswXteorkTaf2ZhlWHQ_klcl`s@XZ z6LsTN$ltne&g8Cs%V4NapWU#y>-p#tsC(~knBADTzBCQ;d;#)xbLTg9 zU5{%3|N9Y!)?73P$UM;6lzdKscYxp>-Lj6%+6z=|6JE}(`r4~omjZUCSxTfc= ze^2(hH9Co3g#k}VZO6yF<;!PS%i7VH)OIukpadWfAT@QM6*c3%Xfwbb02j9nsV7f~OpmqX3(#iuBUYe@{Jh9YAvdngM7j#rQz0JIC`XPD23(!*7Df z&ER96KV+wSzRYf?aI5F_P&)(J&)raqYCLCLPkUZ-P4m18a46ArFalQ`^Bi#9=h^CR z$GciRTU_lJe)Cu&Tj+wH9`nqOZ1+sbmimWpZ>J8mdJ3U`TvXx7FYtNtTvt7rf1!2( zLp|L!+>?_1D^D`~5H9n=O#@M#$LZSY=?7hIS9z!(z$ttX??x$jcWYp%=Oh$ixJQRX z3bwc72agU8X9wEx(rEtR@b<{yP#`kg6NprVLQo!efnUYn%@5>r_*6d32YDaw;EjS_ z&w&RzfkvWAAOO1z*3yeSsNHDf{e%=PM zi;V5~P@9&Npm2-A8qH*YI9SGwM0Ka zS6ET@?~;0{=XRR|=Tiftb@rY3gKRU6A8g-%!P?aQsV3;#A>un@W$e@jzShmBrx zv}x|lspXCS@_K)HBS3xZk*4X^So0*W_sGn-q{ADdgY}apPbYapV{ER!u`D*zU*k>e_f*o|7GQMRY#sxe@C7*DLP4d78!i`j4`DTECBBGmd_aGjfKa=hK!m}6Z1CI zmbK%(&{(z*A@&T?vZqm)ZANw`6L}Eo{0QI*$;G=mzhciLtvI{$Z*&pN>InjrSW=A6 zphwYe)Pgv)AIf1g5$!}5@k|izdr%v?jNK>$HG|-{qv7Z++}ZgKf0~M3fa@2a*U>g~ z1S#P+vylmUH{n3%Qm99vJPEDpd=4d}0<;F5Mul+KO{k;uK<82D9gXfn2hkz;{hQcN z9bpWeFLz!=0vZMPTm?PvbPn%q0d1ECI;9a&KkVD}_?20e>@j{brl z!fl(N&9JlwwpzGp!7 zm*ZJ@0p5zYQBmq4s*PFATEsZeAp+X85>(S1v<@h60-Z&FN8jVGDJ!j|7trTA^E&?r zDbO$&B^gO0YJ%@t_-=wRox&W>!h>)%UXCBf+wgCw6zVRje}-B_EvCMrN6`1sOX%M) z4=}ClMs_Es5Wnp_)p@@2ePn@U;che^t$@+JjxM3==mw_YUQQgqMYt4Cgl{w6O`X8c z;uBOgK7%h&2k~$57x-&@lVT|)Wuj841=LpR5cN9sYkCH~jedguE&VMsfTh@H*)O>O z|FJkpTrd8*f3v9bcb)$P9V;Lo%uFd7f$l{OFxt7W^!x-yaTvZWFl%SgIdoC_eu15+ z1N{@IfUq9haSpD6?+82+PsKCv)A%HOUzKqAj)IAxWR#AwP)=$LHHn%{HB;|X&9s9~ zp@-5F=oa{1pfA%m>6;A87#I^%$qYdonc2)P`0i!)e>1Jj+iW2_fE~e(W1HFa>_&Pr z`wn}VTfuGOTDh;eZ$K{&=jZSnVRkM8&;A^E`G*gKlL7l2bU&Jm%kU($9cJTM+<-O! zcTK_TfL?P^xU-I4L03{)zzwgW2Z396q2*{jeGhuJ^F#U|`T#iPKDcEw+Q*b47rO&y z=OL5@e_Zs#cPq^L9`q8(#UY>*LaE|ilHB>&S5YV$Nr{9*!9cP<$>)VN!RfHutQND$ zXwd7lDy2d$6L^kgXbPjWa(_j=Hx{gqF+u;}!Re&#Z-9n|9u4&%>)u$!o!7*?T*E2D`kqup0xt+yBzr>A+#{odHGf6Dycc06HJ4U``(^VfP~9a6bUDsPs` zDk%GW@B?qTb$XdMhU>lMv5KbY8_Mg;($nyXD3Cy&o<~98ngJzVwR;}T7RhCE|qWW(HWxx6%CCWDq_+4M}WAbT2E>X8=*FA zj2CW8t*)(!;niJ85FBR$rUc!@q7kT{>5a+!rT*y~X4V67(de31d(zk7z{))i+zhkV%RZUSIJ0sj!dGv=Kv zJ;V>l7LcT|0Bx9D0Ca*+Erwyv0DK0;DBu}75Mu*F8e+|3Zlf{1EP-78%(7OQ%`UA{ zrL}N<{RVA6m?^kk>-TQ>7MAmRf5%_$Y-#9f;R4!k5$Plo-OVd8+;F?xL{`%Pe~fy% z)jyrgZ<92qQ1@HQdo)0ukcQwKGr|gAUE_;+YoP(m&9q_dNLF2Q1mjJ$?YMJwJ1TRX z02`aWcOrDB5muW~2G55|dKxsO_@I=L=B)XLsR25nvGBxbt)sixSX?gKx8%Qw`*9cFgj0dlD+GY%JJrNL@T2disF z)x?_19I=fwFP22^Hn`XF0?S>8H zo?~kKzSx-!8yp*myd~=G81-(5b~UskatR@MJ8rIq-$Lg1Iixx8`F(&^e=VVDA7JU* z90f-Gf2MGLH{S5ezJP7MMB#$}5`_zY42ApsC<+&KV|oXLivi~%LgD`ZdlVjU2Zc-i zGliqwcmt9H0o$lV;nM#Sg$Ml@3YYyT3YT|ddIyCo0OxW-;mZF#3J<=6!bAQug@<CZms0G?D!ZlBF2hk3$ z5LH8e3-q-?UJv~~C?ACW(Ev>lO(}xB0AMgce}Gl^Jb}(D(ANy*^>Ck6q#b}<+XT3+ zhdzR<1?tUER&;?0fAT&6PB64@$1RnJ!|R~#MX!-K%^e>KJiMMC2C?AV^3WuJjRnR! z_^`^J7eJU!jWiG+MMx*LlQ1Ph24sZPgv^jyz{j>BJ8AwG9|z#(LT(ay0E~Pn3Hc!c z5I{i`0uLNwrQkiKf>)mo5e0-Y!Jo?h7kBypu_>nu>3ozAe;)i9oPo#U^Hmp;Z! zXGAuIozDJ+TgH9HYr%J|=06c82r*edIVbNUU#6%~#FRP8r&ZI{T6Mj8llp?DKr=ye zS(~FhsB`Kj=}Yxn^nWotWN0-GHtsau00+AiV%wJ>)8pbR+=e>n}g>=SfS;(~FhC*e*k8kd@tovZWdLI9=AruJLEXHVZ4)Xr4hguozh z)h2Nw)xf?FTreOiGwNgpv&CYUox)E79~tqJQFRp9bhy@LGXKMO-)L()pR+nOb;R|m z4*RF}j`uo7lsA@rg-S}YvoOVTI<3WQ@MqvqFci$wfA-BcP!pfZtQ?iIb;*{BNP$^V zS9FSfUwnJ>$KvnA&xL(eSRKu_E$$X1xO;*x7O-%4CrEIY;4T3c?gV#tcL?t8?iw_> zyIuA<_uTXCe?Q!Q>K@;$S@uv}RdbBl;jaBMJCAeE*8zT!Bzo&rBZ|JDhxTOfiGtjd zNbp0$m-RshXd98y35Ad-#v*d$9g=p$!jt<+vbb06%#yg_-FRI)uP8=OI2(l%rq%OG zsPo4u2~{rvS(0&5G@MkF(?hN~y?nfu?#FkQUe=)_N2?~W1loSfy`Yc?<(MBxM8vHl z&TNZb=O#8VRAR`w6D*_*mfgVK5Lx>6=p4>)WHfXvemWPVCZ;A{{_dYB`b-w5Xut?2 zu1$8<%)D~{2p-Am@W|rVTMWLURpQR;PnVHMnvc>Wf78WQAEUGAaVNZE;(r-i80%)P z2*09rQV4s;{V8x4DFe<4pnz7K(XbL zPN>R;Qf2&b$`GqQGL${hLCPFJ-~I+JJ7EynfLP;HKlr$3F;cgi#eZr=4O(gEJS*yq zJHvtHcdk?LrCA~*j+y+%va|fX@_Aimz3f6$TJjUklIe2daw15triKpD60c}weTx>DXbSebC1>0#Y-ziJX3yyO+~H#gw@x+k@Na{=gSxRU${wNr@uFW zDIPN9LE3s6#r`n!QpT=q943Oe-~P@UPywz4wZ#h(f@}2sVE&fPOW(lG>>tb6d2hb7 z@e6@5CojF}o*iyzC?_pg;8FSGZ2ul*Wqn^ZySdw={o+4n-{M4$2EOl)4O3rG_>yc` zG~Y-;TkU<8Zs2ZY%DCBLzjUMmmP_h8&jedonCx7Z9wJ%Z>4 z^Et(7ikKr9WDkDBU$T&^+Ql$-JZeqWYVXIc4vNh&}e6 znS=-XH)KYn!r~#`kRRKnh@q%)y*F9>O0JH>0`<&!c$A6kX8Wy|j7aM}q2E9c0S>Ph zITOwPwyY5FyBUHO6R$EG*!Ez1Fpb4KsIUz-&5Th)yTxg84cRtb1IWF&2by{LssvLD zb)M+r4dt+mQZ`v)ex(1(jjmc;&Jw{X3t)MLDF~C0ZWgc5E#}0#`4OpZyA{(-(YQOj zYOg$3`4p;oI&(kEBAa>NCR4D3eB!9+%ULp$lzr4lY$g=TBfTvMo-SLoRf(%!S&5k2 zTXCcl(#@{I5#_VG)yK!lU$4ID-bhGthT0r1kJd-W5>JQ5>`wg1fU~h;D6A|z$vsug zXO7PXF+1HA(hQ0imVAtj6|sN4`n$x}`ipb1V#3pb!+n^t#E0Y;w|d) z5lBiwKD_i3GF9 zHI{c9ChilHR_L+dd5WC32B+Zcs~{Q}bH;+2m~NQCjLi?JoOiwS7G1j`PnBPPyD7z5 zgZ}L?_hGne&+TDELj6Q%>S`?SWOlQv<*TLNgT&>+`r)6d$`0~3I5QDCEqhFb=F3A% z^mVZJ;+eBCI4S@x^9jQER;oIY0YlXrpb0{YN|KwJBPiSwUuGCb>CN@A3b_-~iUWIZ z`A*fIn0$yCS+-k>9J4K$oY$9p2_z!VE`$Pw@n$eZjyu*Rwz1==LO`Yi2j^j9Kqcs>A~h?GOxmegT(?238~0 z0Wn`-F*k;TSWg42Nhp3zwECsS68^Jf6Ed6G&r&gHE&%A zBR}U&$gG{YB`alfZY-@ZWvY(HQh~16O@(Tg4_1dKl3Eqi_D3pyn(vAyfu>qQ%Oy~R zGQ&(*Y`~;-!=$B}&mQQCclWw!*7e6fLByERCpi*QD#tOsWz=(L(C{=qS_MBJ1GSrq zopyV-A6=^yK@yqncJpV>s}}**foJF!(Lc*rZubef7`z*vqqgsD!)ScT|nYlwVjO17`4o(P}^RrJ%$0PHm!N;P5TDV23gwu4^G9q|3X4v`>n>>a#X( zR)5WR=E$^A^Vg^I_P? zh_YlVY+l^%xn&$2@I5nwm!u~WDL+5Ob5U{vbr_@i>|!zdge8T;R4hSJ=M2x(!mo*5grpUTP?kKYzpVMoiLsYVXS?CSU|G{muVTI#c6TBmmhtWZD@)Xs(c5}MRk;0uPY`Hss1 z3(DNX&)lca+}qWJ6t@f#EmYst-$3xt#k|30tAxNutU+wRw)5|U;-*ySp40n5)TD17 zqjNpI*=NS2Xk@qFVGV5U2VN%n7fz+GNDO>4B%Ww$jstpLv^-2?$%j|4z@hw%3jrY* zMd$PsC%6J4B3ycV^IiAb0>ytx{ntE#fK;9h+Dy=Pi_S$G8KH40_9F%DDVa9y6x>{8II=wcxm?n=Y z#9vqdlu9!tmpLE0R0lx0;HtYUtcLNXH;84%(iZwn%5NK;fo}XL&rpL0nb7 zA}3jC4lOKfsJ9f#-M2KBKmn-asUIdSKkY%Ff>e;X4>P=DwAD9yRxEv%gQKk-TGBL< z7o2DWXAIyNZz%jV1=fW}samPT{oIpv`$Y*3QEyIJTN%Y0Djgq`tNeS%-x|9RVHo|l zGIo1n#fS!hSz?yXD9zOg!#7SaNv0m>_v1Q_Z8Ei?mNuY6N@O&ToQtN$(hgZSt(zC2q%wU0e>VDTx&IB!D&(5hg)?5eg# zL*o5hFAgEPZ$ssFoV{cHcq0jCFgFrhR%5;l(a$3vS@d?3L*V+(GW& zcE3D5-u~o5@t33L{v9SW8rmCmx($B>|A~5}z{9kRDkPpfEtq()O@SBOb5 zU3YjWV!&#^W?@K>L3ZDz9HOR)aXD6_&zU7blzqEj6HJC|jF;ZQ?Z0blM^@v_Vn%lD z>o_B9&GS6IH`$kd?R3381K$Vhwv+00a;U)EHiy4ClK%JL)8S*-Wfry4gQywea)^}mmQKb zVp1X(fwR6!kuVkP0&O)@zWsCuQ7z5K@+30$DIC$sj)umCEh3|G?cwF+O-1b4{m1*; zvh8FhyAAK?ERxrNb91cHl?qZ)nAm~E!5X6i4!A`ObZd3j_fY!U{PsA0Fd+UVf?wpa z$(GZMXPeN6<~HLTunBn{+mwNqfj1rS(yiaYJ*keLj;&p)8_$qNtudbnp<0$%$)7Ab zI{z9Q8@J28Q(wtyYFfzsjBin>SIQ6`TL!D+5KEh$P*4ZQAQB+Bl(~cWHz-@MkdenM z3T$h-2-Dm1+6z^gWvwJnLs})ZEBJeC2_{ zuBS6LH|3aKW4V5gukvQfF%0>V{gAK|K5V4EeHE_4MfjLf!u6UOaG3IvNneFMKV7&{ z*F`-v=46W=web)4@yNK*Zux7B&1fe_M1V>C*u7X?uDxhBlYc54SO1yJ02|GT+s(cC zz-P=DZ+cPxwiKQ&(6c3MQ1U#Q+}3kFFD&`uY4RAtxB>a|^T9sM%&wgf7^1hZ1apExPzDSSc9gKRr+TV=$fY5}Ojk2xC3}FU08Dt`)dP zTyZ@cy{r;iK&R6h9rG2nO;qhu26I$1-H|u_(b6m<=i5Z7kVYsG(aB55c)-uNzqa;s zwgw_rzKMyHVW&k2DHe6hbjWn4YD6q63=4c6*4ZuvK56XMjS1gahbR*bRr-o&_Gk>% zou=UaG{E*ZbcSwbypEDv_C;)Qd9%Y_?pN60*bs@^ZJ&>B*3VF*j68-x+ z8Y$b)NDMVuVJ~{p+ExbsWC%%wPUjj;zy70Ga=0nZP60I|`WxdGN+ux0_E)ky?u#{t ztxtXLKG9!>Lyi{~edezv*0fr|>zsUMcljr*P1ZhAj~6o%;htBoCjyxQ>-AHZiY?Cc z7Tqn_b>-((N!C1G4ue6BwE3vZ&&k8XC8`r+77zU7TI*yb|3~-7kx>-i(^jbd z-to!trGR=QCQsjSF5cHGuzH1__vt)z7V%HB!9GgN&0a*%6D9!4g`3D+kKHi~^}PNJ z7ftgp$IqrQrZ6&nbfQdKzyAU)Sd4JS2%+=vgvou#(6Oi4;H}v9?TXYmrwNJI&9LQG zQFjL7*{ANaV(P9?K8LwMeBaw|A=DGwEMxH3u~M?7&FG->l;6YlaBmK0=KvC4LDpcVd{rgFZ~^>m*;7P15%NBR*@J6V@i zu6OeWN`J;7IzJxlY5VM?o5Q28i!&7XS<7heJI9k3?Th?P z5Br2k-cq-xJ0#-GHYiIR&2UAV4_GAV+{P>?9m_(&T*DjKU^Vfi6O7F2^XsYd)R}7W zIL#_n{Jf8JA|XqcEd8ucyl=2x8<#m3F(! zY1ZiQsE(P?ic+W>GF47 z?Xd5?1n5@E;Kgy;zS2Xqd{r`m-Wj`etU8nf#G`tT3L(omwsf}WT}d?Ixmlb(o20QG z_>Z(?Xod+Zw)a9<$f5eM9e%}}7^zF1v6V5O8{+5U6Wnx(Q`IFjLb!f+h~6Z!U^KO) z?@r}t59dp6chQ=+YDZTsZak%~x9v>Vd>^2E89JGk0mJ?3AbUg90!Q(MT}<_k-qkHl zew%2qobwXN`uV1<<83l+gg-COxHL{wXjg)#t#LUujhfsx2kAJY$BbZkq5K=B)oKT@cVt3+7jBqN)_eW6_b|oEKDJy~2_sFy2YA}M5w0J!=Gj6&F+O|NBsA!vQM}9(_Gg*-2 z$~UrUj#>=EAIp7fZSDPz{o%pyx%`z#x8R3Ub8z&;X7h{5CC$FVb}g>=)ekZKnB; z763z9ew!HyOcr&bF8CUlHw*={fuWHqMHH{rAm%tIa5KnyNV~Rdc|c+bP5nGfr}yW& zL19orX_E7{V%Ztw?K{RPcF`-QuO9t6`cfSC9t)Wd(hM_z1dF<*iq@dL`3x_+T`t?S z7UWBZ8Fkl@|7tkm@=T6TOIn^)wraf&(*Q>z=l?t&BKeDV;f*LY(2dNLeB!SweG)vv zTd|vWg_tjje)8|2)97Mt#1gOWE{3ZPVD=}gg$G3_{<;iPO`r= z-huoqmz&S%5|Qe=(buTd^@Ft_vF8=WDo@ajVa?5jpfx~itja`T3it49eYy$A%^xfx zu2NP!Sc2O%&onn`jDj5O+q~?NOz#_P)XhMPrGe=Ux%z8=mzVb7?8~s80hkf5lNgxOYlVbcy-}I&1i#Jy>N{n3O~iswZWgh zW;P57-2+?x2=HqH7Y^y8wAH#j9tyZx+S9($JqhO!Q;L#n#vB z;U!-gsOBp?4A#%X#=WSrwTz=c(cvA2O_t_Dt>)J3LvBl*)qn|K$wfpYSB&zv-oc*5 zmIe#jxIS7tgw?=!GKI_ZUskJcqfEiM<7JkF3pU|4u2AmoWzdzA;zMFcYJut2eyQ@| z-Qek3$w7 z5mTgSFkup)49r6^DJ5wbRtL%Q1qttB-ZT>UTWzZb2a%?GH*lXeeYF&0XR9Y$pANc* ze8Z9u0K9=Hvf{#uipL7vuTA?l;fxIm!}X(P;5nj|xvy(LsjVtYm0+))7m7N)r7}K! z8(by?QWm|^ck^#|SX@a7>Mb`>m1l#nA(2(SfoYJSUbzU6@CjhnN%Ejb{lc+3Z~V znBVY>tG^r;lkGDq8mcPB5+(>mt4qQF@c8QqFfG<85JNSnj;Z1C*wL5UedNdxS||}T zeQK^BkIMhh>aBIWx`W-^_YxnX6#BI^-r;Q^7f#msFE6z!f-7g#`#OCNadGtqN*cSm zeqsJBl4=V_?3$Xd)@mn9brD=L%jxl3{9r0FVO9N^V=AJMk_#-qGX`nYbV$Yy>?^z_ zsg)ZaMZcO^M99}c*W8g|iK5}*Sq8zZ&IyTX<+DolQv7D9(FS8ViW3cKr>AWxxEc5q zQ?S@LdmrIGL*dXWB*2s505q@iTm{@@c{}tMW2e81S<84|+g$TW$jdD^SiR^z4Hc6A zFzQEah z(Hc?-6w{fOt5;Bx_;{Hi%A~J{DnE$gUniKtMfo%fwJh(_`i8h8KRbcVlum@O_x!~( zVK^bjet1VjC9ViIi7u%)u{iAoITjb@Gt7OmMfUo03aJ&{jP-f7o@!n-rFlu$afYx0A!KTlS#aNP)~C6WmFhl~_ywQfE$+64m1 zWU01RtJNByNRF76qliq+w$>xNy+)mj(RWSxh5C~>-mlq`Y{VWk{)WL|+(HgCvbz zjvfD!&32(RV(%f^GqQK^AStHh(xPy-)q8x#s|fmw(`y$jY1YGYxzL;t2iI0;31Fm` z@^iZ`_fFnq2mj>GPLqf5!o#I&60N^#T0EQa-UK+yI+djzEWa0GE*3VvH6r^J{8E&} zzarv=-e!FGk{VlsCCC%uEtWtokQY=(K|Kvf|(u31^<-x9=`Ofi(tVPTFgH{Cdf zkz2WhQwRu+{e|mlzN22y?|-853Dk7D33uIfH@OZznaatg*V^Oo zfCC4r$-14ey7)c3Ex5V+3i+1Eu^H^KAFZir)X~kYJ;J`?4*@`R9IPu<>u%kW!zg~! zrq%epYZOn=8djgm5-H`W&4gUPyO-gtRiLY) z7Qu)-#$UgxrJeJx z3z(c>oJP;L5v9o8S$}8+FupKXXnF~;NrCEFf0pfLf z%grVMxEcnM556qSlBF&LF)AUJjjj{c(6rs7^*g~)vo}_JqD|!5Z+3Izz6p>DhG0<8 zKyrckuOKgXai-|uA35@dhA9=?VOm^i)_u;FsxQ}*I~*3?Azn&`^z!NUQ@B_9y5S#&j)jwcwZdnevo!3i(X%YT4Fke2*B0(fT79 z=JNQR9*b;{N|HN@D7UMbNDh1%pO2Ss#Qo^?2L@L$wb1LpA6?;#SMB4leqTmP?)dOr zE%e;BUn5!dn6W$-Dc1W{EmuP%mad{bf7yi_8vv?shg`UfzpK%j%#tnSY!jF9bQD#5 zM+uc=67qiAVvRx#j%ZK};b3?#8JhO9%7>sZMdnv*V+YVA+SaMG2OYSUKE7fd&foY* za#a@tmKM_6q5+Z^#b2xSg^1PU*-$TYGQa>D={|=fqH!8}`?v(PG4*ma&HUzMf$Nz; zU(CNM>Tmx^Yc?{`mJx^OHL>0b#`*Rx6MbOc6N8>0%xN8Jj27m@uI29@4w^+j8L3iHI^3JxecQCL z&{-qYU#P8HjKgOO@lLI+E!TfXvekD7GoCu4!^%T;9Pi0B7EUSHtem?aS6p*4%RHfA zy2Ukq+TeUu&(byz*uy9XI_M_#St4%I$nS3O`xE-sHBxzGL05w5h!lL@$rOD?6hWoY z8!p6O+NU*PZT)}6Z?q7j+RkhQ4#b3tHeA>o@ojBo`WETC0dQsL>~_oT#P)`2Om>vv zIX4#Pn)C;D;SP~X2xIRd_~9RdUQi$^2X%cIeCPy$f_z=tKBhk75I-RdAV z&{l9u&=}BM&~}Jhjy|^Bt^5f5>n0Ix?MHufZzZcd)T&yX-kJwr9XxL1zMnp}wdvlz z=-&G2I&)om51v2YmZG1iGM}oF&Xwsdl<7{Fq5bM5o+Jcslu zCm*wB%lI4By}YZQpxcj-J?3%mN;z*!na@=9X39ElCZ6PEkKWGlaxgKl z{x7CM97_O7oQ9tWoS2fDgoN}*3_B6lf92-*H|_%02X}!RhwJ~c6nJ^bm}O0D%$&^0 z*g$op{y300|DrqmH-Ulee+Ue0oN?Z^KoM4=|F>Gm5VgSt4R%PxFK*RvZq0@Xy4(4~p(R{mobglFbDFOP0mGyb z?Pe3Ne3PKf$BE{HvyBDk<2?5C6{-Bvf|x{)+R7L+a-<(=l#KQ~uYjSkmEUSWn^9)W zP@W?#HQ?ZBzL+R@xK*uUgJp^z=WQN!T2hBsUQa~c%7@bCdOX^QFjeb3Z1s>-h+D0y z;xsDCsp~gT;_QetYs0^yGL&6n=aDkYk7%{_ZeqdvnKoLC@i_POk%%gG0i*Zpl%{kp z&k!0TjtNf8tL<>Br0`tCj^=It<<-b>p>8(2qegCm zd$g^zmaZO&5)!31|D&&H-;dz5>{$oq`{=Rt`kB$9M;N)hH2SDo3z#0IbBj0V1l@g* zlnR{tUv>cz$3u>m1P82fC!|@=(YX0dCC+i-i2|K_?FHcN1-)$3MA@}Hu)1XWaIs{i zOa=DHX-*5Q*uH@;|Kotx9QVkmm;!j^vf|T%dQ1L|K8HA9eteaOI=CvBQ;}x!j#_3U z_XedO#PHo+$85DmBHlHfG;<5Zs?sri8k8Puin25Kpj1j32$mq(klc$OeQvo@`?(F%;gE5M#pjd#)(Ay z>~dMWN-^=}R1U8(kvf`bm6}V`w7Xu>)u>g*^uBMCMpk6uV8VV|yR=RXPF9^dE;o0= za0v4y^;ay~=6J1I0p)>%zi2@^$$S#S%-&-7;X#rr(M~_9%{AL@pUwN9mPI@^E`0$tm^9#kD`M!8$xVjc_^_}pRx>z`WwDwb7B^LcWNrh@Z*_J2}W;8eik zxtifTM~kUz-nZsy^Jleo?f5p1&r!-=`brn(?aW8#R@V)%AF80mWra@bS3*YCG7$}x zH#`GhfIM1ezf_GHTCK|WOq&LXESo_e61U|9dXd0H(4(M{^I=BCQpS($8s&M1vW75N z8UIuQ#7AduDEW5}ismHcy}0%B$aM;IPf=wNg z*KCn8^SZ+GA;R)sslUzjekA!xO^E3CY~13umv}9o&f!9xQbm~S4BEtRZ?twBXYf}< zBw3c-aW;0*!vz!xZU2PE>z!Yn-CL3ppo1-Ob0${+Uct0DZ&YHE@5yn%8X( zm>@W)R?lEhEmh*UWaXzNi8%w3aJ<>v_=aka3>F)#$aM<6ODKBS-@reh+3c;iNn9Y_ zBMjzOTorfNc8QS4&wl4hU6=uT>1U^9=7Fb^UYfVCRr=K~-FH6kY{ttbBo}}_5 z5Sh^KJNa2__W_#2I4`T*&^yU@k;4PCFO2>${lT)&Y?56g>mXmJcOK!{g|{B|!i~Th zKpseAN2&^3wIH@0IGLFG{)Fz;Pw_-BPQvs@S=V=F;yKWUziV9>=l%-({SQXxBA zr!ygtiNRx)PasBY0J{M=o<+0x^N#@2933|mbKJTiu(7M<1%4O0r$E@yIU!m2gdCPf^{$Bn)yI}FWc88uG?s#H( z%2UnFY%s|m-u`k*eW{V1C1_ck_^K`PvxWekOPKYflDh-lvq7;ET%*0lFo79XO(;LT zzEtsS{=q*^nugr5zQlON=P?1cSQTx`6vQ*W6O=ik;~3z2X}K89ljap&Xgm4PQrK=9 z9ydD<7tswSC1oY00VV(ouOdldu04Ot$50N63B?Qb1SlAt-K4Lose;#OWOBQ{Vb~=F zs#XCIfrZvHy$W|f)hyz?UDA# zajU<8D(~vw++n?t+T+3loy4V|HkX{-;MDe~%#TS9wc9r<4K{(BS`{{m?HuLM%4&W% zYdvyvX?p|*0XJEzVmj*50Q+-S%(N#^dcG%Yl&SxR4{6XQrIVGL&lB2*kLMj}bE$gqp%8-~4ew@BB zj31yI;8c74Ec4T3cCn!gDBp%rCgT8W4zemh>~DMa*@oTwk#e5?rN9nP@lu0dXR6@* zJQ|iVskOF{!sPn!M9iH+PqW9}sGh?Zu$o{3uJ9c_g({C8J{(_~f#yLHII5bs=!3DT zZ^JRC)kINf5l2xVLF!cr>a&xAIwT7!f^rNUzOddT?VW{V<$XOudB$vlbbyu?x_Y#qQGNH!n10_jX}o!`Tk+L=Z{y}#NAtm)dX3KX>O*4GTAJSGD(codmRMs zyLf?_5kgUiy!MRy1N&i&{87@&IS7~94tm!xTgRBSZI^)cB`=4ChzPSc=U=wWu=~-& z7pI6pUf&6HJkT2TTux?y0?A3Jxt@>n^m;ML2#QrOFF2p~{#c5-8`H%vqJ&0ujA-x?IY)Ov3H~_O{T>h)O~>Q)TpnEk13c zm<)Q9G z=dGs~238Op;7p;ltHlXlla{%2>bS@1-{EP3pZnv`hY4ZWxIQ?h%)_||Y@Dnh01J>S zZh4sSe?MM^xxR7$Kj_2%ddO_ZkpAn16$s*F`zOW);$n-_8=*D>{ii(#3+Knr{lEL* z0r#A>Sg(8J^0_61z=}k{f{mII6(i2f&LR?XXE_X-#q ba&$6qaB_1nF+~Eha&d4XQB#X4h$Ht&9>X{*B2ZKB4`al7RM1E)D!{J{J9}a)_t55CW>C@q8 z|9yJmQftlj&`pn1_~+^U;g@d?Z69v*hiU8{yXiC@+O9i34$Yf?_lLiG^QPs^H~)V4 z{o&zPpB;XFeC!Snzxj1){X=SelNw*8hF|&qv&P=~BHekH8s5#@bj6?f_-(p$`0QY> ze;F<`58tIb@BL~2R`u3%Q@c<_(C`>grH;m!X({No#7W)S<;=MiF`|LPjV#$kRu zAKLaf^5^}b{MpQZZI|yYemouKb}H_5C;QR%{F&1abp4tGJ3mh!@aZmjopv>!Jup$JecljSm}oic=01YXcJA{ z3v^8yhr#jb@VTMwRUC~sT87v?&ixFIwq5%;9^Slf7C8EUi>L1+zBo?&#TWdy33L3) zlcUGSFF$JncK?0sApQOP>FesfjC%j<-*L?U_(kff8jF7pM9sK&Wpj4Jc<84AV7)(h z`=H6&)uQ!uI34?V^>m!MqZJP=p`GsQD(yzC(=7bUt#JQ*JlfU%a6a-?>p!%finc~# zR~v89e>b#$@vZKBrlp?L3SZ*Bx7D(d*tIaGa6gP%J%#z@Iq%1h{@6XX)A7WI`^T;# zVZTT#lKwgg$&38nvBRkeB<%KTX@-;b%=-XYYrngO*-fOrfkL-OAlMyF;|Yuw)$N?> zI^A;IdHT16k6{+g!w-K-SA6V{%{*kNIYc!4zr_rH8pfgj_|qTHkNt4!i!o(R@F{`s zqhr6rify0|H%3+W@E`xAL4eh-ArNX=UTyg|-2t&4X{T z4Um5FhyLpDz62#w*lh~10Oj$qpZe)=^2sGo7K5r#!oTnQ(64-CNG8ku>%){b@V|am z($+fx-#!kbXnofu=r>7NeJS++oJfU}R`1b&(Ke9=pP)bDxE`Nv9@4XytFntOm#cz| zHjn34ldfonfB*Ur(>NSqwD^n?7bDqzSW3@$HiN3x?op3si zfBd1`qaW6F`7pa9YZ2ghJnR=f&%^OBj}rRJy)32w>E<{Kjr`*ePWbZJ>m4pWuqvE3 zTf!-nGHx5zHHlC|&(&TSR*W8$X)swleDm%1Z@+r`vDiNL+T9;9=twt?s~LrV^M|+J ze(}e5Z@;{2e?}S*=F+@*D&}%VKkIF`m>wQhBJS0PKYsV!ySHDkIh_=2%%vg%HiNU2 zvdi`L?e6Qm6vi@VxJh~{$>@v|3y2J1C8eJJ=>Pw-;eQ#?d;c9N7 zm``)MI`y%qZo*h-U()^5R%?)n!LEf?xF1HXp2Do?-{&X8&t3Gj@6V5aHq#TP$hb#b z>T~Mq{O&sh5^A+1opn~#TS&?3Z*=0o%S_4JfQolj0L zYvDfIt>V2`P&mQYW5~P&#?cn&WxZbVnx=rfL)CU=u)F$J z$Pm6FI^55b0=q@xE~t2aMtz*;E(~_L8J;CNtwlIf}k*e3i$rX>ds+P-MQ2{ zuE|jQv9Eo^cfhVI2AZ+2+WG$#uUuov>zlojM0yM~^BED_KD&l;xAmy1Q-inp7%t(R zRMCu6*>oQ!^a@lJPej{JAd-f#L?r0VPqB|r!(%sye-}V_m3?f6{3TGEhaJ4?aIbN+ zTGO7X^e1$(sTf0l#?R|eZ5|Snx(`(=Uf%c9<7vhqZ6k>5x`66!RING{svlpAu6FO)nd|H;qW_Tim@ofJG+p$qArAFL0>!FbN?10`mD=$PFG3}@^ha!y@*X|m-3gRhhtX)kY8}nRhHwd1vv~| z?0-+)_}l416-XvqN#Sb0jhZWf#{hI3L@IoWy8-`9K`(-|-H2Fp2&Sn!5<5_mea^RQ zv869D*Fo$3qH<=ry_m<%&AkFau zT%sd8a1m76TWS#)=mwi|0Y zPRkI<=HctN-+cA;_fSapzwbq|^{*i9;rl_3n5HGVtR3uZK;&9zh5NxftDYnRBf`mnZ7ua5+YJK=7rjA{klev~h3LD` ziyHP3Zl)#;8;-7|aj9v8rHe3rpXfeGUS2yF4AE4kb9+V|IHOH0u?K&H%Z2Yh{l>Sq z+Z13_nNVI?5SxpP707o6J+=2scYpFH%KumKS|5#D0-XCg{jV7*?()|n@<$xa3a}}M z7qRuHan!W(wRKXp3I{1Tm;+LtLFNT-^;=Q-8s3S@dqzvv3pRwmW(7|w4m!=a6T1oE z7GtS^+dSNBAq_s3l@Ua$l+9gmZso6`?-nCi0Qa`Prs`C{Eu3n}Kw3lyIDZHona!s4 z62slpJ)Q=Oyjk@qrd9O4a?8fDuF6+)ooCd4MTZm`shqfs z;qWG9D~gB?h}D=33w+udVOggL=4Rtz(P%ZG3;)xSe=!jl>NVudGjLA9R8QcE{m+M)k5 z-D0Sg!7V1&W!yA-mnchK(ZBzyZZV;E;j2qv##iKK0LO2aU?r%$gnzkW-bG1>8xQ&&TnIm$- zpJk2sL#^IbQX-`V9*<`NYfBK2&XEP+tMXp#YZa!Ly%7CIX$ zKcu$UPlONN(!U+ghQIvV+BN=t!l0}%@U%umA2!52E}?}YiM19vgzP?i6)UMK|0@Rd zWOQ*k%T0044}HV_@K3ScgWpP?hV=Jyf41D*d1I~Mk@gdFCV%hVzlZ^TD>C@#LOK>>5?7 z19o-p`tH=6Arl>;yO8h*q^k~MVQ33~=TV{u%63aQ0c=W{j|wcXmbj0lN7_|k0KRCh zS&M&kKYz7Di?SJZ4F@-^bRQ>l?5ULl-}+Ze_tmvswNWiw-0ypYgm4vxFL$>1p0%uh zZ-=Y+&EtKw^uC_8QCm+oKcD|5m=;`)AomHcB$Fp+Yo%n2+e_WB;M^_kOyAC`E|W>~ zhg#qf8;FwxVZ^L7D}osAU{?SRZy2q=XX(wh5q<|3tMF9)JPsE55 zu}cuBxRio_E9Ic@*+$EZ`)qep_ll9Sb=X?U1I{D7len++X&@%LeCZi0vxDAeYfOO< zfnL5io)nRg)I^8`M$6=s&R|bacV6*I20lP3TBODHslO5^f#)SCee^lp&ut=+iM~Af zqJQm?T?c$m6sLNg#P+eQ(vwIt5J;o3;YV7J4hz5tGs+`;rS&)_Uv6Fx zmlhq?4uhX+Js>oM$5OH`jqbnQdQ6W)Cx2PONBBDHaU{?9k|;To|5yv_zAv0i{nb~k z3S;+<{H>QNQc&lXG%i+$fxna$Z^-H|V8tiI)ma9MJi(f>CxQHnqNu*mW z+QXl|{_fkAbeDT9V{i!^1{Ry@-7j{*J!(*QLk+r1V-LdK5e;B5>EMnIqbhJP5LHHJ ztS`qn^q3O{NyO|lfCX5tm?&0-KL^YGJaa`pqmaOWQdkUZ1<^jN3*bGv7+6YBHxabd zR+Au3Dj^m^7JpET;!M}55`=COk#Pn$rXws1Ee}GIA`~QlqsB0tQ|KPE&@IK20t8CW zR*EixM+w*{n zTpRg#WGr$oAq}cdsC4WVh)Vd-<7m2c0Ky#6-8GUlI$ay2!zz@V0IlhCqP*t`C^M29 zx^<7cnKc%Fz+&sH7&xxPzbejy1;DO!pa9m+v;CFnHMQ(73V-?=?_fl=cL5T;$p)Zz z)ITlzUh$V2mniRchad(SV5v(GO|YqDf7_{vf9Wl>DBYxY8FiY)CNvl7>4~LN@uzhg zY^|KS&9q3J|IJ6|M$Xkfdf3dTPdAiSt*}kR?5hTU#4Y=3wOdWNEiJ6BKV}2#d$+K< zMC1dk)Eze+yNFcLz)R9++&~txO-FxbHp;u0wA!_Kc2T^q`mhth+=Dh!%g+D@R!C3v5z?1<-Dyw^mQQ%8OX z#y#jYQe|JQOE!JL^C02iq6(cTz!49Yu`76#Xe-@~qA3G*O9cX*$T*l}LL4Z7Odjgo z@abq?gp>Le8-MZ!wWph_^hulh40k*kHkNIP=;3N^;jzMf6tBY2ME|K`q!z_Z#8kW; zTC(jHt#}^>!d3MoG3{XeTZ{Yps@jc>%C6=X+-Stc_QSs5`}85P$S&c6jp{7}Xwft#hZIPHmoU z5OodAShNzqMndDTvY(;=G0!Av5b*POoXDs{LIS0PTUf4VWC0;k#H}+XZ)zf9sGcFN zEg4y71Su?>Fk3~5QL|Y^^GIqVJ?%uU7Pz2Nd)H-&<_rcaHH%`$^4X4zNtaHeVeSb@ z3d!vqy?@GTVpt8vvnw_v3C*>WL9OTck&Xeh_-=H>}-+hp4GV9Di$irLzL+DkVhSt=LwFdP*5;y?I_j z`<&ZNXs4%?#;Er#y4m(n`1;w}fX2oWe%TOnvq{g0=&)+qfWS{p^%VK%E>w;$FF zgUd|`dwL{H$2tsiF2J%0%Y|gc4nnd5FV82K*D@#o{p#0AjdMQw>633tl=_=?{xBO0 z*X(6*QXXu$WRC0(Df^y7qF}{LLm4Ho|jBt)sQ1j2a*(32> z2cwIie&yvg!k{>TfaNi*=!17@-hw?^!KK>m6U^bM4*Mea?$f8rJ&?1(E`?Ln=pCh( z*943fVrEO>BSi+YV41rLLRJQ3P5xLrn12e{JQ`z{dm^~7T`G6f%cm#gHGduuvV^Ws zA-E0{)(0Br&gS)1`iaqyPyp<%|Zw7(n+9sEuv9Ox)NFHI$cQ(7o+ z9#n?9D!Z*2a$tJ=(+BxViv3#E%x_`RW z;o)2ZnT!L>nT!XkICy-)9jE~tUp0gnjI$8pJjnYnZZ&%7 zo&aLRJ{8vC`_Txy*wfDl9~Q*@{DBN{GPk3A?}XDK?W^ICuGy$RoEE{+G0}*ceqZ9} z4OW!YnQWBDS*Dsgc|Lm=r-}~P2!ANOnbBR1OCa`h2?`K91RSd!ju8}bJ@=+>W`=~I z9|GO-hj-VR$-?B8jIuh*e7Hev6mmQ&DsMYUbL?>P=LGS^SRrYbvzX8@legyCXi;#9 zNUonzF>V!dXm*#Ia8*$azRexh{;V%Yq@>M5mZk2*`)ZHzn4CW5Z~G(Ojmr<|*)^OuDRrl( zge(M8LG$eM^7x^7)mMFlX&4TI6*q}FZPtzBvgo)l0>hzxaJ?5CbY58w0(Wm{WWCur z0?jJR@y$rv^30vKy`CzxJ1(OhsSN!DGUtIVB-q{2@2K}HM{EFe41d52PI@g{$)wAj zcoom3!4vDfKO4M-Xc>3h{XqydR7oSZT%|m~6|jClDieZUICab%t@HD!;APQ&vPR>l z8P6SOACPXV%3d8N(phOsgH9F2;!O~I3L5V)e+;UBOhf`UhY<@SKB1PHA$asr(G@$2 zP5wL(rocbM@RDV8+kao7S+<;wNKm{5KFlMZ=Ms?;gaUWLntLK1_#M}%TGz`JKM+1J z;QiY$!K>dBX7tb6{1i_#=uz`BtzS2K(VDOME%N zRT$#N!M9=rD}Ouq_XnlY{eeCFv|*xW{|Imy{ux7I9cQ!#=pgpsd5f-O%9b49;QxZCsj|7m#IaGi~-Rh;63@!ejkQ) zOJXFP6<-`EOHK*p^-0WNOXCg3T~8bfz9mjn9c@cvMt_(8m)r_?8v#8VTUryRLL@X@ zo~hKrTWwd;Up7=bhAZ+&^Q=76R?ml9v1#6F73r}n)(AJ{tFsR9nySGJ)KI6fsqfmg z)L;vD6xI z!O$H}rGH>RucLa(@R-QKu1ioZYNG07jqO9th_r$yz|yxNEl8Fe3nD{(C-?-Pja-&R0R6h@GS51O+&?@EbAr+9p#(i2c7(cNY3=no4cxAcx>@AhY%@W|Kws z34bGuqE0S23|r+!GLsw9?+EHr;U99DEWppd_+#7XY=%YciL4t|nst?nQ5>o38q~9` z6$vL?T~d88b|MQ<3~#}Lp@C~G_|=Zkn6Q}+oF^Yf5Os(Z7QDsZ5(UoF5=s?i_%pyA zvmKbOrn!E6X&ySrJQPXpnyL(lb_W$s=zn3BYf+4D54`h98ml7D<_29T$b$Egn6Ut# z$ekAOeug&#vP4)JlD0}B75g}{Jm*Gkw@50#!`vTnMg8KD;ta{OY5e8v#>*zxwcNaD z3TYmE@zY1#^x)%gB-l#iyOz%k#Mks>j!+@FSI3kVU<#|>)Ukj&Fn;YLMr`C5zkkrj zujEMFg}jPgp`0NyQ|^B^_GUR`Yi2cx(q1kK_vgLrJGWZSC>Xsw&Sg?OzGXi!^Ls5k zFPLyqYJO$D8Q(7?z$VvZb(pyQ&l~ymPgjw9Z&)(Xc@&8ULdA$HjCf^Vf-oE^mewN! z=&!zwozOUq$dtk1;J|xnL*9G!ge7JJiylK~D}J>D z;&{AMwy`n{malE^kf;E)C$$uarM84$Jr(ZgS8S8|vTXZP9D|@c)-QBSec9L5w!ZSO zI7Yiuw(09ECIP!wUqtQDR=-VZ>+ANE-LbKRrwDHLH>~YXX@J=ILq2zEt!k{oV0_&!4_d0*QB% zQ>fQJA3dk(^FGAyQct&3ML`OUPz)YqR1oLo?-o;v79iXWztXd;myWjZcd7ayksnKg z{Yk%MuM`H@Z+f!d=~*Sf@PA5tHvCG@f=Lzvn!dtF?O9XrDX*Y`*%<6{yc=h;_KRo7 zfOP3@Ks5Ubi9+dD9Pi?Hx*JCy?}cC1uc55XTs;|TN0=?(dsVlqk=BX_Lvv8$R{~l8 zDdtPNBYjFp>|##BzV!E(5t})aGv`P6(@sOvqpGg${F=%;Tm_nPM_aDK1)eks!3CbnrI3F9*aPsnD!uPU`^L0kjDv?ikK zha6-k<#2IerV%?-K05pIv3tnIzIg^C(pBz`H*G_7&8j)|Z***=@X8OI$c!zIJ1R$a zpK4cpDZtCmCRl-2j(@gw@Z_X6q8bZBR}7}TZH!(MpfT6ZSa2aU%D4$mtrTYWvXI({ z6n=a_o@Cx)_xdC&c^S72W;x^dso+LlG8dUwZR+I_6Xvnn>8FeH!s_iVz^M7Ty6uSk zoFiG|`o_lBH0+L^FnIG}}v!_YXT8sdEH^Bd_fPeTpGV546vK>#&3cTOPui=PGWA2dWNG9)aScTKqNdCfWflc2|Un4mTkW1#r>w!*YH60RE^{3V@Dr$js%&Ua)==CDs`U`F>cc6 zHWS^{F@H`Oo9=Kj|1Uq8sSY+EbliR*dXu9Nf1orWnkIMR3Qf?i=rI(d837@j82D+- z!AZXpNpkiRzm2ru#UnR7hfoHlgJWf;b2?I5tCTOQu|ZTA@DZ5fZbGTUb;8MbLIm7F z1Hr~&aRy#I4g*U;UgD8O!6}c4O?6O7YGq(tAb&bZviPYU_})K9NazB1UysL0gHvKzC>t{ zaCX)a2pga=)Zhh{i+CM8v*_*uw`%XBm$pzmI+^Ww67WaIPb(4xS&iiYLCDXf(tymo zDu3L%HU5T&7(JT_nuZ5ZMHb9gE$GT6Lk~){#KyzmaXqP5H26)AoUlcyZt_r(V$8V0 zo&)FDM|g0-dIqLtFo&-84D}(>&zJ{jH}MHGAMLCT>PtmtxCy>hoR5N}3UH9R*K7Ap zcn&vb%7!MD6y#9_omp=5JW2{L3XZBy(SNa^?0-E5*4?O1p_yvGf`zz8c2f%rDb?)hB>4yMn$O+j=Vhiibdkrx+-GS(~TAv61nPoVT&x zaL{D>V)2WR2a$e_SIs6g)stN}8-qFxfUz%!<`#w>#5G-7XrU?uX=q|>fsM>k*9JYa zCTqDLfB1D$m`m|F^4X+)c@O>!9DjII&ou&LbCuCnOvl#JEV%o{5#Srq(dI^!ywA-go+#cFKBS$p z*1CA|%QuCn!-Nz>1XzntXKCJnxvIRGeJ^NmcM4k|X%e=mkZ5EzjNp~Lv3~(maD3L1 zYfh*3nk8c3aifi%ft zRM?MqiuROj6JJF^6z@I5EPo(nV&+Hcm~hGytWbSp5WIL#c229wOfOQI^nV>23^7jS&-jA^ zVfn%E!ymK>qlg6iw!v)y)4)#m?5NCFk!it7dqW3dYlvASb6p^Sv{Y#$es{IqE-9=xH+d-2okWHkkEI3LI@14Z1 z2ptY4TukvZ{=LGUe18uaTBW)aam338on^91$NDPohC%Hly3&WX502gkK?iPKR?A`J zkoj1E=AJ6s>!3lZCb!;Zkw|s4cdXf;_lq?FG;Ybyrpkz1_98`&Igf*$|}6~$FRZ; zu%js~&`*>`BFtLDGa^_6xXDRaf}7*~d~2q`=cCb`zJKM|8{fY^=eTR*nD%O_3uvRs zV4b9RY#QF~fOU%lScUffB&qg@v62wCasUf(Z+0c&7{jg1dME;_K#VG-;AirXg(Rv098-LBgTiS)_h~A?B9E!2@MrAdUFNf`ypdUFNL9@;b!y|e}NB$Jo_|OdUZJ1Wo zvF1(nKma8*C>ZdW_NcN8TtbUs_?q@4doWiN8jR&9PkTf^qvoQfjoElWF_2Lj=aBl8 z$yz>!U{sb5wPRBriC4uOh6zVmJf?sU;g45q0)JdHSOd7p{*ZSGhXlsE2&E6}#;KN( zllr4`&@~jiDJa)&Ose19GI;WOSR-YxZh8kKOS6QS8N!3hR{=7dXGmH;YF;+s>w z$bW`%3*dC#O4xZ?4fgqcNo)gjtIv%aSFf!^|bUi(gHPCLj%h< zIb!Q*2bo)i{sZQFtvb=OtY<*~fGm8&Od8toj1Bb1dqAw1(1vJa{2n%cf*d(65Rn*F zf#HI|BFj8JQ7qwTg?NQFXS_C)E@IWOe1DKg%z6UTv;tQR+QQ)UkbFYm0mlF`PS6g# zp(Z$}EUzf#s8Hjme1OwUb{GaAI}5Uf9Cp|SreSVWS)BwE9*~MVF%sczSX8rR2$d&d z;>V6v?I1VA9LbkQB3KVFyZ|TZQX}ijJ=Vj5T(CdSs@2K%&tO zbO}WvS;F=_b5QytR#zO7T5kZR->7JD@v+j#M8@%CM`bPnCype6Qt5O^s;uLzqQQRT zm#sc+wt{^T=!3f4B_2p6;*C~Pk$L6wj-85L^ZF2@19nb0%mk03$mR zpSMU8PF4I^0H;$ed82MZSoU(-CM!Ubc2k42E;Q^kPoRw1Zgv)`60cE-JKUrZZt|P*-PQ*!@kEtUSIc^iZGB%Cn}5{cE_^0Dh*+XV zFZqP|s^`?QzYHY(jdzUKkNAaKpV=mbT4P|SU!MVhT!MUu^oM8n&g z7STr2I2zIjkTmxjnUR#(<#H|r14&lUYg_|__|8*$q`%erx=p0sA& zm|^`^g3BiQs>Wpl-+yWho~z|f@m7@Z1V;x}xX?V@QRHpY4vzJ#F5w~R@{D(LL95vl zMy{@UIClkz8$1xplS?t9lfwfWakO@=;k!d(AIG@I?T}Sy#g|!~V01QAaeD^6lm z?Spaz`#6RuEmR9d#Y7b67*bfNGy%k^%uj3+M1ha=M^dJxb{2J>+UcOopHg8inDB&Ptjmtc{`v3@bbbgts|{I@ZCGI`>ENb#5d5 z+i5^3Hgpm0OOK&~gFQ=7A-aH8F0@3wxNle0R*Uqz&}u>}+$Ty?SLuoPF16@Cw7BnW zjU-&nttZBZ7Jq4PVI$zada{;%iTk>0ZMAfeQn(*l;eHskdI~eibH2q-ihbE#M1(NRB}n6r`7CG8g!M zl&~1iLpFJ@{Bk5;h??8>U5kWzhCR?`x>A&a>;adsvwwlpZG<1Q|I8^{BKj4Le|dVc zG-RSZK|Bq0$?5ii=Bl7-0-hUcMu^QI8EVGl!b!<&O+G#K*!2{8%RbQ-P|znjF6JBb zeiYj%p5ma~^4_ZUl5{7%Mok~-$m;5>GoEb&S`8x2kQ!*1ig=8Q6}Mv>32Jp>gR+-? zP%l3=n}6J7sQgI82NRKE86Kg=noUC;1{zd=;uaCY&Z4E`4+;O6Rk0VY zkRA|C`KVFobIH&f2$q{66hTF?sRhauVQZvmD}Va>ny*-e>x@<`eJ2lZzy0Em@7{ii zK|Ya5kUBZhHpMC)l33NKew!0R3^Axv9BQ{hm+p&U5Cj%!Y#*%aQIO%&(`2WBD@qq@;iQ#41z7EmDUp23ax`ln&`ZSC;TYM4RmP z%72y!=D8qzktHJY`@%rS2D6(o&SHv%f?>jzoP=qVvyRw1I$1E8=aAnwUN;>Fm)ng?i3QPG5`;U-xU&f6k@jAU@l?XD&YfFxUnSpHPam^(T_KL+ zmT!c2iB>zh`v%Ci_-o;gk$(hvXMd_X^I>glnJWNj7Ar-fB5rMbs+^QqZJ8UG@`ok~ z6L<1OVk=bAlY0)^n$eqQB* z;sv4m&V3S&j4#(llD&(`nUFaB@pW5+=WTg;mF!}VBY6$7i@FkdNlc)+>e;zMdX^># zqrHBtV)pC!hH@hJ7r&G!ZzWyECyE-L{f9c!(1x3lyDT2e+eAdm|&5&=@4|Eq607iIRo;=TOLz& z0I5$hg7h`Ee1DgG)c5f#-x0oPBASt#lw{N&9P@lB{OJsyT^l*_{dI~civ^C%>I}~T4-Z$(v!)u!SGz8`*Q}VRX$m570uUbSrO-%1S6aXIDk{6p zvr9SEFmvVbM+cw-z-d@k5M^nK0Lw9#S^IV%I_#V`y!YOmEIhL`O2$j&o1kk@9d0}> z74=XO^V3K2cyTYkeC zOf^tPTz@S-o3;BpMZSt*%tZ2VZXdPu+T>x|$BN_DNMm;T@kxdc?9>z%Zq zCT_}gmRPRD=cVwtrue57bg|qW08ZdjWPi_Y|3x(>GJ=U3BYG>3=}!Me)um`SXN@lK zU8W5e@EpQUES%q0Fn9Xn1khjFTn;=HVmyS0Q2;pnQ(3-swzv)$%7a~Cue;qMiul-G z7HUDRe}%nisT~P-ZdN%Rb{n~f&o<67uV*tk?R8>T>wQmY$BzQ6fENKcyE*$GJcO_YK7*F zCo2&!DWp6$^*F(vTPVaPC7@dDyQ z3A85Ck_wxYF2GbvMMPrPiNv7thku?7klBogCNz|^8bURd)K8=)6C-Vw>VitKA>J~U za-b|BH7!V#kUc#l;*)f!Di4YtCXGg$c%T3ef$uR_2mEf%RIa8odQyT#E58#p8#${o z#eZH|R0=^qp2>a3w@JJzWdh!l{Y+Z-kwk5sZ+uh~BDp#wY#%9ePOn6u_J6mlG?1wj zBF0s*Ahk7tc)4ua#5};9(rzhwJ~U(WJU<9W*AG&7Sq@8{DVplV;^7r)%7;7zUf(1L zldJZj_=AM;bUC+(5cO;y&ZLcz^VW)aJGrfvji>RJB2?|FVl35Dh?&px-$W1}m{hB}I^}PDv3cO*w)U(SKxxb{Q^`N=rq1 zr4@mLRP}*X%+NuUSh7`BHC>0ZLuskyqEsW5P*GYC#Fxq-c!Vuyh%ow{iH+ng66dcZ zI6~h$WjHGHo@<2S8-)SOdL=fJx=rIrbu`S9?vk*9|< z;)9B5EDLoVgGfw*aAQB&ZO*Pt-QN z>}C}dC6AH1#8^oJ7*+3=3@=5{s$$Ow|0J~r;84~C$%k$MK7X;b%3}b#dCAork0pL_lsO1QDq{0o!!w^OV4mugo-;tL5gY;R;H!KK%EDjGgmtvp-eoyh*v=%EuJ z4mqg+3^7SrIiN}uvzR2sdzyiyoMWexD~?EI0}P$QM1QLJ6vQk_DF9d1ho%74_1yt> zAyX;eku{Q-#gP`u6*4(%R2VquKoyN7XPxasIy$z8|8HP{pm-+RheB7%qJng&q8-;H zsY2Uqav%W09h+`ch9aUK!NbTXDsV)FFC6^<0;p~$r=01$=LiXVdRB}sU!ez)hZA5P zRWs=wmw&*-Q{Sjhk_a}JN_$SS4e}+P7Ey8~8M5bSg4L8OQypZe2e_>AT$Frb53?*d zWrPkS*8p+~j!-%gQm7L;1_^ys1y({7)jL2(2BU~eW@rb*5kgL8%?(0uRyidEyMS;5 zM25MtLipLJ#-rYKWgsy(ldQWclaPZDlSWM(lR}IjliY*w3^6z$Fd%PY zY6>zkG?O|^H3nBuMMy$KlM{u*Cowr7Fd$MOK0XR%Ze(v_Y6>wqATS_rVrmLJJRmPj zWo~D5Xdp5$ll_IGVS}vD<=OJt|E_Ch{Cu=`(%l)wvv;*eZ4vp<@;&sZ!0G1FeT;>s z1u_g1S4u(Pp?iOVsHim)jwsjKNTiiraSm6g;?P0Y>g8QIu@!a%k?P(4r*$TBlFk_Re+ zaEy&aMfe%nn4H`^G?hiwVogd)HEeY?q-7jMbS#Ah_{@K0G`QKh1wu^?6-3oMA|(C1 zWFoyaB$Ty`L_B#pr8sO|*(5j_U+MemFfnRMnu+ol8gcR|$V+K>iYn_i>uAW@Y0Jy1 zNSOy4IaujS>4-?NE6Q?+3L8u7>Y9leN63asi`uw}i3ZDnLIWDU|Fali=?Wx@06=+0 zCic?2Oe0z&Lvye&BZCk$?AaKE85qI?Ts@pzv>giya#DjUbCdFOib2XC;SXX70I|$} zC;$n-*^El!AU*&S6pLjFWo~41baG{3Z3<;>WN%_>3NkPtFd%PYY6>76nX9M^8_aPm8#d*M&5bJB&GhnS=y#2^p9I z0TdE6m;hlE8H6whG$^x35o8b?a44ggONbDlC{-xX+KN_Daj30m>5yvsLtBA+^42~# z#E{qa^N)VN_q}_w_IU0&Yp=c5+H0-7PZrEy*o0K51<|NxLR_5#Y+%8=_S>!9Zf$IB z8(Z79y*0NwwYjxz+qP}n+H%XU|9ijteaTHuCOMPmoi{V*Br};jznT4wQi+#@MWTV6 z(R$ot^0Oi=A@|pVBZw`L%uZiqpwr=O!?GULWmOlNie0`PkbJtPv-duDxi1=`3iEM> z`|E!?6I-&+I}%?!tyjaT$e|bXHu-uib9L1W@Aq=Q8Wqu=9m5~o_T)FTDjRk_K1U>< z#dF*X5%!XUNvzM|=A-=d(1LLTfEZd#iaN!@PYUto#bR{LBkxsHvG?BqH48||GV9w9 zN8V|F>|*6&ZQb-AVhY~^P^Ygy%;zg(_Z)V4EMhmivJP}aB8dtHX0}V+JBr0$@JUD6U zz;MVKIos@rzl5f=T?ow7z{701<{QX*6enUmBIk_N(Apby0O9LuO zAg)EzK_5Y8EFgW*=s-1)Zb(7qmAOG0QJ-ho#X_?Nq+{`sBB-&Zb;Z($sny-LPJ47- zS+bBSv$Oly4XU;cwbNloAxCcs-e}YOd7mjLeUtNuDI?wRqc*MqOW!Im3;LgMAasRT zgceT6?s|iklsyK|vdFF2UK4jA7tYg|tN3WPcO3+021Ku^xK@f$$C2mQ)7Dj%S?ZvO zWNnCIJK@GzU{$Yt+MD?9>gnbYDuJ`df6ldVH1nDRtT8W^&pnOUz7y2{%LKLWg*uxn`Khzb(H)dAm;v2)# z+ZzWz6iQH-q3EjVH9^<7S};PZ)$kPzT`QWLTltPk7OeKg!(J&}k z;RkPw@$s~5Z0Q@5&Y;f1smDKc=ZGFQ3rZ2m;&q!CQnJZ?CEtR_`Qe zrmkLab>Zth{6WZ)l5$v1m>O^!Nf0kX9I<3YcxFX;Q3GG~7NY5mImUj{5k2EufP0|2 zxpYPWMR}OJFAyg#4G8#xQqPmWO#HWGIcFNt&J-!-h05Eq#79ezD+P-cQ8rvq&n~!U zT+lp*bJ}MGouPd`r7w!38H1~m+p9=Gqk=uF{IiYt`X zSCnAYc*62UWC;rh1HDN5k5#9-le)=mK2RNim8cvmM%TCl&j-Om6t3(m+tkp(bp{cdz#9K9)WhKT07y)BRo!}2>e&m1bSE*z?W zG+iEsvi{tUQ_oYfd%F~J1+}jTXbv8iu%@Ef`ay!R2FlCV0y~!m3&&|(HZ|Gf;wF!Ti6-yVsS<$$JdSt$^@da#& z2}ph>eFS5VC|x*RVCwjON@S2$VFH_g>c&HR72qF@9*bmF1Ro{xlq-gHsiWcH1D?+b zzpa+iSbu`oM(HguEVmH$0i*I$Bj%D5O1w8zVREw8%uZRM(l(;4( z1zS>@$YhaL$x{i&nqcuv{|SsUjTggA@@e|LY_KVOWLT+Da9-5JFEdQ9C+1fmmHmjW zDfEj%Fd43;yYO)R!I$ct-Z@dZ!|q_Sp}w)4gDHOF^c=;=gXw1uKz6*nhxCs6dLw#( z$POL4e_unazs0i^!S!t~+Hv_=-AcKkDqo#bUP8MQtUfE;Q`tV_*pStQ$+!Ff>W$oq zl;J3_Q3r8pJQf?V30i;0IQ9*ofB9%fH}gjFfH~Mho`K0#xwVzN^13LeM2jjA>B}`B zTFpMV>r2~lUa?V&ST$iianVXtB2I?k9cE??Qq&6SuIt5xV;@M#0Y+k-m7X|+gpI3% zA!A+aD*jGc8|nRR7dvU&AEVUaYMf4-9Y~zbqN!cd_LrKQ??CslyHE!Xee9sJ7~3$$ zViI4^J8I=hb?6c~q)pKiy!oH~n)|prH*otAw!$?`@9q)M5e`o+pGD9lh~(vegp-A% z9SkwCwm5KE7_g@3D5BKAj?);i3nb*mAgZv+g)K%_RZ_Y=d%4U&${JhkVxL;F82M6o zsBjGm9L`2lrY-!Gih2T;hE9gsuoiz_6-q~Gz8x}+&oNYNtJ@`0vp=3iD*BBL6(J6rDW}UbnGWlTsyhmWc^=+|` zu}SB%N^Wq1UtDNf&0{b9ljYjimbU_xFA&F1>5V)Z;k|?&_J#z+kgjcW2|J#L*Jlgz zd&wYyGUoaMlsnjWa!CYxP$qDab1I?iGW6iwy~T+AjOHNx0mf)I@c5y%ez{S#Nwv+h zDSBBys|?M4r%#wAtCiMqw{#f>Gzm>a(ID_{|@NB`+@*jU7PJeFF8V;|Abxb zCSuuk=-QH(TY>;$e4A(4a!1XYY04$9mFS%~IdT%h_R-jeLDi)XgB>n2AV+3vH;AO= zrF{OkMQw;1jcs6w?Q*_RvfCUeZS&COlawLH!eo31I7(g$V-k02eepCf)$Sbb9PpWS zz1pXlh!X?g1$f+P>t0Q}3Z7 zhAv3DPqYTEFvT012V&lS_iJPvq^$ie*Z%VOg7W}!1=Qyb+&7ysJ73MB8+w^{5MP9+ zg+vAHy>ez5@i*B0YmOK4%PXm zE;ojWoeaK=nK+h2{Nb^3RuqO(f$$^Hr7)?)jlMB9!me{~4E%^alR+D#e?hSRDSZDc z3{K?hPYF)IIUv>RDFso@k52*%ZR#(O_|9KEDfb{N|-JwDsMc4d?0^-kj*vo zKdNIF_f$Aukey3DZ9e%la$lJ-!!z2j>;Oe{#U5y45UdCZ{)d+VeE^$^9}0@xfDf(v zjmU*^o=_OukpOVSaaUOOeHI_LIO|SDbf7S#t_qIcf3{a{a-ygvf91Vs$oh zzL@zaf023Z8eL&Q{rNpH$;{j^{McD5Vs&S_C)a>7r5dDQ3L*O%~fDoDm z4*gW{N9M~RMg1ilk~GGeC%z~pQ(8Lg=VXeuqoP63kJiEMCq(G zb*NJQvQ@BTtDnN1axDo3wT~6r@LPK~vuuS)@ksO3*F!Rd9TCUVrqKa>btx`dS$}^E z3+n0#bjs`JjOV{eCQMl{9na00BJ8V&c4H2rvq+^od<1t!APKayIgN~8Off`<+JzH# zlYczaE4Ms*&{TEY4hr0+oVRFr$-f=sFLnp!_IhOpfp!hs`mH_?qS!-CMNwl1t24j3 zVvLrXm?)TUM_~3Q=zRjJu1UlI(N%K!-T72kEltZQ{QD)O@a7gS(#*EhQ~0;+w$)-m z)QhNSS_A6T+Y8!du&cr=Rd+hF0%+7<^}oh{jb~J^Xe0!(MJn6e-OAyDziP&a#hb() z<7!l!=Q2p1zM|+`WW^UCTB>=##{VgQgW1!&UhtX!jh>h^AT0&(xV+@abQVGjS20k} z3HqOr)$w4bGv~lj-=8u5!TwD|pFcO&ufZtz?S9dU?B$y!+_viT%j)AVy3P&-P&*w-mjDEF8z||G=q`O{mTH$czzG&p&J}55e zbmNhTfWBa?vQ!NHUAKuzAHokCSST4^{*Wjfb3LG__ws2PYvWU?I`^f+jOt)CMm!92 zSDz!MZl*5AROPOwz(NXjpTLqraEXMV2*YXqL@eG$ z6?^n$i^QG)Yh@;Oc*Xl!PejT$Q9?(&(c(xp1Ha6o;!}m~&Ojl^89nW`zmcJ5GV#MC z@B~u<8GI`AZRKrHK5=(!KV8q`kjuMg2RFT4X>>3#CB_suQGv|D~J`45^(KTUMr427v0JL+crpzHoFNJ%f5g=H- z4IuO%cuu#gaCgn{L!o=bmwCaIeSLlm($;!bL^Pn&-%oFCpsP+quIea51Y3#>6H1C zL?|b44h}q1FACe?*G#!Xh{H?*o|qh10`xXu82o7AZHUJh(l=5V5_pqI8pGLZ5;(55 z=P~1H7Eic@Fyp)(-=7`mtR)F0#XO!Gne(k&uG#WEK<&~Z9w~#<){I9j9O$C-;kDo* zsQp`u?upsJ|BCfG;Z}Y%l}7ZT*x@4Y@jPB`7uwysiae&4F`#Vg^>?iwDPz0Q6Mq%> zk?U8y1*Pc?TR{dVk_cc|;)D#3lUtm@E8EBaN-_&JRQ$=V@)}#YDj;xUV4?X~m*LXX zxYd~Jf_+}+wx*&g6pgH)?1v}XC6_#O)UGM*lNL@L2r`wnf7UmWA(J};dZ->5l=@q> zwG;f=^WP=ynVQvizB^^+486`&wbXea%CJC2HKbOD0Yti$$dFeBE1j9vut3T$(5=o; z#*_FoPDj!T_5K1wU5LfIn%TdR3u%RpxTYtv$MvJY#Nu4Mv!&=TE(G&ecH0#NlzO$7 z;kxo34OMFiim^kO@7hB8M*3129&sOB~4-zp#|LP85;+QZOI8Sk_mEGhY~4O(G#q5QS9B2y>-7nwb-36quw+q z&-Y5s=BGudFCyQ?gyj}$KM^3tv$G1%tBvR*hK0_DN0*V4mXj_ysWQ1hSBUZNIk${B zK022OaNc>1en~5qGG-_ZuC?y2OiEDdNRR>EULh3h8teV(dLVw&#D{CP$HI~bktd&| zdC*qsQ>4~l#ll6g=r;wuYV)ibqq9-EJ(t2um;SlokGrtc1NQ!{l&cQIWa&=ZI z@X*^mXj|MXzO8hQ>fVmwIOZJ8dk#zuxL%(Jwo$uBaa=d+PiEUD6s!dM{bZ54z!S1( zT!J!(eTaW6isua?xiBJsj2nQ=yfruAmTp2iM0EZWJ=|NFRG3AmlT{tr6l*>Pi zugIeVx^);+Nomk&y|c3&_IWqYyPRwY!?)iq%VP-fc6>Iw3RS(j;X2<2r70X#Q{II- z9IfW{Zs~3_D8sAqOFZA!=8N4vVY>rq=->7B6p=w(nQy{i-)1Zor?oa+`4WFnZr~W` zM-Z9dUbw3Mw5eZZcuiZT04JiK1xXx|-k<9M0#+*EQvC6z|H8}Pp-nqFR)XZS36spz zI5OIS^D)49z+$WWMh30~YQeS$8i8iU6&su}upwwMR;*P0yRqA=$1JJkblPrO+uTcY zKNnQCklV~RF0Vl}-`E(%*#dOEUge7i*|ETaJ0%D30+~h>6c@(YvBkvNcMF1KcFYWc zc7Kd-BjoDNJGbKA>-<*){sTh>he=5iGVnt1q;baSC zIiUQZyMf2i9I4HUp9xfelxR4>P)gNYg{)a+(Cd)U;X45z4#P%VuBYU&`iUmnimjG& z$y@Y|w$8zR$AmU?aX`-qf*wDP!Tx*)kn~iSN zDeIsimR=j>Ls$=aQ4j?i;>cT7xIIWXdri%+G=|NUUzW3^FkxW@B`SJgsG8fMpehy4|K(?+q3Pgj|u{{Aw< zW(y!qS7)2wj55aRB&)~9yc>M^2Dv{GFZw)h;Z}UoP|l~rP*>Df=Q#o<5^)1gM^C?u zV3Ca1#h6}y+|DgiKsfc69|$}Fgad6bnoLxi(4xv9-`U@9kS>BPl*f>8MISh8v)Rd9 zRK?1<(?yrI)=hm!j=+p~fhV|@(J7t@g`R1%e5$b57~U_;3a)|T31WUz#9Jz-o?_<% zUwN1?(tc86!Wu5m_Jn~9p%*VYl0Ux|UMQOi~fX)b%?+LCVub%^Xhi7ZwQE_OGroXCj9ntTBSDT-Cb{`DNb3onmUg; zEg*I}^)YGI$`;$Qexrsg%ukrA4` zUa*M2S7O0<@=blRIaYGAi}fuE9&BS~E%Ur>>*HX~;=yc5st^ z(oVCf$MX)X1d}rkV9ZTVD?rB;h>@F)-M_WvQpQ@2Pp$3)>8pIbHTFQa@2QKZD7Xim ziOCVmUhBghDOCxg`3bK?j=u^cUyop9kX(R;u}5%1EmcidJA9VP0i&jJ?PU0TstPF_ zm6F3xKbD*caUzHF%o)pIkw3_l7)gGCsB@R$$ok;CdZQOVK5Qr{nWFPs|joQi4^j{vDW^o6L zKWRT)o@~>~hSZZ{Humsa%pGjyi1_F}xAp}vfmd0l(*SvyHi6;v#8egD%Zmp$cK#Q2 zF+t}}qyyM{PAuKuiabXfp~YB!SOF*GqEH$~C;xC|bLMDAuO!KE@ z^PcalS?$%W4Ok-$#72Q-du4&tPl8&sbP};ddJdHKya0CSYC6i&SJ}6$3w?OqAGT;5 zRRmH1f|>lbR*m^lRzGTXA;%Us!-q}8GhLEhFHRfu{V~?f^{6E=LIxO(V73UHa$SuM zoOKvW0*?rfFuU?NCX7d6r0c=WD08yfDYaZ7Gs)m^MCo2eg0J3qy+2EWiG%A70wZ2> z2vX~pTbM>)u`fA+Gs=t96sYsg`LTyr1cMH&LBhXLZGnRG`!(lZ#gS?JwR*d_ob^+M zh+sApCCR|f#Lgrg`o>JdWZIIGO$B494T5RmHFDxfJvG4yAs``k=MTe#c2*F+?9wfhv+>I?X+ zu2Zgh3e%XuOEB3n@g#n=i}-8v&)dG!qo5?;xk_nCxTWG0(|4cFU+bswJnS88#5N~e z!?JR6m5yd|{ZDX~OZT3`(Gu9Ncbme&7m?TYvTh^ha^+H4qbZdChzOzLJc zgFd>fu-NCf&PH~=@gKj+aZAp$P+_K}@78osaM~kkLf=DW%rl#piao zXzJCj+LoCEGK+#2a(P**c1H(hQ& z9AnlY1QU*y_Aqhjy`C-;3*8RUE(?qJKc0<|GNIKvr@9C}ogOS|l{@IeYmETl;pK2y zkMHKRw%JXFm*kc&BQ~Fb>4#x)zu%)M%hT$O+_}$gP9g#Mi7T$<+DPj~#~6ef{1-#q zK+G3>lRkCzCxn)rA_Mm*=H-atQx8L`tT%w7NSoo141p0TqtSPc6p5r!5H6qeu^GY2 z0C**R)izXv==}&5F+21h_;>`~;a<~ANJFDZE9~^b{XoTBI#H9fESLw6N^`vAIzv_pUJ{Ce1)ApSAbhxCfGe z4|>Hi&+(G2%h&<5arw8Qqd@T05~4pmfkf~MX}Va6Sv78M22e6+aFj>@KQ;!*)MK-D zmiEWSR^d6~4uWw#B%V*#eIb|lAg;c5_;vf^$Dn?f!zrdpH}8}En2YgF(`X~-`%w0c z`wX$L!P6un_kiSMQ4PS{W)gB!;GG>}wwMsimbTy#HHxJw79}(g9YPa5dwe^6dKZlp zh-8|~NBCT=S@jS7*yZ?Pq4V3h^wI@$`=1ETERI(lIlU`pns0B2$Na|*v7qDzOW+w5 zvQ-Bz$jz=n8lIF~0Z6OAdS}|ZI$@5W;8cy?-S(9xaF*N+;$Hv)equFQd7{ei|FDyS z_cKyVIpr0K7p)Pr@{@KG{7A(ek@K>uh+NxEF!)2!$X$@j7kt{0(ljK%X>QO(I{jt_ zj^dr88cGTaiYf-~&SpD2`h*5*AIS2W1O0jy4@pB152eUOzeDj0z8>~{>wH{Nzc|8= z*-SL$?TZ;Bs5b#-QsDNoYaX6f@}ZGQhFTKsak2xKYlFZgdx z7{Vrp^#&y(5pMd9O5-z9fDIVE;7o*xui^3%RMImdq6d#z1#z!(AA%11Ec?xDEubQb zs^m;cqC9B+{$64m9MSU2u~WKgbccmmgCf&#N+PD_k+u-vF2KQp=dwxF?8LhDFh|LC zemmpH$!;e@X^0Zp3T*p2iSW`kh@LA4;bpUz2zH%#mTG~&K#@ijR9y)<1P>)voD6GZ z6ZZ8LxzI#J`>#_k*8$N7s+7pUE4qXhmnM`^Xn`!mcbgw@#6?M8zL{-pX7vvDXNI%= zvKe3Tt#C--)IW1vAH&Y*gOnb)6|Yu zjx7BL#Ysq=LCo(~blIg_onf2V5iSMgVZ_N4MY_tCUpvdXBiGxf9f*v|OnZO{>n|vZ zEmJdkzULmVR24pA2*Dv5i@jv;ZnIxvrzGU+xkmvQL`iA2LdS4 z2@9Ajd$hQE4*BF{e-GsGyxcIp%rOxlxTNvOy-IzyI14)RX>6w-W{CY)1ntv;bpcxk zXd=7()o1i&6_;kB-HCygkEdMfy=LOVW#C#jZcb2>cA#}BE$!>xd?fvNQNO$}SycI5{rw759n3N1K z44Dvi`yO3y|B*IRA4BdQEuq> zu)_up_eGf(*GjhxzG*#zd&hMNjcX zF(w?D{m6DPYc4J1rkot7s{Sbcg;rWgC}ZC)KwZhGkr*LOToJSCZjj;^mZYi`VeDBu zi&QaeeKem~gSWQgYuE7)=ojJ<vAP`IxaZ?EgVhU zAL4geE^-$*TdPQu_1uq9E;c)c2af3aF27gLXXdPrw1$PvUhHrDjyB@_f%&yr>ICP$ zR8kPBMyDYeT2Fo8x@9Xq7CLb?fV~uou!?6;wnh9W?2sh4*FYz8=etV;8Km{df;FWG zy&zD|G(xWDVlmKrs%||O-Cn0A@}nPi9{J;Qw) zc2xAa75uu`QL_+l1Z)kVO&Z<4)brWSKcESa!#e)30q|;M_~-*25KqQ7`L#3I_73Em>;O9_;Z9TXA9{rZV;AL>Hyq+l3lKXc0d0qh?9X zj?39X#`u6WXXALOgpx9GIiDt?S_Q+Og4%!apM~f&soW-?nmGCM7e6cbM!@61AcxY3 zd)Zx(XE7{g=4wLeq-mFdfeaKVX3S&qXH-2bqB7`6?ab_#e_cNhN0re*B?cpx{7?9h z@KIwJRvJxY)Er*_YZ~CddaVYu}hl zg!A)yk?~a?^2@Qr=q#ujWhj(`!TW-_TMal2jHZdxw`Tlke%7b~_Znw8Rz2LM^nADi zaOW0oyqOg+-_He~iNPjV>hLNAOgtPgtX(Ye*IcxJs>q>T6rHGBmbv(NQN+Qms0Yk5 z_3zRukWYnvv?w&iZ&m?wE%Oa5L2wjMLJ(b2`l^nq7CL{QXBG}Dd&$Pg%E->lKK&0M z{2+Qeuih;oaVGEp_RLX6qV`ck2QAstp~xCBCa^pj2vF+SfdU2nNiLOg~2yd#&f!b zQG(yTg-S^V5{m6OQ(O4g1jt|B5@UBXhY9q7v9vJHQ)fNj79u?5=1OdCXC5EA*eKkne+@S-ui|iZL!mfXhEMQ7k9*z?pXJDKvA-z67@3T{6z}Xd8 z^Wn4m(b9s8l;=+^H?+*~+mSAd!QEM+$_&1?FjF2bejk0KfkzO)I)ac~l>6Zb>u?!e z)q1%@>Yj@DHsX+$RT%=!5jaj5*2Y!Cydy~q49{TIqfO4%Fiej?Fl$yWNXpRGtBO0& znAb;j*j7dZkD43glSs7;QgmctEQl{81QT$VBjt-;B+~f&9+Ip-MekWBb3(KBd&FD! zj|?Un>P}u?G0+Di!e2I04;xEwpvYlcejwW>8?NvV5E^sH@lk96Vmc!xTWgZ?-T&AD z1xms4Z9z%UV)&SmpgF8$PjH7qCT`5(gjA+QQ+E!ZzLWl-LoyIa-mnOmyFjy&4u{uOX-;7>_9@jfO%=-gZwegeo z$^oM_o92YUaasawl(a(p;M@gBA8MP1%#zw+%w&yO*Ll1d%80)ABCN44Me0R0A43$ys^<8q;qFDd3XFal&Yv$@x@3)*rM0 zXPM$0!i=47Qu7VhUN>=)rt*!v=#ecf$_-qpTCO=-IydCtNvRW-d;5F(dKkq`PJI#7 zQ|9Pd5@uq3&b%@fiBMkah;`%vCm-*#bv_%&tOSdDw|MppSwnP2racZif%aKC(OmXM zOse2XbbGBNg5=3}7eBYE3POm1bfMKHV@8Rh=!Q!OMf>kN$!fSWy^Jl5d#GW@9)ry?nRW*IAeNoB=X#S(LM}f4 zFU_q^G){=;t7MMNG$DaT%kJYzj_K_V+EW&Z9oa2%_w9RqZ^vAeB;lH+k>9%CtI535 zIpaKE;cdaEw*H)WBevuL_Pn4U0Y8bU#nDTYJl0)O?!~OxIuN*}JkDL=J0v|haKy>K zFZQ;VKKTcDLT35zPU_I+_Qciq{SZ@$!eOI#k(hsEmqAO@?B5fz-vV>G5l2h7)Cm3*`{hYqz&9Ap0eU|Dlfmq1XHD z(EBXW`)r4EzAufrRPHX9f4|~?7~+4B^gfG!T`0aUm9AT| z_9=Qe&E6{J&zJW$%YLcge|UXeDEus(JO4fKdd2tY^s;dLSUP>J4AjVb3ueFc@jo2# zKMZ=GNxv*4Z)tXiNxpxApvt?H{Vx}L{O?fsc-D4dNELBe6;b*BSl3Zm|BG5+`2Xkw zGus#Xz#WejiTi)C2gG=Wj@@|LcIbGlPIyq(|M9s0Pa|rbjTFor|BHS2uZsW8K5)h} zcWDBCS0pi;q_}@1hysYw=~#_>$NbTxb77;yZ7PxDr2BScDUq@9UCJ9QpAc@ zp67%8!z2B(^u3>EhFdCceFTvX-IOiv-EOp9LTDj!U+X>acCO62NI!?wNh4474lo2p zn>`5DKY!nsXB@oZ>-WU5rr1eo>j4Ccus?kG|9yxIScRnL%)>G~{h8ov7#lDC2R@mD zOBGXRiPoohZTSI~sCUFAIUnqP!YUwpcZ$)L>WDh&3_CA09?v$Th%_lURjB){ z>|bvu4XIA%P$HjxAd{Ao^$6a>i>v4;s=r+6A6uV7lCy_oU*?)R!I6}#7rV)SgI;8eXEqRzQ{@Ql8L}?g^s6=B0Rc5i7isTxVUXZc(?XN^6JE}#-z;L2`I9wtS6Yk>I zp1{J@27WuisnKPf&~*`#IKNt+s9chHJCn<6f~SsXR;}n7GyhvZ`S19z%-N%lmX+A3 zqT$4(j!r4>TJ-E@bxiK|gwjxk2Qr%Y;+BN;Isp~(qZ7nn-4s6gQ3fAP?3iE)<=N8V z&7Tx11V|QvGH3#p@1Sxym zzv-}Sm`#$JW&)uEp*)P>_I-tTMrZDse^X4m+B*9*gUd>6ZGrjIZL?3!jw5B)wfU2h4cy9K9M?+`P;am1 z+lhV_-fS#9SBJ;8);6kmDBNaND_vdnaH`NM-!wI@WbAJ|(x92BRZB5me6gymofw5m zE0eaf>%UR~lT9p3(ymmc)xua0@N*&HR1sDj~tpuYYUN^Q@L-8pTdQT zvK7Ic|IRIvY4Hh&yTXYVT1OQ}B8>`0%p7Bg=&>DPi`%cE@4%P)yTN4|#XLvPO2|=z zwuPLaaQ~d1DfZ$ZWWkAY-LG&!^jwrQF2ylLCERz~LpdebC*Hpn6G#~;^oqnO+PufT z2fz!F!~tKsefF(MPw;H}W_y`6>X_3{9NvRn*35u>OMGAx4$|X9^99qpHycKdN%a?M zHj6FuhwP|Im}VMFm=e#}w4$q#9L36zC~tbXJL+fn)6Kb1SB(fXtN_LpGCu}p==fmN z-uc|6QgVl|PfyYY(93DaYu6!Ye52KpxHNAzaRr}Q_&JkIn^#?XvHP9=Fp(0!L;qwK zY~zQD10j%&j(F?&1_}&eLTE~$h{5UQ%C68k!=Jm)-TxeKNd!~F&Q_alAy zBl%m7HV(4NRkJ|h4&(?#WRjl1JPscp z_(93=<%q)^jQB&VOB0oJB!S)_Y!&yI%S+Ek>>>&LDIQ}vfcUG_D!fI0jeLHfe#l{y zZo^}v+cf>_v!|7Fx@)Qnto)AT@q%S#d|T&x4AhHcL(0$?;!CHB)au{rT5dOG6xUe} zQx3IvMUU^(q7?2Ve;*lYvv`ud!X3SS|NGs_h043XDd1e{P7ygdHeny#YU}*cm_Mf^ zUPKxr;kaT`M+z$g0qUlyu}B`sX6fJF(J=!wY@%?IBy;w;FR51kvWPB9yCi`|7`-R1 z->s9;=bcX;IZ$!omSvz-0JBx~T)kFv(QBfFe&_GzDX==G^X@9VuDg$$(WPfq0Gkr) zE_2X8urR%hs{Og5uhGNDufUjB)5ELbmGH~8V)kN$JfnwoeFEAd)fV_UZZ9k@a}N%X zJZLTE8T4cyItJ|oSUVsaqhYXG_DHTPpKU&@yAUo0%hJ{HmW0K{k_S$9&2_9{HS6O# z9g9!dO$gG}?ElFjcON5})kr;pvx90a!e*}=LDWcGq;5lR3iijb!v`@m`URSt>OtrTPUO(6r4db4ZBe{j~HLFiEs9r{M&(St| zT;2!cse8#>>iEcfJETGdQjG(GcNdnaXce5do(}7Y7h8jzk1IbTy34k@4Mfe%Gv%g@kjQ3)kvwzNgRDms6|&3Si))9pzncA z&DaX1<7>&k$^RIGmzUcS8&CIhtsA^aC?B|4*k$Ck(ST1TjYTwc=VnY!f#3f7&ctgB z-T!sfR1Je4E|EEC<+M@DJv9@rCnx-C$e=xupEGp7X%8MFcGlfHlMa92Za57KFUOaZ z#?Q5C@TTLd*|%NB4g){~ok%1Lk@BW>s!yUSRQQfSC{7ak+ViPrZGxsHq z3GTPI*MJZCE)l}m0iPmF-rr1)^=NA8e9E=quv#mv{%)YhANUtty~xYdh~#G{?2Wos zLP+)Z!?;}qJs#Sz^RGY!J){X2^26EBABPCZ3iL63pBc{pMQ5*_57l#VvOi%Zz1MCJ z2jY2}Ogu5f!5?Rg&q7fzmJIw)g`<>`_`oxX#jvToGhre{w02D&KSVLVgw9g;imqHm3ufdJ7@!{cSnlO>T zkV6N%*LZjBrlK}zM@VxpothyWu;f+l+d&pbGAg|8cg3p>wvDBpHgO02EkV zP6r8THzca{hKDzy_ZR2O35q?s+M^Gx!GSRfJ&U}pl6)BMD?W!e+16CmZITBWodYFG!vcBR1?{<{IXCM*fAfH* zECb;|2=|a2`(Z56ny{RTMR1w)Et5?;Z}VcGuhztQdByMoT9TM);s83!D{vsTh`5os zQs`^n5bA_)F1i8C5))8@g;5FC5f86zj@=UUh=CVo{!*o`?#l5NrQ@H`VqxN+8+RLa zllvIF5xp`fcJ*%|AFf}h=Xs%;BED=J**PDHjB3!lz*NmDo>5BA+8K3k#9v1j4Y#d; z8Zd@;pp{}+QqSoWc*dc*`X0K_N47b{Cy!|F>{6bSW=H&`0{*t7VoB$V^|~V)M4Ch7 z(?bOQGXG@`$^uK^j-{G~zTrej^i{fI{->nM8q!@<~a}vC3jfH`VB@~j1Nb?h{ z?U>jxKxDXkL|ZmHOOB-0=5qb+iGbM^Yy-GQ;R*k#6|DA))a#ek>%YtxvHtqmABZxA zq<&CgWrnzH&^S{3RVvUbXq9OGs#O|rmNTS|tPq(hZqb&hK>JNMr=n+Ey_+6lM?cP1 z_Yj)3Kq2`gR>Be@Hz|2sL%nw=$k?uHrq0oL{a*ZD4y=WlRs?PKUy-e@gyMr80-c%q z=Hl(A!kG{ZqQhphP?FK`W%-K*zT^tgq}HNe_YY5Wboz^|+)<8m|EPCJt*_4^ZOi6< zR`tx+7nc(eh;e4|rTD=h`iXp=WNCh{+rZn+;X&#sem^;9%c7-6e^NyGI6N@p9Tzv7 z-Axv3D>nQib2j~VEr*A)iIKCW2;fXR=B(3*!PbwRsmMsd4f9kUF%g4f?J(UryEdXa zn>JA*+0U&$7o}gI?9+lsGu?loJL4suFeDzMPwRwE09sZs|049 z!WGS4;DHev{I7OlHTBlEOg1~7d2o0(;p?Q737lk{)L$oR^DIiLqrnN>mt#eUQrDJZ z*5NkiMJ8&>9I|&sbh`DUHq_keBtq$D3bwW7n)s)j{POZ;{^w-GQIYo?*2~ii zc84yG^76*UjI8S)?F2`<4kxVs(P3GVK}o#5_=gFC_9f+x7U2X}W1?(TM$ zcfZ}*dY<>kPIb+6U3K-{a?g*M?pvaqC?&xJJ6{2`tP`L6#|Gomcxl+r z4UDq-MKMhDdQH%G%ti*?%Ezm!PKKmH0q=M^3+X*mv2!$~1hzVKQ_s-VrC8J-H6(*+ zNN7(WINTUH>Z6?Lainj@xcw)q+jmiME2#ld=7LI2<=Wv}Nh7GP{fbEC)=o zoP)UYML2yYCPW4OZs3{q-ZrVh6FzA<&|7)&4;)h!{R1mgSD>$f{!LEAEPW}n_X5#D zt_I+2Q@{qlO9uwDAnvr@B~TXWp|m?$y8WM$VI_|>Ngg;*!s(Va+`NCaBy4bQtciTP zf-_-9d@!pOgWku_$L;9iDO{dx8P2(!Rog#UbSj-y8TNySFU2FE#4{CYd;%0u**#w1 z^5^A<9ZH`sL;uQ&vc>*w<&ILhtC0Do35SHELU*!>Jdwt0wd>7D8aR@sHE4Gds(v*V zs(yCMt3Xs5xzN~ZQ6GbETlejxZB{USKyHdB5;dvt2Fgnp*`ZDw7WQ4~8=8wKdvzUZ z=zyHhuXwS=_=a&+`VwQDAX-owC!Cd4`fNQ(BbFA1O=eAZ1Bc8a%0^6;SU2UYX!U7B z(D(J{PgW4PC$O>rSGxqtMU;HAOLv(cjPVG16>_5W>Gz4GszbLN2qQ4i?@G_?g^BH_ zh6zH$FJ8l){y$HMrGo{;{1j8;aucC;HN5e)&Zu9casN^)6Fs3Xi~E738$~O|MMjCt zU^}Vn!Evy&`j_&=LA}1wgndgF@tMPZ+XVr)2fH}663>E_E25{AvC&ksL$c1?9poK3 z^>L=x6@`&{B9&BSRz9tCK&9u-+r-@xv)o(5BOwzivRa7Epd%IqkUTj3b3gV&V%RXi zJ9iJpWQ*<$@5!__Q~*TYFv0;;cqX)nldJqgXvUUKSSZLC(Z)iaI}Nc;88fJ#BV966 zWvU)rpU}UHUYn~q6T!GRmynYsB<<@tAh~vDJR@_zy{ce9CiQ#VmG8~$nFApK!}-g? ztc0JKPvLv#_*+AFCW1D;Xz6ra!Yj=aC$Id@ZK`e2umwH)mtqjXj8u5)XPTI_v)Sfr zwPz)F_Rc10hat?Fop316r%!`iPuNf4p;mO+vX*sZwp1?>^`U83eSaUBDdqex!W?5&&&Yke*e=jFHoi+4vq2TE6ObWC za1`^nA%9UEJ8OAZSC6E`D-RYG4wHR`dkYnrWeW*0eg!#V(oQUN_r8+7pz{Y`7~gZ> zH|(Zf7Z$41%}bBZ$c|Z;)kAIK7RK(z`ARE7O_~?O$@42rrsZ&VSo2jZ&0UBMcHNv| z0{ej^_lY07CaAX__Z~&U87M|j>atn8`G zMP)~lMxbl1XZW|@X)i2?qunzkhje4h6XYfnsnxPvKNR{O=o`Z;LILh1Cngs)E(!EH zR3%AN*m9Ufn&0E=6e+C?5+fD5$-j%vQcyCKTCv z?uSNd`JpJsyy71v8xE}a1@Swm+umBZ%htpzE=kW<$NNzsCnnCU?*4L(F1q;_#w0e&*93 znL0D*47^Kw_YAHM1-a(=BDaJk%_{7&Ut=|!gdcq?(jLxtsHM7g-_O$z9-cIDo9D=t zrDkb~X_SqnEm?Xo6Xd0|*%dpoOnW1{M*@AX^_G7F4fPd0r<$B%dINDM zXgE@B!Z{ckXM6+%r!EYuJv#+*B?>xTy+f`d;FB6|y&#>A;myjKwY|czCC(LJ$aWze zGY19()5gMjydle8F_h9M@8YiC>B=btMZSgH5mU_0DwPzdQ$)><4y#|YJ^i*OznP=F z=aB$~-EBzY)Oi*Nw9SHhlTM_o!@&|8|$EN(le0e5gx}a1_Q$sT;6`4fS zdw43r>?$t5H&EP9fQ1`peE3JOSdaf^>fT+me(S7plMZK;j)r_~A1&SQSS72dBE%I{ zXA$3-!n}6k+^|qDT#ou86RQlzt2Fg!LvB=k+!zkl>toQD?`D$t2U4nnnqna9(3HO8 zotn9xR?qUxiS!NV$MaTC7sh#ptzpOwG9&)2H9bAFGE~OOs3I%fav@IRKig+_c5Y&F zR$&?hBqUwZ1m8sYI2gV%{7e$=EDd@dRQ|*Ydi#YUIp)p?z>Zv;F9~$gi(HkCc=ke4 zn=R&^Ukq_^$qY*=JbZ+?dZGjMG8Gl#i4H^!7A9TMX$Vj^LUSobu6;S7JzDnDYWfIX zKxK!tgLKfqQB>&FECn1%?sGX&eJ4zY`9zL23pKH0vE3KNCMpAMU&@O;?Mt}`9dfjAk1i9=*ef?NIZS$@d_q%P z4=X>L@Doma>bB@Y(}pgze1@hBb@^pH;5DWyH27#<4XsuK0~jl$`@tEryPO|y_7WJs z1mT-OS1HTX_k&SJXP^mWwYy#Uv{VhWneHr8trJ zEpmb&SZ&y>v^gy?oR8QilJ^Jt-AEo4L932Hr)(H_EE|>$xjB1Lp!6eJ!uTG6uVs_S zenEnD?nct@!J$`28i1^^ZXMUgEc;U8{E*KIoX>>e1`ZsRhZ6{tVpcQ;a{$h2omA`c zRF8aqXIYP8dqZa5L1v9Hy<1&{{nco^AkiQ%EJb@6+WCog@5?4-$d?tKzTSkxaqXcX zF(YQ~WmRWLP$cPb$a?7)b-Hg>wxY5QnMuQ$4Qp$ka-Kl?bJ;@URT%vqsmP2Jobg5sTsoLcR?!$g`u<5{!ysANBu8g&%1qie71 zb~2tCtFP)ZV5i8rf)j=A(P*fD;#KbKH5|q6HtaeVuKsON5aa#y`xB5jX(z66#xT+D zcJXL%IyPag^lQ_NdtqyUGltI(TM-ab<*3wZg}+#_Attf!umnA%m#Ro1Gz}l(k%*vV zC83qb9(Xhi1Q$qY<%MZc*h}7ohMW_Dyb&G5<3zqgZoeJyJ{kD16&8Zl_lSmoI>w1~ zR&-0&sF6Vv%M~JD#lTYbK#FlEHtKXne*&vp2TY>aejIC=;~a2X>X^NWDvy1e@DDD_ zqi=CB-d55IAl0g52>7f*e{Cm!{ItLt?;tII{%K+cL~{2B=NQZ&8Ty%^f{M{BaFN^3 zmXudQI1eN%OY?w2LaniHA+cxqlIjb7Y36Sc0IL2NGWEZs=bEFfSz_uJ@%iN$-qGB= zB1B$BFHrheyRGSCbEW!{u-$09de(&M)%Rd^sN%!bteTioUk2f-O{?t=A}Ap z>*8{4eUq>YyQ;aG*;sXENTaWTjY5A?^o0FhtLI>J9+xb(6es<=V8N-%w1nb}_009u zJB`jq&Vz`o`V+SgF%p!#g&(^yyhqW+lIlX&j)s)f;0wz^45}!v(n;u zke^Uf&FhbMandRdu)njku}YDqab!@HdQWW}+@miRLGI_tWXb-X)Uw0Zzay9N&&vT2 zA}7Zi>>V;4Zf+P%6&;qaJFuLU79enM#i#r(4V0{GYIR z%?%N)0@5Z;h?k)LX90a zan5yHU-lwwXf&Aly^)!!Hr+?>mVb9Qgk3D%uW_tzPx|m~=YpR{Qfjf~aD)xwfHph9 z2Tk(J0{th|Vb_=|4Pq>I21MFG%OJqTwH#N@yTxb`#SxqYdWV(sQDGxPiGeo}i1yiC z*%iwPIooW<_OFU{E$@v&a+H}Y!~>4m z`Qn0QaNOh(m*6NFLv%1jq-;YuDEtrpkg#o0>wI;i&T578+*X@8HitDbd^0}~2P;sL zmPSMjV#3vl9>!4*4b=f4`{eg+QALXvy-&()!ymI2+Eg&<{AZh0WKOYj(gL|X>GZj4 z7wI>MP5kAo_FtsfhzSs<`-P$~zm58|@Jcx%^Mu~55WPju_hNtcWJPG`fxNRyu+b)t zIXM&WgzB@VUSMV53wsgZLClIQS*oUOFhFGcp2I%Gb}lWa^rZs(E6$ z=ig=lpa<&$@I_U7d$b0}yV0LXzgE9LlkzVw?@kwUKAYcGL8aghl36$ujt#HNvp)`m z!6<1dLUebc1|f%8C<7WPAeFz({W95_)}+Ptk)u`~eWkGEY$m8WrRh}$*kxK|o)9O# zccnisgQPaL>dxm49hi2$KUP-*rcDZ_hdd`e!Sa*xpv;nSFs+Zeci(&AyV;OMBV0p~ zZAATC{YK-+hCOKHKG3}CK5%@$Zr%PRP3A{?%S7^oZdO8~Xdm7p2$jND)h=xTr8bI? zrX-ImOOZkSXp4{{&Aao@Sp3-#k}2?M!3@i?CrLHvhK;lDTpq&*1H;EzhmrvtCtF}$ zF`^DfQfTcPN8eY*C!lxbO-h$W+?HVczQ73;Nfh>Z4f06eg?hP7vYcq_yp(xfS7|HO zVb%Inm;KIVgSrwC#N9Y?poR2kZ?3IfdNd?-7gg{E*1LHk5(c}tdR(UPuIBh$Hx@li zF}>rWPTQ8gMc0nEksz_?zOP(t`e+=cAuQFIZb{?v)J}V3_UC{ z+J$;p?BX|0)eqHnui_j<5Cb|+o=6`f4lpn1z=lD&@Dn#6iGpD?%f(Q%1N}RU6o;-p z?nsRl0__f9;6v@uL;do-&1o)e?$g9HJ4&{N3`*HKwA42Z+)r|{3txGu5K`ImPQvun zJ-$?OX|*Ah4}T~B^OKo-k%)Q1otfE8AF+fq)kwSkok%ReDK*HH@Qwv074mTeZ_s0~ zVImv!Rj`m4q&8bR)?`&m|C={(H#kevh3B9w@QFvqWHtC+C5RV$mU*jwVLs7k(goMD z6~9C4qKvoap**zY;?dTPVW}MBMFYY(Ynk)h^XL7DZ1oi(AfroGX7}1f``suv=tt)bUlS5Osf0_nrOr}adZ@50 zxlXx?HD|*&{EDbT^Wx+b2~8KA#Xyr~i0ChbBR?+Nr`|e`vL0-uiO-3#35ma)uY}*tbU)#cty zQ!a;Uzqo~=$i%KScoTWbhW=c28j?)!3(>yOHlbeHSK?um!Ab)sfOt z=_^1~$R8YH&68UBi$WAiF*R<_HX6Nc12Mrnarv5gH(Fv-n~*Go8RaPD4JT=OdV z*h#Qn1m25Z8)Js#QxLXa-RS}+?|+G6>K z1;2HHCDYvlS-!VxbMbli!`HBOuyKRuCMWaR08+{Rk7SD+RjT_T>0D0qlJ^#jWGq!!1R&FdO^u@yp$pvA(NcV8BHs zU$Ey)IF|luktmaFPMs+byiy^5y#g{z9WK4b{)WxD?R@Sp{_xV1d>>qVRz35pVS#U+ zzGsxjQr$_m`Zx=#qF1FFF?R;>1ZE>FCNXb*Y|$9I-45BiU3hX2iEnbgS24grnO&mF zQ2pV^T9rTj1zI~f(`{&wE0x1WiL~|O37g83A>&Y2-B{;EI=^^ zG_|rdZ)6)J=RE_Dx@yKVYD4*&otrv26(K_!70V-OKNWt0rj3c2al?0E04Ujqe3@7# z_ArK#%sv-A;))2>n>Jbt#Q{mADAcN&r-xT4hgvJFxXpN<{kpBm7b==+R{cpmHa{XQ zR{<>T(6QIdn6nsFxV|e6V{)MFO59Xaq|Ge@t9No)ws4M9%CMp8ZV67KB|wV)fWYy_p%)!9@Vlek-G74Xb_!IY4)Z&1b`ulChFvThe7+vruE5zKCx zU+T+IBw-OcoqKXL2+vT!B3c;hAGQc5@yq-B{_?ZgXV^cDjrXE8fSXi`1i z?Q~F+{roB-=u?`wVUG(Ml)qLtD^XCLs~?%Om(9Fy98&QO%0@n%C9g(^(9l;;A#vUL?mdWdEhGbQ#lw@>~e zV`3m}lQ2pb@^6|%!Zt5DRa7Pxy~cLl&q^Z2DWV8{gcN^57fSc$Uvm4SE-=AO)V;1* z<@yE_JC0+D_wej3f;4sHOTU2EBT2{MAn7$2tzDYr{sdky7| z1sV6FVl`at*bbUr$yJ#!7WYV!oMVsgV(lW?cwvsEIW&gcSe4LDa(qvO21iVNZixd2 z_fZM;fL@uQR-FefuL&^oB*UwPrCEii6}Zozv=GJ~ieQO{VaPI(M1gTrK(%1o&=x;#x|yF9-I zwCySS&wLCDy1(6I{n_=ybqxY$KQ+=nWa2$ZXZ*X?83bPHB+vbT2LQJ><&24`3 zyS16m3$?3N`hfdRk7tAZnjpSD6vUb+cZ|Z(dkZr6d=Br&@1NkZvZxlFX=(Y^N^$Bz z3hLD9mJH+jHc3<#E+IlAf+JdAek~HLA$LB1jr!fsCg$MQ^lSmGnWm|YbIh>D;EM#c zIL#PkQfo*z&Ne<%SgvxA@ZqmZ!(Ed7IX@I^tS(ZpBMI2*SK z`$Hk7eHw^PRLCtp?60wZhn3VntI?^rfjC3sCN53m(A(eGh-D#8hiJIqJbc#I{K?4| zq*)QV$%9$D8${pHNV=E+j&jT>cwdOO$zW`cpP0@hzUJN8o_HYZwUMhMsEqCi>e=a7 zWLSLL&)nBFtIT{%ChkC#m#Ga_6K8gfJkDv~(E{an5`euAYTh@1*}4uFYjx%}AR2>A zx^_!3uoMsu{0z(xJG*Fqn{WW#-Rq`JX=YLGnZT`6hD~sv*Bpu6$=$)~SH={XFya%K zL|LYqC!5EP8ep%Yv&UY?A{w4|39Q+6&Ma&@Ah2+<)GASoWRtmfCWcjc-2{st-+$dG)u1GJtPV*GWU4xxslc{u^j5utJ7FUy2%2$lU9Hk~I z3DrVM$n`QmViO@zY!MlNwsg?!N54<<=C_}`t3R#XOME5iy|x`Lx7PgL7OhY{ZY;O- z(kKigbPptc<#=UsQC&VqChI*`ZVw+q58G5x^z@yVaVz<2>(a=-M~MCbwjE#vz{3Xw zJeI0KlV_2m1!&T$qRU=7jSotMOih`1R>TpX=z-ZgGbWd#2US4vQFy`hc=Fg+&YWr4 zE>5?9H~TbSCLFm>4Y@+giz@?on!|C))*MyT8wwwL2DF})Dqi2lyS}}78lF#bRRXOa zLhqDrS&a9m)efoD*XKbeY7bciEN`z{J&S(8-3~(+?VJ2hw9!uIGIu znmDcw)|UeV^aR?ELnJ39LIGYhXL!US*iiA4bWV7Fq>K>uT&Lae_kGPlg(??B12J7V zyFhtyg^-iZy(@s6byd6dShG_>)%E@mOl(CC$MI2bL<7jq=J|&sZcfj zJpqRe+R?p~*4JgPsB12r^P063aMHn3f)-U@fRXZkSuArrlUuOA1D6xRn<;|n1$NKp&@i+fE6;IMm&RiFfF z%9`-0%o#{$6*EL>n>(h9{_-z8ziGriGUSyADF_YClqaPR4<#Hx_)&{PX8GfIpgsw} zrMAr=jKnq@UXZI5dqtyV(e8~WL0*6@fjxlrfJ24Bwq(WE`yzmoRM6uS#Q2DqB#v_^ z+SiJ#z5AKWK8TITVTeuCZG_a#``#0X-Ok|}mbmYZ1zRF2owui!;K7C0iS}DaPyQ2- zewWEV5q_gq@{^+g#G?sIqN0a5Xb^UNW$Q9vOCZgclyV-)WWgAzBAw0gHe0?@GU>g| zKbZ&N&(D>O`R&6@A1<_&e1DZ_;iZAsM*?)D0!J%F!hlW4)bjG3M)9vXgg(oT+z+t!jB%yx4n)D zyp>6IX9)^&z|NUVJ2>L3j@_6{lny197)IT?U*|KPq$=*q`*fI9ERobS>z)cmlB3b3 zo|LNvd#SPOb8MCe4}JqrAP(U-4^3NdJcs&MCz9!}L06E(58Vie{`aINR$Oh8RNJ#m zG9|F{Ogh=##KQ&d9=(#Yr7at(o5hu?tMf#q@Q>Oi_^6NuL_f_#E7 z=`{2IO82D+qVTxO@aH6YFx z=%Esr7=Lzj4i#i#S=`*Uw_!`abP3T_9#(?Y(@^enN=+@uIm%0xa1v|`tu@__ANvRh+={Rxl+JaBFv>AzN##5gxK zksswfS;S6C3JNhyfHd^JV$wZOLHeC51_xJd;~GS6j)!np>99tsuAB5HC-aq~Z$%bF3;CLvAmWbJESZUE>%ZBZuiO#f31qY*lYUpDO zV;W>)!)K2Sg8I@AK#K_tONijI4D7-Ao2f0%y2M81sUi(=49b51@sUlD5?(ZLeisB43W+y~n#-VnvW59%DWZwAv2mY1Su~a8~Tm)~51y3{>x@bk=!r-n? zeSO8;O`jk5ELhOyH^=$Ce{Q7Vw6jyt12vZixZkm=&DmR&WE54HxI`4=2e|C?-!!An z(8-IGL^Ebr0a=V3>{`+*_&F+rw@9UfZ20YSLJZ3}R1ywK7n*&W+De%m*%`(JOygXA zltoFSFeu)ww4I$9KCFr76!CGyox@STSWCrZMlt^;1(+$WqN$qEO_jf2*8roT)fo8GMOla4 zQ$HoUC$*Qo#rT#3#U`w%w141`3RQ$-S!t}O2cl&RJHF7%JDM}VZrkCMhp}WEDO!G} zN$tT$&r|(@v_Ul@0|RSi{~ScihsktO~*Wq*4uwj-I*)z`ddPjt~$#iu_*nQZ|JMXn;a6TfA;d~bpK z6iJUN>e_W^_?}CH;W>Ef@bX-hjPz{ZX0ca}YzrcYEuuJ&^*Awrc5B`{{p@y1VNWWO zHTWw%wObs;mFTEegi@p~CpZFe2z!T@?~)pKTj|i>dM|Di&25}Y#Y9crXcfVB$qr4s ze0o3sbJv|CSpr4A+82?7-V<6l)Z+`HxmZe6=i?oC92PzEl>T(G&nUMuCSKtK%pUqj zt%D${mY*0Qu`YT%m1!cdUj4qMlNMJ}N}>8(?~F)!YG zux{C2xwV@ui*KlV1ak578sd?sAwS41^V+EA_!HDys@ON}{iMC8?m2*=f~NgZY-Uxp zn^%V69$gN+bh)m6`-x0I=1=U2dO+e&=ZQW*c4PoLw{6O3bQxy}#eGI%8&DR+RllSj zQ#ofpowhKJk36c5`!T)#e!X^!d4+m~z6dJT#aWiAx|}-YNY5|^o+o)58whvgcb>!s zSRuhlovf}$TshpdtuW5OhepNDV3!q$Kl*z9^i6zdiynuZ0#0cqq3W&{YN>)2Q8lSo zrNR=haOElbC@@0USP=b|=w6;ndJT)hTIo=fIT&bVIGPZ{guIs4^Q=TtdVI*SYh zr;Ba&mm6^n{hjM>sV~fvL>poCmgOubEG_pwT~k6g?|(K*KxYb4&agVu2Q`wtwRIC- z1SsI3gA$f~ID_F!bgZD+@3TE{Q-~r}gNcqd2I^T{Xx_c0J^i3*fmb)9vff1{a_`_| zNfdFs_o}aFNQzs%m+o~sp$!Xm&C7ZZpSWE-W}SSpIb!F+L~iTYme@=hjT?V+ea~RB zGv$h2Qj2^za*VBXw8ac39y-wl!p;%J*Q)eyg?g8A;H`le2RzQM&#YQ*`dD) z8PtFt{lvRCmnH(5Mp0IUNV>(S`8!y*a4Vyjc5pP5`R?eT(U7905z`c_)ETF7HZqDa zC^^m=d0EQ%qggjoFr=E^cwpxx+dI(D|H&)L!&PRSva77y?9A}$7;d=T>UyX0eb4kJ z%q~NJ8Z=(#t>WjI&aTUR?Bn^iuRyR=>+o*#(7d0n7xWio=XC^sI3nUf;O@cgGds3c zKX!I-kkSQUggC_0ru@}mt%qU+&rq9m?AfN>7OiN6IhLwZe9YvElWCq~nqJIOg0uwL zJjXrbwokz1F~hXa&uBQy&Pd3CJ4Lo%ShVu0c0=;3RBW~5m!$@4HHz&3g(RUO27&oB z-UJh7QV%@H2#Zb0_(ooaQ6<{4$J)rK*7m4>binUw;c6IZqp5 z63=I;%z|~N6=O)*Nj&(gE#zT0@wW7t^ANx-0oMfcstJ^H-V~xM|(~%BbpwFS%6hK1UGaFlHH@3eTm&gFaQ2H ziZF^W*@U!TE}=p+G|j2|a90|SR}FUBVaZH79^Wq21)PoFTzv9i*96gpBC1qU;6V^?!TT5&!$RyI~v_Ww&s3?JcP-~<3jS^sm9+LI#w z?+SpEo0s$77!MCCXX42S6^NVr!=3(Ld|uZ7lEK5x^^q*_A3Qcz4%UCSW#?x7ufEvX z*?Img?|&qH+!JF*kw5?*UXG7cb^nkK;9_NG|2M|N&GF$;^iLiS5AT1q<>mN~=g~iT zya3k!#yI|if&NA0;{Eq<*;v_m{yo(XwQzpK5co%1HUK;8zp;<$bN+kjK30V5|4k0` zKYIG$ar|3PA4HD-NBloLjt_ Date: Fri, 27 Mar 2020 15:20:34 -0600 Subject: [PATCH 38/56] Remove propagation_org_ids attributes --- app/models/course.rb | 5 ----- app/models/lesson.rb | 5 ----- app/policies/course_policy.rb | 1 - app/views/admin/lessons/_form.html.erb | 15 --------------- spec/models/lesson_spec.rb | 13 ------------- spec/policies/course_policy_spec.rb | 1 - 6 files changed, 40 deletions(-) diff --git a/app/models/course.rb b/app/models/course.rb index 045ffdb1..93bdbeeb 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -29,7 +29,6 @@ def subdomain_for_slug enum access_level: { everyone: 0, authenticated_users: 1 } # Attributes not saved to db, but still needed for validation attr_accessor :other_topic, :org_id, :subdomain - attr_writer :propagation_org_ids belongs_to :parent, class_name: 'Course', optional: true # has_one :assessment @@ -74,10 +73,6 @@ def subdomain_for_slug before_save :find_or_create_category - def propagation_org_ids - @propagation_org_ids ||= [] - end - def topics_list(topic_list) if topic_list.present? valid_topics = topic_list.reject(&:blank?) diff --git a/app/models/lesson.rb b/app/models/lesson.rb index 1b5b3cff..21af8714 100644 --- a/app/models/lesson.rb +++ b/app/models/lesson.rb @@ -18,7 +18,6 @@ def subdomain_for_slug end attr_accessor :subdomain - attr_writer :propagation_org_ids belongs_to :course belongs_to :parent, class_name: 'Lesson', optional: true @@ -42,10 +41,6 @@ def subdomain_for_slug default_scope { order(:lesson_order) } scope :copied_from_lesson, ->(lesson) { joins(course: :organization).where(parent_id: lesson.id) } - def propagation_org_ids - @propagation_org_ids ||= [] - end - def skip_for_zip %w[application/zip application/x-zip].include?(story_line_content_type) end diff --git a/app/policies/course_policy.rb b/app/policies/course_policy.rb index 44ac211c..f85bc59c 100644 --- a/app/policies/course_policy.rb +++ b/app/policies/course_policy.rb @@ -48,7 +48,6 @@ def permitted_attributes :category_id, topic_ids: [], course_topics_attributes: [topic_attributes: [:title]], - propagation_org_ids: [], category_attributes: %i[name organization_id], attachments_attributes: %i[document title doc_type file_description _destroy]] end diff --git a/app/views/admin/lessons/_form.html.erb b/app/views/admin/lessons/_form.html.erb index cceef65a..72c9a565 100644 --- a/app/views/admin/lessons/_form.html.erb +++ b/app/views/admin/lessons/_form.html.erb @@ -103,21 +103,6 @@
- <% if top_level_domain? %> -
-
- <%= f.label :propagation_org_ids, 'Propagate these changes to subsite lessons for:', class: "text-color" %> - - <%= f.collection_check_boxes :propagation_org_ids, Organization.using_lesson(@lesson.id), :id, :name do |b| %> -
- <%= b.check_box(checked: @lesson.propagation_org_ids.include?(b.object)) %> - <%= b.label class: "plain" %> -
- <% end %> -
-
- <% end %> - <%= f.hidden_field :subdomain, value: current_organization.subdomain %> <%= f.button :submit, class: "btn button-color loading-button" do %> diff --git a/spec/models/lesson_spec.rb b/spec/models/lesson_spec.rb index a7646b85..371832eb 100644 --- a/spec/models/lesson_spec.rb +++ b/spec/models/lesson_spec.rb @@ -156,7 +156,6 @@ let(:copied_lesson) { new_course.lessons.first } before(:each) do - original_lesson.propagation_org_ids << new_org.id copied_lesson.update(parent_id: original_lesson.id) end @@ -169,16 +168,4 @@ end end end - - context '#propagates_org_ids' do - it 'is empty by default' do - expect(Lesson.new.propagation_org_ids).to eq([]) - end - - it 'can be updated' do - lesson = Lesson.new - lesson.propagation_org_ids = [1] - expect(lesson.propagation_org_ids).to eq([1]) - end - end end diff --git a/spec/policies/course_policy_spec.rb b/spec/policies/course_policy_spec.rb index 4a3a7a14..4629cc23 100644 --- a/spec/policies/course_policy_spec.rb +++ b/spec/policies/course_policy_spec.rb @@ -233,7 +233,6 @@ :category_id, topic_ids: [], course_topics_attributes: [topic_attributes: [:title]], - propagation_org_ids: [], category_attributes: %i[name organization_id], attachments_attributes: %i[document title doc_type file_description _destroy]) end From f76f5543adf7d7925e86910125d54eb352af8dc2 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Fri, 27 Mar 2020 15:49:47 -0600 Subject: [PATCH 39/56] Remove redundant lesson parent id column --- ...039_remove_parent_lesson_id_from_lesson.rb | 5 +++++ db/structure.sql | 4 ++-- erd.pdf | Bin 52665 -> 52649 bytes lib/tasks/demo.rake | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20200327214039_remove_parent_lesson_id_from_lesson.rb diff --git a/db/migrate/20200327214039_remove_parent_lesson_id_from_lesson.rb b/db/migrate/20200327214039_remove_parent_lesson_id_from_lesson.rb new file mode 100644 index 00000000..45b09027 --- /dev/null +++ b/db/migrate/20200327214039_remove_parent_lesson_id_from_lesson.rb @@ -0,0 +1,5 @@ +class RemoveParentLessonIdFromLesson < ActiveRecord::Migration[5.2] + def change + remove_column :lessons, :parent_lesson_id, :integer + end +end diff --git a/db/structure.sql b/db/structure.sql index 959df770..7c23d1ab 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -535,7 +535,6 @@ CREATE TABLE public.lessons ( story_line_content_type character varying, story_line_file_size bigint, story_line_updated_at timestamp without time zone, - parent_lesson_id integer, parent_id integer ); @@ -1834,6 +1833,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20200120023743'), ('20200220181809'), ('20200220184942'), -('20200327172506'); +('20200327172506'), +('20200327214039'); diff --git a/erd.pdf b/erd.pdf index 29323775c087d8d1f49493a072e2e37d37708330..42850105e8eafbadd5e589088480e1eb1c992b07 100644 GIT binary patch delta 44383 zcmV(}K+wOrn**tv1CUaG-I6S~ap&*rDcX0#3yr&~y6a=_BzZSN8&a$+9$m=_2Q@q< z<>gR1=TNe#huvq{-#-B)P>t&9>X{*B2ZLwO^??EsiTuvQhr>S~J{=bzfc)2GAH z{`>UArPiA5p_?A3@Xyop;b-p-Z69v*hiU8{yXiC@+O9i34$ZrN=fgj~d)M;jyMH_U z?(p#Q&kjF1K6ZzPU;i?-{wX#7m>OTDhF|&av&P=~BHj5WHN2bm>54z|@!NFi@Y%s$ z|1w-?9{!Z>Jp0rBt?I33e>%Q@c<_&X^I7xz!@K`|_@D29nL+I5pGSy&{_|@PJCDPm zZI7qN^WpiBe>7u%>(`6s(_!qo^!(UOG}|Mu#^yj%kJxqnpxLx-uinE|Yo=kb_cJr5@})nRDH4;4Q`v(<-aGAwJ-i@j>o2pt+QGAQ`a z=Z1t=Fpi!A#{;f1Hf5yM~MH*M}NXD}(8!-U28v*unTzdUzzS)N5 zp$$8nKj(>^%92JPf+TU<{xuGWygl;cx>0>wvPM~DAcBKPJZt&ciL8rujh~d zP{%x&?&+uf&^Bz-58kpL`N3WzN!_2U$2boAp-+cl>1UJ1Z}%2I*tdh;25R~dK5g$wwP2C&l(x>&K3EOmk4~OvmIu70A+}nQb+Q%{N*CwIb zjr|(gha+9RUz>-tPt)JepT4e;H52|{IX*ex`RM4Lkj|fR@&NK>Y`=nY-7p^dN!0JT z$!$$OT+OYg!|B+^tEc09=w~f`XbJyxUsq{2YMo{wVs3@|=c9pr!U!cZOP9PiloPJsomeEgOkl3u6lR!>H9$m|vdr4SEiyC3@Z;yT^7q zp7=22yb>UOnpPzJb>f*9`Ps3W1!c8f)U|RNZms z>0c8*hFLTZ-~TyX@v+}YP7g*-n@r66Xh;3}5-;_dWk1>@%7MKCTHWVHP$Dtk;HMD1c zwvtbBKiW1)6yE}A*eS&)4Q>1L0;CPf%F4#Q3vB~Pn+Ine8zBAU5B<&IeF;i*pe=!_ znpb~5KK4^T9Zo*E1j=Gi6-xN`ogey@j||B)segHx62bbH&q~^QC*a%1VHB-L!-+)0 z1%cN>|1XJDIBE4B9c>e7@Co`Oj_Z|wC~&zdH^kg}RS?$Z@!V?C70vMPUms!`vm=c5 z-tS+5`G^xG!4~GASttfKezX+;K5OzXDLa~{w^POS_Pu{BKLO8WbB80J>bGy~$~jBUsMo_mDS z)Uv{+F<~*N&AIEBox(Vz07InhuIR5eba*uvkx1@#H9a)P2$KzqY z@Od7Nhk2CHU+!g@+@5ZZv#^JK{N4#)9(%pR#RrNVlXd-O9j7A^^lihshTVKT3_VwS zVOTMGP^Q6P`0&SXzkC1H`;W!;vDfbYh(Sk6a$LJlc5>= z`^vPsSf~M`PCHJJvjU`l3F!{M&1-aJjNN>Oh?!!4$n6t~K)6b)2`v=!u1!}vQAktl ztrZn}Z=YyQ)0s8SExkWB(=7XqdYWb_sQOZ9ao^h-Nw}I@DCX0gu1+n01d zwbdGAVz6tW74C;otEVt4`uF+CP`iU?78-tkezcjMvbol!KBumKPJUeE{`g6Pj$7NW zEsZ8QY7%Ji`i!-&64DCgyZLyS1}(y+KdO?9we8e6gMSseSB^J-`;=;;1fn=}t6p#$XF^X16S9 zwm6#OMm5bOcpe^q{*d$&$Diax^0%*YvAyK6$N6#WPN&0Ej1w{vt>!PLkHPeE1;Llv zG5~MK^Atu9QFa0OmzZ(11$tS9m$F1tK;EHhyD~UYd@E!KUlASd=Sgd#Lw`nnoaZhK zcDWf|BsyfN#E`Fpz*opu&nT-qhfQ_oQtP-TL+!`D_7N+8KfA6NXvV&3=l^HCa*ZXg zZ}v(Ok%4ADBVyZU*HA8MI`@b-25M={`*84X7%fh_;8j;(Hc>hN`FEpn~E`H{Jaj;<{>eu`%tyw z<$XUro@NYx(l&y)t_!H%M%AiQp(>)I<4HDiXSqA=Jr^0AG_H}4!@_`ezm(peLhEAG=fA9c&1ZW@QK^I^rJ`smzk*j)|_ZCqtBf0l|Ga<%d82WagW~ zNx{Wnn+JdCDhk}gEipB>hp`xDMgbo}mLMH5H>uG*vfA)CopCbS2-XMBR_LqGGY<;H3 zTKY#0@(Dg?8SLZtdC@WI+_rC547De23j@c0a2SiPwr&yFvoqJ(S496I@iAZi*J!%v zTSFY`s|1QwyOgkOm@Bp81zv<2%13OI@*u z`NV9UiGNICZRzh%KV??W)0ymls158IV+6&Z?ZU6HF!pP|l@x$ze&@cD_gtb_j>?n^ zzvm*L^Un8)NW0kK1j$9&%xGjwys0O}^;i?l+m4{enH{PrEZ1e#aMT>HNH7(de~o}S z9V-pdzo?v9ZZGC>b91ji z5c#4d21C)~FG5}W{H18PU%hKPl$V}Vm?C_AVQYGUb{CiE$PTnbnzTesj!kn=UM$h! zVb>Bx==-yK;?SJ-uKVFP=`KO?f$sX8BAUO5?yk~yV@=0t86w#{eEt59e_wt59Td|2 z?|YGK{VPa&_H zAaX6V!u{Z#RZkLu*D-=C2hL~{OYFhl;Bw*fr(gT_cAEl>Dig{p3u1GTu>$$dpr`hJ z=}!Jc`Tr_j>!Wc?fOB6L*J?(JyZo(){1Hd90&L3RMQr_X95tZjxuJerg zujr6s!fye;!hx6JfA{p9gJ0GR%9qNC%NP#toMP#KSdGcB!1sOZ6E1)d{`FptlTTG|_HC=#ff{nl@U*MA7z05II?SYmAvfvmiK9R|o z?{TNCc{4_gO&6S{y}~i3sn$L~c$M!MXQgfw@r~l9?~Ad%f2Chcm=pYB#V|9tdV`eqJRHQ-C_cB;j7Dp z@Q3t@VctbyK?bu=SK{*xl+D8P4r|G(%R!T_U4hq}G`E>o<|~B2%SUrs^uJi?PzPgU zGZqH8jg^*}eq(lmPJRZ*k)|Mb3onsM^y)LfAzE)w1*$dHcl*Waw zvRu=L9c~<)B={!Go^1^z+4L8UdXNWzL^!ot;x)0d#lQ04ge%IlVhl zz(T!};;Y_5OC50`{vox+ejQmg%ht_frDnX(jq6}Ytd$Acq$W(@I1ggcaWoT@X znQD8fSaMFmw(?9@LC#j9mdiDI9!qYF4N$t3#U(D6$|&^{!0ia;a#|7?R~-YzzLVe(6n}7pb9Tu@ zuhPOLbInWugF0D>py$I+h$5IL?cg5AIhhEZ3PH8AviZ6btU=aSMZ-_i39f)1JRRE^ zBDjaPomsAy0wXfx;Y#nI6=&Qcb32X=R90^G8LDxT#0t9b7(}7NF?_?_O|6%{9~3Kx zl@egK4IMLTMm7*P(Baz0ZhwCoA5R?_Plo{;VSC0vjTdh?9~nF!Z2K8c?wQ1{Q3W>3VkTIoJc=-5*$2fp>MmhP)-yK19awzyAZ4t?pZ9)E@}ceb~z|9F+J zS_{8<(bD^R%SLTI+5CL|n_yCsL-wQhikdhvd2+U_WXv)S%I&3YSa9x^cBXGbVu-Q(5HG9zXVq<|3tMF9)JPsE55 zu}cuBxRio_E9Ic@*?(RVh~3n^Vx(*xwwCgM^9b)G?kjy7h>0#=ddAA^pyzCjDG(yi z%U8#fA`+6C2$8_un4HoX>K8O3cO(ZhW*C$`J zJ+kY7?}?ICFLT@$Do=sG5x1Se?Z)3qkRTQUy$pw9F~U26UVrx)NJN*)#$@rNa;SfF zh1LZQM`x#NZ|F#;WC((<{MbIajMzSwReBO>1_Eg`HvB;A(P06wB8oo3H(HNl^5y3B zaB0zD?J)SU)&oKlN<*g6{g+#h>2c^JOE~=AW<8GN8DA15XYwCwVcqwIlc~S?s#Rg^ z-jTocT15)#++C8!#p*Ed*RtXbS$#JttJ&rWadno#B9HLSrHXyJU7xP9$3;x}NFv>0 z(H{Q%^`E|7Nq4!&G6t8xVPLVT-u+@1+@l6{H`JiJH1;6u9nk<5lMe3aFscFv17UQN z&J!4a&ogU8LrZ)dPzsBItsvTmbpgCb7XwQP>L!Ag+G-NSNhQQW$l?!*QJm=-Rf5oM zA~L9aikb<_Ld$~?5!Xp{1$83`+}@{ns;5yJpWZvoL}u_k`a-MitSTaLAR~d+N>w;f zyVknLEOblpqyT}^vz4MtAo<9^C`v$;PJFZ|U4w6uZ?P9oiUc9kg9ofVns%nEBL?B_ zJS(IefSi;gLCp3%;3C&XlZ_Oef7c(K8#!0|=wUOTKHX4SwZb+Lv#%Nux9qFcZZ+Yy zw6MDVm<_DYZeewa$Ol-dJ8n955vihqm!!|Qfh=U3j{eMSly@;{wQKY2qIh5RVJE(6 z)GjQn_<8r*=?sFU<<=qS(xMl2{+K@OBl$7Fg`2J;F08ik{=J|j<7~w%8pAA)fYx|D|ll+2w~m2CQeJzm1WMHMm&mWOt7==zM&+$^-$rdc*{t*YZ}a~| z4Bgx)i|(nnJgzPmsP_GQgP=#OefJp{)gJOm15Q1i+C1GL>Kd4_e`qCsjV_`^^~)R%#Z-j^(o*8IvxZM#J0_k`$8LH}op2iD5Mu&#u^z zBsAAf2DP5&M@qt-8PB6cl#Y$Sd=Xn1>pb=t-dXDLj3h;kJhqcS7a@O%{LB<=10L8r zu*TrOh&KI0VbgDd<6{dR>}ZfvBCDL6#ScPn{f4!h@DMe%h+|E!bXHcq#|1{+t=LxB zvz}6yy~QVo_8IvzK852!?erAuXm>2S`K0fLub-_AXlyLumklvDoAiu`4%nfWfgk@^ zpRpM}R{XGL7+h{j*wcTjVLH}fm~#P^O;|1s|0Y?1muGT2>Nx3NCN<9a=%-IEMxoT- zwDX7ASga|iX3)l+#PIifrX{l?nO>@X&d{^4SIHqx2+A?b#rOs`RRT6;GRi}XEDf#H zKkH_X#B&{tE`s`%*VhPx;sgSg$F!mk-lcg9_Q%@C;uFl_sSbbpBKPjor^-E$v%xNf zQ`G1krI*(Pj22>MOW`BEDqY+=d7>OE#4BX;XpCL%iQvL^soYVIP~6D5@|wR42w6f` zs1RI-`qMtpzdss6XG#4)fA%rG0UE*ytCh&umG+lop@ZMagaaMr=e4PXa7qgW&V$NO zcV%Rs`TmEg1;l^8&GquLp*^R?I#xQMTzYaC7Bng%u0NdM?Svp*s5i$Yir=e*l09va znatf@r-0L?3lBM-Vq~f#Wv`N*rT74IiwpgEK4_1zdQFn4G0|f7>7NZXD|qpw`%) zNdY@~5Fy?s-{;xq<#Cz1`l^pG4Z}gOVuLo)wr+oUToeP=Uf_7fC7oF<+eH%Ry>VxC z1PkX&S=lbWdGBTqS_q(zVIq6v%-v4!dZecdu!&Eq5&E|sKC zGG;1>7|(FqaIOX<3iJGJW3Xnas!c?$(vu>bi9W`vr;<`V(ZOab8;M88L`0CSOr6-t zFwPT>C->=Q)vXgo%8`CC;Z8%N)_}vY{EL6J9QUYQA;xdyGn`aFs;Ql|5?i`LOtsz7 z-=`*A(X&>;*m_k!GriHjg*Nl$@-J3(B7{TGGu6wF*xhlY(Hr)=*s{O+vVMmVSc@^~ zU5zo#=c++3@(T8iY~ea8qcF1LwN|mTQ2~t?y3^s|o%psH&_(WP1ZHhlZrRPXhBkjx z{N~tW1vXk&O?r8d_2xd|Kpt7<3qRGh{e2JLI5BU+4z#+t|HTduBJhUtcwf>*#kkMZ z+#o6!d@DwZB*~DL7%bV%76)24-Z#$kWz#gI}6ceWN7jzmAiRq6DTIG6E&o(s_2fqScV!Q9;Q({xA(q5}j5;>ZN?M*F^Qh^V$F3W#v z;SIDa=`UNV9m5rQ{CHNLKdYC*t=Kegpq(JAE7k}%|?PM#%4c10X z1f~w{*fw&+;OV-V-9k1FE;E+w8Hyg83M;Z}slnK0k!?LUix0_Nq((di#+z!icDihC z>0SBRgo^aibaqaxx(+Swds{;YS99wL)&e`Xx2DLdsi1P~n(!svXNP~=SJkpHc_ZAl z0jnFEf=~1+$P>A9w48{gI&tbc-&s2+yokX0f2E2i^x4d1x1p;ZJn%P=S^E~d$pYjA zm6KQhg2%8`ZX}Bsx7p>FC_aYJMy`kjQ27^k+otkXx`) zOI?X74Hm`rPN2}=bs>K{;e-qCs=vfeWC4odEtoJgkPOR;3BTD91rtK*z`@;N1W}J# zVZvJgPZT&$ODI*8InMxh%ywY9D&Z=!8$2)vKPj8X zDbDCio5o)zP%!%Xvek7h_bFOKng?Il^bxl{_&6L1wi2bT<%FBJ5%;gfpx=eOiie{`jReHc;GP^i018*x1{fd1y&*a?l(h)fwA4i3E6n*FI|NccUGSjDI+AgnM^BkCCl zA8J#P7oy8mG`qg~tE5j>D$9rT47n2zZvZzglQ?Y8(<3A-{<2x)d5x?*&$3u5MZ|Wsd6rbn7T@T-+dHZ7!u zqk@0n3Aya|Ri!p9h-)C2(L{8;hNg6wx(n%hVUqv3$ZS zFX*2cTOM~*j_y7+toTxZm)Cw@fme=ZbnxV)A)>}=P58DsdQE`FU^`>Og?K2VAvhDG zh2TX(dNoNe&z>ilx7fXI$x5ZiH-lNuIDUUBXpoo8MdnJOw}i;NJ@&B7OJv9H?XK6T z`MJ97h@4Mj_j``_YilU|WUnyF%Hc3G3B$)y&Hasq(Xi2T4fMRGe|3`NGj-*5bIP~T zwnQmB4}(<7T<|?lIi-C2=axJ4LoINMklDdMkgwd*5!)Pj+Qh#yzGEfk3V%66oU(r_ z;jeNKQp^4#U#7qD4hKB(ZZlJO$a>?iO!@Rr%f4Lvl^uT$cQDz_ysIO+RUc4ytku|G zoZIPdyu+C6UB;N^b6XgUo2j4*&S5DGjn$eA&lwzZvH$>esQWL!`1Y&6eDM`vPPO%~ zBud#JEn&pKVs6w8llj7OqqDK_8zFzk_%4ezZk&@i#_hBa?ue<-$&sq4Y+p{)Fig7) zGlHH(Cg6ifvab=9JA)UH{8D@YUS~3YF%Xs`0N)Mp|4=}D9hrMfQ)H8!ni&obrpmd| zv1d-A6Ei+8&O*XBkFVi~OJnYk=SbG=a9D-Yt?+;2wZNutr(2PHgBf3^TakbBpwq2z z<{={}*@iu+!>wAm)^1~(3DYWr-;#i%)2;CO^;G5J=VM17R;Qm#IXOg-L6jQJh!{6% zN}Gv9>KLbtO?Nn%2biDCRE6U?>&Jc|FcSkFf1orWnx^1@6`G)3(PJn^GXg?5G4Ruv zi<5pQl922tej91Qi$^xX0n~pdTY%}{SefaZj+8bi<%?=p5ETY2mniNglsa4|oIEB( zz#TMDb1f{+z>CLW(1G_#iI=k)?+EqHaJDFukk^$<9-OSBhB^Xn%9fEOrQ;L$7|HZp zAqnz$#EQXLV}QS(8vfyR5~wz1aJ(>hX#r%Xvp70U*8=a5#pIEcj~P!8xN_z%=!#Yb+Xq9A_|(bO2am|< zQmXmZ_!}M~Qc=coh#H$jG#?zs9*>_{KAC=i&VK_`DeTaN&aXfJJ}nU>;p<8lB)Ce_EYAh`4Uz6b9q9wK~WzC2wITI9KsL3Y4mF zK$uIf?Kj~%+?*;qnp{2kx^+rjkCQi#lFD|Bc2@jK$BIG#^cZM&BmG}9737W`T*iFp z6vR`%AehC-fZYI-tkoWPP~8bGP4)!?HZMGmZc;-C2B5^;jp}~|a>kRq49_GqN2LbY zk#eIBMBhj`qAZ`ePRR`%P7{n;X^cA0#6)J9Mcw`VxaV8Z}3z& zmoK~@PVWo-#KGap%_cPCGjU4lGytXm%NB+m#H?LhXdx>Uiqyo| z0voA&t`2&g&8+5r{Qj3oV=m?A$Y_)Ly`xOF4Y?vi4EIY8oLk2t$wpA{a)b$u z{`l>8@4tU~PxfaL>|Zc(NPIo<6<3Ip;^*`ClfBp|q<2sPrT1W1*s zg&`vxp*Ijo3!~8KurNa;NdyHM_9cAmNNb<%cvydG(aK~@Y>R%fS?wqO6f-2R{eqDo zf%1+&8%^Cvt6Xg3FDnV5XN%wdOEI|l+3+hrD~&*Rqp6!pQw%JQhzbYXvoVB+?01|? zxViX2?2;weBZTNhsY&Y0zF zJ1T$kRm5~;H5&!mSLKrZKhgU9mbLM2^3nts3(G14RNj!QDCikMt zisRw$xi=Idj>H2j+}!S0a6}>U!Vydl@1Bby>2Cry0-PgJc4gqMnL2!OVY?5B#Ja-d0LoE1E)8CS z%3`-}`bXA5rP7DgWh8ned2PaWdRZV^Rv?VT1Yg85wb~cl8QF{VCfQvUawJuZOl?|q zg18F0?(?#EdzWJ)nY~wzJz_3IhDCn@^22ZuQ7*;UJ(5m%26zTQj!DE=ou>U$~8ql%K^bPjKT8$VX?$}s~tp9st#-B z9L@=m1)K9v9w$N(P`*&=Fs)(L$B2usfX4+K(wav65^zhjc(NOag4uKAiiW56h7J=7PoG|z)K|PRf!?c>_O?fr|B{c}kV3_u((hFQd zi(&Yh_N3ZvTv2Q=W|BPZ5rvGRcA7S(f2Cr{D2;bWead7lCxZ^>Vmkt*j!k(aU=?#1 zCLE>lm;yqGKW?oFaFJienad0wLo`+MsG)}obK-_#T zoN}WAxyY$F2=GVXg&A=jY=A~G9!d`OCF#_HG?w{^&hTJ#jCqjfV?uxD0Y0fhzqmny zyGIpIPiGB>HC7}d=|pJuOmKn$pgCb5mnDFbemLh;kS}4u2Z*sK>qQo>iUN~l8=yh_ zX7owP@uF-QPPbq#7}J08zX``U(g(l-^)$a5nSq+C&>yVQnq%u|2bo)i{sZ=Vtvcbe ztY<*~fGm8&Od8tomgPqUDHc{K65tNtlGhDI94!;fASBydS#r(m9zoJUNswOQkbEiO zwrW4J^wfl8D<}YBCU^17EvhF%69#QxHWj&Ppoc{Z6q%AMxS-jpE(+cN`eDT=4sQn( zVb8!M%QekXCsu!e>s-@!mGn#^#b$kI>({ISIG#WNOmGkrz6DVsVZyfk$QM{z46isP zc}O++^cyWLu0O^YS;;s8>Zt4`K*hln5G$R)ME^ zxQ$#=n5W?iKt}fC3Y(U?*jG_OSj^)_vGq6<3o@%~(3yYHs1uG=JaWLMQ@w5@aKc&h z9d2fX0~64MHKRM4*ov41<|e!54H>iKjwC~~t2VItugp%XOd z0um9rrJ*+$}Rx?00O_{?44mLOGn9@<*lJ(29duE$=N3r*@im8D{-j{r(jf|h<1R98*pju zYW(=Z0eD6ba}?=dS9JKRBmis#Lg}z?w^WNjg^+)flvghMDK2m$LfXo(HAytb4snMK z%zCnyH7vO;3s$#+vc@Ci*|B7Dc#^e5A(jnoCFCVN1_cwd(>T+CDaVppyb{N zH~CG8Wb1>L*rLi+t7SdMw!W{6O=@r#RudjXGEsx0&}oQS=w4{qU%sCH#yiIDM_j|L zxUGK;ev?8jyuUN#eb&0o@Fd^6?j9{tZQU@E%w~s&=i8eW=|+P;8qx@mH23dWge7*l z{0qTG61J>z(`$1^w(}$tvnx2R{KSo3Bp+q<^F;=ZJ5{AM1ILUEV3oLRqHk(nHt?;+ z;kjn+6fXn9sbPYnTZ6)d=HX3hyn#W{v_R;o<^ajKsa-ULzLBmGec-S|Ke5pAO*x{IQt9};92i!^L84AXyG zkiAFA-Moh)hKR`!ltrUZJkePR^n|ui_<&)B=Ya4w$56*QyiaGVNd3!g6aYJM1>J@& z!hI+)CbiHeun=`XD;HX#Ufj2BsC&fN?sZf0k1fKF)B<%~j z_M1O_g9R`}Dy(p9gTIYgkVL~XsHy!;vsdCHK?Z$LkX~BKT;TgbB4apn*5tkN%aMG+ zx3*2Z7Nzh4lc3FXr7#5<1a4@}HcmGae#|a3r)-JnS2X_hDaulkDZT~bX{diojMxX7 zP4iu01c2BKlA&f)Z%(6SYx3!-$F!<lR^zfZ{&Uak1c_`lHxJ@f08BmIGH6n4~-D zHNst`Bde>kPSmvxh@`AARFHo_wbNr%t&lpttzHtH>BI(QFa4kw zR}-PLN74_w9>`A743AK0&8DFa0}U!baf=8Q3aO%`2>@OrJs_HLQlqZrlA$*cEH|Sl zf{J2O3zR9s)=1M0WwaoZfvLgtfdM9AQK_ZN?&1BnU;N>l_g`X@Ph@`*q)vXc?FfVL zokmsM@^=)4Ou?cBMNDGVU4CgnVBymWQ&=HCkh^VAM^Vd(&pxs0o~VTq02m;ZA!yX6 zvQk_p%x|ZNWBD@qq@;iQ#41z7%{)gYgDe?}ONaEBd2Z|oYLn?+856-g7lbd&ezL$X z40LQTyD9rD@%T_Mtk{2&ldv0do(zUDo!%DgvuN)abif%IL;Dd!BUeN}+3u1cWL{-Z z*f7Z_5T%=XkK<2L+cm+Qo+Jl`_lSfGb~+-RMVv)UAQ7UZ^v}^b*ykoRRg6>vlH4XG zGqVU+bL***X+K^?BBibzZz(sU!(u9_Ew|MgtgwGTZiV}l##HDSJ(0ws z_xVz2ao^h-Rk)g4NOedk@v5T!tS88H{1W%QtyUOSZiV|{)aohB#OEKy=PSb1!U~{t z9jd13!^mpY-uP|OiE`cl6j5pQ%&&YRj6P7w05#ey-(LAmX&JKCUP^CnPpmVzoq)LZ z=Cs8%wNiM-EV>~oerp11!`l4ZSS=04slIpWA)TVLxn5Bk0 z|29!>OPE`*G0OtN-gphh2-Ek%cxll+q?-F{<;-jFyG?)MS}+Ylz%}Z+oS3|`s`ZXv zH32!;Q!b?L$c}y8*+dRYGxpyHOEmaPSngO-2ZW1cA!ej7+Ie_`FS~mdT(WyL&~WPF z8syv}{Cp8J9caZgBFqvZ?!?SZXjTH2VJ0m05}N+8m7tDjAbq{oHlfc_g^k14@CaW5 z;=0uIc4dFy2xgyjXsasIhVL(Arl2lgVL|Kz;!0{Gqh(?0)VbU#BwVEc9uB`PByL-$ z&G5b~VA?9-29K-cHgsPl-&ao`vvyq}j^mbZ1V0JJ(cL#dw#8qIc#I^-JNt9u<=&YO zYh%k?VN%QUI>=Qd4g#Ml)wruIa|2Uec&v<6%|U->|&22 ze+_@Ki@FkdNz9?T>e;zMdX^>#qrHA?U!I?DC?|4%^-GEJR?=mBqNwBPZ~IR5m$uRn z9D;tjNd0~q#Tt;!+Oy7m>J6{@M>^X@Rp=sU*W{JR57KA7Tx`1F;8{r0oAQc`6H9>; z#VsG&_am&vQx?p9VbX+(MQ~mig|_P1I~RX}iC=I)Q4Tv>8F&6Yi(n(mr{cWXBCH&C z=zTjRPmk@ zxYo!;ur6dk?y`o~Ta;21gW^8&RI_~GETGyTzM0Yp9V$jH8ggv!KjBWqJD)@t$c29d z2k+bAvL926A_c8`0OH=iBru%nuJ&&9i@|8p&6? zF1gpNn5gMluDkkN!s6u7RaJezd3GtM8fLDXKj;8-05}cH3Zg7c5nwsyGHc%sM2DU8 zhG*~1$-)b(qh!2P$_cs#72;ldwjp*uw|w01IpAo$ia@&IA}61x{6`0{gWN&l0Q6^k zd%ayLnTd3s{;cv|muD8PG7Eq7zrENjqIXInc_w-r;kAGB89%!`;ZydK1`a5HI#;17 zPn?R>(!rSsV7%~BgZLW9Rn`!Gcb!U>CY%J4yCN!Tk{}@VbrSb3AZA_olhY`VYV}Q- zwT>*#IrM#>dWNin6QAqbXdomeqAQc4k|&xO%Eh7`9+u@`w`^aPWyF7o9YK?q;!B28 zj@_*&6e4=YxBP}Pm};Poxc*vvHf#5HihLDz%tZ2VdLPG{waLSlA?M$}KEyO;r!TM6 z-8lGf0bJ>B8B`h3(svy)j-Ec&+OW$4_>}y`+^6Gn)w%bX?!1h67Mw<^5>y+@e#)1p}zCFHZNi zk?R8>T>!9Vxi2E{-0WPr?OL^PqHq}33r zsl0w7HJKP`vlJLqiVg9Wv6=&w3CT_;Q9}0gkc&^!p$dOJD0-MQ8g1f%8axEP$6Ouo zyE#+6n$GA+q06oOPLyrryvmg3d1X;&POLbeNbI1tG-p3hVuS2w(z=f%YU`BaqoNSW z)gfW~NU3vrB?7g-U8sRfr4TW$q6Mj~3B=1~(@8qHHW%r`pRm@<4x?=$Ui8Y#B&&$ce2#1Mzc( zd(F$MZ4~AoVn`$K_2X6$>8iE{I{gTN_LkRX_1u4p)T77*?knz9aX~6rETY%5cJ0cs z1NU+PikL%x#<`DkM8D!A$24?o~;HBQrHJpF+&GYV#!v;4n=&WDwiOUDPC?;6&0lg zL41EH4uVJ6a)t<_-d9;68j(ayo%;5})fnQw=xSML}4_LCOrlgWM zGtw88062FcFm3@t*GNzydSB;_jaDJ)YW{#$d4$uGy2MyX0vJ{DSJ$+rBqogTPwEW- z9Lky?`OvM(yr?b|mk3+Hz(@dK z=m|y%(onyLJdzWP3;Bk?N+2bXW^WDS{G7_Xqy4F94q6~bfh%o^Di$iK#1;OM?yF)D z08SN!T8?2yD%_AfZ1<|bL8sFqV0C|lSQ*me6lyslK3vmrD%wr#XeH7h`%p&dX7wx* zX4u}yOos0|Q$@oEtCeRnqV~*%Tx*(>H&W)vwx`?h5E|EDveO+KynQrr{D}vqFpO zlRZ8i0x~kQTt0>j21QU!K}lJ&=t_qH21QU!K}lJ&bxa)rf4q5MRMp)-e9pOd?wz@_ z-B~hwGLuXu37KFZ3n3861rin`JD~|C5;kR1c0@%9RRnRPKCNq8aH(rsCLv-#eMr^X zx=?6~w$iFtQPDQS(-*0t$^1U&OoGs-@9+Kdoyj@pdzO3eIp6c$&z-DWvwktLk#-^x zW8pRPR}t|Ef4+s{cMCVHi)HHe03pikt5#ioO{VTyL5S&#t5;lqRi+;LGa}-22Zv&(3q!d}$7w(Ll(f9~Bn!@)dd2&U1VEuGWd!hN?x3=N-6C z9n(LRjMvGzJ?C!FGmqpwgP+KLGFvLzTM&pIc~Kfdjw3N?NM|xTx?d`kvO7mdjczHv z*PT`7e;hkhis6o>B99?oiL?jlAd*bxNjd1%k#9z7N7{pQ5a|e#LI`r+8$()&v+L^_Og3Q1wd@%;eb_u2cz$=)NSNVQ1wkai&*L^_3}viFed?5~_+M9$$_ zB*y-VTxWm5vi^eH$&LX!#*U?X*dIHqs>}8ZAXz#9L=yvmKRf`qeP!M351n5R0Yw#H zr$JFKNO@!oDVOp(6T_q3QlPVDX|$Vtf3!E2jP4#gj2$H@B!-zB#gmVc7}9j4Hl$TZ z3ZQoYy+hiOb|URYN+E&Dkn2b>_6E{hNbitgNCwh$Br`kGiN|!a!<_}=qGNsRckDOB z4~!pTzZC#oK%&3pTkJJazR7+q%GXimp#Kf_T4zp_jJ2Yl;2IsJj3g*rO z#Iu5FvjHLNWxj&*<6rW%%;)%UXK^tw_K=Yr zQXFkRK-*uW?K5fnqqKc7ZNHheZ=vlqwEarjo}}#&+MYw(4ch(!9SKylQ={vmYPAud z?QhWbU(oiow7r0~Cun;9dYE-;!4nt#uQ zOgM=AFj8973=E3pWd;Xxc$v4ixHeP2WK`M8v6I*E9Xk|L&a3R7WZC2~H+Jz`>|$ZL_N z@fv#t-#mPCS+0?-NA#pVNxCOOoqsuWT24BLRS};La@p-NySk};-@oi%{mV`)V=e4% zb`QzMM(i9Y@9F$HJK9Yj=qz|4IyQ^mPjX~X9jzt>G=Xv?Su5(5Bx2_66(qu*MOoGv znS;xmodqS)1JuE<+86ygaw7U!q?-Xe8F?Z4r&za4JEL!-<=K7FqmkRAuYZ?zo6+)O zK{rKlASQb)tkj`#yNd4EWSWDA>`cHbgzHUGL zA6_&!?U%;Tf7Z|B?b4XK=H`ZOI!BBnG5S9k2Z}*~ab_rHK90o9Ihk<}WyU3NJ;vqp z0^=+ek`Ut(7K<1sQ-40LV{LwYT}M7LjPb|FS}|s=KX&1mHxd|=K!!2CcJhW8^M
uz#6%#8Og0+k%BlcsYM@ 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 U#1s+4$_-*gq@?_!Ac6RQ0H?7cTmS$7 delta 44370 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 KrWTbKL;7DZG_Pm? diff --git a/lib/tasks/demo.rake b/lib/tasks/demo.rake index 51cd0c58..239ee233 100644 --- a/lib/tasks/demo.rake +++ b/lib/tasks/demo.rake @@ -45,7 +45,7 @@ namespace :demo do story_line_file_size: cpl_lesson.story_line_file_size, story_line_updated_at: cpl_lesson.story_line_updated_at, pub_status: cpl_lesson.pub_status, - parent_lesson_id: cpl_lesson.id) + parent_id: cpl_lesson.id) @new_course.lessons << new_lesson end From 6f45f68e419b2edde1061669d0d2c5ed31efe90b Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Fri, 27 Mar 2020 16:16:04 -0600 Subject: [PATCH 40/56] Remove unused user concern --- app/controllers/concerns/user_courses.rb | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 app/controllers/concerns/user_courses.rb diff --git a/app/controllers/concerns/user_courses.rb b/app/controllers/concerns/user_courses.rb deleted file mode 100644 index a392b379..00000000 --- a/app/controllers/concerns/user_courses.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module UserCourses - extend ActiveSupport::Concern - - def authorized_courses - courses = Course.includes(:lessons) - .where(pub_status: 'P', language_id: current_language_id, organization: current_organization) - courses = courses.everyone unless user_signed_in? - courses - end - - def current_language_id - english_id = Language.find_by(name: 'English').id || 1 - spanish_id = Language.find_by(name: 'Spanish').id || 2 - - I18n.locale == :es ? spanish_id : english_id - end -end From 066b8bf25de02484c833d972b91cdab68875c853 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Fri, 27 Mar 2020 17:54:26 -0600 Subject: [PATCH 41/56] Replace publication status select on course forms --- .../stylesheets/components/_course_form.scss | 12 +++-- app/controllers/admin/courses_controller.rb | 51 ++++++------------- app/views/admin/courses/_form.html.erb | 7 +++ .../forms/_course_owner_actions.html.erb | 3 +- .../forms/_imported_course_actions.html.erb | 2 +- .../admin/courses_controller/create_spec.rb | 14 ++--- .../admin/courses_controller/update_spec.rb | 40 +++++++-------- spec/features/admin/edit_course_spec.rb | 32 ++++-------- spec/features/admin/new_course_spec.rb | 25 ++++++--- 9 files changed, 84 insertions(+), 102 deletions(-) diff --git a/app/assets/stylesheets/components/_course_form.scss b/app/assets/stylesheets/components/_course_form.scss index cbfdd864..32afc7d7 100644 --- a/app/assets/stylesheets/components/_course_form.scss +++ b/app/assets/stylesheets/components/_course_form.scss @@ -17,13 +17,14 @@ "course_level access_level" "seo_title seo_title" "seo_meta seo_meta" - "propagation propagation" + "pub_status ." "actions actions"; &.restricted { grid-template-areas: "errors errors" "categories access_level" + "pub_status ." "actions actions" "title title" "author author" @@ -34,10 +35,9 @@ "additional_content additional_content" "topics ." "language format" - "course_level pub_status" + "course_level ." "seo_title seo_title" - "seo_meta seo_meta" - "propagation propagation"; + "seo_meta seo_meta"; } .error_explanation { @@ -116,6 +116,10 @@ grid-area: seo_meta; } + .pub-status { + grid-area: pub_status; + } + .propagation { grid-area: propagation; } diff --git a/app/controllers/admin/courses_controller.rb b/app/controllers/admin/courses_controller.rb index 83a5e1af..417f6ff7 100644 --- a/app/controllers/admin/courses_controller.rb +++ b/app/controllers/admin/courses_controller.rb @@ -40,10 +40,10 @@ def create @course.assign_attributes(new_course_params) if @course.save - if params[:commit] == 'Publish Course' - redirect_to edit_admin_course_path(@course), notice: 'Course was successfully created.' - else + if params[:commit] == 'Save & Edit Lessons' redirect_to new_admin_course_lesson_path(@course), notice: 'Course was successfully created. Now add some lessons.' + else + redirect_to edit_admin_course_path(@course), notice: 'Course was successfully created.' end else @course.errors.delete(:"attachments.document_content_type") @@ -71,14 +71,17 @@ def update_pub_status def update authorize @course - if update_course + @course.slug = nil if @course.title != params[:course][:title] + + if @course.update(new_course_params) if @course.parent.blank? CoursePropagationService.new(course: @course).propagate_course_changes(attributes_to_propagate) - success_message = 'Course was successfully updated.' end + success_message = 'Course was successfully updated.' + case params[:commit] - when 'Publish Course' + when 'Save Course' redirect_to edit_admin_course_path(@course), notice: success_message when 'Save & Edit Lessons' if @course.lessons.blank? @@ -86,10 +89,6 @@ def update else redirect_to edit_admin_course_lesson_path(@course, @course.lessons.first), notice: success_message end - when 'Save as Draft' - redirect_to edit_admin_course_path(@course), notice: 'Course saved as draft.' - when 'Publish' - redirect_to admin_dashboard_index_path, notice: 'Course successfully published!' else render :edit, alert: 'Unknown Action' end @@ -134,35 +133,15 @@ def course_params end def new_course_params - new_params = if course_params[:category_id].present? && course_params[:category_id] == '0' - course_params - else - course_params.except(:category_attributes) - end - - new_params.merge(pub_status: publication_status_by_commit) - end - - def publication_status_by_commit - if ['Publish', 'Publish Course'].include?(params[:commit]) - 'P' - else - 'D' - end + @new_course_params ||= if course_params[:category_id].present? && course_params[:category_id] == '0' + course_params + else + course_params.except(:category_attributes) + end end def attributes_to_propagate - course_params.except(:category_id, :category_attributes, :access_level, :course_topics_attributes, :attachments_attributes) - end - - def update_course - if @course.parent.present? - @course.update(new_course_params.merge(pub_status: 'P')) - else - # The slug must be set to nil for the friendly_id to update on title change - @course.slug = nil if @course.title != params[:course][:title] - @course.update(new_course_params) - end + course_params.except(:category_id, :category_attributes, :access_level, :course_topics_attributes, :attachments_attributes, :pub_status) end end end diff --git a/app/views/admin/courses/_form.html.erb b/app/views/admin/courses/_form.html.erb index c30f8df6..6d754f52 100644 --- a/app/views/admin/courses/_form.html.erb +++ b/app/views/admin/courses/_form.html.erb @@ -102,6 +102,13 @@
 
+
+ <%= f.label :pub_status, class: "text-color" do %> + Publication Status + <% end %> + <%= f.select(:pub_status, options_for_select([["Draft", "D"], ["Published", "P"], ["Archived", "A"]], @course.pub_status), data: { status: @course.pub_status }) %> +
+ <%= f.hidden_field :subdomain, value: current_organization.subdomain %> <%= f.hidden_field :organization_id, value: current_organization.id %> diff --git a/app/views/admin/courses/forms/_course_owner_actions.html.erb b/app/views/admin/courses/forms/_course_owner_actions.html.erb index 87dbf224..7b5c4f4a 100644 --- a/app/views/admin/courses/forms/_course_owner_actions.html.erb +++ b/app/views/admin/courses/forms/_course_owner_actions.html.erb @@ -1,5 +1,4 @@
- <%= f.submit "Publish Course", class: "button-color" %> - <%= f.submit "Save as Draft", class: "button-color" %> + <%= f.submit "Save Course", class: "button-color" %> <%= f.submit "Save & Edit Lessons", class: "button-color" %>
\ No newline at end of file diff --git a/app/views/admin/courses/forms/_imported_course_actions.html.erb b/app/views/admin/courses/forms/_imported_course_actions.html.erb index a2f5cf05..f64e426b 100644 --- a/app/views/admin/courses/forms/_imported_course_actions.html.erb +++ b/app/views/admin/courses/forms/_imported_course_actions.html.erb @@ -1,5 +1,5 @@
- <%= f.submit "Publish", params: { commit: "Publish" }, class: "button-color" %> + <%= f.submit "Save Course", class: "button-color" %>

If you wish to edit details of this course and use the PLA-created Storyline files, please <%= mail_to "support@digitallearn.org", "contact a PLA Administrator" %>.

diff --git a/spec/controllers/admin/courses_controller/create_spec.rb b/spec/controllers/admin/courses_controller/create_spec.rb index 08a0969e..2cbab832 100644 --- a/spec/controllers/admin/courses_controller/create_spec.rb +++ b/spec/controllers/admin/courses_controller/create_spec.rb @@ -74,6 +74,12 @@ it 'redirects to the admin edit view of the course' do post :create, params: { course: valid_attributes } expect(response).to have_http_status(:redirect) + expect(response).to redirect_to(edit_admin_course_path(Course.find_by(title: valid_attributes[:title]))) + end + + it 'redirects to the lesson edit page if specified' do + post :create, params: { course: valid_attributes, commit: 'Save & Edit Lessons' } + expect(response).to have_http_status(:redirect) expect(response).to redirect_to(new_admin_course_lesson_path(Course.find_by(title: valid_attributes[:title]))) end @@ -112,15 +118,9 @@ expect(response).to render_template('new') end - it 'saves course as draft if committed with draft' do - expect do - post :create, params: { course: valid_attributes, commit: 'Save as Draft' } - end.to change { Course.where(pub_status: 'D').count }.by(1) - end - it 'publishes course if committed with publish' do expect do - post :create, params: { course: valid_attributes, commit: 'Publish Course' } + post :create, params: { course: valid_attributes.merge(pub_status: 'P') } end.to change { Course.where(pub_status: 'P').count }.by(1) end end diff --git a/spec/controllers/admin/courses_controller/update_spec.rb b/spec/controllers/admin/courses_controller/update_spec.rb index b3123e5f..fbd78bb0 100644 --- a/spec/controllers/admin/courses_controller/update_spec.rb +++ b/spec/controllers/admin/courses_controller/update_spec.rb @@ -28,35 +28,35 @@ update_params.merge(course_topics_attributes: [{ topic_attributes: { title: 'Another new topic' } }]) end - let(:publish_request) do - patch :update, params: { id: pla_course.to_param, course: update_params, commit: 'Publish Course' } + let(:save_request) do + patch :update, params: { id: pla_course.to_param, course: update_params, commit: 'Save Course' } end it 'redirects to edit path' do - publish_request + save_request expect(response).to redirect_to(edit_admin_course_path(pla_course.reload)) end it 'updates title' do expect do - publish_request + save_request end.to change { pla_course.reload.title }.from('PLA Course').to('Updated Title') end it 'updates access level' do expect do - publish_request + save_request end.to change { pla_course.reload.access_level }.from('everyone').to('authenticated_users') end it 'updates category' do expect do - publish_request + save_request end.to change { pla_course.reload.category }.from(pla_category1).to(pla_category2) end it 'displays appropriate notice for successful course update' do - publish_request + save_request expect(flash[:notice]).to eq('Course was successfully updated.') end @@ -74,7 +74,7 @@ describe 'propagation' do it 'propagates title to child courses' do expect do - publish_request + save_request end.to change { child_course.reload.title }.to('Updated Title') end @@ -86,13 +86,13 @@ it 'does not assign course to main site category' do expect do - publish_request + save_request end.to_not(change { child_course.reload.category }) end it 'does not change child course access level' do expect do - publish_request + save_request end.to_not(change { child_course.reload.access_level }) end @@ -152,35 +152,29 @@ sign_in admin end - describe 'publish an imported course' do + describe 'save an imported course' do let(:new_category) { FactoryBot.create(:category, organization: org) } - it 'should change the publication status' do - expect do - patch :update, params: { id: child_course.to_param, course: child_course.attributes, commit: 'Publish' } - end.to change { child_course.reload.pub_status }.from('D').to('P') - end - it 'should not change title, if new title is given' do expect do - patch :update, params: { id: child_course.to_param, course: { title: 'New Title' }, commit: 'Publish' } + patch :update, params: { id: child_course.to_param, course: { title: 'New Title' }, commit: 'Save Course' } end.to_not(change { child_course.reload.title }) end - it 'should redirect to admin dashboard' do - patch :update, params: { id: child_course.to_param, course: child_course.attributes, commit: 'Publish' } - expect(response).to redirect_to(admin_dashboard_index_path) + it 'should redirect to course edit page' do + patch :update, params: { id: child_course.to_param, course: child_course.attributes, commit: 'Save Course' } + expect(response).to redirect_to(edit_admin_course_path(child_course)) end it 'should change the course category, if given' do expect do - patch :update, params: { id: child_course.to_param, course: { category_id: new_category.id }, commit: 'Publish' } + patch :update, params: { id: child_course.to_param, course: { category_id: new_category.id }, commit: 'Save Course' } end.to change { child_course.reload.category }.to(new_category) end it 'should change the course access level, if given' do expect do - patch :update, params: { id: child_course.to_param, course: { access_level: 'authenticated_users' }, commit: 'Publish' } + patch :update, params: { id: child_course.to_param, course: { access_level: 'authenticated_users' }, commit: 'Save Course' } end.to change { child_course.reload.access_level }.from('everyone').to('authenticated_users') end end diff --git a/spec/features/admin/edit_course_spec.rb b/spec/features/admin/edit_course_spec.rb index 80966b7c..631cad37 100644 --- a/spec/features/admin/edit_course_spec.rb +++ b/spec/features/admin/edit_course_spec.rb @@ -58,10 +58,7 @@ expect(page).to have_content('Text copies of the course to allow users to download content and view offline or follow along with the online course.') expect(page).to have_content('Supplemental materials for further learning. These files are available to users after completing the course.') - expect(page).to_not have_button('Publish Course') - expect(page).to_not have_button('Edit Lessons') - - expect(page).to have_button('Publish') + expect(page).to have_button('Save Course') expect(page).to have_content('If you wish to edit details of this course and use the PLA-created Storyline files, please contact a PLA Administrator.') expect(page).to have_link('contact a PLA Administrator') end @@ -70,11 +67,10 @@ visit edit_admin_course_path(subsite_course) within(:css, 'main') do select('Authenticated Users', from: 'course_access_level') - click_button 'Publish' + click_button 'Save Course' end - expect(current_path).to eq(admin_dashboard_index_path) - expect(page).to have_content('Course successfully published!') - visit(edit_admin_course_path(subsite_course)) + expect(current_path).to eq(edit_admin_course_path(subsite_course)) + expect(page).to have_content('Course was successfully updated.') expect(page).to have_select('course_access_level', selected: 'Authenticated Users') end @@ -82,10 +78,8 @@ visit edit_admin_course_path(subsite_course) within(:css, 'main') do select(category.name, from: 'course_category_id') - click_button 'Publish' + click_button 'Save Course' end - expect(current_path).to eq(admin_dashboard_index_path) - visit(edit_admin_course_path(subsite_course)) expect(page).to have_select('course_category_id', selected: category.name) end @@ -94,7 +88,7 @@ within(:css, 'main') do select('Create new category', from: 'course_category_id') fill_in :course_category_attributes_name, with: category.name - click_button 'Publish' + click_button 'Save Course' end expect(current_path).to eq(admin_course_path(subsite_course)) expect(page).to have_content('Category Name is already in use by your organization.') @@ -108,10 +102,8 @@ within(:css, 'main') do select('Create new category', from: 'course_category_id') fill_in :course_category_attributes_name, with: "#{category.name}_#{new_word}" - click_button 'Publish' + click_button 'Save Course' end - expect(current_path).to eq(admin_dashboard_index_path) - visit(edit_admin_course_path(subsite_course)) expect(page).to have_select('course_category_id', selected: "#{category.name}_#{new_word}") end @@ -132,20 +124,14 @@ visit edit_admin_course_path(custom_subsite_course) attach_file 'Text Copies of Course', Rails.root.join('spec', 'fixtures', 'BasicSearch1.zip') attach_file 'Additional Resources', Rails.root.join('spec', 'fixtures', 'BasicSearch1.zip') - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Attachments document is invalid. Only PDF, Word, PowerPoint, or Excel files are allowed.', count: 1) end scenario 'can edit course title' do visit edit_admin_course_path(custom_subsite_course) fill_in 'Title', with: 'New Course Title' - click_button 'Save as Draft' - expect(page).to have_content('Course saved as draft.') - visit admin_courses_path - expect(page).to have_select("course_#{custom_subsite_course.id}", selected: 'Draft') - click_link 'New Course Title' - expect(page).to have_content('Edit This Course') - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Course was successfully updated.') expect(current_path).to eq(edit_admin_course_path(custom_subsite_course.reload)) expect(page).to have_field('Title', with: 'New Course Title') diff --git a/spec/features/admin/new_course_spec.rb b/spec/features/admin/new_course_spec.rb index de826314..67012961 100644 --- a/spec/features/admin/new_course_spec.rb +++ b/spec/features/admin/new_course_spec.rb @@ -33,9 +33,22 @@ def fill_basic_course_info visit new_admin_course_path end + scenario 'toggles course publication status' do + fill_basic_course_info + expect(page).to have_select('Publication Status', selected: 'Draft') + select('Published', from: 'Publication Status') + click_button 'Save Course' + expect(page).to have_content('Course was successfully created.') + expect(page).to have_select('Publication Status', selected: 'Published') + select('Archived', from: 'Publication Status') + click_button 'Save Course' + visit admin_courses_path + expect(page).to_not have_content('New Course Title') + end + scenario 'assigns topics' do fill_basic_course_info - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_field('Topic A', checked: true) expect(page).to have_field('Some New Topic', checked: true) end @@ -44,7 +57,7 @@ def fill_basic_course_info fill_basic_course_info select('Create new category', from: 'course_category_id') fill_in :course_category_attributes_name, with: new_category_name - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Course was successfully created.') expect(current_path).to eq(edit_admin_course_path(Course.last)) expect(page).to have_select('course_category_id', selected: Course.last.category.name) @@ -53,7 +66,7 @@ def fill_basic_course_info scenario 'creates new course with existing category' do fill_basic_course_info select(category.name, from: 'course_category_id') - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Course was successfully created.') expect(current_path).to eq(edit_admin_course_path(Course.last)) expect(page).to have_select('course_category_id', selected: category.name) @@ -66,7 +79,7 @@ def fill_basic_course_info scenario 'attempts to create duplicate category' do select('Create new category', from: 'course_category_id') fill_in :course_category_attributes_name, with: category.name - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Category Name is already in use by your organization.') expect(page).to have_select('course_category_id', selected: 'Create new category') expect(page).to have_selector(:css, ".field_with_errors #course_category_attributes_name[value='#{category.name}']") @@ -76,12 +89,12 @@ def fill_basic_course_info fill_basic_course_info attach_file 'Text Copies of Course', Rails.root.join('spec', 'fixtures', 'BasicSearch1.zip') attach_file 'Additional Resources', Rails.root.join('spec', 'fixtures', 'BasicSearch1.zip') - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Attachments document is invalid. Only PDF, Word, PowerPoint, or Excel files are allowed.', count: 1) attach_file 'Text Copies of Course', Rails.root.join('spec', 'fixtures', 'Why_Use_a_Computer_1.pdf') attach_file 'Additional Resources', Rails.root.join('spec', 'fixtures', 'Why_Use_a_Computer_Worksheet.pdf') - click_button 'Publish Course' + click_button 'Save Course' expect(page).to have_content('Course was successfully created.') expect(page).to have_content('Why_Use_a_Computer_1.pdf') expect(page).to have_content('Why_Use_a_Computer_Worksheet.pdf') From aa8b627521ec8c8906ada20f3604fc080ed951ab Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Mon, 30 Mar 2020 16:05:14 -0600 Subject: [PATCH 42/56] Remove lesson publication status update from course model --- app/controllers/admin/courses_controller.rb | 1 - app/models/course.rb | 7 ------- .../admin/courses_controller/courses_controller_spec.rb | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/controllers/admin/courses_controller.rb b/app/controllers/admin/courses_controller.rb index 417f6ff7..a03ba488 100644 --- a/app/controllers/admin/courses_controller.rb +++ b/app/controllers/admin/courses_controller.rb @@ -59,7 +59,6 @@ def update_pub_status course.pub_status = params[:value] course.update_pub_date(params[:value]) - course.update_lesson_pub_stats(params[:value]) if course.save render status: :ok, json: course.pub_status.to_s diff --git a/app/models/course.rb b/app/models/course.rb index 93bdbeeb..3fc48384 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -122,13 +122,6 @@ def update_pub_date(new_pub_status) end end - def update_lesson_pub_stats(new_pub_status) - lessons.each do |l| - l.pub_status = new_pub_status - l.save - end - end - def post_course_attachments (parent || self).attachments.where(doc_type: 'post-course') end diff --git a/spec/controllers/admin/courses_controller/courses_controller_spec.rb b/spec/controllers/admin/courses_controller/courses_controller_spec.rb index d271a3e7..9d2be8c4 100644 --- a/spec/controllers/admin/courses_controller/courses_controller_spec.rb +++ b/spec/controllers/admin/courses_controller/courses_controller_spec.rb @@ -7,7 +7,7 @@ let(:admin) { FactoryBot.create(:user, :admin, organization: org) } let(:category1) { FactoryBot.create(:category, organization: org) } let(:category2) { FactoryBot.create(:category, organization: org) } - let!(:course1) { FactoryBot.create(:course, title: 'Course1', course_order: 1, category: category1, organization: org) } + let!(:course1) { FactoryBot.create(:course_with_lessons, title: 'Course1', course_order: 1, category: category1, organization: org) } let!(:course2) { FactoryBot.create(:course, title: 'Course2', course_order: 2, category: category2, organization: org) } let!(:course3) { FactoryBot.create(:course, title: 'Course3', course_order: 3, organization: org) } From 82a8fca2f8e3326a2774ea26bb01492990a03dde Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Wed, 1 Apr 2020 15:16:21 -0600 Subject: [PATCH 43/56] Whitelist publication status for imported courses --- app/policies/course_policy.rb | 2 +- spec/controllers/admin/courses_controller/update_spec.rb | 6 ++++++ spec/policies/course_policy_spec.rb | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/policies/course_policy.rb b/app/policies/course_policy.rb index f85bc59c..7db280df 100644 --- a/app/policies/course_policy.rb +++ b/app/policies/course_policy.rb @@ -28,7 +28,7 @@ def permitted_attributes return [] unless user.admin? if record.parent.present? - [:category_id, :access_level, category_attributes: %i[name organization_id]] + [:category_id, :access_level, :pub_status, category_attributes: %i[name organization_id]] else [:title, :seo_page_title, diff --git a/spec/controllers/admin/courses_controller/update_spec.rb b/spec/controllers/admin/courses_controller/update_spec.rb index fbd78bb0..ba1e66ca 100644 --- a/spec/controllers/admin/courses_controller/update_spec.rb +++ b/spec/controllers/admin/courses_controller/update_spec.rb @@ -177,6 +177,12 @@ patch :update, params: { id: child_course.to_param, course: { access_level: 'authenticated_users' }, commit: 'Save Course' } end.to change { child_course.reload.access_level }.from('everyone').to('authenticated_users') end + + it 'should change publication status, if given' do + expect do + patch :update, params: { id: child_course.to_param, course: { pub_status: 'P' }, commit: 'Save Course' } + end.to change { child_course.reload.pub_status }.from('D').to('P') + end end end end diff --git a/spec/policies/course_policy_spec.rb b/spec/policies/course_policy_spec.rb index 4629cc23..297016bc 100644 --- a/spec/policies/course_policy_spec.rb +++ b/spec/policies/course_policy_spec.rb @@ -207,7 +207,7 @@ subject { CoursePolicy.new(admin, imported_subsite_course) } it 'should contain appropriate attributes' do - expect(subject.permitted_attributes).to contain_exactly(:category_id, :access_level, category_attributes: %i[name organization_id]) + expect(subject.permitted_attributes).to contain_exactly(:category_id, :access_level, :pub_status, category_attributes: %i[name organization_id]) end end From 6b7ed034682527c95d456c4f31a2f5640d06ee5e Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Wed, 1 Apr 2020 15:32:13 -0600 Subject: [PATCH 44/56] Test imported course publication status change --- spec/features/admin/edit_course_spec.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spec/features/admin/edit_course_spec.rb b/spec/features/admin/edit_course_spec.rb index 631cad37..a5646079 100644 --- a/spec/features/admin/edit_course_spec.rb +++ b/spec/features/admin/edit_course_spec.rb @@ -74,6 +74,19 @@ expect(page).to have_select('course_access_level', selected: 'Authenticated Users') end + scenario 'changes publication status for course' do + visit edit_admin_course_path(subsite_course) + expect(page).to have_select('Publication Status', selected: 'Published') + within(:css, 'main') do + select('Draft', from: 'Publication Status') + click_button 'Save Course' + end + expect(current_path).to eq(edit_admin_course_path(subsite_course)) + expect(page).to have_content('Course was successfully updated.') + expect(page).to have_select('Publication Status', selected: 'Draft') + + end + scenario 'selects existing category for course' do visit edit_admin_course_path(subsite_course) within(:css, 'main') do From 31af0183694cfb26ffa6408136cbd104831f9d27 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Wed, 1 Apr 2020 15:54:42 -0600 Subject: [PATCH 45/56] Include publication status in import course success message --- app/controllers/admin/dashboard_controller.rb | 4 +++- spec/controllers/admin/dashboard_controller_spec.rb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index f90041f3..0e25660c 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -43,7 +43,9 @@ def add_imported_course import_service = CourseImportService.new(organization: current_organization, course_id: params['course_id'].to_i) new_course = import_service.import! - redirect_to edit_admin_course_path(new_course), notice: 'Congrats! You have just imported a PLA course. Please set your desired Access Level and Course Category.' + success_message = 'Congrats! You have just imported a PLA course. Please set your desired Course Category, Access Level and Publication Status.' + + redirect_to edit_admin_course_path(new_course), notice: success_message rescue ActiveRecord::RecordInvalid => e redirect_to admin_import_courses_path, alert: e.record.errors.full_messages end diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb index e57b0f45..13b41fe9 100644 --- a/spec/controllers/admin/dashboard_controller_spec.rb +++ b/spec/controllers/admin/dashboard_controller_spec.rb @@ -89,7 +89,7 @@ it 'should assign correct flash' do post :add_imported_course, params: { course_id: importable_course1.id } - expect(flash[:notice]).to eq('Congrats! You have just imported a PLA course. Please set your desired Access Level and Course Category.') + expect(flash[:notice]).to eq('Congrats! You have just imported a PLA course. Please set your desired Course Category, Access Level and Publication Status.') end it 'should create new subdomain course with new category with same name as imported course' do From dc7a11ca95e1fd2117ad73daf101d739f30cd487 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Wed, 1 Apr 2020 16:19:24 -0600 Subject: [PATCH 46/56] Use Published instead of Publish in dashboard status dropdown --- app/views/admin/courses/_sortable_list.html.erb | 2 +- spec/features/admin/dashboard_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/views/admin/courses/_sortable_list.html.erb b/app/views/admin/courses/_sortable_list.html.erb index aed2d9da..424eac23 100644 --- a/app/views/admin/courses/_sortable_list.html.erb +++ b/app/views/admin/courses/_sortable_list.html.erb @@ -16,7 +16,7 @@
<%= link_to course.title, edit_admin_course_path(course), class: "no_drag_link" %>
<%= course.topics_str %>
<%= course.language.name %>
-
<%= select_tag "course_#{course.id}", options_for_select([["Publish", "P"], ["Draft", "D"], ["Archive", "A"]], course.pub_status), data: { course_id: course.id, status: course.pub_status }, class:"course_pub small narrow", method: :patch %> +
<%= select_tag "course_#{course.id}", options_for_select([["Published", "P"], ["Draft", "D"], ["Archive", "A"]], course.pub_status), data: { course_id: course.id, status: course.pub_status }, class:"course_pub small narrow", method: :patch %> <% unless course.pub_date.blank? %> (<%= course.pub_date.strftime("%m/%d/%Y") %>) <% end %> diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb index 2bb073b7..20f4e070 100644 --- a/spec/features/admin/dashboard_spec.rb +++ b/spec/features/admin/dashboard_spec.rb @@ -5,6 +5,7 @@ feature 'Admin visits dashboard' do let!(:default_organization) { FactoryBot.create(:default_organization) } let(:admin) { FactoryBot.create(:user, :admin) } + let!(:course) { FactoryBot.create(:course, pub_status: 'D', organization: admin.organization) } before do switch_to_subdomain(admin.organization.subdomain) @@ -44,4 +45,11 @@ expect(page).to_not have_link(link) end end + + scenario 'changes course publication status', js: true do + expect(page).to have_select("course_#{course.id}", selected: 'Draft') + select('Published', from: "course_#{course.id}") + visit admin_dashboard_index_path + expect(page).to have_select("course_#{course.id}", selected: 'Published') + end end From 94218cc6ffa77c9727c3803227436eb005a8f46e Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Thu, 2 Apr 2020 15:54:12 -0600 Subject: [PATCH 47/56] Add line break to import course flash --- app/controllers/admin/dashboard_controller.rb | 2 +- spec/controllers/admin/dashboard_controller_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 0e25660c..81db709b 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -43,7 +43,7 @@ def add_imported_course import_service = CourseImportService.new(organization: current_organization, course_id: params['course_id'].to_i) new_course = import_service.import! - success_message = 'Congrats! You have just imported a PLA course. Please set your desired Course Category, Access Level and Publication Status.' + success_message = 'Congrats! You have just imported a PLA course.
Please set your desired Course Category, Access Level and Publication Status.'.html_safe redirect_to edit_admin_course_path(new_course), notice: success_message rescue ActiveRecord::RecordInvalid => e diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb index 13b41fe9..d1d91d43 100644 --- a/spec/controllers/admin/dashboard_controller_spec.rb +++ b/spec/controllers/admin/dashboard_controller_spec.rb @@ -89,7 +89,7 @@ it 'should assign correct flash' do post :add_imported_course, params: { course_id: importable_course1.id } - expect(flash[:notice]).to eq('Congrats! You have just imported a PLA course. Please set your desired Course Category, Access Level and Publication Status.') + expect(flash[:notice]).to eq('Congrats! You have just imported a PLA course.
Please set your desired Course Category, Access Level and Publication Status.') end it 'should create new subdomain course with new category with same name as imported course' do From 10f014d06fc8bcb9a073fcc615292696564a58b4 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Sun, 5 Apr 2020 16:04:14 -0600 Subject: [PATCH 48/56] Use child course attachments for additional resources --- app/models/course.rb | 2 +- spec/models/course/course_spec.rb | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/course.rb b/app/models/course.rb index 3fc48384..07a8bfdd 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -123,7 +123,7 @@ def update_pub_date(new_pub_status) end def post_course_attachments - (parent || self).attachments.where(doc_type: 'post-course') + self.attachments.where(doc_type: 'post-course') end def supplemental_attachments diff --git a/spec/models/course/course_spec.rb b/spec/models/course/course_spec.rb index b7b88c75..200ccac7 100644 --- a/spec/models/course/course_spec.rb +++ b/spec/models/course/course_spec.rb @@ -172,6 +172,7 @@ let(:child_course) { FactoryBot.create(:course, parent: pla_course) } let!(:post_course_attachment) { FactoryBot.create(:attachment, doc_type: 'post-course', course: pla_course) } let!(:supplemental_attachment) { FactoryBot.create(:attachment, doc_type: 'supplemental', course: pla_course) } + let!(:subsite_post_course_attachment) { FactoryBot.create(:attachment, doc_type: 'post-course', course: child_course) } context 'parent course' do it 'returns correct #post_course_attachments' do @@ -184,11 +185,11 @@ end context 'child course' do - it 'returns correct #post_course_attachments' do - expect(child_course.post_course_attachments).to contain_exactly(post_course_attachment) + it 'returns subsite specific post_course_attachments' do + expect(child_course.post_course_attachments).to contain_exactly(subsite_post_course_attachment) end - it 'returns correct #supplemental_attachments' do + it 'returns parent supplemental_attachments' do expect(child_course.supplemental_attachments).to contain_exactly(supplemental_attachment) end end From c23574ebb81c99a871572db896355381d7ba76c4 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Sun, 5 Apr 2020 16:05:04 -0600 Subject: [PATCH 49/56] Remove attachment destroying data migration --- ...0200325204512_remove_child_course_attachments.rb | 13 ------------- db/data_schema.rb | 5 ++--- 2 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 db/data/20200325204512_remove_child_course_attachments.rb diff --git a/db/data/20200325204512_remove_child_course_attachments.rb b/db/data/20200325204512_remove_child_course_attachments.rb deleted file mode 100644 index 821dfe4b..00000000 --- a/db/data/20200325204512_remove_child_course_attachments.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -class RemoveChildCourseAttachments < ActiveRecord::Migration[5.2] - def up - Course.where.not(parent: nil).each do |course| - course.attachments.destroy_all - end - end - - def down - raise ActiveRecord::IrreversibleMigration - end -end diff --git a/db/data_schema.rb b/db/data_schema.rb index 5c189146..2c86f65e 100644 --- a/db/data_schema.rb +++ b/db/data_schema.rb @@ -1,3 +1,2 @@ -# frozen_string_literal: true - -DataMigrate::Data.define(version: 20_200_325_204_512) +# encoding: UTF-8 +DataMigrate::Data.define(version: 20191205164530) From d6398cfcf3bd57072bf6e83ed6dce97489f935e9 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Sun, 5 Apr 2020 17:17:21 -0600 Subject: [PATCH 50/56] Rename attachment document types --- app/models/attachment.rb | 2 +- app/models/course.rb | 8 +++---- .../_additional_resource_fields.html.erb | 6 ++--- .../courses/forms/_text_copy_fields.html.erb | 6 ++--- app/views/course_completions/show.html.erb | 2 +- .../courses/_supplemental_materials.html.erb | 4 ++-- .../shared/courses/_text_copies.html.erb | 4 ++-- .../20200405224603_rename_attachment_types.rb | 24 +++++++++++++++++++ db/data_schema.rb | 5 ++-- .../admin/courses_controller/update_spec.rb | 4 ++-- spec/factories/attachments.rb | 2 +- spec/features/admin/edit_course_spec.rb | 6 ++--- spec/features/admin/new_course_spec.rb | 2 +- .../user/user_completes_course_spec.rb | 6 ++--- spec/models/attachment_spec.rb | 2 +- spec/models/course/course_spec.rb | 22 ++++++++--------- 16 files changed, 65 insertions(+), 40 deletions(-) create mode 100644 db/data/20200405224603_rename_attachment_types.rb diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 61c56c0a..fa61a349 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -15,6 +15,6 @@ class Attachment < ApplicationRecord message: 'is invalid. Only PDF, Word, PowerPoint, or Excel files are allowed.' validates :doc_type, allow_blank: true, - inclusion: { in: %w[supplemental post-course], + inclusion: { in: %w[text-copy additional-resource], message: '%s is not a doc_type' } end diff --git a/app/models/course.rb b/app/models/course.rb index 07a8bfdd..f9ba048b 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -122,12 +122,12 @@ def update_pub_date(new_pub_status) end end - def post_course_attachments - self.attachments.where(doc_type: 'post-course') + def additional_resource_attachments + self.attachments.where(doc_type: 'additional-resource') end - def supplemental_attachments - (parent || self).attachments.where(doc_type: 'supplemental') + def text_copy_attachments + (parent || self).attachments.where(doc_type: 'text-copy') end def published? diff --git a/app/views/admin/courses/forms/_additional_resource_fields.html.erb b/app/views/admin/courses/forms/_additional_resource_fields.html.erb index 30dc4f90..b38babef 100644 --- a/app/views/admin/courses/forms/_additional_resource_fields.html.erb +++ b/app/views/admin/courses/forms/_additional_resource_fields.html.erb @@ -7,10 +7,10 @@
- <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'post-course' } %> + <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'additional-resource' } %> <% unless @imported_course %> - <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'post-course', removable: false } %> - <%= link_to_add_fields "Add Attachment", f, :attachments, "post-course" %> + <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'additional-resource', removable: false } %> + <%= link_to_add_fields "Add Attachment", f, :attachments, "additional-resource" %> <% end %>
<% end %> diff --git a/app/views/admin/courses/forms/_text_copy_fields.html.erb b/app/views/admin/courses/forms/_text_copy_fields.html.erb index 75c0a4e7..ae2abd1d 100644 --- a/app/views/admin/courses/forms/_text_copy_fields.html.erb +++ b/app/views/admin/courses/forms/_text_copy_fields.html.erb @@ -6,10 +6,10 @@

- <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'supplemental' } %> + <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'text-copy' } %> <% unless @imported_course %> - <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'supplemental', removable: false } %> - <%= link_to_add_fields "Add Attachment", f, :attachments, "supplemental" %> + <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'text-copy', removable: false } %> + <%= link_to_add_fields "Add Attachment", f, :attachments, 'text-copy' %> <% end %>
<% end %> diff --git a/app/views/course_completions/show.html.erb b/app/views/course_completions/show.html.erb index 5ae3aa65..7943718f 100644 --- a/app/views/course_completions/show.html.erb +++ b/app/views/course_completions/show.html.erb @@ -17,7 +17,7 @@ <% end %> <% end %> - <% if @course.notes.present? || !@course.post_course_attachments.empty? %> + <% if @course.notes.present? || !@course.additional_resource_attachments.empty? %> <%= link_to(course_skills_path(@course)) do %> <%= button_tag(type: 'button', class: "congrats-button button-color") do %> <%= t('course_completion_page.practice_skills') %> diff --git a/app/views/shared/courses/_supplemental_materials.html.erb b/app/views/shared/courses/_supplemental_materials.html.erb index 8a496006..b59d7ac1 100644 --- a/app/views/shared/courses/_supplemental_materials.html.erb +++ b/app/views/shared/courses/_supplemental_materials.html.erb @@ -1,7 +1,7 @@

<%= t('course_page.additional_resources') %>

-<% if @course.post_course_attachments.count > 0 %> +<% if @course.additional_resource_attachments.count > 0 %>
    - <% @course.post_course_attachments.each do |a| %> + <% @course.additional_resource_attachments.each do |a| %> <%= link_to attachment_path(a), target: "_blank", class: "block_link" do %>
  • diff --git a/app/views/shared/courses/_text_copies.html.erb b/app/views/shared/courses/_text_copies.html.erb index 89da52fe..d1421683 100644 --- a/app/views/shared/courses/_text_copies.html.erb +++ b/app/views/shared/courses/_text_copies.html.erb @@ -1,7 +1,7 @@

    <%= t('course_page.click_here_for_text_copy_course') %>

    -<% if @course.supplemental_attachments.count > 0 %> +<% if @course.text_copy_attachments.count > 0 %>
      - <% @course.supplemental_attachments.each do |a| %> + <% @course.text_copy_attachments.each do |a| %> <%= link_to attachment_path(a), target: "_blank", class: "block_link" do %>
    • diff --git a/db/data/20200405224603_rename_attachment_types.rb b/db/data/20200405224603_rename_attachment_types.rb new file mode 100644 index 00000000..c1c096e9 --- /dev/null +++ b/db/data/20200405224603_rename_attachment_types.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class RenameAttachmentTypes < ActiveRecord::Migration[5.2] + def up + Attachment.where(doc_type: 'post-course').each do |a| + a.update!(doc_type: 'additional-resource') + end + + Attachment.where(doc_type: 'supplemental').each do |a| + a.update!(doc_type: 'text-copy') + end + end + + def down + Attachment.where(doc_type: 'additional-resource').each do |a| + a.update!(doc_type: 'post-course') + end + + Attachment.where(doc_type: 'text-copy').each do |a| + a.update!(doc_type: 'supplemental') + end + + end +end diff --git a/db/data_schema.rb b/db/data_schema.rb index 2c86f65e..42973583 100644 --- a/db/data_schema.rb +++ b/db/data_schema.rb @@ -1,2 +1,3 @@ -# encoding: UTF-8 -DataMigrate::Data.define(version: 20191205164530) +# frozen_string_literal: true + +DataMigrate::Data.define(version: 20_200_405_224_603) diff --git a/spec/controllers/admin/courses_controller/update_spec.rb b/spec/controllers/admin/courses_controller/update_spec.rb index ba1e66ca..00fc5b63 100644 --- a/spec/controllers/admin/courses_controller/update_spec.rb +++ b/spec/controllers/admin/courses_controller/update_spec.rb @@ -104,8 +104,8 @@ '0' => { document: document, title: '', - doc_type: 'post-course', - file_description: 'post-course attachment test' + doc_type: 'additional-resource', + file_description: 'additional-resource attachment test' } } } end diff --git a/spec/factories/attachments.rb b/spec/factories/attachments.rb index 205caff9..0da4fa8f 100644 --- a/spec/factories/attachments.rb +++ b/spec/factories/attachments.rb @@ -2,7 +2,7 @@ FactoryBot.define do factory :attachment do - document_file_name 'post-course-info.pdf' + document_file_name 'additional-resource-info.pdf' document_content_type 'application/pdf' document_file_size 22 document_updated_at '2015-10-10 20:00:00' diff --git a/spec/features/admin/edit_course_spec.rb b/spec/features/admin/edit_course_spec.rb index a5646079..f3990919 100644 --- a/spec/features/admin/edit_course_spec.rb +++ b/spec/features/admin/edit_course_spec.rb @@ -17,10 +17,10 @@ let(:pla_course) { FactoryBot.create(:course, organization: pla) } let(:subsite_course) { FactoryBot.create(:course, organization: org, parent: pla_course) } let!(:course_attachment) do - FactoryBot.create(:attachment, document: file_attachment, doc_type: 'post-course', course: subsite_course) + FactoryBot.create(:attachment, document: file_attachment, doc_type: 'additional-resource', course: subsite_course) end - let!(:supplemental_attachment) do - FactoryBot.create(:attachment, document: file_attachment, doc_type: 'supplemental', course: subsite_course) + let!(:text_copy_attachment) do + FactoryBot.create(:attachment, document: file_attachment, doc_type: 'text-copy', course: subsite_course) end let!(:topic) { FactoryBot.create(:topic) } diff --git a/spec/features/admin/new_course_spec.rb b/spec/features/admin/new_course_spec.rb index 67012961..d6759a8f 100644 --- a/spec/features/admin/new_course_spec.rb +++ b/spec/features/admin/new_course_spec.rb @@ -85,7 +85,7 @@ def fill_basic_course_info expect(page).to have_selector(:css, ".field_with_errors #course_category_attributes_name[value='#{category.name}']") end - scenario 'adds supplemental materials and post-course supplemental materials' do + scenario 'adds text copies and additional-resource materials' do fill_basic_course_info attach_file 'Text Copies of Course', Rails.root.join('spec', 'fixtures', 'BasicSearch1.zip') attach_file 'Additional Resources', Rails.root.join('spec', 'fixtures', 'BasicSearch1.zip') diff --git a/spec/features/user/user_completes_course_spec.rb b/spec/features/user/user_completes_course_spec.rb index 1d2b9ae1..dab101d5 100644 --- a/spec/features/user/user_completes_course_spec.rb +++ b/spec/features/user/user_completes_course_spec.rb @@ -31,7 +31,7 @@ scenario 'sees practice skills button if post course attachments exist' do file = fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') - course.attachments.create(document: file, doc_type: 'post-course') + course.attachments.create(document: file, doc_type: 'additional-resource') visit course_completion_path(course) click_link 'Use My Skills Now' @@ -41,7 +41,7 @@ scenario 'can view skills page' do file = fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') - course.attachments.create(document: file, doc_type: 'post-course') + course.attachments.create(document: file, doc_type: 'additional-resource') course.update(notes: 'Post-Course completion notes...') visit course_completion_path(course) click_link 'Use My Skills Now' @@ -73,7 +73,7 @@ scenario 'can view the supplemental materials link' do file = fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') - course.attachments.create(document: file, doc_type: 'post-course') + course.attachments.create(document: file, doc_type: 'additional-resource') visit course_completion_path(course) click_link 'Use My Skills Now' diff --git a/spec/models/attachment_spec.rb b/spec/models/attachment_spec.rb index d4a5aba5..1cdb5559 100644 --- a/spec/models/attachment_spec.rb +++ b/spec/models/attachment_spec.rb @@ -15,7 +15,7 @@ end it 'can only have listed doc_types' do - allowed_statuses = %w[supplemental post-course] + allowed_statuses = %w[text-copy additional-resource] allowed_statuses.each do |status| @attachment.doc_type = status expect(@attachment).to be_valid diff --git a/spec/models/course/course_spec.rb b/spec/models/course/course_spec.rb index 200ccac7..b27fabf5 100644 --- a/spec/models/course/course_spec.rb +++ b/spec/models/course/course_spec.rb @@ -170,27 +170,27 @@ let(:pla) { FactoryBot.create(:default_organization) } let(:pla_course) { FactoryBot.create(:course, organization: pla) } let(:child_course) { FactoryBot.create(:course, parent: pla_course) } - let!(:post_course_attachment) { FactoryBot.create(:attachment, doc_type: 'post-course', course: pla_course) } - let!(:supplemental_attachment) { FactoryBot.create(:attachment, doc_type: 'supplemental', course: pla_course) } - let!(:subsite_post_course_attachment) { FactoryBot.create(:attachment, doc_type: 'post-course', course: child_course) } + let!(:additional_resource_attachment) { FactoryBot.create(:attachment, doc_type: 'additional-resource', course: pla_course) } + let!(:text_copy_attachment) { FactoryBot.create(:attachment, doc_type: 'text-copy', course: pla_course) } + let!(:subsite_additional_resource_attachment) { FactoryBot.create(:attachment, doc_type: 'additional-resource', course: child_course) } context 'parent course' do - it 'returns correct #post_course_attachments' do - expect(pla_course.post_course_attachments).to contain_exactly(post_course_attachment) + it 'returns correct additional resource' do + expect(pla_course.additional_resource_attachments).to contain_exactly(additional_resource_attachment) end - it 'returns correct #supplemental_attachments' do - expect(pla_course.supplemental_attachments).to contain_exactly(supplemental_attachment) + it 'returns correct text copy attachments' do + expect(pla_course.text_copy_attachments).to contain_exactly(text_copy_attachment) end end context 'child course' do - it 'returns subsite specific post_course_attachments' do - expect(child_course.post_course_attachments).to contain_exactly(subsite_post_course_attachment) + it 'returns subsite specific additional_resource_attachments' do + expect(child_course.additional_resource_attachments).to contain_exactly(subsite_additional_resource_attachment) end - it 'returns parent supplemental_attachments' do - expect(child_course.supplemental_attachments).to contain_exactly(supplemental_attachment) + it 'returns parent text copies' do + expect(child_course.text_copy_attachments).to contain_exactly(text_copy_attachment) end end end From dc458d672ef9992120bdca6579002f8ae023cad0 Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Sun, 5 Apr 2020 18:16:38 -0600 Subject: [PATCH 51/56] Show additional resource uploads to subsite admins --- .../stylesheets/components/_course_form.scss | 2 +- app/policies/course_policy.rb | 6 ++++- .../_additional_resource_fields.html.erb | 10 +++----- .../courses/forms/_attachment_list.html.erb | 2 +- .../courses/forms/_text_copy_fields.html.erb | 2 +- .../admin/courses_controller/update_spec.rb | 25 +++++++++++++++++++ spec/features/admin/edit_course_spec.rb | 17 ++++++++++--- .../user/user_completes_course_spec.rb | 2 +- spec/policies/course_policy_spec.rb | 6 ++++- 9 files changed, 56 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/components/_course_form.scss b/app/assets/stylesheets/components/_course_form.scss index 32afc7d7..52192d95 100644 --- a/app/assets/stylesheets/components/_course_form.scss +++ b/app/assets/stylesheets/components/_course_form.scss @@ -25,13 +25,13 @@ "errors errors" "categories access_level" "pub_status ." + "resources resources" "actions actions" "title title" "author author" "summary summary" "description description" "text_copies text_copies" - "resources resources" "additional_content additional_content" "topics ." "language format" diff --git a/app/policies/course_policy.rb b/app/policies/course_policy.rb index 7db280df..8267674d 100644 --- a/app/policies/course_policy.rb +++ b/app/policies/course_policy.rb @@ -28,7 +28,11 @@ def permitted_attributes return [] unless user.admin? if record.parent.present? - [:category_id, :access_level, :pub_status, category_attributes: %i[name organization_id]] + [:category_id, + :access_level, + :pub_status, + category_attributes: %i[name organization_id], + attachments_attributes: %i[document title doc_type file_description _destroy]] else [:title, :seo_page_title, diff --git a/app/views/admin/courses/forms/_additional_resource_fields.html.erb b/app/views/admin/courses/forms/_additional_resource_fields.html.erb index b38babef..220844b1 100644 --- a/app/views/admin/courses/forms/_additional_resource_fields.html.erb +++ b/app/views/admin/courses/forms/_additional_resource_fields.html.erb @@ -2,16 +2,14 @@ <%= f.fields_for :attachments, @course.attachments.build do |a| %> <%= a.label :document, "Additional Resources", class: "text-color" %>

      - <%= "#{@imported_course ? 'Supplemental' : 'Upload any supplemental'} materials for further learning. These files are available to users after completing the course." %> + <%= 'Upload any supplemental materials for further learning. These files are available to users after completing the course.' %>

      - <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'additional-resource' } %> - <% unless @imported_course %> - <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'additional-resource', removable: false } %> - <%= link_to_add_fields "Add Attachment", f, :attachments, "additional-resource" %> - <% end %> + <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'additional-resource', allow_delete: true } %> + <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'additional-resource', removable: false } %> + <%= link_to_add_fields "Add Attachment", f, :attachments, "additional-resource" %>
      <% end %>
\ No newline at end of file diff --git a/app/views/admin/courses/forms/_attachment_list.html.erb b/app/views/admin/courses/forms/_attachment_list.html.erb index 740eee37..bce372dd 100644 --- a/app/views/admin/courses/forms/_attachment_list.html.erb +++ b/app/views/admin/courses/forms/_attachment_list.html.erb @@ -4,7 +4,7 @@
<%= a.document_file_name %>
- <% unless @imported_course %> + <% if allow_delete %>
<%= link_to "Delete", admin_attachment_path(a), method: :delete, data: { confirm: "Are you sure?" } %>
diff --git a/app/views/admin/courses/forms/_text_copy_fields.html.erb b/app/views/admin/courses/forms/_text_copy_fields.html.erb index ae2abd1d..c02d824e 100644 --- a/app/views/admin/courses/forms/_text_copy_fields.html.erb +++ b/app/views/admin/courses/forms/_text_copy_fields.html.erb @@ -6,7 +6,7 @@

- <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'text-copy' } %> + <%= render partial: 'admin/courses/forms/attachment_list', locals: { type: 'text-copy', allow_delete: !@imported_course } %> <% unless @imported_course %> <%= render partial: 'admin/courses/forms/attachment_upload', locals: { attachment_form: a, attachment_type: 'text-copy', removable: false } %> <%= link_to_add_fields "Add Attachment", f, :attachments, 'text-copy' %> diff --git a/spec/controllers/admin/courses_controller/update_spec.rb b/spec/controllers/admin/courses_controller/update_spec.rb index 00fc5b63..ea7a913b 100644 --- a/spec/controllers/admin/courses_controller/update_spec.rb +++ b/spec/controllers/admin/courses_controller/update_spec.rb @@ -154,6 +154,25 @@ describe 'save an imported course' do let(:new_category) { FactoryBot.create(:category, organization: org) } + let(:document) { fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') } + + let(:additional_resource_attachment_attributes) do + { '0' => { + document: document, + title: '', + doc_type: 'additional-resource', + file_description: 'additional-resource attachment test' + } } + end + + let(:text_copy_attachment_attributes) do + { '0' => { + document: document, + title: '', + doc_type: 'text-copy', + file_description: 'text-copy attachment test' + } } + end it 'should not change title, if new title is given' do expect do @@ -183,6 +202,12 @@ patch :update, params: { id: child_course.to_param, course: { pub_status: 'P' }, commit: 'Save Course' } end.to change { child_course.reload.pub_status }.from('D').to('P') end + + it 'should add an additional resource attachment' do + expect do + patch :update, params: { id: child_course.to_param, course: { attachments_attributes: additional_resource_attachment_attributes } } + end.to change { child_course.reload.attachments.count }.by(1) + end end end end diff --git a/spec/features/admin/edit_course_spec.rb b/spec/features/admin/edit_course_spec.rb index f3990919..eaa603f4 100644 --- a/spec/features/admin/edit_course_spec.rb +++ b/spec/features/admin/edit_course_spec.rb @@ -51,12 +51,13 @@ expect(page).to_not have_field('Other Topic') expect(page).to_not have_field('course_other_topic_text') - expect(page).to_not have_link('Delete') - expect(page).to_not have_css('.attachment-upload-fields') - expect(page).to_not have_link('Add Attachment') + + expect(page).to have_link('Delete', count: 1) + expect(page).to have_css('.attachment-upload-fields', count: 1) + expect(page).to have_link('Add Attachment', count: 1) expect(page).to have_content('Text copies of the course to allow users to download content and view offline or follow along with the online course.') - expect(page).to have_content('Supplemental materials for further learning. These files are available to users after completing the course.') + expect(page).to have_content('Upload any supplemental materials for further learning. These files are available to users after completing the course.') expect(page).to have_button('Save Course') expect(page).to have_content('If you wish to edit details of this course and use the PLA-created Storyline files, please contact a PLA Administrator.') @@ -125,6 +126,14 @@ expect(page).to have_select('course_category_id', with_options: [category.name.to_s, "#{disabled_category.name} (disabled)"]) end + scenario 'can upload additional resource attachments' do + visit edit_admin_course_path(subsite_course) + attach_file 'Additional Resources', Rails.root.join('spec', 'fixtures', 'testfile.pdf') + click_button 'Save Course' + expect(page).to have_content('Course was successfully updated.') + expect(page).to have_content('testfile.pdf') + end + scenario 'can preview course' do skip 'TODO: course preview spec' end diff --git a/spec/features/user/user_completes_course_spec.rb b/spec/features/user/user_completes_course_spec.rb index dab101d5..f5dfd7ea 100644 --- a/spec/features/user/user_completes_course_spec.rb +++ b/spec/features/user/user_completes_course_spec.rb @@ -71,7 +71,7 @@ expect(page).to_not have_content('') end - scenario 'can view the supplemental materials link' do + scenario 'can view the additional resources link' do file = fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') course.attachments.create(document: file, doc_type: 'additional-resource') visit course_completion_path(course) diff --git a/spec/policies/course_policy_spec.rb b/spec/policies/course_policy_spec.rb index 297016bc..0567fafd 100644 --- a/spec/policies/course_policy_spec.rb +++ b/spec/policies/course_policy_spec.rb @@ -207,7 +207,11 @@ subject { CoursePolicy.new(admin, imported_subsite_course) } it 'should contain appropriate attributes' do - expect(subject.permitted_attributes).to contain_exactly(:category_id, :access_level, :pub_status, category_attributes: %i[name organization_id]) + expect(subject.permitted_attributes).to contain_exactly(:category_id, + :access_level, + :pub_status, + category_attributes: %i[name organization_id], + attachments_attributes: %i[document title doc_type file_description _destroy]) end end From b0625aaec6efb1497e409f647ca1092645eac59b Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Sun, 5 Apr 2020 19:29:25 -0600 Subject: [PATCH 52/56] Allow subsite admins to edit course notes --- app/assets/stylesheets/components/_course_form.scss | 4 ++-- app/policies/course_policy.rb | 1 + app/views/admin/courses/_form.html.erb | 2 +- spec/controllers/admin/courses_controller/update_spec.rb | 6 ++++++ spec/features/admin/edit_course_spec.rb | 9 ++++++++- spec/policies/course_policy_spec.rb | 1 + 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/components/_course_form.scss b/app/assets/stylesheets/components/_course_form.scss index 52192d95..50da54c0 100644 --- a/app/assets/stylesheets/components/_course_form.scss +++ b/app/assets/stylesheets/components/_course_form.scss @@ -24,15 +24,15 @@ grid-template-areas: "errors errors" "categories access_level" - "pub_status ." "resources resources" + "additional_content additional_content" + "pub_status ." "actions actions" "title title" "author author" "summary summary" "description description" "text_copies text_copies" - "additional_content additional_content" "topics ." "language format" "course_level ." diff --git a/app/policies/course_policy.rb b/app/policies/course_policy.rb index 8267674d..d792102d 100644 --- a/app/policies/course_policy.rb +++ b/app/policies/course_policy.rb @@ -31,6 +31,7 @@ def permitted_attributes [:category_id, :access_level, :pub_status, + :notes, category_attributes: %i[name organization_id], attachments_attributes: %i[document title doc_type file_description _destroy]] else diff --git a/app/views/admin/courses/_form.html.erb b/app/views/admin/courses/_form.html.erb index 6d754f52..c8ed0533 100644 --- a/app/views/admin/courses/_form.html.erb +++ b/app/views/admin/courses/_form.html.erb @@ -52,7 +52,7 @@
<%= f.label :notes, "Content for Further Learning", class: "text-color" %>

This content is available to users after completing the course.

- <%= f.cktext_area :notes, disabled: @imported_course %> + <%= f.cktext_area :notes %>
<%= render 'admin/courses/forms/topics', f: f %> diff --git a/spec/controllers/admin/courses_controller/update_spec.rb b/spec/controllers/admin/courses_controller/update_spec.rb index ea7a913b..a0b61441 100644 --- a/spec/controllers/admin/courses_controller/update_spec.rb +++ b/spec/controllers/admin/courses_controller/update_spec.rb @@ -208,6 +208,12 @@ patch :update, params: { id: child_course.to_param, course: { attachments_attributes: additional_resource_attachment_attributes } } end.to change { child_course.reload.attachments.count }.by(1) end + + it 'should update course notes' do + expect do + patch :update, params: { id: child_course.to_param, course: { notes: 'new course notes' } } + end.to change { child_course.reload.notes }.from(nil).to('new course notes') + end end end end diff --git a/spec/features/admin/edit_course_spec.rb b/spec/features/admin/edit_course_spec.rb index eaa603f4..7fe3c6b6 100644 --- a/spec/features/admin/edit_course_spec.rb +++ b/spec/features/admin/edit_course_spec.rb @@ -39,7 +39,6 @@ 'Contributor', 'Course Summary', 'Course Description', - 'Content for Further Learning', topic.title, 'Course Language', 'Course Format', @@ -134,6 +133,14 @@ expect(page).to have_content('testfile.pdf') end + scenario 'updates content for further learning' do + visit edit_admin_course_path(subsite_course) + fill_in 'Content for Further Learning', with: 'New content for further learning' + click_button 'Save Course' + expect(page).to have_content('Course was successfully updated.') + expect(page).to have_field('Content for Further Learning', with: 'New content for further learning') + end + scenario 'can preview course' do skip 'TODO: course preview spec' end diff --git a/spec/policies/course_policy_spec.rb b/spec/policies/course_policy_spec.rb index 0567fafd..61ba7fec 100644 --- a/spec/policies/course_policy_spec.rb +++ b/spec/policies/course_policy_spec.rb @@ -210,6 +210,7 @@ expect(subject.permitted_attributes).to contain_exactly(:category_id, :access_level, :pub_status, + :notes, category_attributes: %i[name organization_id], attachments_attributes: %i[document title doc_type file_description _destroy]) end From 40b4338bfcaa3ddd45a2f54fae6d96882a18455f Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Tue, 7 Apr 2020 12:09:40 -0600 Subject: [PATCH 53/56] Update restricted course edit page styles --- .../stylesheets/components/_course_form.scss | 9 +++++ .../stylesheets/mixins/_color_scheme.scss | 8 ++++ app/assets/stylesheets/partials/_forms.scss | 38 +++++++++---------- app/views/admin/courses/_form.html.erb | 33 +++++++--------- .../courses/forms/_access_level.html.erb | 2 +- .../_additional_resource_fields.html.erb | 2 +- .../admin/courses/forms/_categories.html.erb | 2 +- .../forms/_imported_course_actions.html.erb | 4 +- .../courses/forms/_text_copy_fields.html.erb | 2 +- .../admin/courses/forms/_topics.html.erb | 6 +-- spec/features/admin/edit_course_spec.rb | 2 +- 11 files changed, 57 insertions(+), 51 deletions(-) diff --git a/app/assets/stylesheets/components/_course_form.scss b/app/assets/stylesheets/components/_course_form.scss index 50da54c0..3c01fe06 100644 --- a/app/assets/stylesheets/components/_course_form.scss +++ b/app/assets/stylesheets/components/_course_form.scss @@ -127,6 +127,15 @@ .actions { grid-area: actions; } + + .imported-course-actions { + border-bottom: 1px solid $grey; + + p { + margin-block-start: 2em; + margin-block-end: 0; + } + } } .attachment-upload-fields { diff --git a/app/assets/stylesheets/mixins/_color_scheme.scss b/app/assets/stylesheets/mixins/_color_scheme.scss index 958c1b64..69f95af8 100644 --- a/app/assets/stylesheets/mixins/_color_scheme.scss +++ b/app/assets/stylesheets/mixins/_color_scheme.scss @@ -20,6 +20,14 @@ label { color: $primary_color; + + &.disabled { + color: $grey; + + .required:after { + color: $grey; + } + } } table { diff --git a/app/assets/stylesheets/partials/_forms.scss b/app/assets/stylesheets/partials/_forms.scss index 3f54d0fb..fc343aef 100644 --- a/app/assets/stylesheets/partials/_forms.scss +++ b/app/assets/stylesheets/partials/_forms.scss @@ -3,18 +3,22 @@ label { font-size: 1.5em; margin-bottom: 0.5em; display: block; -} -legend { - margin-bottom: 0.5em; + &.plain { + color: $dark-grey; + font-size: 1em; + margin-bottom: 0.5em; + display: inline-block; + padding-right: 1em; + } + + &.disabled { + color: $grey; + } } -label.plain { - color: $dark-grey; - font-size: 1em; +legend { margin-bottom: 0.5em; - display: inline-block; - padding-right: 1em; } .required:after { @@ -214,19 +218,6 @@ select { outline: 0; } -.inline-checkbox-row { - padding-top: 15px; - - .plain-label { - font-size: 16px; - color: black; - - span { - padding-left: 10px; - } - } -} - .inline-radio-group { padding-top: 10px; padding-left: 20px; @@ -286,3 +277,8 @@ select { .character-limit { margin-bottom: -14px; } + +input:disabled, +select:disabled { + color: darken($medium-grey, 20%); +} diff --git a/app/views/admin/courses/_form.html.erb b/app/views/admin/courses/_form.html.erb index c8ed0533..5f2bae34 100644 --- a/app/views/admin/courses/_form.html.erb +++ b/app/views/admin/courses/_form.html.erb @@ -11,13 +11,11 @@ <% end %> <% if @imported_course %> - <%= render 'admin/courses/forms/categories', f: f %> - <%= render 'admin/courses/forms/access_level', f: f %> <%= render 'admin/courses/forms/imported_course_actions', f: f %> <% end %>
- <%= f.label :title, class: "text-color" do %> + <%= f.label :title, class: "#{'disabled' if @imported_course}" do %> Title <% end %> <%= f.text_field :title, maxlength: Course.max_length_for(:title), disabled: @imported_course %> @@ -25,14 +23,14 @@
- <%= f.label :contributor, class: "text-color" do %> + <%= f.label :contributor, class: "#{'disabled' if @imported_course}" do %> Contributor <% end %> <%= f.text_field :contributor, disabled: @imported_course %>
- <%= f.label :summary, class: "text-color" do %> + <%= f.label :summary, class: "#{'disabled' if @imported_course}" do %> Course Summary <% end %> <%= f.text_field :summary, maxlength: Course.max_length_for(:summary), disabled: @imported_course %> @@ -40,7 +38,7 @@
- <%= f.label :description, class: "text-color" do %> + <%= f.label :description, class: "#{'disabled' if @imported_course}" do %> Course Description <% end %> <%= f.cktext_area :description, disabled: @imported_course %> @@ -50,44 +48,39 @@ <%= render partial: 'admin/courses/forms/additional_resource_fields', locals: { f: f } %>
- <%= f.label :notes, "Content for Further Learning", class: "text-color" %> + <%= f.label :notes, "Content for Further Learning", class: "" %>

This content is available to users after completing the course.

<%= f.cktext_area :notes %>
<%= render 'admin/courses/forms/topics', f: f %> - - <% unless @imported_course %> - <%= render 'admin/courses/forms/categories', f: f %> - <% end %> + <%= render 'admin/courses/forms/categories', f: f %>
- <%= f.label :language_id, class: "text-color" do %> + <%= f.label :language_id, class: "#{'disabled' if @imported_course}" do %> Course Language <% end %> <%= f.collection_select(:language_id, Language.all, :id, "name", { include_blank: "Select..." }, { disabled: @imported_course } ) %>
- <%= f.label :format, class: "text-color" do %> + <%= f.label :format, class: "#{'disabled' if @imported_course}" do %> Course Format <% end %> <%= f.select(:format, options_for_select([["Desktop", "D"],["Mobile", "M"]], @course.format), { include_blank: "Select..." }, { disabled: @imported_course } ) %>
- <%= f.label :level, class: "text-color" do %> + <%= f.label :level, class: "#{'disabled' if @imported_course}" do %> Course Level <% end %> <%= f.select(:level, options_for_select(["Beginner", "Intermediate", "Advanced"], @course.level), { include_blank: "Select..." }, { disabled: @imported_course } ) %>
- <% unless @imported_course %> - <%= render 'admin/courses/forms/access_level', f: f %> - <% end %> + <%= render 'admin/courses/forms/access_level', f: f %>
- <%= f.label :seo_page_title, class: "text-color" do %> + <%= f.label :seo_page_title, class: "#{'disabled' if @imported_course}" do %> SEO Page Title <% end %> <%= f.text_field :seo_page_title, maxlength: Course.max_length_for(:seo_page_title), disabled: @imported_course %> @@ -95,7 +88,7 @@
- <%= f.label :meta_desc, class: "text-color" do %> + <%= f.label :meta_desc, class: "#{'disabled' if @imported_course}" do %> SEO Meta Description <% end %> <%= f.text_field :meta_desc, maxlength: Course.max_length_for(:meta_desc), disabled: @imported_course %> @@ -103,7 +96,7 @@
- <%= f.label :pub_status, class: "text-color" do %> + <%= f.label :pub_status do %> Publication Status <% end %> <%= f.select(:pub_status, options_for_select([["Draft", "D"], ["Published", "P"], ["Archived", "A"]], @course.pub_status), data: { status: @course.pub_status }) %> diff --git a/app/views/admin/courses/forms/_access_level.html.erb b/app/views/admin/courses/forms/_access_level.html.erb index b309cc09..94931f24 100644 --- a/app/views/admin/courses/forms/_access_level.html.erb +++ b/app/views/admin/courses/forms/_access_level.html.erb @@ -1,5 +1,5 @@
- <%= f.label :access_level, class: "text-color" do %> + <%= f.label :access_level do %> Access Level <% end %> <% options = [['Everyone', 'everyone'], ['Authenticated Users', 'authenticated_users']]%> diff --git a/app/views/admin/courses/forms/_additional_resource_fields.html.erb b/app/views/admin/courses/forms/_additional_resource_fields.html.erb index 220844b1..6555059c 100644 --- a/app/views/admin/courses/forms/_additional_resource_fields.html.erb +++ b/app/views/admin/courses/forms/_additional_resource_fields.html.erb @@ -1,6 +1,6 @@
<%= f.fields_for :attachments, @course.attachments.build do |a| %> - <%= a.label :document, "Additional Resources", class: "text-color" %> + <%= a.label :document, "Additional Resources" %>

<%= 'Upload any supplemental materials for further learning. These files are available to users after completing the course.' %>

diff --git a/app/views/admin/courses/forms/_categories.html.erb b/app/views/admin/courses/forms/_categories.html.erb index a49d1609..8a05dc4a 100644 --- a/app/views/admin/courses/forms/_categories.html.erb +++ b/app/views/admin/courses/forms/_categories.html.erb @@ -1,6 +1,6 @@
- <%= f.label :category_id, class: "text-color" do %> + <%= f.label :category_id do %> Course Category <% end %> <%= f.select(:category_id, options_for_select(@category_options, @course.category_id || ("0" if @custom)),{ include_blank: "Uncategorized" } ) %> diff --git a/app/views/admin/courses/forms/_imported_course_actions.html.erb b/app/views/admin/courses/forms/_imported_course_actions.html.erb index f64e426b..0442aaeb 100644 --- a/app/views/admin/courses/forms/_imported_course_actions.html.erb +++ b/app/views/admin/courses/forms/_imported_course_actions.html.erb @@ -1,6 +1,6 @@ -
+
<%= f.submit "Save Course", class: "button-color" %>

- If you wish to edit details of this course and use the PLA-created Storyline files, please <%= mail_to "support@digitallearn.org", "contact a PLA Administrator" %>. + If you wish to edit additional details of this course and use the PLA-created Storyline files, please <%= mail_to "support@digitallearn.org", "contact a PLA Administrator" %>.

\ No newline at end of file diff --git a/app/views/admin/courses/forms/_text_copy_fields.html.erb b/app/views/admin/courses/forms/_text_copy_fields.html.erb index c02d824e..d8f9e3de 100644 --- a/app/views/admin/courses/forms/_text_copy_fields.html.erb +++ b/app/views/admin/courses/forms/_text_copy_fields.html.erb @@ -1,6 +1,6 @@
<%= f.fields_for :attachments, @course.attachments.build do |a| %> - <%= a.label :document, "Text Copies of Course", class: "text-color" %> + <%= a.label :document, "Text Copies of Course", class: "#{'disabled' if @imported_course}" %>

<%= "#{@imported_course ? 'Text' : 'Upload text'} copies of the course to allow users to download content and view offline or follow along with the online course." %>

diff --git a/app/views/admin/courses/forms/_topics.html.erb b/app/views/admin/courses/forms/_topics.html.erb index 8f3384b1..1685f5f2 100644 --- a/app/views/admin/courses/forms/_topics.html.erb +++ b/app/views/admin/courses/forms/_topics.html.erb @@ -1,19 +1,19 @@
- <%= f.label :topic_ids, class: "text-color" do %> + <%= f.label :topic_ids, class: "#{'disabled' if @imported_course}" do %> Course Topics <% end %> <%= f.collection_check_boxes(:topic_ids, Topic.all, :id, :title, {}, disabled: @imported_course) do |b| %>
<%= b.check_box %> - <%= b.label class: "plain" %> + <%= b.label class: "plain #{'disabled' if @imported_course}" %>
<% end %> <% unless @imported_course %>
<%= f.check_box :other_topic %> - <%= f.label :other_topic, "Other Topic", class: "plain" %> + <%= f.label :other_topic, "Other Topic", class: "plain #{'disabled' if @imported_course}" %> <%= f.fields_for :course_topics, [CourseTopic.new] do |ct| %> <%= ct.fields_for :topic_attributes do |topic_form| %> <%= topic_form.text_field :title, placeholder: "(Enter to create new topic)", class: "topic-box" %> diff --git a/spec/features/admin/edit_course_spec.rb b/spec/features/admin/edit_course_spec.rb index 7fe3c6b6..bec384c4 100644 --- a/spec/features/admin/edit_course_spec.rb +++ b/spec/features/admin/edit_course_spec.rb @@ -59,7 +59,7 @@ expect(page).to have_content('Upload any supplemental materials for further learning. These files are available to users after completing the course.') expect(page).to have_button('Save Course') - expect(page).to have_content('If you wish to edit details of this course and use the PLA-created Storyline files, please contact a PLA Administrator.') + expect(page).to have_content('If you wish to edit additional details of this course and use the PLA-created Storyline files, please contact a PLA Administrator.') expect(page).to have_link('contact a PLA Administrator') end From 342de74b3594ebce005c97389c15930b7d8ee0fa Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Tue, 7 Apr 2020 12:24:30 -0600 Subject: [PATCH 54/56] Remove propagation of course notes --- app/controllers/admin/courses_controller.rb | 2 +- spec/controllers/admin/courses_controller/update_spec.rb | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/courses_controller.rb b/app/controllers/admin/courses_controller.rb index a03ba488..521acaf3 100644 --- a/app/controllers/admin/courses_controller.rb +++ b/app/controllers/admin/courses_controller.rb @@ -140,7 +140,7 @@ def new_course_params end def attributes_to_propagate - course_params.except(:category_id, :category_attributes, :access_level, :course_topics_attributes, :attachments_attributes, :pub_status) + course_params.except(:category_id, :category_attributes, :access_level, :course_topics_attributes, :attachments_attributes, :pub_status, :notes) end end end diff --git a/spec/controllers/admin/courses_controller/update_spec.rb b/spec/controllers/admin/courses_controller/update_spec.rb index a0b61441..be10f2ad 100644 --- a/spec/controllers/admin/courses_controller/update_spec.rb +++ b/spec/controllers/admin/courses_controller/update_spec.rb @@ -21,7 +21,7 @@ end let(:update_params) do - pla_course.attributes.merge('title' => 'Updated Title', 'access_level' => 'authenticated_users', 'category_id' => pla_category2.id) + pla_course.attributes.merge('title' => 'Updated Title', 'access_level' => 'authenticated_users', 'category_id' => pla_category2.id, 'notes' => 'New Notes') end let(:new_topic_params) do @@ -96,6 +96,12 @@ end.to_not(change { child_course.reload.access_level }) end + it 'does not propagate notes/content for further learning to child courses' do + expect do + save_request + end.to_not(change { child_course.reload.notes }) + end + describe 'attachments' do let(:document) { fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') } From 1d634124ee1821662ea5ada0f0124faa9e2a72dc Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Thu, 9 Apr 2020 10:31:16 -0600 Subject: [PATCH 55/56] Remove specific instructions from import success message --- app/controllers/admin/dashboard_controller.rb | 2 +- spec/controllers/admin/dashboard_controller_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 81db709b..3e8d9a6c 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -43,7 +43,7 @@ def add_imported_course import_service = CourseImportService.new(organization: current_organization, course_id: params['course_id'].to_i) new_course = import_service.import! - success_message = 'Congrats! You have just imported a PLA course.
Please set your desired Course Category, Access Level and Publication Status.'.html_safe + success_message = 'Congrats! You have just imported a PLA course.' redirect_to edit_admin_course_path(new_course), notice: success_message rescue ActiveRecord::RecordInvalid => e diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb index d1d91d43..986493fd 100644 --- a/spec/controllers/admin/dashboard_controller_spec.rb +++ b/spec/controllers/admin/dashboard_controller_spec.rb @@ -89,7 +89,7 @@ it 'should assign correct flash' do post :add_imported_course, params: { course_id: importable_course1.id } - expect(flash[:notice]).to eq('Congrats! You have just imported a PLA course.
Please set your desired Course Category, Access Level and Publication Status.') + expect(flash[:notice]).to eq('Congrats! You have just imported a PLA course.') end it 'should create new subdomain course with new category with same name as imported course' do From ba75692b8d10012508b897136dd803453adcf1ca Mon Sep 17 00:00:00 2001 From: Tom Reis Date: Thu, 9 Apr 2020 10:31:25 -0600 Subject: [PATCH 56/56] Import additional resource attachments with courses --- app/services/course_import_service.rb | 11 +++++++++++ spec/services/course_import_service_spec.rb | 13 ++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/services/course_import_service.rb b/app/services/course_import_service.rb index 904f2a72..3195a499 100644 --- a/app/services/course_import_service.rb +++ b/app/services/course_import_service.rb @@ -12,6 +12,7 @@ def import! save_new_course! copy_parent_lessons! copy_topics! + copy_attachments! end @new_course @@ -54,4 +55,14 @@ def copy_topics! new_topic.save! end end + + def copy_attachments! + # Create copies of the attachments + @parent_course.additional_resource_attachments.each do |attachment| + new_attachment = attachment.dup + new_attachment.document = attachment.document + new_attachment.course_id = @new_course.id + new_attachment.save! + end + end end diff --git a/spec/services/course_import_service_spec.rb b/spec/services/course_import_service_spec.rb index b4d08f2f..5d03ddb5 100644 --- a/spec/services/course_import_service_spec.rb +++ b/spec/services/course_import_service_spec.rb @@ -9,7 +9,8 @@ let(:pla_course) { FactoryBot.create(:course_with_lessons, organization: pla, topics: [topic], category: category) } let(:document) { fixture_file_upload(Rails.root.join('spec', 'fixtures', 'testfile.pdf'), 'application/pdf') } - let!(:attachment) { FactoryBot.create(:attachment, document: document, course: pla_course) } + let!(:text_copy_attachment) { FactoryBot.create(:attachment, doc_type: 'text-copy', document: document, course: pla_course) } + let!(:additional_resource_attachment) { FactoryBot.create(:attachment, doc_type: 'additional-resource', document: document, course: pla_course) } let(:subsite) { FactoryBot.create(:organization) } @@ -45,10 +46,16 @@ end.to change { subsite.lessons.count }.by(3) end - it 'should not copy attachments' do + it 'should copy additional-content attachments' do expect do subject.import! - end.to_not change(Attachment, :count) + end.to change { Attachment.where(doc_type: 'additional-resource').count }.by(1) + end + + it 'should not copy text-copy attachments' do + expect do + subject.import! + end.to_not(change { Attachment.where(doc_type: 'text-copy').count }) end it 'should create new course topic' do