From 9b9cc69c7c7e1152919000c1e0160763b21f25e4 Mon Sep 17 00:00:00 2001 From: Abd El-Latif <34073213+a-abdellatif98@users.noreply.github.com> Date: Fri, 25 Sep 2026 22:42:53 +0300 Subject: [PATCH 1/5] Notify co-authors when a post they are credited on is published (#23803) * feat(notifications): notify co-authors when a post they are credited on publishes Closes #23758. Article has had co-author support for a long time, co_author_ids with validations, but nothing ever told a co-author their post went live. The notification architecture was already there too, so this is wiring rather than new concepts. - Notifications::CoAuthor::Send creates one notification per credited co-author, following the shape of NotifiableAction::Send. - Notifications::CoAuthor::Remove deletes notifications for co-authors who are dropped. Targeted by user, since RemoveAll and RemoveAllByAction delete across every user for a notifiable. - Notifications::CoAuthorWorker runs both, with lock: :until_executing and on_conflict: :replace so rapid edits coalesce. - Article notifies on publish through send_to_mentioned_users_and_followers, and on an after_update_commit when co_author_ids changes on an already published post. Drafts are skipped. Avoiding the double notify: co-authors who also follow the author or the organization would otherwise get a follower notification as well. They are now excluded from the follower query in NotifiableAction::Send, the same way already-mentioned users are. Sending is idempotent. It skips co-authors who already have a notification, so re-publishing or an unrelated edit does not notify anyone twice, and it upserts rather than inserts because a unique index covers (user_id, notifiable_id, notifiable_type, action) and two publishes racing would otherwise raise. Web notifications only, no email or push. Locale strings for en, fr and pt. * Fix co-author notification sorting, nil guards, filter scope, and add regression tests - Set notified_at in bulk upsert in Notifications::CoAuthor::Send to ensure proper ordering and offset pagination - Add Array.wrap around co_author_ids to guard against nil in CoAuthor::Send and NotifiableAction::Send - Include CoAuthor action in Notification.for_published_articles scope so notifications appear under the Posts tab - Clean up CoAuthor notifications on article unpublish in Articles::Updater and Moderator::UnpublishAllArticles - Add unit specs for Notifications::CoAuthorWorker, Article#notify_co_author_changes, Notification.send_to_co_authors, and unpublishing cleanup * Update co-author notifications on article edits and optimize deletion - Refresh json_data on both Published and CoAuthor notifications in Article#update_notifications - Replace destroy_all with delete_all in Notifications::CoAuthor::Remove - Add request specs verifying GET /notifications and GET /notifications/posts - Add regression model spec in Notification#update_notifications * Update notification conditions for co-authors Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Refactor(spec): flatten co-author organization request spec and eliminate rubocop disables * Style(notifications): fix indentation in CoAuthor::Send * fix(url): prevent double port appending in development environment --------- Co-authored-by: Ben Halpern Co-authored-by: Mikey Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- app/decorators/notification_decorator.rb | 9 +- app/lib/url.rb | 10 +- app/models/article.rb | 13 ++- app/models/notification.rb | 12 ++- app/services/articles/updater.rb | 2 + .../moderator/unpublish_all_articles.rb | 3 + .../notifications/co_author/remove.rb | 32 +++++++ app/services/notifications/co_author/send.rb | 76 +++++++++++++++ .../notifications/notifiable_action/send.rb | 6 +- app/views/notifications/_article.html.erb | 9 ++ app/workers/notifications/co_author_worker.rb | 16 ++++ config/locales/views/notifications/en.yml | 3 + config/locales/views/notifications/fr.yml | 3 + config/locales/views/notifications/pt.yml | 3 + .../decorators/notification_decorator_spec.rb | 17 ++++ spec/lib/url_spec.rb | 6 ++ spec/models/article_spec.rb | 31 ++++++ spec/models/notification_spec.rb | 58 ++++++++++++ spec/requests/notifications_spec.rb | 49 ++++++++++ spec/services/articles/updater_spec.rb | 7 ++ .../notifications/co_author/remove_spec.rb | 30 ++++++ .../notifications/co_author/send_spec.rb | 94 +++++++++++++++++++ .../notifiable_action/send_spec.rb | 21 +++++ .../notifications/co_author_worker_spec.rb | 35 +++++++ 24 files changed, 540 insertions(+), 5 deletions(-) create mode 100644 app/services/notifications/co_author/remove.rb create mode 100644 app/services/notifications/co_author/send.rb create mode 100644 app/workers/notifications/co_author_worker.rb create mode 100644 spec/services/notifications/co_author/remove_spec.rb create mode 100644 spec/services/notifications/co_author/send_spec.rb create mode 100644 spec/workers/notifications/co_author_worker_spec.rb diff --git a/app/decorators/notification_decorator.rb b/app/decorators/notification_decorator.rb index ea48925bd7acc..bbde9b4f2411f 100644 --- a/app/decorators/notification_decorator.rb +++ b/app/decorators/notification_decorator.rb @@ -131,7 +131,14 @@ def article_id end def article_url - @article_url ||= json_data.dig("article", "url") || json_data.dig("article", "path") + @article_url ||= begin + url = json_data.dig("article", "url") + if url.present? && url.match?(%r{:\d+:\d+}) + json_data.dig("article", "path").presence || url.sub(%r{(:\d+):\d+}, '\1') + else + url.presence || json_data.dig("article", "path") + end + end end def article_title diff --git a/app/lib/url.rb b/app/lib/url.rb index 90bb547ad54e5..f40b45d3eb991 100644 --- a/app/lib/url.rb +++ b/app/lib/url.rb @@ -45,12 +45,20 @@ def self.domain(domain_or_subforem = nil) def self.url(uri = nil, domain_or_subforem = nil) base_url = "#{protocol}#{domain(domain_or_subforem)}" port = dev_port - base_url += ":#{port}" if Rails.env.development? && port.present? && base_url.exclude?(":#{port}") + base_url += ":#{port}" if Rails.env.development? && port.present? && !port_present?(base_url) return base_url unless uri Addressable::URI.parse(base_url).join(uri).normalize.to_s end + def self.port_present?(url) + Addressable::URI.heuristic_parse(url).port.present? + rescue Addressable::URI::InvalidURIError + false + end + + private_class_method :port_present? + # Creates an article URL # # @param article [Article] the article to create the URL for diff --git a/app/models/article.rb b/app/models/article.rb index 550e7f1a2b063..bb0870f6a8b9d 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -353,6 +353,10 @@ def self.permitted_video_source_url?(url) after_save :generate_social_image after_save :generate_context_notes + after_update_commit :notify_co_author_changes, if: proc { |article| + article.published? && article.saved_change_to_co_author_ids? + } + after_update_commit :update_notifications, if: proc { |article| article.notifications.any? && !article.saved_changes.empty? } @@ -1475,7 +1479,7 @@ def fetch_video_duration end def update_notifications - Notification.update_notifications(self, I18n.t("models.article.published")) + Notification.update_notifications(self, %w[Published CoAuthor]) end def update_notification_subscriptions @@ -2037,6 +2041,13 @@ def update_dependent_embeds_if_key_info_changed end end + def notify_co_author_changes + before, after = saved_change_to_co_author_ids + removed_user_ids = Array.wrap(before).map(&:to_i) - Array.wrap(after).map(&:to_i) + + Notification.send_to_co_authors(self, removed_user_ids) + end + def cleanup_memberships_if_unpublished concept_memberships.destroy_all trend_memberships.destroy_all diff --git a/app/models/notification.rb b/app/models/notification.rb index 599d52b4a2bc0..7fa15d54f4818 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -13,7 +13,7 @@ class Notification < ApplicationRecord before_create :mark_notified_at_time after_commit :cleanup_old_notifications, on: :create - scope :for_published_articles, -> { where(notifiable_type: "Article", action: "Published") } + scope :for_published_articles, -> { where(notifiable_type: "Article", action: %w[Published CoAuthor]) } scope :for_comments, -> { where(notifiable_type: "Comment", action: nil) } # nil action means "not a reaction" scope :for_mentions, -> { where(notifiable_type: "Mention") } @@ -73,6 +73,16 @@ def send_to_mentioned_users_and_followers(notifiable, _action = nil) # Kicks off a worker to send any notifications about the post being published, if necessary. Notification.send_to_followers(notifiable, "Published") + + # Credited co-authors are notified separately from followers. + Notification.send_to_co_authors(notifiable) + end + + def send_to_co_authors(notifiable, removed_user_ids = []) + return unless notifiable.is_a?(Article) + return if notifiable.co_author_ids.blank? && removed_user_ids.blank? + + Notifications::CoAuthorWorker.perform_async(notifiable.id, removed_user_ids) end def send_to_followers(notifiable, action = nil) diff --git a/app/services/articles/updater.rb b/app/services/articles/updater.rb index f8825a214c3a4..f8148a9a2740b 100644 --- a/app/services/articles/updater.rb +++ b/app/services/articles/updater.rb @@ -83,6 +83,8 @@ def send_to_mentioned_users_and_followers def remove_all_notifications Notification.remove_all_by_action_without_delay(notifiable_ids: article.id, notifiable_type: "Article", action: "Published") + Notification.remove_all_by_action_without_delay(notifiable_ids: article.id, notifiable_type: "Article", + action: "CoAuthor") ContextNotification.delete_by(context_id: article.id, context_type: "Article", action: "Published") diff --git a/app/services/moderator/unpublish_all_articles.rb b/app/services/moderator/unpublish_all_articles.rb index 4836a187dc311..f6fc3759b089f 100644 --- a/app/services/moderator/unpublish_all_articles.rb +++ b/app/services/moderator/unpublish_all_articles.rb @@ -56,6 +56,9 @@ def clean_up_notifications(article) Notification.remove_all_by_action_without_delay(notifiable_ids: article.id, notifiable_type: "Article", action: "Published") + Notification.remove_all_by_action_without_delay(notifiable_ids: article.id, + notifiable_type: "Article", + action: "CoAuthor") ContextNotification.delete_by(context_id: article.id, context_type: "Article", action: "Published") diff --git a/app/services/notifications/co_author/remove.rb b/app/services/notifications/co_author/remove.rb new file mode 100644 index 0000000000000..db901201cb4f4 --- /dev/null +++ b/app/services/notifications/co_author/remove.rb @@ -0,0 +1,32 @@ +# Removes co-author notifications for users who are no longer credited. +module Notifications + module CoAuthor + class Remove + def self.call(...) + new(...).call + end + + # @param article_id [Integer] + # @param user_ids [Array] + def initialize(article_id, user_ids) + @article_id = article_id + @user_ids = Array.wrap(user_ids).map(&:to_i) + end + + def call + return if user_ids.empty? + + Notification.where( + user_id: user_ids, + notifiable_id: article_id, + notifiable_type: "Article", + action: Notifications::CoAuthor::Send::ACTION, + ).delete_all + end + + private + + attr_reader :article_id, :user_ids + end + end +end diff --git a/app/services/notifications/co_author/send.rb b/app/services/notifications/co_author/send.rb new file mode 100644 index 0000000000000..2129223b42b1e --- /dev/null +++ b/app/services/notifications/co_author/send.rb @@ -0,0 +1,76 @@ +# Notifies co-authors that a post they are credited on is live. +module Notifications + module CoAuthor + class Send + ACTION = "CoAuthor".freeze + + def self.call(...) + new(...).call + end + + # @param article [Article] + def initialize(article) + @article = article + end + + delegate :user_data, :article_data, :organization_data, to: Notifications + + def call + return unless article.is_a?(Article) + return unless article.published? && !article.scheduled? && article.type_of == "full_post" + + recipient_ids = Array.wrap(article.co_author_ids).map(&:to_i) - [article.user_id] + return if recipient_ids.empty? + + # Skip anyone already notified so re-publishing or an unrelated edit + # does not notify the same co-author twice. + already_notified = Notification.where( + user_id: recipient_ids, + notifiable_id: article.id, + notifiable_type: "Article", + action: ACTION, + ).pluck(:user_id) + + pending_ids = recipient_ids - already_notified + return if pending_ids.empty? + + now = Time.current + attributes = User.where(id: pending_ids).ids.map do |user_id| + { + user_id: user_id, + notifiable_id: article.id, + notifiable_type: "Article", + subforem_id: article.subforem_id, + action: ACTION, + json_data: json_data, + created_at: now, + notified_at: now, + updated_at: now + } + end + return if attributes.empty? + + # upsert rather than insert: a unique index covers + # (user_id, notifiable_id, notifiable_type, action), and two publishes + # racing would otherwise raise instead of no-opping. + Notification.upsert_all( + attributes, + unique_by: :index_notifications_on_user_notifiable_and_action_not_null, + ) + end + + private + + attr_reader :article + + def json_data + data = { + user: user_data(article.user), + article: article_data(article) + } + data[:organization] = organization_data(article.organization) if article.organization_id + data + end + end + end +end diff --git a/app/services/notifications/notifiable_action/send.rb b/app/services/notifications/notifiable_action/send.rb index ff01d30a6876b..0d895c7e5c29a 100644 --- a/app/services/notifications/notifiable_action/send.rb +++ b/app/services/notifications/notifiable_action/send.rb @@ -32,12 +32,16 @@ def call # have a mention in order to avoid sending a user multiple notifications for one article. user_ids_with_article_mentions = notifiable.mentions&.pluck(:user_id) + # Co-authors receive their own notification, so exclude them here for the + # same reason mentions are excluded: one notification per person per post. + co_author_ids = Array.wrap(notifiable.co_author_ids).map(&:to_i) + article_followers = User.joins("INNER JOIN follows ON follows.follower_id = users.id") .where("(follows.followable_id = ? AND follows.followable_type = ?) OR (follows.followable_id = ? AND follows.followable_type = ?)", notifiable&.user&.id, "User", notifiable&.organization&.id, "Organization") .where(follows: { subscription_status: "all_articles" }) - .where.not(id: (user_ids_with_article_mentions + [notifiable.user])) + .where.not(id: (user_ids_with_article_mentions + co_author_ids + [notifiable.user])) .recently_active(FOLLOWER_SEND_LIMIT).distinct article_followers.find_each do |follower| diff --git a/app/views/notifications/_article.html.erb b/app/views/notifications/_article.html.erb index e14436811aa33..afad863a4abd5 100644 --- a/app/views/notifications/_article.html.erb +++ b/app/views/notifications/_article.html.erb @@ -11,6 +11,15 @@

<%= time_ago_in_words json_data["article"]["published_at"], scope: :"datetime.distance_in_words_ago" %>

+ <%= render "notifications/shared/article_preview", notification: notification, context: "default" %> + <% elsif notification.action == "CoAuthor" %> +
+

+ <%= message_user_acted_maybe_org(json_data, "views.notifications.co_author.verb_html", if_org: "views.notifications.co_author.if_org_html") %> +

+

<%= time_ago_in_words json_data["article"]["published_at"], scope: :"datetime.distance_in_words_ago" %>

+
+ <%= render "notifications/shared/article_preview", notification: notification, context: "default" %> <% elsif notification.action == "Moderation" %> <% new_user = mod_article_user(json_data) %> diff --git a/app/workers/notifications/co_author_worker.rb b/app/workers/notifications/co_author_worker.rb new file mode 100644 index 0000000000000..55cb0fe8fa374 --- /dev/null +++ b/app/workers/notifications/co_author_worker.rb @@ -0,0 +1,16 @@ +module Notifications + class CoAuthorWorker + include Sidekiq::Job + + sidekiq_options queue: :low_priority, lock: :until_executing, on_conflict: :replace, retry: 10 + + def perform(article_id, removed_user_ids = []) + Notifications::CoAuthor::Remove.call(article_id, removed_user_ids) + + article = Article.find_by(id: article_id) + return unless article + + Notifications::CoAuthor::Send.call(article) + end + end +end diff --git a/config/locales/views/notifications/en.yml b/config/locales/views/notifications/en.yml index 6d7b52cd5f62f..161a785c5ff81 100644 --- a/config/locales/views/notifications/en.yml +++ b/config/locales/views/notifications/en.yml @@ -27,6 +27,9 @@ en: settings: Settings event: reminder_html: "Reminder: %{event_link} starts in %{time}!" + co_author: + if_org_html: " under %{org}" + verb_html: "%{user} published a post you are credited on%{if_org}" comment: commented_html: "%{user} commented on %{title}" first_html: "%{user} wrote their first comment on %{title}" diff --git a/config/locales/views/notifications/fr.yml b/config/locales/views/notifications/fr.yml index ece0b299e39e0..1f300701d7905 100644 --- a/config/locales/views/notifications/fr.yml +++ b/config/locales/views/notifications/fr.yml @@ -27,6 +27,9 @@ fr: settings: Settings event: reminder_html: "Rappel : %{event_link} commence dans %{time} !" + co_author: + if_org_html: " sous %{org}" + verb_html: "%{user} a publié un article dont vous êtes co-auteur%{if_org}" comment: commented_html: "%{user} commented on %{title}" first_html: "%{user} wrote their first comment on %{title}" diff --git a/config/locales/views/notifications/pt.yml b/config/locales/views/notifications/pt.yml index 90e29a85a997d..3ae7ccdc8cc29 100644 --- a/config/locales/views/notifications/pt.yml +++ b/config/locales/views/notifications/pt.yml @@ -27,6 +27,9 @@ pt: settings: Configurações event: reminder_html: "Lembrete: %{event_link} começa em %{time}!" + co_author: + if_org_html: " em %{org}" + verb_html: "%{user} publicou um post em que você é coautor%{if_org}" comment: commented_html: "%{user} comentou em %{title}" first_html: "%{user} escreveu seu primeiro comentário em %{title}" diff --git a/spec/decorators/notification_decorator_spec.rb b/spec/decorators/notification_decorator_spec.rb index c43996ef5941e..9e79fe3e7866e 100644 --- a/spec/decorators/notification_decorator_spec.rb +++ b/spec/decorators/notification_decorator_spec.rb @@ -331,6 +331,23 @@ expect(decorated.article_updated_at).to eq("2023-06-02T06:55:53.406Z") end + it "falls back to path or cleans malformed double ports in article_url" do + double_port_notif = build(:notification, json_data: { + "article" => { + "url" => "http://localhost:3000:3100/a_user/article-here", + "path" => "/a_user/article-here", + }, + }).decorate + expect(double_port_notif.article_url).to eq("/a_user/article-here") + + no_path_notif = build(:notification, json_data: { + "article" => { + "url" => "http://localhost:3000:3100/a_user/article-here", + }, + }).decorate + expect(no_path_notif.article_url).to eq("http://localhost:3000/a_user/article-here") + end + it "responds to comment and commentable fields (even if blank)" do expect(decorated.comment_id).to be_blank expect(decorated.commentable_article_id).to be_blank diff --git a/spec/lib/url_spec.rb b/spec/lib/url_spec.rb index 56227da5d3c0c..1dd06331f0717 100644 --- a/spec/lib/url_spec.rb +++ b/spec/lib/url_spec.rb @@ -130,6 +130,12 @@ expect(described_class.url).to eq("https://localhost:3005") end + it "does not append dev_port when the domain already contains a different port" do + allow(described_class).to receive(:dev_port).and_return("3100") + allow(Settings::General).to receive(:app_domain).and_return("localhost:3000") + expect(described_class.url).to eq("https://localhost:3000") + end + it "omits the port entirely when dev_port is blank, for a TLS proxy in front of the app" do allow(described_class).to receive(:dev_port).and_return("") expect(described_class.url).to eq("https://localhost") diff --git a/spec/models/article_spec.rb b/spec/models/article_spec.rb index 2b3a8a9d8a15e..8ee18f24b45f6 100644 --- a/spec/models/article_spec.rb +++ b/spec/models/article_spec.rb @@ -4279,4 +4279,35 @@ def foo(): expect(Organizations::RecompilePagesWorker).to have_received(:perform_async).with(organization.id) end end + + describe "#notify_co_author_changes" do + let(:author) { create(:user) } + let(:co_author1) { create(:user) } + let(:co_author2) { create(:user) } + + before do + allow(Notification).to receive(:send_to_co_authors) + end + + it "notifies co-authors when co_author_ids changes on a published article" do + article = create(:article, user: author, published: true, co_author_ids: [co_author1.id]) + article.update!(co_author_ids: [co_author1.id, co_author2.id]) + + expect(Notification).to have_received(:send_to_co_authors).with(article, []) + end + + it "passes removed user ids when a co-author is dropped from a published article" do + article = create(:article, user: author, published: true, co_author_ids: [co_author1.id, co_author2.id]) + article.update!(co_author_ids: [co_author1.id]) + + expect(Notification).to have_received(:send_to_co_authors).with(article, [co_author2.id]) + end + + it "does not notify when co_author_ids changes on an unpublished draft" do + article = create(:article, user: author, published: false, co_author_ids: [co_author1.id]) + article.update!(co_author_ids: [co_author1.id, co_author2.id]) + + expect(Notification).not_to have_received(:send_to_co_authors) + end + end end diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index f4f53dc4d5515..20855a04e86f0 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -559,6 +559,21 @@ def skip_notifications_for_status_article?(article) expected_notification_organization_id = described_class.last.json_data["organization"]["id"] expect(expected_notification_organization_id).to eq(organization.id) end + + it "updates CoAuthor notifications with the new article title" do + co_author = create(:user) + article.update(co_author_ids: [co_author.id]) + sidekiq_perform_enqueued_jobs { described_class.send_to_co_authors(article) } + + new_title = "Brand New Co-Authored Title" + new_body_markdown = article.body_markdown.gsub(article.title, new_title) + article.update(title: new_title, body_markdown: new_body_markdown) + described_class.update_notifications(article, %w[Published CoAuthor]) + sidekiq_perform_enqueued_jobs + + co_author_notification = co_author.notifications.find_by(action: "CoAuthor") + expect(co_author_notification.json_data["article"]["title"]).to eq(new_title) + end end end @@ -695,4 +710,47 @@ def skip_notifications_for_status_article?(article) end end end + + describe ".send_to_co_authors" do + before do + allow(Notifications::CoAuthorWorker).to receive(:perform_async) + end + + it "enqueues CoAuthorWorker when co_author_ids are present" do + article = create(:article, co_author_ids: [user.id]) + described_class.send_to_co_authors(article) + + expect(Notifications::CoAuthorWorker).to have_received(:perform_async).with(article.id, []) + end + + it "enqueues CoAuthorWorker when removed_user_ids are present even if co_author_ids is empty" do + article = create(:article, co_author_ids: []) + described_class.send_to_co_authors(article, [user.id]) + + expect(Notifications::CoAuthorWorker).to have_received(:perform_async).with(article.id, [user.id]) + end + + it "skips enqueuing when both co_author_ids and removed_user_ids are blank" do + article = create(:article, co_author_ids: []) + described_class.send_to_co_authors(article, []) + + expect(Notifications::CoAuthorWorker).not_to have_received(:perform_async) + end + + it "skips enqueuing when notifiable is not an Article" do + described_class.send_to_co_authors(comment, [user.id]) + + expect(Notifications::CoAuthorWorker).not_to have_received(:perform_async) + end + end + + describe ".for_published_articles" do + it "includes both Published and CoAuthor notifications" do + published_notification = create(:notification, notifiable: article, action: "Published") + co_author_notification = create(:notification, notifiable: article, action: "CoAuthor") + _other_notification = create(:notification, notifiable: article, action: "Moderation") + + expect(described_class.for_published_articles).to contain_exactly(published_notification, co_author_notification) + end + end end diff --git a/spec/requests/notifications_spec.rb b/spec/requests/notifications_spec.rb index 1e6e4ed3ef54f..e22bb88022336 100644 --- a/spec/requests/notifications_spec.rb +++ b/spec/requests/notifications_spec.rb @@ -786,6 +786,55 @@ def renders_visit_profile_button end end + context "when a user has a new co-author notification" do + let(:co_author) { create(:user) } + let(:article) { create(:article, user_id: user.id, co_author_ids: [co_author.id]) } + + before do + sidekiq_perform_enqueued_jobs do + Notification.send_to_co_authors(article) + end + sign_in co_author + end + + it "renders the proper message in GET /notifications", :aggregate_failures do + get "/notifications" + + expect(response.body).to include "published a post you are credited on" + renders_article_path(article) + renders_authors_name(article) + renders_article_published_at(article) + end + + it "renders cleanly in GET /notifications/posts filter", :aggregate_failures do + get "/notifications/posts" + + expect(response.body).to include "published a post you are credited on" + renders_article_path(article) + renders_authors_name(article) + end + end + + context "when a user has a new co-author notification with an organization" do + let(:co_author) { create(:user) } + let(:article) do + create(:organization_membership, user: co_author, organization: organization) + create(:article, user_id: user.id, organization_id: organization.id, co_author_ids: [co_author.id]) + end + + it "renders the organization credit", :aggregate_failures do + sidekiq_perform_enqueued_jobs { Notification.send_to_co_authors(article) } + sign_in co_author + + get "/notifications" + + expect(response.body).to include( + "under " \ + "#{CGI.escapeHTML(organization.name)}", + ) + end + end + context "when a user is an admin" do let(:admin) { create(:user, :super_admin) } let(:user2) { create(:user) } diff --git a/spec/services/articles/updater_spec.rb b/spec/services/articles/updater_spec.rb index 9dbfe250bf890..5ff1ac8839dc8 100644 --- a/spec/services/articles/updater_spec.rb +++ b/spec/services/articles/updater_spec.rb @@ -300,6 +300,13 @@ # expect(ContextNotification).to have_received(:delete_all) end + it "destroys preexisting co-author notifications" do + allow(Notification).to receive(:remove_all_by_action_without_delay).and_call_original + described_class.call(user, article, attributes) + attrs = { notifiable_ids: article.id, notifiable_type: "Article", action: "CoAuthor" } + expect(Notification).to have_received(:remove_all_by_action_without_delay).with(attrs) + end + it "destroys the preexisting context notifications" do create(:context_notification, context: article, action: "Published") expect do diff --git a/spec/services/notifications/co_author/remove_spec.rb b/spec/services/notifications/co_author/remove_spec.rb new file mode 100644 index 0000000000000..3228009d25476 --- /dev/null +++ b/spec/services/notifications/co_author/remove_spec.rb @@ -0,0 +1,30 @@ +require "rails_helper" + +RSpec.describe Notifications::CoAuthor::Remove, type: :service do + let(:author) { create(:user) } + let(:co_author) { create(:user) } + let(:article) { create(:article, user: author, published: true, co_author_ids: [co_author.id]) } + + def co_author_notifications + Notification.where(notifiable_id: article.id, notifiable_type: "Article", action: "CoAuthor") + end + + before { Notifications::CoAuthor::Send.call(article) } + + it "removes the notification for a dropped co-author" do + expect { described_class.call(article.id, [co_author.id]) } + .to change(co_author_notifications, :count).by(-1) + end + + it "leaves notifications for co-authors who remain" do + other = create(:user) + + expect { described_class.call(article.id, [other.id]) } + .not_to change(co_author_notifications, :count) + end + + it "does nothing when given no user ids" do + expect { described_class.call(article.id, []) } + .not_to change(co_author_notifications, :count) + end +end diff --git a/spec/services/notifications/co_author/send_spec.rb b/spec/services/notifications/co_author/send_spec.rb new file mode 100644 index 0000000000000..33d8f3a17d517 --- /dev/null +++ b/spec/services/notifications/co_author/send_spec.rb @@ -0,0 +1,94 @@ +require "rails_helper" + +RSpec.describe Notifications::CoAuthor::Send, type: :service do + let(:author) { create(:user) } + let(:co_author) { create(:user) } + + def co_authored_article(co_authors: [co_author], published: true) + create(:article, user: author, published: published, co_author_ids: co_authors.map(&:id)) + end + + def co_author_notifications(article) + Notification.where(notifiable_id: article.id, notifiable_type: "Article", action: "CoAuthor") + end + + it "notifies a credited co-author" do + article = co_authored_article + + expect { described_class.call(article) } + .to change { co_author_notifications(article).count }.by(1) + + expect(co_author_notifications(article).first.user_id).to eq(co_author.id) + end + + it "stores the article and author in the payload" do + article = co_authored_article + described_class.call(article) + + json_data = co_author_notifications(article).first.json_data + + expect(json_data["article"]["title"]).to eq(article.title) + expect(json_data["user"]["id"]).to eq(author.id) + end + + it "does not notify twice when called again" do + article = co_authored_article + described_class.call(article) + + expect { described_class.call(article) } + .not_to change { co_author_notifications(article).count } + end + + it "only notifies co-authors who do not have a notification yet" do + second_co_author = create(:user) + article = co_authored_article + described_class.call(article) + + article.update_columns(co_author_ids: [co_author.id, second_co_author.id]) + + expect { described_class.call(article.reload) } + .to change { co_author_notifications(article).count }.by(1) + + expect(co_author_notifications(article).pluck(:user_id)) + .to contain_exactly(co_author.id, second_co_author.id) + end + + it "does not notify the author even if listed as a co-author" do + article = co_authored_article + article.update_columns(co_author_ids: [author.id]) + + described_class.call(article.reload) + + expect(co_author_notifications(article).pluck(:user_id)).not_to include(author.id) + end + + it "does nothing for an unpublished article" do + article = co_authored_article(published: false) + + expect { described_class.call(article) } + .not_to change { co_author_notifications(article).count } + end + + it "sets notified_at on the created notification" do + article = co_authored_article + described_class.call(article) + + notification = co_author_notifications(article).first + expect(notification.notified_at).to be_present + expect(notification.notified_at).to be_within(5.seconds).of(Time.current) + end + + it "handles nil co_author_ids safely" do + article = create(:article, user: author, published: true) + article.update_columns(co_author_ids: nil) + + expect { described_class.call(article.reload) }.not_to raise_error + expect(co_author_notifications(article)).to be_empty + end + + it "does nothing when there are no co-authors" do + article = create(:article, user: author, published: true) + + expect { described_class.call(article) }.not_to change(Notification, :count) + end +end diff --git a/spec/services/notifications/notifiable_action/send_spec.rb b/spec/services/notifications/notifiable_action/send_spec.rb index 786019b3aacd5..616fb73a1a3b4 100644 --- a/spec/services/notifications/notifiable_action/send_spec.rb +++ b/spec/services/notifications/notifiable_action/send_spec.rb @@ -9,6 +9,27 @@ let(:user2) { create(:user) } let(:user3) { create(:user) } + context "when a follower is also a co-author" do + before do + user2.follow(user) + article.update_columns(co_author_ids: [user2.id]) + end + + it "does not send a follower notification, since the co-author gets their own" do + expect do + described_class.call(article.reload, "Published") + end.not_to change { + Notification.where(user_id: user2.id, notifiable_id: article.id, action: "Published").count + } + end + + it "handles nil co_author_ids safely" do + article.update_columns(co_author_ids: nil) + + expect { described_class.call(article.reload, "Published") }.not_to raise_error + end + end + context "when following a user or organization" do before do user2.follow(user) diff --git a/spec/workers/notifications/co_author_worker_spec.rb b/spec/workers/notifications/co_author_worker_spec.rb new file mode 100644 index 0000000000000..62701ae10102e --- /dev/null +++ b/spec/workers/notifications/co_author_worker_spec.rb @@ -0,0 +1,35 @@ +require "rails_helper" + +RSpec.describe Notifications::CoAuthorWorker, type: :worker do + subject(:worker) { described_class.new } + + let(:article) { create(:article) } + let(:removed_user_ids) { [1, 2] } + + before do + allow(Notifications::CoAuthor::Remove).to receive(:call) + allow(Notifications::CoAuthor::Send).to receive(:call) + end + + it "calls Remove and Send when the article exists" do + worker.perform(article.id, removed_user_ids) + + expect(Notifications::CoAuthor::Remove).to have_received(:call).with(article.id, removed_user_ids) + expect(Notifications::CoAuthor::Send).to have_received(:call).with(article) + end + + it "defaults removed_user_ids to an empty array" do + worker.perform(article.id) + + expect(Notifications::CoAuthor::Remove).to have_received(:call).with(article.id, []) + expect(Notifications::CoAuthor::Send).to have_received(:call).with(article) + end + + it "calls Remove but skips Send when the article does not exist" do + non_existent_id = -1 + worker.perform(non_existent_id, removed_user_ids) + + expect(Notifications::CoAuthor::Remove).to have_received(:call).with(non_existent_id, removed_user_ids) + expect(Notifications::CoAuthor::Send).not_to have_received(:call) + end +end From 0842b9b47b49367e1a59b684d82058ddb41f2d3f Mon Sep 17 00:00:00 2001 From: Jonathan Gottfried Date: Fri, 25 Sep 2026 15:55:57 -0400 Subject: [PATCH 2/5] Ship production logs to Better Stack (env-gated) (#23878) * Ship production logs to Better Stack when BETTERSTACK_SOURCE_TOKEN is set Claude-Session: https://claude.ai/code/session_01YL4NMvotZJsvKFri2g2qZa Entire-Checkpoint: 01M3CN2FH8ABTF7QSP5YXJXJV0 * Document optional Better Stack env vars in .env_sample Claude-Session: https://claude.ai/code/session_01YL4NMvotZJsvKFri2g2qZa Entire-Checkpoint: 01M3CN5M7D0HHQ5YCR6D853D5J * Harden Better Stack log shipping and move it to an initializer - Attach the Better Stack logger in config/initializers/betterstack.rb with Rails.logger.broadcast_to, so it adds to whatever logger Rails built (stdout or the default file logger) instead of replacing it when RAILS_LOG_TO_STDOUT isn't set. production.rb is back to its original state. - Add Betterstack::LogDevice, a subclass of logtail's HTTP device that: - waits 1s between connection attempts. Upstream reconnects in a tight loop when a connection fails fast, which kept a CPU core busy in every process that had logged an error. - caps the exit-time flush at 5s. Upstream waits up to 20s, and Heroku sends SIGKILL 30s after SIGTERM. - turns TLS certificate verification back on (upstream sets VERIFY_NONE). - lib/betterstack is ignored by Zeitwerk, so logtail is still only loaded when BETTERSTACK_SOURCE_TOKEN is set. - BETTERSTACK_INGESTING_HOST is optional and falls back to logtail's default host, instead of raising KeyError at boot. - Pin logtail to ~> 0.1.17, since the subclass overrides private methods. - Add specs for the initializer wiring (including tagged blocks running once) and for the log device fixes. Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Ben Halpern Co-authored-by: Claude Opus 5.5 --- .env_sample | 6 ++ Gemfile | 1 + Gemfile.lock | 3 + config/initializers/betterstack.rb | 18 ++++++ config/initializers/zeitwerk.rb | 3 + lib/betterstack/log_device.rb | 38 +++++++++++ spec/initializers/betterstack_spec.rb | 81 ++++++++++++++++++++++++ spec/lib/betterstack/log_device_spec.rb | 49 ++++++++++++++ vendor/cache/logtail-0.1.17.gem | Bin 0 -> 32256 bytes 9 files changed, 199 insertions(+) create mode 100644 config/initializers/betterstack.rb create mode 100644 lib/betterstack/log_device.rb create mode 100644 spec/initializers/betterstack_spec.rb create mode 100644 spec/lib/betterstack/log_device_spec.rb create mode 100644 vendor/cache/logtail-0.1.17.gem diff --git a/.env_sample b/.env_sample index 13e99fed6f89b..5dde17f05dca7 100644 --- a/.env_sample +++ b/.env_sample @@ -90,6 +90,12 @@ NODE_ENV="development" HONEYBADGER_API_KEY="Optional" HONEYBADGER_JS_API_KEY="Optional" +# Better Stack for production logs, in addition to stdout. Off unless the token is set. +# Both values are on the source's page in Better Stack; the host defaults to in.logs.betterstack.com. +# (https://betterstack.com/docs/logs/ruby-and-rails/) +# BETTERSTACK_SOURCE_TOKEN= +# BETTERSTACK_INGESTING_HOST= + # AWS for images storages AWS_ID= AWS_SECRET= diff --git a/Gemfile b/Gemfile index bc34e6b981b7d..b589322a931e3 100644 --- a/Gemfile +++ b/Gemfile @@ -64,6 +64,7 @@ gem "jwt", "2.10.3" # Verify delegated access tokens gem "kaminari", "~> 1.2" # A Scope and Engine based, clean, powerful, customizable and sophisticated paginator gem "katex", "~> 0.9.0" # This rubygem enables you to render TeX math to HTML using KaTeX. It uses ExecJS under the hood gem "liquid", "~> 5.4" # A secure, non-evaling end user template engine with aesthetic markup +gem "logtail", "~> 0.1.17", require: false # Ships Rails logs to Better Stack when BETTERSTACK_SOURCE_TOKEN is set (see lib/betterstack/log_device.rb before upgrading) gem "metainspector", "~> 5.12" # To get and parse website metadata for Open Graph rich objects gem "mini_magick", "~> 4.13" # Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick gem "nokogiri", "~> 1.18" # HTML, XML, SAX, and Reader parser diff --git a/Gemfile.lock b/Gemfile.lock index 2642b58cce2b0..ca836e6597cb4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -554,6 +554,8 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) + logtail (0.1.17) + msgpack (~> 1.0) loofah (2.25.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -1195,6 +1197,7 @@ DEPENDENCIES launchy (~> 2.5) liquid (~> 5.4) listen (~> 3.7) + logtail (~> 0.1.17) memory_profiler (~> 1.0) metainspector (~> 5.12) mini_magick (~> 4.13) diff --git a/config/initializers/betterstack.rb b/config/initializers/betterstack.rb new file mode 100644 index 0000000000000..04f7fa397a97d --- /dev/null +++ b/config/initializers/betterstack.rb @@ -0,0 +1,18 @@ +# Ship production logs to Better Stack as well as to the existing logger (stdout on Heroku). +# Off unless BETTERSTACK_SOURCE_TOKEN is set, and the logtail gem isn't loaded otherwise. +if Rails.env.production? && ENV["BETTERSTACK_SOURCE_TOKEN"].present? + require Rails.root.join("lib/betterstack/log_device") + + betterstack_logger = Logtail::Logger.new( + Betterstack::LogDevice.new( + ENV.fetch("BETTERSTACK_SOURCE_TOKEN"), + # Falls back to logtail's default host when unset. + ingesting_host: ENV["BETTERSTACK_INGESTING_HOST"].presence, + ), + ) + betterstack_logger.level = Rails.logger.level + + # Logtail::Logger must not respond to #tagged: BroadcastLogger runs a tagged block once per + # logger that does, so ActiveJob#perform_now would run every job twice. + Rails.logger.broadcast_to(betterstack_logger) +end diff --git a/config/initializers/zeitwerk.rb b/config/initializers/zeitwerk.rb index 4da82d4fd1d13..b81646759aaa0 100644 --- a/config/initializers/zeitwerk.rb +++ b/config/initializers/zeitwerk.rb @@ -16,3 +16,6 @@ Rails.autoloaders.main.ignore(Rails.root.join("lib/generators/service")) Rails.autoloaders.main.ignore(Rails.root.join("lib/generators/settings_model")) Rails.autoloaders.main.ignore(Rails.root.join("lib/cypress-rails")) + +# Required by config/initializers/betterstack.rb only when Better Stack is configured +Rails.autoloaders.main.ignore(Rails.root.join("lib/betterstack")) diff --git a/lib/betterstack/log_device.rb b/lib/betterstack/log_device.rb new file mode 100644 index 0000000000000..3973dcb21bc89 --- /dev/null +++ b/lib/betterstack/log_device.rb @@ -0,0 +1,38 @@ +require "logtail" + +module Betterstack + # Logtail's HTTP log device, fixed for running in every Puma worker and Sidekiq process. + # Only loaded when BETTERSTACK_SOURCE_TOKEN is set (see config/initializers/betterstack.rb). + # + # The overridden methods are private in logtail; spec/lib/betterstack/log_device_spec.rb + # fails if an upgrade renames them. + class LogDevice < Logtail::LogDevices::HTTP + # Upstream reconnects immediately after a failed connection, so a fast failure (refused, + # TLS error, unknown host) keeps a CPU core busy until Better Stack is reachable again. + RECONNECT_INTERVAL = 1 # second + + # Upstream waits up to 20 seconds for undelivered logs when the process exits. Heroku + # sends SIGKILL 30 seconds after SIGTERM, so don't let an outage hold up shutdown. + FLUSH_TIMEOUT = 5 # seconds + + private + + def build_http + wait = RECONNECT_INTERVAL - (monotonic_now - @last_connect_at) if @last_connect_at + sleep(wait) if wait&.positive? + @last_connect_at = monotonic_now + + # Upstream turns off TLS certificate verification. + super.tap { |http| http.verify_mode = OpenSSL::SSL::VERIFY_PEER } + end + + def wait_on_request_queue + deadline = monotonic_now + FLUSH_TIMEOUT + sleep(0.1) while (@request_queue.size.positive? || @requests_in_flight.positive?) && monotonic_now < deadline + end + + def monotonic_now + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + end +end diff --git a/spec/initializers/betterstack_spec.rb b/spec/initializers/betterstack_spec.rb new file mode 100644 index 0000000000000..bb80f9f6c49ef --- /dev/null +++ b/spec/initializers/betterstack_spec.rb @@ -0,0 +1,81 @@ +require "rails_helper" +require Rails.root.join("lib/betterstack/log_device") + +RSpec.describe "Better Stack initializer" do # rubocop:disable RSpec/DescribeClass + let(:initializer_path) { Rails.root.join("config/initializers/betterstack.rb") } + let(:stdout) { StringIO.new } + let(:stdout_logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(stdout)) } + let(:rails_logger) { ActiveSupport::BroadcastLogger.new(stdout_logger).tap { |logger| logger.level = :error } } + let(:device) { Betterstack::LogDevice.new("token", flush_continuously: false) } + + before do + allow(Rails).to receive(:logger).and_return(rails_logger) + allow(Rails.env).to receive(:production?).and_return(true) + allow(ENV).to receive(:[]).and_call_original + allow(ENV).to receive(:[]).with("BETTERSTACK_SOURCE_TOKEN").and_return("token") + allow(ENV).to receive(:[]).with("BETTERSTACK_INGESTING_HOST").and_return("in.logs.example.com") + allow(ENV).to receive(:fetch).and_call_original + allow(ENV).to receive(:fetch).with("BETTERSTACK_SOURCE_TOKEN").and_return("token") + allow(Betterstack::LogDevice).to receive(:new).and_return(device) + allow(device).to receive(:write).and_return(true) + end + + it "adds a Better Stack logger at the Rails log level" do + load initializer_path + + betterstack_logger = rails_logger.broadcasts.last + expect(rails_logger.broadcasts.first).to be(stdout_logger) + expect(betterstack_logger).to be_a(Logtail::Logger) + expect(betterstack_logger.level).to eq(Logger::ERROR) + expect(Betterstack::LogDevice).to have_received(:new).with("token", ingesting_host: "in.logs.example.com") + end + + it "sends lines at or above the Rails log level to Better Stack and stdout" do + load initializer_path + + rails_logger.warn("ignored") + rails_logger.error("boom") + + expect(device).to have_received(:write).once.with(having_attributes(level: :error, message: "boom")) + expect(stdout.string).to include("boom") + expect(stdout.string).not_to include("ignored") + end + + it "runs tagged blocks, like ActiveJob#perform_now, once" do + load initializer_path + runs = 0 + + rails_logger.tagged("ActiveJob") do + runs += 1 + rails_logger.error("inside a job") + end + + expect(runs).to eq(1) + expect(device).to have_received(:write).once + expect(stdout.string).to include("[ActiveJob] inside a job") + end + + it "falls back to logtail's default host when BETTERSTACK_INGESTING_HOST is unset" do + allow(ENV).to receive(:[]).with("BETTERSTACK_INGESTING_HOST").and_return(nil) + + load initializer_path + + expect(Betterstack::LogDevice).to have_received(:new).with("token", ingesting_host: nil) + end + + it "does nothing without BETTERSTACK_SOURCE_TOKEN" do + allow(ENV).to receive(:[]).with("BETTERSTACK_SOURCE_TOKEN").and_return(nil) + + load initializer_path + + expect(rails_logger.broadcasts).to eq([stdout_logger]) + end + + it "does nothing outside production" do + allow(Rails.env).to receive(:production?).and_return(false) + + load initializer_path + + expect(rails_logger.broadcasts).to eq([stdout_logger]) + end +end diff --git a/spec/lib/betterstack/log_device_spec.rb b/spec/lib/betterstack/log_device_spec.rb new file mode 100644 index 0000000000000..6a7eaede9a81c --- /dev/null +++ b/spec/lib/betterstack/log_device_spec.rb @@ -0,0 +1,49 @@ +require "rails_helper" +require Rails.root.join("lib/betterstack/log_device") + +RSpec.describe Betterstack::LogDevice do + # Nothing listens on this port, so nothing is delivered + let(:unreachable_options) do + { ingesting_host: "127.0.0.1", ingesting_port: 9, ingesting_scheme: "http", flush_continuously: false } + end + + it "overrides methods logtail still defines" do + expect(Logtail::LogDevices::HTTP.private_instance_methods(false)) + .to include(:build_http, :wait_on_request_queue) + end + + it "verifies Better Stack's TLS certificate" do + http = described_class.new("token", ingesting_host: "in.logs.example.com").__send__(:build_http) + + expect(http.use_ssl?).to be(true) + expect(http.verify_mode).to eq(OpenSSL::SSL::VERIFY_PEER) + end + + it "uses logtail's default host when none is given" do + http = described_class.new("token", ingesting_host: nil).__send__(:build_http) + + expect(http.address).to eq(Logtail::LogDevices::HTTP::DEFAULT_INGESTING_HOST) + end + + it "waits between connection attempts" do + device = described_class.new("token", unreachable_options) + allow(device).to receive(:sleep) + + device.__send__(:build_http) + expect(device).not_to have_received(:sleep) + + device.__send__(:build_http) + expect(device).to have_received(:sleep).with(a_value_within(0.1).of(described_class::RECONNECT_INTERVAL)) + end + + it "stops waiting for undelivered logs after FLUSH_TIMEOUT" do + stub_const("#{described_class}::FLUSH_TIMEOUT", 0.2) + device = described_class.new("token", unreachable_options) + device.write(Logtail::LogEntry.new(:error, Time.current, nil, "boom", {}, nil)) + + started = Process.clock_gettime(Process::CLOCK_MONOTONIC) + device.flush + + expect(Process.clock_gettime(Process::CLOCK_MONOTONIC) - started).to be < 1 + end +end diff --git a/vendor/cache/logtail-0.1.17.gem b/vendor/cache/logtail-0.1.17.gem new file mode 100644 index 0000000000000000000000000000000000000000..0d04d8b405fdb26a8527afef234b38824879987c GIT binary patch literal 32256 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 HQQ&_7_ZZ48 literal 0 HcmV?d00001 From a780ae9174bff726b70b50dd82229babf2cf1db9 Mon Sep 17 00:00:00 2001 From: Jonathan Gottfried Date: Fri, 25 Sep 2026 16:31:50 -0400 Subject: [PATCH 3/5] Use logtail-rails for Better Stack, keep stdout unchanged, and cut noise (#23881) Claude-Session: https://claude.ai/code/session_01YL4NMvotZJsvKFri2g2qZa Entire-Checkpoint: 01M3D45E16WRRNV1X4P6ZKJTCE --- Gemfile | 2 +- Gemfile.lock | 11 +++++++- config/application.rb | 4 +++ config/initializers/betterstack.rb | 38 ++++++++++++++++++++++++-- spec/initializers/betterstack_spec.rb | 26 ++++++++++++++++++ vendor/cache/logtail-rack-0.2.6.gem | Bin 0 -> 14848 bytes vendor/cache/logtail-rails-0.2.12.gem | Bin 0 -> 34304 bytes 7 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 vendor/cache/logtail-rack-0.2.6.gem create mode 100644 vendor/cache/logtail-rails-0.2.12.gem diff --git a/Gemfile b/Gemfile index b589322a931e3..67e815077648f 100644 --- a/Gemfile +++ b/Gemfile @@ -64,7 +64,7 @@ gem "jwt", "2.10.3" # Verify delegated access tokens gem "kaminari", "~> 1.2" # A Scope and Engine based, clean, powerful, customizable and sophisticated paginator gem "katex", "~> 0.9.0" # This rubygem enables you to render TeX math to HTML using KaTeX. It uses ExecJS under the hood gem "liquid", "~> 5.4" # A secure, non-evaling end user template engine with aesthetic markup -gem "logtail", "~> 0.1.17", require: false # Ships Rails logs to Better Stack when BETTERSTACK_SOURCE_TOKEN is set (see lib/betterstack/log_device.rb before upgrading) +gem "logtail-rails", "~> 0.2.12", require: false # Ships Rails logs to Better Stack when BETTERSTACK_SOURCE_TOKEN is set (see lib/betterstack/log_device.rb and config/initializers/betterstack.rb before upgrading) gem "metainspector", "~> 5.12" # To get and parse website metadata for Open Graph rich objects gem "mini_magick", "~> 4.13" # Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick gem "nokogiri", "~> 1.18" # HTML, XML, SAX, and Reader parser diff --git a/Gemfile.lock b/Gemfile.lock index ca836e6597cb4..8becfcb7176a0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -556,6 +556,15 @@ GEM logger (1.7.0) logtail (0.1.17) msgpack (~> 1.0) + logtail-rack (0.2.6) + logtail (~> 0.1) + rack (>= 1.2, < 4.0) + logtail-rails (0.2.12) + actionpack (>= 5.0.0) + activerecord (>= 5.0.0) + logtail (~> 0.1, >= 0.1.14) + logtail-rack (~> 0.1) + railties (>= 5.0.0) loofah (2.25.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -1197,7 +1206,7 @@ DEPENDENCIES launchy (~> 2.5) liquid (~> 5.4) listen (~> 3.7) - logtail (~> 0.1.17) + logtail-rails (~> 0.2.12) memory_profiler (~> 1.0) metainspector (~> 5.12) mini_magick (~> 4.13) diff --git a/config/application.rb b/config/application.rb index 3618d3e61f73a..058577bc330ea 100644 --- a/config/application.rb +++ b/config/application.rb @@ -19,6 +19,10 @@ # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) +# Better Stack's Rails integration has to load before the app boots; only load it when configured +# (see config/initializers/betterstack.rb). +require "logtail-rails" if Rails.env.production? && ENV["BETTERSTACK_SOURCE_TOKEN"].present? + if defined?(Anyway) Anyway.loaders.delete(:secrets) end diff --git a/config/initializers/betterstack.rb b/config/initializers/betterstack.rb index 04f7fa397a97d..a7148d2cba39c 100644 --- a/config/initializers/betterstack.rb +++ b/config/initializers/betterstack.rb @@ -1,5 +1,5 @@ # Ship production logs to Better Stack as well as to the existing logger (stdout on Heroku). -# Off unless BETTERSTACK_SOURCE_TOKEN is set, and the logtail gem isn't loaded otherwise. +# Off unless BETTERSTACK_SOURCE_TOKEN is set; logtail-rails is only loaded then (config/application.rb). if Rails.env.production? && ENV["BETTERSTACK_SOURCE_TOKEN"].present? require Rails.root.join("lib/betterstack/log_device") @@ -10,7 +10,41 @@ ingesting_host: ENV["BETTERSTACK_INGESTING_HOST"].presence, ), ) - betterstack_logger.level = Rails.logger.level + # Set BETTERSTACK_LOG_LEVEL=info to also get logtail-rails' per-request events; stdout keeps LOG_LEVEL. + betterstack_logger.level = ENV["BETTERSTACK_LOG_LEVEL"].presence&.to_sym || Rails.logger.level + + # logtail-rails' request events go only to Better Stack, so stdout keeps Rails' own lines. + # Rails' log subscribers and Rack logger stay in place for the same reason. ErrorEvent is off + # because Rails already logs every unhandled exception; it would ship each one twice. + Logtail.config.logger = betterstack_logger + [ + Logtail::Integrations::ActionController, + Logtail::Integrations::ActionView, + Logtail::Integrations::ActiveRecord, + Logtail::Integrations::Rails::RackLogger, + Logtail::Integrations::Rails::ErrorEvent, + ].each { |integration| integration.enabled = false } + # Only the user's id: logtail-rack would otherwise send names and emails. + Logtail::Integrations::Rack::UserContext.custom_user_hash = lambda do |env| + (user = env["warden"]&.user) && { id: user.id } + end + # Request events (info level) record headers; never send credentials. One event per request. + Logtail::Integrations::Rack::HTTPEvents.http_header_filters = %w[ + Authorization Proxy-Authorization Cookie Set-Cookie X-CSRF-Token + api-key x-algolia-api-key health-check-token + ] + Logtail::Integrations::Rack::HTTPEvents.collapse_into_single_event = true + + # Exceptions Rails already turns into responses (404s, CSRF, routing, Pundit; see + # rescue_responses) are logged with full traces. Keep them on stdout, not in Better Stack. + rescued_classes = Regexp.union(ActionDispatch::ExceptionWrapper.rescue_responses.keys) + rescued_exception = /\A\s*(?:\[[^\]]*\]\s*)*(?:#{rescued_classes}) \(/ + # Rails' own request lines duplicate the request event above. + request_line = /\A(?:Started [A-Z]+ "| Parameters: |Completed \d{3} )/ + Logtail.config.filter_sent_to_better_stack do |entry| + message = entry.message.to_s + message.match?(rescued_exception) || (entry.event.nil? && message.match?(request_line)) + end # Logtail::Logger must not respond to #tagged: BroadcastLogger runs a tagged block once per # logger that does, so ActiveJob#perform_now would run every job twice. diff --git a/spec/initializers/betterstack_spec.rb b/spec/initializers/betterstack_spec.rb index bb80f9f6c49ef..7dd30093ce1a0 100644 --- a/spec/initializers/betterstack_spec.rb +++ b/spec/initializers/betterstack_spec.rb @@ -1,4 +1,5 @@ require "rails_helper" +require "logtail-rails" require Rails.root.join("lib/betterstack/log_device") RSpec.describe "Better Stack initializer" do # rubocop:disable RSpec/DescribeClass @@ -41,6 +42,31 @@ expect(stdout.string).not_to include("ignored") end + it "sends logtail-rails events only to Better Stack, with the user's id and no other user data" do + load initializer_path + + expect(Logtail.config.logger).to be(rails_logger.broadcasts.last) + expect(Logtail::Integrations::ActionController).not_to be_enabled + expect(Logtail::Integrations::Rails::ErrorEvent).not_to be_enabled + user = instance_double(User, id: 7, name: "Ada", email: "ada@example.com") + env = { "warden" => instance_double(Warden::Proxy, user: user) } + expect(Logtail::Integrations::Rack::UserContext.custom_user_hash.call(env)).to eq(id: 7) + end + + it "keeps exceptions Rails rescues into responses out of Better Stack, but on stdout" do + sent = [] + # Upstream's LogDevice#write applies the filter first; device.write is stubbed above. + allow(device).to receive(:write) { |entry| sent << entry.message if Logtail.config.send_to_better_stack?(entry) } + load initializer_path + + rails_logger.error(" \n[req-1] ActiveRecord::RecordNotFound (Not Found):\n app/x.rb:1") + rails_logger.error("[req-2] Pundit::NotAuthorizedError (not allowed)") + rails_logger.error("PG::NotNullViolation (null value)\nCaused by: ActiveRecord::RecordNotFound (x)") + + expect(sent).to eq(["PG::NotNullViolation (null value)\nCaused by: ActiveRecord::RecordNotFound (x)"]) + expect(stdout.string).to include("RecordNotFound", "Pundit::NotAuthorizedError") + end + it "runs tagged blocks, like ActiveJob#perform_now, once" do load initializer_path runs = 0 diff --git a/vendor/cache/logtail-rack-0.2.6.gem b/vendor/cache/logtail-rack-0.2.6.gem new file mode 100644 index 0000000000000000000000000000000000000000..a6e27d1db0fe4273e22d6f27135681e7e0205ac5 GIT binary patch literal 14848 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 literal 0 HcmV?d00001 diff --git a/vendor/cache/logtail-rails-0.2.12.gem b/vendor/cache/logtail-rails-0.2.12.gem new file mode 100644 index 0000000000000000000000000000000000000000..f8a696fea422477e62642ae6894f049515899b30 GIT binary patch literal 34304 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 Date: Fri, 25 Sep 2026 16:52:59 -0400 Subject: [PATCH 4/5] Carry request context onto unhandled exceptions in Better Stack, using the Fastly client IP (#23882) Claude-Session: https://claude.ai/code/session_01YL4NMvotZJsvKFri2g2qZa Entire-Checkpoint: 01M3D5BYND5PPGCK6V07MGZNT0 --- config/initializers/betterstack.rb | 4 +++ lib/betterstack/request_context.rb | 26 +++++++++++++++++ spec/initializers/betterstack_spec.rb | 4 +++ spec/lib/betterstack/request_context_spec.rb | 30 ++++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 lib/betterstack/request_context.rb create mode 100644 spec/lib/betterstack/request_context_spec.rb diff --git a/config/initializers/betterstack.rb b/config/initializers/betterstack.rb index a7148d2cba39c..e6ebd15ae3a83 100644 --- a/config/initializers/betterstack.rb +++ b/config/initializers/betterstack.rb @@ -2,6 +2,7 @@ # Off unless BETTERSTACK_SOURCE_TOKEN is set; logtail-rails is only loaded then (config/application.rb). if Rails.env.production? && ENV["BETTERSTACK_SOURCE_TOKEN"].present? require Rails.root.join("lib/betterstack/log_device") + require Rails.root.join("lib/betterstack/request_context") betterstack_logger = Logtail::Logger.new( Betterstack::LogDevice.new( @@ -23,7 +24,10 @@ Logtail::Integrations::ActiveRecord, Logtail::Integrations::Rails::RackLogger, Logtail::Integrations::Rails::ErrorEvent, + Logtail::Integrations::Rack::HTTPContext, ].each { |integration| integration.enabled = false } + # Above DebugExceptions, so unhandled exceptions carry the request too (see RequestContext). + Rails.application.config.middleware.insert_after ActionDispatch::RequestId, Betterstack::RequestContext # Only the user's id: logtail-rack would otherwise send names and emails. Logtail::Integrations::Rack::UserContext.custom_user_hash = lambda do |env| (user = env["warden"]&.user) && { id: user.id } diff --git a/lib/betterstack/request_context.rb b/lib/betterstack/request_context.rb new file mode 100644 index 0000000000000..5eed8dfaf09c4 --- /dev/null +++ b/lib/betterstack/request_context.rb @@ -0,0 +1,26 @@ +require "logtail" + +module Betterstack + # Adds the request (host, method, path, client IP, request id) to every Better Stack line logged + # during it. Replaces logtail-rack's HTTPContext, which config.app_middleware puts below + # ActionDispatch::DebugExceptions: its context is gone by the time Rails logs an unhandled exception. + # Only loaded when BETTERSTACK_SOURCE_TOKEN is set (see config/initializers/betterstack.rb). + class RequestContext + def initialize(app) + @app = app + end + + def call(env) + request = ActionDispatch::Request.new(env) + context = Logtail::Contexts::HTTP.new( + host: request.host, + method: request.request_method, + path: request.path, + # Same client IP as the rest of Forem: Fastly's header, else Rails' remote_ip. + remote_addr: (env["HTTP_FASTLY_CLIENT_IP"] || request.remote_ip).to_s, + request_id: request.request_id, + ) + Logtail::CurrentContext.with(context.to_hash) { @app.call(env) } + end + end +end diff --git a/spec/initializers/betterstack_spec.rb b/spec/initializers/betterstack_spec.rb index 7dd30093ce1a0..67e77c0189f20 100644 --- a/spec/initializers/betterstack_spec.rb +++ b/spec/initializers/betterstack_spec.rb @@ -19,6 +19,8 @@ allow(ENV).to receive(:fetch).with("BETTERSTACK_SOURCE_TOKEN").and_return("token") allow(Betterstack::LogDevice).to receive(:new).and_return(device) allow(device).to receive(:write).and_return(true) + # The app's middleware stack is frozen after boot. + allow(Rails.application.config.middleware).to receive(:insert_after) end it "adds a Better Stack logger at the Rails log level" do @@ -48,6 +50,8 @@ expect(Logtail.config.logger).to be(rails_logger.broadcasts.last) expect(Logtail::Integrations::ActionController).not_to be_enabled expect(Logtail::Integrations::Rails::ErrorEvent).not_to be_enabled + expect(Rails.application.config.middleware).to have_received(:insert_after) + .with(ActionDispatch::RequestId, Betterstack::RequestContext) user = instance_double(User, id: 7, name: "Ada", email: "ada@example.com") env = { "warden" => instance_double(Warden::Proxy, user: user) } expect(Logtail::Integrations::Rack::UserContext.custom_user_hash.call(env)).to eq(id: 7) diff --git a/spec/lib/betterstack/request_context_spec.rb b/spec/lib/betterstack/request_context_spec.rb new file mode 100644 index 0000000000000..be7110a9e3f27 --- /dev/null +++ b/spec/lib/betterstack/request_context_spec.rb @@ -0,0 +1,30 @@ +require "rails_helper" +require Rails.root.join("lib/betterstack/request_context") + +RSpec.describe Betterstack::RequestContext do + def context_during(env) + seen = nil + described_class.new(->(_) { seen = Logtail::CurrentContext.instance.snapshot }).call(env) + seen[:http] + end + + let(:env) do + Rack::MockRequest.env_for("https://dev.to/some/path", "REMOTE_ADDR" => "167.82.161.32", + "action_dispatch.request_id" => "req-1") + end + + it "adds the request to the log context while the request runs" do + expect(context_during(env)).to include(host: "dev.to", method: "GET", path: "/some/path", request_id: "req-1") + expect(Logtail::CurrentContext.instance.snapshot).not_to have_key(:http) + end + + it "uses Fastly's client IP, like the rest of Forem" do + env["HTTP_FASTLY_CLIENT_IP"] = "198.51.100.23" + + expect(context_during(env)).to include(remote_addr: "198.51.100.23") + end + + it "falls back to Rails' remote_ip" do + expect(context_during(env)).to include(remote_addr: "167.82.161.32") + end +end From 18d50cb8669230df5913513840cf5b150537d1c6 Mon Sep 17 00:00:00 2001 From: Jonathan Gottfried Date: Fri, 25 Sep 2026 18:01:54 -0400 Subject: [PATCH 5/5] Observability pilot: env-gated Better Stack errors and sampled tracing via the Sentry SDK (#23595) * Add env-gated Better Stack error reporting and sampled OTel tracing (observability pilot) * Address pilot review: match Honeybadger's ignores, load Sentry only when configured, tolerate missing OTLP host - Sentry now ignores only the four classes Honeybadger ignores. Rack::Timeout and PG::QueryCanceled are fingerprinted into one error each (as Honeybadger does) instead of dropped, and SIGHUP SignalExceptions are skipped, so Better Stack's counts are comparable. - sentry-rails/sentry-ruby are require: false and loaded from config/application.rb only when BETTER_STACK_ERRORS_DSN is set in production, the same way logtail-rails is. Requiring a Railtie from an initializer would be too late for its middleware to install. - BETTER_STACK_OTLP_TOKEN without BETTER_STACK_OTLP_HOST now logs a warning and skips tracing instead of raising KeyError at boot. Claude-Session: https://claude.ai/code/session_01LLhNCkqm5YHohiaT6Z5nQR * Vendor the pilot's new gems into vendor/cache CI installs only from vendor/cache, so bundle install failed on the Sentry and OpenTelemetry gems the pilot added to Gemfile.lock. Claude-Session: https://claude.ai/code/session_01LLhNCkqm5YHohiaT6Z5nQR * Trace with the Sentry SDK instead of OpenTelemetry, and report Sidekiq errors Better Stack stores Sentry SDK transactions as spans (confirmed on MLH Core's Railway source), so one SDK covers errors and tracing, matching MLH Core. This drops the OpenTelemetry initializer and its 27 gems. - traces_sample_rate defaults to 5% (SENTRY_TRACES_SAMPLE_RATE overrides). - sentry-sidekiq reports worker errors, which sentry-rails alone misses. report_after_job_retries mirrors Honeybadger's attempt_threshold by skipping failures that will be retried. - sentry-sidekiq is loaded with sentry-rails in config/application.rb, only when BETTER_STACK_ERRORS_DSN is set in production. Claude-Session: https://claude.ai/code/session_01LLhNCkqm5YHohiaT6Z5nQR --- Gemfile | 3 ++ Gemfile.lock | 12 +++++++ config/application.rb | 5 +++ config/initializers/sentry.rb | 46 +++++++++++++++++++++++++ vendor/cache/sentry-rails-5.28.1.gem | Bin 0 -> 30720 bytes vendor/cache/sentry-ruby-5.28.1.gem | Bin 0 -> 84992 bytes vendor/cache/sentry-sidekiq-5.28.1.gem | Bin 0 -> 13824 bytes 7 files changed, 66 insertions(+) create mode 100644 config/initializers/sentry.rb create mode 100644 vendor/cache/sentry-rails-5.28.1.gem create mode 100644 vendor/cache/sentry-ruby-5.28.1.gem create mode 100644 vendor/cache/sentry-sidekiq-5.28.1.gem diff --git a/Gemfile b/Gemfile index 67e815077648f..95ec3ae9992b9 100644 --- a/Gemfile +++ b/Gemfile @@ -106,6 +106,9 @@ gem "rouge", "~> 4.2" # A pure-ruby code highlighter gem "rss", "~> 0.2.9" # Ruby's standard library for RSS gem "rubyzip", "~> 2.4" # Rubyzip is a ruby library for reading and writing zip files gem "s3_direct_upload", "~> 0.1" # Direct Upload to Amazon S3 +gem "sentry-rails", "~> 5.19", require: false # Pilot: ships errors to Better Stack (Sentry-protocol compatible); loaded in config/application.rb +gem "sentry-ruby", "~> 5.19", require: false # Pilot: see config/initializers/sentry.rb, runs alongside Honeybadger +gem "sentry-sidekiq", "~> 5.19", require: false # Pilot: reports Sidekiq worker errors and traces jobs; loaded in config/application.rb gem "sidekiq", "~> 6.5.3" # Sidekiq is used to process background jobs with the help of Redis gem "sidekiq-throttled", "~> 1.5" # Concurrency control for Sidekiq gem "sidekiq-cron", "~> 1.7" # Allows execution of scheduled cron jobs as specific times diff --git a/Gemfile.lock b/Gemfile.lock index 8becfcb7176a0..16f27f16be8fc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -963,6 +963,15 @@ GEM faraday (>= 0.17.3, < 3) sax-machine (1.3.2) securerandom (0.4.1) + sentry-rails (5.28.1) + railties (>= 5.0) + sentry-ruby (~> 5.28.1) + sentry-ruby (5.28.1) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + sentry-sidekiq (5.28.1) + sentry-ruby (~> 5.28.1) + sidekiq (>= 3.0) sexp_processor (4.17.5) shellany (0.0.1) shoulda-matchers (5.3.0) @@ -1264,6 +1273,9 @@ DEPENDENCIES rubyzip (~> 2.4) s3_direct_upload (~> 0.1) sassc-rails (~> 2.1.2) + sentry-rails (~> 5.19) + sentry-ruby (~> 5.19) + sentry-sidekiq (~> 5.19) shoulda-matchers (~> 5.3) sidekiq (~> 6.5.3) sidekiq-cron (~> 1.7) diff --git a/config/application.rb b/config/application.rb index 058577bc330ea..814f32b9b818b 100644 --- a/config/application.rb +++ b/config/application.rb @@ -22,6 +22,11 @@ # Better Stack's Rails integration has to load before the app boots; only load it when configured # (see config/initializers/betterstack.rb). require "logtail-rails" if Rails.env.production? && ENV["BETTERSTACK_SOURCE_TOKEN"].present? +# Same for the Better Stack errors pilot (see config/initializers/sentry.rb). +if Rails.env.production? && ENV["BETTER_STACK_ERRORS_DSN"].present? + require "sentry-rails" + require "sentry-sidekiq" +end if defined?(Anyway) Anyway.loaders.delete(:secrets) diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb new file mode 100644 index 0000000000000..5fcee905054bd --- /dev/null +++ b/config/initializers/sentry.rb @@ -0,0 +1,46 @@ +# PILOT: sends errors and sampled traces to Better Stack via its +# Sentry-compatible ingest, running alongside Honeybadger. Honeybadger remains the alerting +# source of truth. sentry-rails is only loaded when BETTER_STACK_ERRORS_DSN is +# set (config/application.rb, with sentry-sidekiq); unset it to disable entirely. +if Rails.env.production? && ENV["BETTER_STACK_ERRORS_DSN"].present? + # Mirrors config/initializers/honeybadger.rb so Better Stack's counts are + # comparable: the same ignored classes, and the same classes collapsed into + # one error each instead of being dropped. + ignored_exceptions = %w[ + ActiveRecord::QueryCanceled + ActiveRecord::RecordNotFound + Pundit::NotAuthorizedError + RateLimitChecker::LimitReached + ] + message_fingerprints = { + "Rack::Timeout::RequestTimeoutException" => "rack_timeout", + "Rack::Timeout::RequestTimeoutError" => "rack_timeout", + "PG::QueryCanceled" => "pg_query_canceled" + } + + Sentry.init do |config| + config.dsn = ENV.fetch("BETTER_STACK_ERRORS_DSN") + config.enabled_environments = %w[production] + config.environment = ENV.fetch("SENTRY_ENVIRONMENT", Rails.env) + config.release = ENV.fetch("HEROKU_SLUG_COMMIT", nil) + config.breadcrumbs_logger = [:active_support_logger] + # Sampled request and job traces; Better Stack stores them as spans. + config.traces_sample_rate = ENV.fetch("SENTRY_TRACES_SAMPLE_RATE", "0.05").to_f + # Like Honeybadger's attempt_threshold: skip job failures that will be retried. + config.sidekiq.report_after_job_retries = true + config.excluded_exceptions += ignored_exceptions + config.inspect_exception_causes_for_exclusion = true + + config.before_send = lambda do |event, hint| + exception = hint[:exception] + next if exception.is_a?(SignalException) && exception.message.include?("SIGHUP") + + # Honeybadger matches its error message ("Class: message"), which also + # catches these classes when they arrive wrapped in another exception. + error_message = "#{exception.class.name}: #{exception&.message}" + fingerprint = message_fingerprints.detect { |key, _| error_message.include?(key) }&.last + event.fingerprint = [fingerprint] if fingerprint + event + end + end +end diff --git a/vendor/cache/sentry-rails-5.28.1.gem b/vendor/cache/sentry-rails-5.28.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..6adcdb0be1212264fc62241fb37f1cd5bdd027e8 GIT binary patch literal 30720 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̷R0HrE&= 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�i?*bI14H_yf8rO9#k^UKVwo8hptH)5>#sZ;rP11wcr4^Nj;Bu~lhr z>$FMa-IT>6OmN%B`hYX(6fdsgLR;J4Qw%1+Iy z9=YFCtXWJ?V5|&=jeDb)L$SD^KCLOBSQlq@M71BvZKGp!Uju+QV{D_;0ZcT$kX>cKd!OTpcJWLt}M*NCvuvIIi4r2$4{VF|5-ZQJ%avoJE zB1JwzgUPAS;Y6o=!0Tw;K07lkYrbc*$Q4QFw%hBG4`nJ<>hso8CQ9_KRW<~o#DE*y zCtE6{qZr8aH_Vs@^7v9l(sEMEd4av}$>Y0_UWhfs|2Iu0b7{#ogAupxZ&{`G&vau7 zGN{!1Hm~1JL$y7Ij7tIrUOVwx=V))CawdvHPGy4;G&jwqE1)k0x0yCIK%shGJAV5X zpd(;6iA8#FK?s+1i=&})Xr_HTwTETEocxZ0Ca#DqB4pr_pjXY9dSTxL%$Z~e(bLpH z?Yyw!`vY}t6KFrJRQ*kT5?{dGSK!{<0T;g}Mau-u_dkD!L(`gQj@g4>*kv_FqUuha@jx0A)eQQlI$Q5A;eW z#Rj&`Ru(p%k*Z+3$FpU;B{Q7_>JS0S+|x==K^QCj!C3 zZpamUm_$sCJ3wjVN;X5gz;D*Q1h0?v1zm&@gshn8k5KIQRyByW>~JT#RZfK50e#RiX}gTf~QE8R9@#^d~1<%@}hH?bM&W_k(6b z-p@Lx5_^HfSJ+m^u8J;if0_A7HHClsoTjG$JcYlkKmMa=g8Up0z8o{4pK`ivl^6Jpu{E1K*|EkLxT#&-czGM)nCq< zc*S4jvqMzan{dwVn^A z0=M4%KC5z1|F*8Mv;CvM*irs+-yvIYTixk6B20*EeQO}dd|ViK+>`G(Lm|;#^=R=) zkjl_=ge_q5OJ(oJ`pCSf`xtlAp04$Gk^N?OI`P=8b(i8to2;oRPfWU12Ht`~FIi1*9a5csX(nw7eR+-JBQ3y-;mH&rw~{V>+~&S5#3^>CMLIs#%r*mx5UygD&@1>>C>kfzwK+2Ckc z?$V5KTsJPPPe4|RI=R67>70?<_O7^#l(@}Pf{d)vuQON^?3+TJ^*X5m(9mINI2!vnixhNkCxu3yxwRPwx}!z zjL-b!fM@C&NjfT{vyC^25{7~2zLWMmI-9boL&W+JwWQLvGyAN8Fnp3tQUdcP&yU}C z5DqBXvk;lr=BUlpm~r`7EfDH1=nIxBPqLdJb1CyhqF0JDM5CAHSH;qC z!OC!$sD=60kXOI|`M1jdnY>V6LIt=*{%^N7TDJV(#{Ybm|G!!LPfl(+@kHi8a7Tx- zERP|RD;arr|D<>H6V+sCG2cO{dFSBg{p0T2!@XYrRrlq|!4bc{Rf1NT>1upob%kiB zd(!z1=fK7)MG|ZRL9=O{IZP(hP|q)2XA)oDn0MJI`T|3j6`;n>kOiG)mZi&&pXnop z_L`MyLUoY+IMc@>DEW;oc;Q?fV;msD9jp05PuJUFE=q_4Q7PnAM11oR&x&GLi{)*ojHrClRB^T$C+Fj9*_WO#Y6ucEcF7yPb?!Y zd^iT3iFQseQel*7poXo z=6z6%>*(E!UqEm;e0S1+b#U~ydjef0o;&|7{t-PCm1iAs>a6~&yZZODj`)NrC_4m; zYJG$qQGF&Vr~lnK`!l?JQh)fg+R+dy{}}x_(KHcK$MgRYRUUjgufng&=|8UFyXrqy zs?Pw#1Ni5I>a#z}4;mjzdc;9^QU8_8wa$IC36LHJXO3Hc=?pJn?C2JAjK8U-Px|4n z&Xvxe}$aDA4>@@Xf+#8hlG6$p%QiQMAQ;=aA8`+qBmdz&PIyI_T z2%wa0j+AY`hN%Z8us@Y0$gD5x^t6)Mpj9hhZ}PoqSgOg(K_-P7J}?%frpRI2_#A8E zI0g&^P><$=A1aN1)M>Z>u~D;_l4+4MpkrAbWAO_tu(%x;jytnItM&kM#$%5f;3l2e zqe~24SUd5$Vo#O=X7ymNVopW2l+v~|NO>7AFXD|n$G6V#b3JbU2aegZa!B)<%U!Ks zWC%31Hw%V}Z48TLUUXO97ALCZ5&lnpPwaL)FC-o6WN}t$jzRU=(KJeU9wo6w7DWEw zV<);yO8rQmgyf>Xyz&w8{M=dj$P@Y*xE6XZ@&tZ$++R{me9RzncPH9XY%BQK29`eFE_YTKu5_4Apw_-Z#$n@zlg zcvUb$fT9ONed9KO#|#>plK= zW#yweN1q$jXDc7m^Yl5dqN5r>f*|oM;D$2_N3eKgQpFIL^)Ba5PLGH&&qUVLU~n>{ z2|Bq;G?`p-zB4Jf{3IbjQ5JvZuW(3}A3L&Xwf<}1`4vpGP=yxdr{!E%p(ydTjoC(Z zdS=d?SvT68AJzWJ6Z6DQn1*~Wk@$yS&Y6t#h6cLfogBK+EbvGDICxg+So5UUQ*HWW zzEb?m*vyg1aH`pPicX;fMm&u^=8^EfGTnK~Q@7Ra^S#4c>|oL-_lNgXONl$)X) zD&eLhFDVNQs(@+=Ws(ApyEMWv&1sgQ(7d8{7@&0MU~DjAO6MyZB}sW6$XR?K*gldZ z+Lomci~vto2!Z*#GJ%|9_964Rm~q;20Nzv%IX6&LjzH_NCsb`#4t3Em&HCQdDxD4n zMLC?jz5*xxZ7ckjKGx)NeN>S|$x`vgkVUZQBPolOYvpQk^df}h=%vZv)i>g7@DG(^ zzH%n|EyLP2{b$UY_E;J5#~<;F!q=coo`aY3nQ(uJKLD8dY@q z^7U?g4k!B1nW2EJ+f}iuto8EBta_i!X!_VUWU}<0lK;p==f1_707zzvIMVc0luVY3 z60Q=d%hm7Vzwnj-BpFw}0F_+U@S`{=Iv$ zd$8Z{9UUDU_22f6kGrqYOS*hYMX#^j5R+p~gDcEkJa>_oC>FulGQ237yU|&>bZf$u zl*jfEq^FA@ytySSN$M-a>TW%0gApDEnVc3LS~g{3$Ku}b{sw4pI=k=SbSTlC(Nvi+ zZDC7IQqI@94J}ko{-)eioOw<3D2wMsx8=N=i-6tC+=6U7rmv73myG_xA;^D9eC02V zn*1$uL-IQnJ(lGe905HEfR7xgPrr`0qFBGshadLF&63B(?d>trFky(IXur_IGO0eBo@SJ}-^Jb}>U4Ub zIgE5<376jO&*O3b(K8K4JX0TXtlh*Lx|L?VF4H$7$CP}qf4uwmUVnGL|KgXE-Z2(g zEtd<%X6=hxMn-M7EA$uFVQ@zrIyZIQ*mUkk%cHhvngoOfyE0~#D8p#zAL#Q02Kw2?@s40#|Qh;Vk>{BN{toTO*L}b2lat#E*b|-)kvkVz&~7Wu*B1k!%-@G z2d`iEjzFe7c)j0!+pF5{`cIzx&)ehIrJ;ifHuXqEA|UY|AGkvYb3TLCOCIPLaOi$6 z@#a7uDfow(i2`Bfy6t~d-`{#@e*V(d(OmgYK2cNlTcyEUs z|EW|EcasRMMpg!$z1~l~y<@bj7;J!BbUHh|7w=x<1}@VsE!T3|?C!rhpeC3CD!0YY z-J^YKLA)!k1??$nLi;Ya%`4c7d(?&!cdPrx&vmvKm{*m~XjFOVgcq3iwtr}O?Lsp2fV{XK$NC?StHDNVFwweYF6468tsaF01kjASynOTO(q?M@uBU*KrDTyUYy|;&u95KT~sq8 z(xB?0={XrdEVI;`ljL)TBjE7p-6PDT^od{Bia86ICW+m1TEdY5;GCFQ{ZbKqLvpwY z;!C}LXlGT6mka&;{M`6uDc~ISyt8lEA4UmalXwj&nKxNY76!x?& zt|`S;K-Kg-q$17&=uN$egNd^)oh#1>x%0GONx7N~2>@@|akKY{LY~>-iFy+!<#KW; zH$xv8pAZvNUTeeQ$C5&lL{r{{AE=CEZuqRCpiq%igRIKd{vii4{zOKt!iHAPn2i`~ z2vBOx8RgWZ<-QRWw8Mv(>mRGqPCcxY7|g5ow)EfQ4pjNTh%}N>vcUgo{#z+ss z0KNp6kx2|mCpveR@kk;1Lt3TNniQaxEd<@^n5Qe8TXeA2$1XaIB}apG001G$p=RM_ z18=1kmr~+v-7u>fT8dtVH6+TME^YC2Tdbji!AG&BUgQMa8d;!?qfnNT#;ngB*!Bvx z(aY!RVlOF6fsv+!qFtaNnQS$sQNSW+u}bo@6BlGVN{InEWSZ7@GBtYZ z*~a-QL`g|Nc(F06bY>x?L95+Lfz|KE^#2(9e}6E?!~HAee`&9+Z)Nhow3^@bzi&zZ z%h1RjRKXWSMOFYP8oTI@plRi5>G>cEhKXl|Vb&ry$Xxq36KTpuMp>;+E#orQPoWz1 zm>CLq>yJ}M9}C7N|IL;g@{rqO@$L?pU!qiS*%9;d}zq2TLD9gleklfkTj~hG1(pw*D#o0 zTv8eqQyR2ak1OqPC5^nwH@7ZsYFg2EB$Z`BVVilCw@TSEB$OI91R_3h8TU-U0^{_Apv zTrB0w`2gH@{%^M1>HGh!)_4EUZ|wXBeFEP2qhOj%7(5IEzhM{L%r=_i^;u&+_eO=X zgIQivJP|!zlIP@?L-H6TRH^u4>0QIUu_{DjHShGmNnm z^I7DEaki(NnybaV+N7bq%JOU8W~Y*?Z|0`twUHcm(gQwy| zr_`g@GOPQx#MpeL%j|Az{PO_ID!JRK@t94`TEN>@WnhqY>2AD^yKyPeLb^_vr#(J8 zHFxEi-K*8ioS!pe6vjkxL!O|s^i=UnH9=>_WT8l%nmD`5p{zHYp1QgmA(?~oCRN{y z|DK|XdH!>%mM(y$9&NyE}|vH|B|x+TRc z2PB**G?kAsmSsY9AB~zSv8JwH%5;!r997}O}ul;&~^^&Y`R|!%vi+R3rRgslQ$rs z%51aIA=`P4Z&}!(&}3zMn~z z#WRbi8Xt4OM`ZE|Y2+k-j8k&U;1Bo-UCqmQj=3|D_((1Upd7+{WTPmZFUZW6(^pct zm3yM!X~1}W&v4HfTptI0E_6~{awbrCqCGFavTVW#je6*r+U8tEATXgUwta8}KIQEvL@=SM_#p*^v!7`gNxB9_-E6G|x>Uu8D;@a} zS{ZBV%CnlffzNIzreo<5Y+=aAJyZ2{m{CmUYPvwVH+?LVVXi$c zdNs3nmd}Ne0B?s=IlCiG_|koov+5)}A|Xp%vl|J~Sg3_-oGSNQv*&(UAZ47UGNn=J z*c1C_(IU2KPj3NHQR4D~mJD^|PFNQ+`&iAa)t4Ivbx0#H5qO%UM@%*Xw4vPYeKx&s zFU$--@*>J<-RDmjBjfX$u*k@qpgX46r!s2D8W4hXz33#ZYgP!bP`pUvWx&lLYcm1N zf*GbP=6y`jJqAWpNNo3nvNW|B0)Z)4Ajd5pWSZ5P6=Do`ZX?w+%stta;K3(ox(Aj|WYtPD z;g9hW-t*uSfu zsRqpNPt{>0g&*~tr$?Upqgw)bwQwN6uBd7;V2vjwmStaIac2SU288r-<=s$9QyhrmwPx zmyYj6)AYFX3mnf|^#e6M7?=Dwk?OM=VCvMUWl-&8o>c3x%t}RTn|S>(=OvD+r-rhO zkEz;tvgR7;PV&!c4j3tP7(j+0(6l@1q~r|#M7fT3=*TQqXYaAel_%}ukUPtd`{a8!VqgnBw%k9tKx&f4O^o41;mhs%R&iVo>G$tlVRrl$W;M}4%gnXjR z6C^CMv@eG9iBsO2<>r&2YcoxsUg}yGE8g%0P3kMYRa5tm>Ua9SvZgf1k0zF#j(s2b z`FACK8O5zlvbKYqyiEp?-I-yBeCupZjJkVH?R@+4u=q|mWf9i5=eg5v-Yi-{-t^sk z2D7BTn2?)A5w9A@u@tBVBzjI9a2?mm=<~*z+V`}Sd$DBtK?!dV$}vLF;x5nqYs@Mu`fX zw-4cEasYD>N=+Dk5zFrqyuk7XbFTTT&Wq3`0^p28{ZHaOMssjR4?M;Ar;a1hPlC|9 zfC*6IvizyRp2`Mis&6$Bv^%ZP8Zih)H%Y9Ffn~?|cTINDk$+czgB)krYh{bnL1CI{ zPmR`RD(#ehtK>VhDCOwrY0Gdf<2B$_jDM?@PQ$o^sAE9shzv;6IYnM}CiW>KgF&9j z%J%>MJq`1@CiaC^`CBaR%7D(}`C&UV@tqF2;eqm(vX3URiLHZVD~={DIR$Z^Az$8u zCaa-uJQH!ZW}SG3m2(AEF+aed!3+E2H;K2AeKEk<9;((IDBCb7+K@hE3x$C`6%lo3 zK={Pa@SISEI#nto$sQ?--qiUOWEbEekxY1*{5j+zi*m;}I?yT^tj?LpH5cneDJATS z+!fKKC`FaOLdi_74N}Uoh=RHhxyImJmvUdADeoEtQoO$OA|9sviT8|-=SO#*)1vzq zb5=**2>ZRmWB^m-1elz~o68b0d6NO6DDlQEhHwL!1-5kSPNm=$+}=*xOKqoo6Z>sj z%lvB5HcMT1X88pic4mV&hI4o;0w6%O|6!r55sDw@!Av_M!>6jpFaX zN30vsFUC`fxk`Fv7VwtzzOmT*|9)O$&3qBxDVnaY!F|dGg5~O$qI=^S@16`T={7AI zRlmf&MJ~`nFSmQ%6iRgNc~7`-qJ1~U3#7hO%yQ3)`vAE8%JnWT7op>2)7Bp2(Q4kv zkv=fMOK4WcqLiYlu7{M0_(W+hPg7Tzk#S3^VA#dL7F>kUievAUq{HM&SfZLp#I{|7 z&sNm^)m}|p&}-(sbKH00PCC<`7X^zx5;^uA+e6GJ0ODV3jKq?k^B z7|iL2Zl*@lSE+7K&kDWSOcn+6VtKOg92xZ;)H5^LfHePc=7Rq1(gL(%DM2@{rp~|| zh<5pMdw5Tt*UaMlYH^35o#G{*B)!RQR!! z&TE00h012a3;ckG(@9}LVvyNX7U1YhNaU_Jqy=kSfyN|LP4lf36t` z<)~4*Lv5`vf=hC5yw&T(W5ryS`oG*TxTC|HeH`JWBPNQ?r2topZ>cgYOgR-4dsW`e zy&%eS!_MJTg?AT*D?=floT}Ji!Ho^0J2519KywiG=C`9 zClWaV`UdfJx4r3#^4qprdmXd(Y__{ygpR3-B;Hz>y|6`V9oE(q$^- z0E_yqIf0R;)rWnV>XE*$AlSPYSkssrBI3}M>Ko--GJuz|6^T!H^3Ft;Gr#Fv?u>pH;O77;`X>F9K|iK_qSzW3El=A*m&mbXY(R?`(2V#VKwjg`6@Q z20_gKBPc>n#&0GDHK_?X$R~#AquQWDiK;(jWi7akU|w`zzs4-O_n;NoPj2P0fl+~` zIJxb;JUDOlJ2O(x-tH!utqQ-4m+Ol78R*x!qC*f?6KkAv2?tEVyE^gSyHs53c8M0bew!~YTts$%NgP{tJkcI|rMh$JL^ZN!2pNraX)onj`Fs2DqC zu<|1SVnX4kPdP_oZ(vl1%$|Fxv+pI3m+2?5&wmyb^;78LODPmwH8 zv2(qe>keHsZEuUVZY*yejC9F%vSeD@q%#v*V*l&&il)4s-Mf61roe@=MHk_ysin`= zmB;5L_3%a8;(MNtFBbo6Ex;EH16~~eyScWxww})avDx1I9{>AI)qe|onNW~ob%8@Q zH1B8Sjk4+H$MqV%p?H||hnEhf@W^jGgcYIsTvQShZJ$L@{j2^Zh5lw+fLfJ(7`kK> z2WcV($U)9$S|zbJLqWomTiQ%rn9^Z%TQjVNIRsV7&A!q;c2NVUR8?mk%snh{n;T|* zk@uWS|IU+KmUoHJE{ej=#Neu6?3c7|yL#CcL~5IFx-tzg-REY4xpzp*4?@q43|E5- zA9FrqB3L*KV>G_s1oIHX8|%WYU)1qLg(tdr))mDgoV)%7RvtY^+ktSn2m)57)c|C< z+8X{M`Q_TtW=$$e6Y~uQ{yV_R$9R;HeAB2v=bw0`KgoVR0dK7~EL8%-#6f6t<`cT& zAQv0_N24!&_mcqzKK}$-NBjwAGzCbD@?3GZIP*%n-maS1L(YST^I}A+3t7dL zhIo!bz&Q^*31BBF;S$I{m`6!SM-OJbBPPytFmlk9hK-UiUUU{E|Lc$1dYZBGf0lNs zl^jKFH@?FinB3U)300`=!iz8G1I$j>098+I39fL61%?}3U8vF8Xtzn3n^HKe zPi5RRAsbVU`QD16@;L&{B$;I9C|t-7{8bXMkaVt{o0>3Cp)5ZhG!3qOQ{rZYK|+OQ zl7u*|IKQN-*QlYgf3BDX!GxC-VV=^2aY^)GY)I{ARwDNmy4OPD9|Bz{zD43j&6b`si`Z&%2fA|OK-=bhdu|qFOv=wNSp>*T`!IDr zc+>e*PzW98pHxX6GE1no3n)mDLD#tdke>~LE9rJS@upsEn;~`*zVY#e2K+O@#nK6! zZ4yhQ{MWnQyWZ#eZyPBVUZEkWv2r^0hTP*sS}|4k1X6L7(;yvFLfQf3>MC#Mx%6d@ zK=j8u(+V6&^PyWcyvBo6u#n9b+z%8zEq@Agx%2CmqnV%4MKh#s_enz#;>f{EqZ9~C zW{H0%uI*L*iBf@9?!p%A30_oOeMKD1q|YV;BJcT8sx*RKw?W16s{#w;1%BIPDNiwT zVvMwzs92fvV-y8UGO9mt9^^L3PLe%6ISf%&Zdl z#rM#>Lg$9|>o>qbn=~YO1DwI9YJ8T&xUSfW{)$N7p08M%{ZgwJ8CKS>vTmtd1b1G; zx$jL;yr+{U0Raat*Abo}hLMLhEMZguv|NF#uD3w%(8^A(ixBR;FX0ZIF$LKu4t#IeU(hf&@9-0jLwK4;P01Wt36!wT@&`kXH0RPW4rPQ$rjVauFmhG48?s|_1UNd%s6iw0W^R@gh>%Iq?%+jH~I5STd!7(+LmT z!y8L43NuDO33TCZvtgogm(bg%xwDejzd}@&ih7`mc|4%bWyHI515MTBxL@CP^$^YK z)Tol!crx6$a$+Qz`54cl-5+31T(SFl|KOuqGPTJ^{8W*cVqJO7u$!`85cj%3zbd^lF-aV1p zC-SWFTY&tFbF)Zy>+!LvKI%dia1>tJKUSq>X9^pFyx6|<2$&V-^m=(n%?U4Wr78~G!t7GkVnkR*d!$k*_IG_7uu!LdI^vd6Q1ND+q6 zR31bgkcLA>z7IEO{=*}?(`Zne%OHw7j~;J6Mq{b#Oj9^0(*%j?M(MK@%+Uz54A(4_ zncO8f9f!pqygS+}n*EwskU%<>5-;o8@NuPJp+4I#4n(c!%Xk@#uv)fEp`xjgNQPlV zwOd#J&RA@x(6I8iv%pjZ-G1 zQ@zNgO?{n_Ita=71G1Akes_Jgz0`EwMZ|(0Nx8hnC|-M7W0D(RPG4dwRUW{ya#c=P7%5yUcn60#M4sjpxl!rc7-XmT%V~{2|78zj;|@PFk(*%jFt^T2k^y3v(^m$ zE7yyhhqRnW42+8%i`hJ!1(6%o?^_lgheRL~e?W4=MJ$SUYBCXdn^V52Ok}Aq8CHio zuzbpj%b6DWWaD!?oJAYwk%y|LMz80(*Rqw_+)VFk=rjxby3D~8j^!>xxZenF9Y7lI zL%wa2o~#)CNtaPb5}w}&AxrQ@B_&mQsjNr5L$GB{xbd*Aw?-_Sc^u%C1*-Qq1c$Ag z_b5#uZ@~HpKj%tp?1VhG{U zPi(4)4c>5FCc)5HwLt0Aj7N?;SoA>pibeP7J>TKYkiA2+J%dspjJSHXF~|dBWII7c zuD9Nf7Sg{~>QPdCiD@==E+h&vsR*4as0G}lkg%Ppe|A%3B`aW>B90?2 zJdlOnbWzWH>CDg>((wa*Eq7-<|p7uhaa0!|0a zXlDN&2EltTX(P81WiikX;StbDWXryCSyWQR;(U3xj@=ld-hAjpPn3yp1CHmO6H#_xIZE2(OQy_Kn0RdWjDKs(<0i#O~pobW)V=J=Ziv;Ftl<3^yJw6zrwp ze8P!r0EW~Y>UsT3pnVCnbPsOM7Ti7+09JcS%QCRp=*YC)z6!J8cRD#~+!rUs$8^Y%d{gaw2CC%;R*zk;NTwM2Ez6l!9$Qc|e{+&=f6} zJWpshitG+hEP;Q@RbobpCT+UIlYASGyan{J)GdZR<7%~gWNbvUfOO_kPF43|W@f5< zU4=;lR28-t@1^7eiNI}pD&>EMD626!5oTe#c5ak)MLNY(P_qeK3?2Rr_8Y_M6*ogPfLJo) zeR{_a`?3d`%J;@x8k)!m^nST>t&3b+Sk)=s$E1(U@Q?*MtS1G?Xbl89sHseM(t%3b znfZEGxu($N3QcRPnXbZ?He@cbF-=fQ7lLjmP@#rcJ>2g zTjW$F?^H-=C+WuHIGr3m*RUUkHRW?vck9Z|jNKq8c_<=VNxIJ^-@Wbj?MqEeydZ6JWgJ_l^Vajdd;p@Gh@6nk_c|oz=&o>;B74%4{;%W{cnF0>I99* zG|sOk`mT%5V?`^0kGHVaNyjI(*!b|lfJDuUr{Hbi!x1u)*|k79+6jilIDr|xLSN8i zv`0W3oz8!uR?oxjbas7^h`rIFGI6EmC+7>@^yFsdrkWpnz5^_%)6sqB%%k$b=>Pm? z_oTPCdwgOH>rdBeU`M^T2PeILcW38F#bEZ1ev;9l_LIYdqm!JD-t>+R{`#)J^UMB0 z|84K2yVE`C!at6WyRWGXEnegx@rQGtk~;yZ=aA zl-0#6pjcj3*ka{>P={qHb0#KVI>&?XJ?yNIGab~#OuDzveQ|!t{Y{)fB$*vPkG-k8 zI)eUIr?S6uSt@t$;C27-sP}63Z#aO558(urMsJ?!w+B1#_Imx}-eLEsdvb7utvVfk zcl_7g!~X96@nP@f$?m~^zk70WwEN=S2~}A=?L60aKERlsXCqZ)t`h)oa`f(PZ~vrs z#2@mGuJHjcTOA%99ClxKsh^YX(d*vHasMqI1O4va9(;uY3Aaog5?t_=T&~0n85c4W zds(}Ohy9)1qhtI8kl06XcZs~9k2(J3$rCc`>j2n8+}OI39V@Pio3ex@o$X}232Fnu zIQ@lm$k$LQBLvCxA7bg9M~=R>>;2e@9f1E%fvI{ZaL{LwK3(|YV}|J!?2fe)vQao~ zVKedR6D6<7#IQ=7jh^X%AJK8*VR%CDUSG>w3ZpQq>mi<)Wn~c(l^-d9qH3gzl-OZz zVwD8-?6gC|%^5BkeUL?(YO2stui{FJLF>5V=w=GA`Lo-A69)H&eJkDzqy=@Eo>^9V z3C+AU$((h>M>!uISmYX`kN-4t%OokKvGPFS2T59*{HdYC!-)+V1tg7!jOOBx-HLW6 ztx0hTLl;T;s>ysjMz&UAc6zEmMgLQCJ`zCcU$sn@AN>DXD(6y15WnjuolxPciiRT0 z#I3m#V`UmpHGl2{lXC0fBRltL2jpEh^o9n;t52m%g_(aqIyx)pn3jPW*)`RKwvO3Z zpwii#bp9ZQ!EWpOj7d6Cq7X@VL3uilVz#o$*5$(1e}?AL;j?U_Udnv&k;N_}(K4ac zk%qm`sSk2SlQU*JCsp?Mf}DxT0(@k9&*y^ldlro-%FnY4n|pw5WK68q>L&p5w6$A7 zGMpxhxsD-EnLhRL@(F1-9U z{peMBciWp95!1i8&28o#XbKMlIzZTlC&^HH9`QW$Dj(TBJS3yEt&>EQ}VJu^386J1{BNDh!z|bb~S4 zv%?c6Mm#>*Ie2$sQMu{N0iW%7VSRQzO0}>&85E*c*M_}mTbtF@OXDUwXO!v7+Pt;T zyKZmfPv{W8Eiz8-rA$&c^b4^Y9v>c@?CrjObE1>N zC#{j4-IeQEebngoeHh!tp?D%yJ4(%D_C)8rcqVL6maF4W8TT8K-*VQh3~0~rK0r|UofoR2K^n%7rNB9S>U_KSHNIq&+!T$n&#a1o2}$6 zJT%O|xF?R6VvM?~W%jxe2e9zc((GGXR^cm5*?s!jodU;&CpwM<^BrQA18nw5oZ??~ zBy`ww_)nFR8yOL3LT4zK<^Yko7GV26t8@UOEgsp1qQkE}> z-FWU~L=#D=BuU-uQ@*-qw*X6Yz-l%pnUXO}W(HY{pt2N&x<;NvN~z(bpU}v~z!TRW z-t;N+HX2r7?vByogm9`>(m3?(tdym7Sz02*12RuxM-K$7G+HFc3mevlE=uGz^#5n? z&HLKOu65z}Z$3p?+}M&W7lWsyUekavZF7T-58%$}sCBA^R6qrxQdAN)0nTT?d#$yH zwTF^qn{?a>onK6;YR}^upM^4TRjg4Rq0yXdOb9-1YEOR>L~f39&~NXuENh+)Ur^GS z-IYbo-&vvnp_eh^s}1ZYu zFfrXW!Icp=)eu8&Q!x@9R3pu76Qn2=*CLfldn&|UIdJ?BHt4p89R&!k{G-lEo}7zDTX^u-_RBrrEqi_2**Ho6>>+^uS;oFhKz}wE^-y8TF#S zPaq&5s!&&#S62fbG8@#i%5~}Um#%|>=G}P65_&16NvH^J*f@_TEJ%nWbHU_JB{q(* zgNtR_xMVqg*Gx-F#psG-*-B%!XpoZ*IRzMjG@ggEHZ4o)ZQTu0W!4j#?}Y14HK>Lp!K^8puBhAN?1a|)NnMyMIcbt0N^62mEL2SF?p=kW+=hL_RQ zCE$w1R9#`2ndpO(orpe2kSXX(pbyiczq6$!e#wj53hZXCVz4nqTVQc=pjQ$Ov9xYM zw8f$rmLY8L{p@&BYATO>&y^Pl>3tTjuzHf%-mr*DT-GND25P4x9JYF5Rs0crVpN7N ztt(pysFs3E$h4`5f=Cz=NFAfNg+A-6#k=QxW}Y7{>-E6dB$q2W8Ohs(B?~M6_@e${ z4Gk#8qT_F08i})aNW;dI9b4zSkBPp`dk!E2(y!!Yo&zoL<|q6Kuzp%lWWlTmJVI55VdaPfzP0)~DN$s*)~ z<6vG&0P5WPl8RPL^5WIjo1Iu(8=YZRmoFPPNP#P^1q3F_YTpST;FiiMJga2B3#fEX z>p=~i+Vg9vj$PwL#KN=KGm|p%OZN+sF9-VdD|&0k!{W-G1n*7#6G>BJt>7wN6KJ6Q z$|Tl$Dv`>Vc`aBGi|YnLXdi|Pcv=& zBA9=|K$P~1=!bySTA2O}#edfLlSQ($%_w~eOFp)i+wJI)`p{a5|4ha(AR+;WpUGIf8fC*F`pIvkNfTEJ zdnL~dnd|kzd)&cpc`jY$5hCK=F3$0ISMT(^d8tzg{uFlxf)YT0L@$jI$)1yn%%OUm z%GWvldDRHnc!6;RbH4NP_o7$y1?enUbjKdYvHmL$qMRAvK*{TZ~K zo#QM;Y=czfR;jI0=NdGsZQ9V~$Md2_>FIKn!YbPqz%e}!UHd+Nt^|r@j_FlvYNO9YftV`SbMJod8EDXoRbAQ zc}|P~o^4PlM?|O`EbPlOjLkye79dhaUpsU;=)kRTHURV)=H+hCKCRA7V+B1MNQquP7zOoHy45<7cIu|N61B4Hi~ro{Zbd7yZ5!;<)P|GHV7p!2xz5_Ozw;VXf+ zQXF&&BL^+@#3Pnc3o}Jw=BLskh#OLDecay{PoO`qwc+sPAI0;|{@!~Ktg(;#n>)J) zP6nler&qOJhJKY$c`d|KSK2uQZ)n|VtO~ASZS`S|pyq_diY@vVq@x3vGPJKC*UumS z>-GC4U2S;BA@+8GQIoR^CY@O{kS&-yXS$DrqI;H&AqtuncGb#+y{_ zC5|#MWezKc0uYyC4T7^?uPtTc?h>V`A%k@f$7*Xwj+9$0(@%q$xr}(#@YR%##dW&{ z$=gO_2|vwksDeAEnOLs%`|xqopP9|0nOJ^AkRAy?- ztX#}7D>c+~6Ie+H|Cnw>Q4OGF=OZUi%kQp=<@_LuA;XF)v@76(E#x0ihklI<-7P#-$nc<#o9=Mim)QVrc-eEV2PquNy88RKygyx(f*X2k#an=0E$^lr&u#J%Zck5gay)3j_or3tUqJN|tBvMdXJw zU`-~8)ySI9vA&X&HFYY8s(P}~X+|pzuaZD=GjAImV3P%FuZXYeI_yk%Y>Ir6^ds4c zZfV4Z0W3+OQ;Bk!QwN(IebmNJ8+>F~_}~$W`&!gmX-2KpX7r@pwgzuaX7PuvwbE{_ zf~U_@w>bF)`$WgKoke!{X{fJK?x44T*TuIK@Vv5z5FL?skb++dR;+`rRY~;V=z)xn zq)i2?tgREeH#TZ(geijGCu+TO7e|XH*TpBLd>9&Q6QX}kHpJIOOLQGk3?~x7VqRG zd5LQmCItY09t$46iAYJJwHTu7C?6vnv7|r{CmIkl0HJA-SS5<*cAg_rRc9#JLST&% zFmps<^)5-jKE~G(6AG7|OEp@$s#H-jq6t!1KyNT1O|tk_>dC?odB@qOs5{CL*#hl0 z5ZQl}8O#wFBE-tkHN^|S`E|5R0)i_dwCU#|xT9ZWQ61wnK3$FgBB6{*P~k}UYlv)? z^}sAYYY;qWE?Nj>6vyKXBy%}%Xn=;ZDC>CuZMp<2&eP7QhuGRGbEe+NThf~c42&VCsuqK zU5*|pi$JxKL`Jq{Z$z_)SxdtmbVZ+DUvU)u-cpo;>HWntbM#o3HLcG&(Hy3u(s-1F_@;yPlhoU75a$DAdy&{eCi|w@>Emqr~(2noeqw$5DO)2%_RPt;wFh%1>U?8$5H( zPwJW7E5)gqRQ1|QyjpAcU6jXiWoo;_i!V*0B#z_egXMT-b$jJObLEfql|MFq_@cvK zQZo{N7bv8PS(5$n=%(;&g;G||+YCx8+#OYu)1R#ZXur?a>Xh&5D~;*PRHn=3*`Rir z(>AD`a>n9CDT3+4S8mb$j)ctMqo7{S90rweo?&nboi+|m(s>4g_2WxN;{W@P{g3ni zUQGLMmi*7f|F1k*cI5vnFP=SHx#R!81O8uzE;vxmCGt18Z!=IdUkzwQ_yEN}GH?jJ ztiv~e%KC~N!QT<~E|qhm*+FUHp@PZ@UMw~cSZ|9@k>G_-qPifc&hr7p6m2j-Q(*lt ztTr-W;PECHKWf4!kT~RHT@>Kv;ai1bNoZ>-UxA2z;&9BMB8Z+58z8RgsFHyoiUfoq z3r^2FBRFnn^hicVQmv83hiDlv8OUfc5HJP;4URa7oCGn=5mJ@ma~`8RF)OXH-~Sdwdk4lT9O$*fFx0C zaL|f|0szz>io>yNMh_nr!*R(ye9J!KfHAWkY1yxqE+k;-^@=9ck)pbBghauS%s;#PU{9BNMKhQHu~SUPg_!)&6kj^mxTYAFSqJRqMzo=_XTSKr^RyA zM6PbzvB~`|1|4lk|9!^2lUrB>7BpnY_f?&>a8gNWi*-`EhnKpsaflK4wCT0bLPJF* zy>mR?zprO5K-9~@9#Q-rI!;5$P;K@aQRmf+&uQpv=O|1;LNPNkA@?}19I+7tMU?j(ra&lA$knm3`#8XgzjF0rc8IPi%Wc+&wXMz0=^#8qVo^jLJ1& zmAyJ}FAe6n1|Ee7!d>SZu@ST+`5iJOmGnO?`CAbH&9eV|@#48F|9SD`=^g$5UD$s( zCY^kZC~TnGymBH-%%gs2O=*K&mmi=v2uU zRE@u9!P4(op!C}blJu?3j(%grUsvm(8QG($2r1J}`9_uJ5LFv`39sqZ%ux7kx@Rq_ zpl~)gJ+l^tD3=XACTo#Hk%TTdR8)6qm(;szw;+3sK`9yD-luxi_CkkMnYj_jU0HE1 z0DnM$zc*ohFgb6EZIO?Ib<5cl1FB@dmD@Q>mo3D^Ie}7+GQJW)Bk83Mb(=)XAeV2C9V8O^xgT zr{GPOSqFl-4aTQ}X3EY45pWru0$eT8F74?vDv$Bm^C~`IH`g%3S53DX1be=z1qlt} ztZ*LR2fN75e+27D9rWyM^zApmjPw85%JUbV|KIaxcjy22#Q*)RECx066Rh?p06W3n z4W+X#dj)Pf5MCm{Aud+921DRk>7y%ynv(>%bbNSO(9RAy5ga2NjVKc#--naYu#iCz z$r^2EjM2MQfExgK=$8bU;1nov<1X?J!Q`TqyzfJ-Fkp!xL4$D#-Vke->2N1sMh7`q zZM~-Pk;YUC(H%nd{kXHc4FL*3YlaT;1XLrc18JL-bkU9l6#p1LNV?Yw7z%(rFgndB z0nc{_n^Yg57Q5YGuFIHNLS0kZRK2Y)xBF&ZHVD&Z0y z3ofiDUFsdNCUp$dpe7?Qw%Xaw}~+QM!kG{iLxC8FO^!ObX8 zs9j#eLgNwx6LaMCFE2&6U>YWZNHnGBBwY6G_E+_GMpI^%WA`_R@ACDH)Hzc)Xsv*B z=&v&FoDY-eP&~$i;!`{s1CD0#$LGr{45|(4Oz4jT`6k<8VxJkrQtJy&o$hV*o(~03HWS z&+*6QCjBb$=hLT8q8k;sn*zH3*TNi~p@eNwN~P#6Rtd>@0ZrFEJK?$Y|HS;=Gd&8teaO zDGxAWAW#P&tE9}jqimcaVnzZW$l~M-bTG)K`Picyqt2&PiMh;Yb-fVi^2hxhN#^(k zh!hI6N<7B!7?(q_4C=L|8V8$&uanY3l@rtYnDld&S}rp1!)P|Cs)&chkR>rQw&oYU zVTK7%uy1y-nm@!$u;xtH8`i0QE)<{*dQH?I=qu9Mo3yp z+6dtk>L!{f8|qcS?8`L*+xf654u7QXv4&Xn%Z>3t2|?eAiyeN5Wn)MEu)#m4hQ6l2 zX@T)HFx>vfIr_7Y*#PUZLoLio*)au+n-8yfuk)elGZXX6UQ=;NLVsnjx!W6xTc)8I z{ijy{trLMW=)dLX&t3ZO*|R(O|97eX^}ySSzT1{dCj_5)iUd#z0Z7N$c@ROfF4F*6 zc%vyB^HM(PfLTzE3BYUzJM4+=FTU4xwZqOOAm29Z+%I27JK}*(v0zeLh9J^nKt{U} z5_ldyguvTTdX@K_4z&{Xp*;ms03rr-#(-Q?)7KKzSzGvL@qbn|w|NN6(*G^H_+Kl} zpRL^afBg>kzqsJU+QC(QaJaek=fnNYt?l&3eL=#cyF2f84%5B&>E2J<`v*IJ71ZvB z&7XJoHeaJ-7zO!3JMr!Poy}dIAcf=*BW`*1Y4lM1S(bie@SX}jkkOiPLr*EC5l@B? znpi2XYBG`zGM=n_@#h&eDWp{^QJ9#YgBcq;;NoUXWbl55ka!B?Pmgw_r!OD*MhU5k}SIjyKf()`R$BzEYygb0^4iVF@R z$d1lIuZ|`FSZ?RTV^*a@Ij2)O4!q<=R64Zm7yyimkyV2t8(lwY^U0a3FQ3XgO(ui@ zcl4y=3yN_y$y>Ox2$!C^ry~+u%f<3?tX>ZrW+8(okJ(KvtY#{o*+T8fNjAt}LDyB+ z8cp39J1~P_%ylo5$jPk6sV!ONUj`wbS#XFJ$WQ7C!$>5PyAru}o~EYLz+h4$)?gO)Mk{9m(Rss7e#@i zVsdgy4#2%)azvgQy&Q`?pLDsg9L3U$)=Z@|AZGl;h#Z5;nMTA;Rx`<9P$*r^@~O;K zuvYL|q^DSJk}se>Y;QH#KgA$DD#oWN#x!61B1&c{TD8iPtrAyEUp&+uuTuKjT8`to zU-9E;r2(O?WTMAj3Us2g9aS51`Ip|Q?o@qZYB4XKLT6#>n%|9|mf#pVB=EZ^Zj zf1msx$}G1pB*#K#;-$1A!01kBD=F=aq=||#hh({5M%&t&idm3rBmy*xKNe?S+vmSb z2r)PN;VGmkr)3^f5-%&TkL`u9@i&mrKvXka3V790g#pyOd{k~fcsE(z+ke zGck`mTBjSqGzo<@H5qhMDnoY8>aK}6XFAL%uk)-cIOn`PPZ|N5%{J4LIwl#)lzH}v zU!zWZo{dhjd#3O>oZgCCuc+K-V0OcTj9b-~eA+6=LF|wAx zP~Ui*Nfr-K`Uk3GT~P(l-Duo7DOLPvK|sLSs!&?RFk~Zf%8SAna~?5qB!5o9m{Ey3 z`kgU26-H(6%!nl03*M-J^=@!f{<6PwxV>)=N99O8M!QOo(CLApfs!?XAX>&&M(K09 z^FDp`GZiX@&3}}V>_6{(5MK{IY;PUz2-ec7zm;srffO8b@YGKL`~<^tAVSSB&*7ce z!{s>ZfhYgxoHC1SXAq(?{d6jJdOt76vZ>O*Alkysv!nM8lYXPc^QivN8={6wWYr&5 z4Ozn@yY^{6Povo6mRDI{LpaL38y!I84%jkVw2Gqo>w~QZZPAkqr0XcnmWHv5;8zMe zmh51)5S`?fAUTmAMc0ebI1Z7A)o}=W)TXqQZBpcb*If*H^>S0o*?$NYXXNmPPDS&4 z+YUQwS!&Uf^&p)jL?#GbtK5t382U^IeXC|Gc=|sDC!=AGrbobT}GBa#s<8T|!XIESiC${zC|Qf@>JgMxHK{`A=Yla? zj^oOk(P#a7AZ7sdRgdU08PNs-caCI$B=Jog;1|!(gjW$?z>hRd` z4@H85k;*qH7*ucgYFwnp5rKuwY%jTy*=;2nP+t<<*}t;Am}gD7KN5^6p$(m9*%+&o z?zXTMwS6Vlw8os-z|gb?9xFA`n*<)<=9lhnGkYT`2#Zd|W9(BtK8;)wM0dN)GVh~3 zB%(krIjS56wPV)m;va2$O?I@Zai9YkTu4J^LLcaMjDSEI@)28yicgt5O-87F_}Tq zWq!?L>-mLZIi(j)Jr_lixiKyR+QNQvxf^?J<(5rnz2LbNaXLj-SJ@TtY)lcTXPh5t z+!W@PXzOBSt&Lgg)+tLy-<-7Mj6BNQ17JuavLvu3n~}Rrk|@A&_}4-bx=yBP_Wc>; zBv}<#fqKyt_Oc8)SHHR;Uu#hukfZ0tHDA}tVS*dhi9~8Ge70&2ZHRD-sqkF&JfpuWi%nO!!d&kqg7+gtTAn* zw5`d9GTGb1!w>1!?#}l6!*u5ZPbr(i)BSh4zrDHZq!To}IQ7NdkscQ#JN1uy`+wQo zf4%)0o_HRIJW4!*O39mJGc@_|KS@E#<-f+v;C6+;v+TcDUaY$Mzm?TH{Lk-E|Hrg= z0Aey0r;pf^%8x;wgEG-)GNe<9d7?X;gYR?y7lYqk|FgXO)bsy+w*34~|MNZUf63~O zvJ*kKWh3xv?4F`c8$fpSKp! zK+Vh3xhk(L(_>E+-l(ZZNi;ufzEAh|ci!v(tU;|a85c25C!Pt)?k?UeP7Nu>f7suU`XZKZmQ-QATCGa1aj48RE%=O zbY_FeM07?Tb6lX|7g`mh{Iw(019SFKG3)?=vV5 zDs8chByZh{breoxjcU_vdm{`G3u6s^rbc1+o6%eaWrK1u%IvjxUv7ARJ}lv$^ee4g zJ6aw*0^vDMyToLO9!0feX{jdu(rPHmF=*b}>IGmTw0-xKE2(ZFflER^+9;8aCqr;E zXhLlXR(WGhNiZ-_g`&&U*-AvGMwe~Xe)_dwc{#ilY-b;x8Hz!)0y>{Z)5<~pRyxQ~ z@PlvbcAAEf#Pip-|I$LBild@uT8clyi-ppEk0$tx{yXlBI=#;2?Q?*$;y*rp=J9{x z?;ZX3{nCFw(o&gC0V=%sVla^AMA{fcPzo7&C_N~n0ie-gRAA8c$`eD^16o*_pIl}; zyiA~N1Bpy%Gm`4ru<#fJW zwYN{{o8AbL8f|@=q)@zn)Gs(|C&@{C3)-0eT;#v}h?+kn+>s_j>Rng&_0&6R5GAPn=iec1j%~wN|6JO*N(?Pet)L)U9=tUE z>>M_vNGyYCYN>A^P2=BPVa4eGlTl}Q`uF~CPX90a@gJW(UAfc$e8>79xm4(aq(kJ| z+ktN&(SPkG3510@?=-+mKlE8r4I&*@20t@Q>=j}A>5=g&T>Wa3yU9(8S@kvX9^pcJ1e4BFf1n3xdGuNN&moaa(dh zLXLqKQlCz;bHNvtX#4{qCu2tcUW#H7w*kufRnEw-n5F&$#AIKMpEtlN_7XUyH`zI& zkQ2UsF#a1bF#iJl=hY|6Pggzs=hfA_{r_G0|Ir#jVY=^5r+9uZxx##^FeG_9IkKFO zHb*DOD{N6%#FMvKU-P-|J|1rWH$aR15%6rB^VMI-Ndt%3@(ooqn`GG_Odj!{4Hf$z`oZ`zhLX`aC_X3**80HKwxHF>+gK_gdy}DIeAHM{ir_&KoR*_pP(YMi9zTt*Y9X%| zGV!Sihrm&CSsKW?Ey6LPh5D@3fa01^8N*3=YR%GRp7nd-@|Y5BD7JRR1bQXHqLy>R z8RF0qvGmLE9_LRpu^g*8iViS=u{v55b(z()W8#a3y%o_5GJq%y+adN7M^ zkm7pH@vmxSaG!SY**Rp_2@I8PBjJwJ1(BYhOGLxOz4M(nuR_Pu;a5N&l zsoi-O=lcG~S3jp8b~g`y+}nSLPLF@l2JlT@_W2&hAad>{;$YP|L%4` z=5Z*9!%uL61!J*&LE*u%z~y7a%LbH54o7d@l-5`XpSt!nBGbt6Y9*(FVkYlK?f7ng zs{+_s;D9FHbrlmohSY9w%Ir!i+D_pi7sBfaIpO;fe%h-E(PI3u(aQ*`7sb! zaPV{n-7LN6jB<<&DE5yQifwIvIQ$6FZ4P$cyx)Y!rWUMK6PvQ<(uusTLupoSp5Wru z*^oo=mcLwMenIsfh{@_q7wgZhhbNf>cZHD=V zzw@6jdYBBa2z}@1dC)ce+nHYzk5R#}c&kc%X|M>e1gxGC!Qf}Hzq5?0wQ1h-bFq&N z4c+&xE6v&pF{@&pz`Oo2(fESNpFMdHML1N){P%$@^JsE>oQ+t^ z_F~<%By8Z>?Sk*AzBu3u6G0;m0S+qbrIZB1je&`TUxzHB?ym}s^iWZpTdNyU9To}2 zZGHLjf8QOvu?!&gq=nexRYmDH2zUlIUivfg@@T3Bua5+8KNR;oX{a=8Mr>6BTCDTV zr4}2M1m1Bj`qaa~6j}5u8bSOjr-f(dZ4O#gRBXK9V#kqh;v(en38{$t_nooBaa))% zu9E)p5g9^gp04~JAMeNdjcSWBA6DB;L*H5lTsVXgvzalE)aQi7NSeA?XUjCCECWtg zl{Xt)tnhfb~Z1=OGaDX?Q1oYA^XGX36kBFW9h*RNl5#w1QZ6r zj&=r@;uYByqPb)r@?J7UQ4h(hlTk5&%~Xueq-=E&wYXqHDz2ZHjf@!O$E8!%<^|RW)Xep2>09{VbPHIwg@^XUU^)K2aMzO6%oDOk5&ShuPVI(4c=h0d3$7(4 zjy(<)~05vJfpfpzf~)23OVa zYV*w-0MT;_S6Sf>myd!px+k9%!D*K@?+_unCFPtth9=-pGrC}*hF&6KCKy<){Q_}^ zZhol|5b$7(FD}H3AN)8&;h0d6F&|8%J#`&z%YBK1t+|AluH|)9YGkc6u#N~K?Pj5R zF;CYIXZ`BtLBs2c zTy~mj1=F;=uA)h<-*6`Rkx5dNzG+ZV4NEY0Fai&4&DOSCT3BEeLarIREUAP1YZ32G z1bKF7&SSF#Rx3g6K88Oh7MfEkcd>!~qw#;F9jZ9Jep~#n)fITQ@xPXz-T8lh$Nrx? zda1DBc+y0inKReXh+16!f*1fnb;Bm%E3@bvCTKIm+m>L`8aLVr!f7Y0D&V#>wqK$y zU~OnS7~^lZ zhr#9JO68Rd6+>N6GOKs$H4+dYJx;u4H&rDGRiT+xeOcEQ{we#PjnShki7JN)18%>Qd#>BZ%T zGK^kUpAj!H0#fS$H%}ni=MRAZP%=W06MDfAyfUg%Rhd5oV;PzJnlag+in!fi`AvZd zym+Bh0nldFZ#V_(_Y(#1kDj#r`;_PcuK;xC5v<~#USM;jQ18G#v&LZJ+k!D7hFjr19n{GTSc|t}l&BCQofJkDSg z&QNSoD;T`ur6f*@u5}Brb+%4B`GDEUiUrVtrOeD^1)B`qaAxGmAS%pysW$FQbBa@* zjg4ER(+Gy`u7vWL6%iqejhP}S3M#5GP`NBaOfeUj5!kebzI+)4^KxIBiusO%E5(YK z8jh6uWr0#d-aS<V5?omxf!NEw0 z801r?-;B;X0}_yFOLudXiJMi+!_a!Iz)m)0W)xmgBskEe!ML0|A~@q2XXI~SLhp&- zR0m#5ym3`mg!#4c-BG3*LX~Hq!P-6_qkxZBTzVt&swnzdXAm3`*~y@DJIU~BCp1en zCcNVo`4ks%%|uWYuhh`3sVsNWpnp^OkLG@FNf0z6{`d0JCocZai)YX8@ISua^WTjX z=3N8(+yC`(``|F$c`fZyFsSsWmUKi_HjpukFQ)@PshsWjc$8(5vftW!e+Z$YtkTp= z41leE>~6n*bNJTEyz_zOQ-Q6mz*S25?}n+e-w6~aRzT@A|@uuzUa0_bX9>8xi3Ox2T`sdg+mxV6P_uCrmUc0rC<5Xea27~CR}&p7Q`R+4h}89 zBJ~0AFU9JHaGvU2*^IJr*Ld@(MPV{vfYrKvfH&L>N~|>K7CnuaCB{hn%s`wp86T&A zgt#Cb)TcDOHp`km<%6D8wqq0~wp~{+Fgtq`&u#68NSlqt+~3twd4J_JV-(z~h@SPc z?6OHAIU82;wBM~9!X?mX`+D*w{`^GPGyYr;iwoF-J-wFI^U!amcQ@{pIcEVY)3^Ye3oma@rX`-o9X{M10c9$x(gje=zS-6Jm&mQ_<;^iqnat z=z{mp$9Qu!r0MYEnuWuRGb^&T=iWa!;@$?r9bpAQ-t&@V!!y5jUMA`F-;}7QG#bSnqrv#3|^*R+@LoZv0 zC$f(d&%bSFpp5ED!LB`N((=P~sZ7nf#b_iJC~a1;O%KGLkMO_|6C?;Jj0OOG_yjmJ zS?652&cS-l2WJvTLJU;&6ICTgC`K%L@z~T!#7-R|r6}!rgKtSVHd^YQyByNXy7~;>3EBohONGKN6or zkcwMKun#6eljK#jSko%yhd?p4C-Jg5C#|(C7Xw}ZGIsWw*W7uo|C#ieZZ{l^s?}CH z$9Dy21u=85Zl$Y9%6v@%+0{0Q&hR|{54U{}%l}-of*odC78#BrS_5PA@_*p=oXRk~A8YN$|vw-Ba5Tp2?dGYG#P{8=#eJMRxZY;OTE znrCuPVX6^}Wr)DF;0cc$q!c@5XX6}MC!wBPNqE^n zne0s9VC=n2uu^~}ATwFvHFOp?RsA$SIqi%8kG1i5g#zA`p;{#kH>)qlu>>oEwe)WL-~hZh4|e{#EfzVgDg*Jj zA$L}I;uHszB(+9Ml#9lb#Q4A~J@snoiDC}%IhL+#o)HGyOkl-i8|6TAv;uf7vKOv( z|IcX?#dfZ?i(>B-M5Qr`a<{rFhH7<>e%np&LQmiGa1e|?EctTkxpujcr z@StSlBM#Hfxs=TKR6nCCjgIz~E?#dCS}eNEOqkt-Z*yi2;R~W#vPL z0dR03m`ux#C=MIties2O%qfT2&h*;|WNnvV^}Ti0W~WU^q67bdVEMw`!57uh8f7Og z;(j(b8J`02>zvzQ>+|Y31DfyBHr`$Piy9Kvt z;kc%HwZycT(TOz{vkdc3(=@|!$ufiD7ZJbks?DSBObY(>^uJjIw_pM=i~fK1)U*Fu zUA>F{^Zn}o&2=`*%KJw+LV_mU@}{(vo%AxC+aY`@sj=LaS=aa#{H0dgS2A;=igV4f zZz_xBT4x#e5N;>Cb*8v-nl@@NdS8sAPIpYEY${B|F`k=%Ew!Tw5<+jy0O>&dGrp7# zxin2Ud>)tOF&CYq65=|YHbFs-xCmku41gy&o(#GY_%|P8s1D{AO;-4K;9ZFNy}nFf`_?8a(yYP?YSaNlrtj5)UTlM@%WQLBp@U(l7H> za|cv1{vtPNU7LBwS}3Oy5yH-g696)luflQR8J8GEwZ$u4!c8K6P!Dcu;k*?!aMWlu zp0Qw9*WK@Wuyw%s*)t>--*Nugq9{c*2w0f%C9w{2O=nQOWyG0L)a?e!v2ynd!7D)Y zAHA#u%Q~gVYw1J*^oCf&?x`5}`j2AJljLCg!{+|x;og2jQNoWRa@2N3J)%-rSeq`wSOV>f?bc#H>^mQ(V23 z{?G2-=Iivs=HXkVL%52rA;opLHhh8CcXT5z^UvwgrMS-_22102sz;bb|7(%KH}C;7 z=>KOgmRhth3S@ex1Y}zrc9ww0gL_QPoMTfe8(xPFXz=-T*T1(kjy2Gn4g=T0Iggn95sE zl_|~QsZ3%olgeaM)w@d=ZXf) zL&ad~&Bdr~cnfze3eKHmqG;W&MfR*kHkm0=k)1gciKZ;pwP?oleKkwz2o>H)R7x40`&Pd3H}3 z4F-UR;1BJ9gvmL8bP`1BW$Cy_J2NmRv6O%3c}a~p$W^#Bqx*JCbOc1fIAlG&M)4GhOJWu@#;=15U>qbjOT25jI0vnmGbm0ku3+^#Wx4QHHlQmS$) zou`=kze(-}45Y53Kjbaz3EIaAvPLgqTj^-Q*eGO%bx$| z%ANk_`{n=0dZhG}Kaw*Ti4!O5RXMaV+XU{&<^md1A<`_U+Ma1HYZfWwc9L;;Q29uJ&S*1?eAM_ZijyRvG&x!86 z{h5zA>+pTYj)tPRs;Bk>f8(PR!Nu&Z9*$FFsJQ7kMIYw1)QMDh5q-La40d7*Z76K4 zGo9T0CUhic-&o$FY6-cc7Q`yz1ZL1w$V0~eVoM=L|6^p3|!^?fEAMXD99%MqBb?%b zT)xPAXpb#16VAmvMLEbNAdn$H`PJFIj|XK5<`Q@!L+~P!0hG}w8;&wq<`~fHl$bws zd@`6s3I<5<(XqIrvWRr>PzDxb+^qE9Jxsf4=#z7{pP0?ePEq8TgQPje!z;?N=(t&wpoAQ?} z`BML`^G2WsyFG(h_Gq(mXL+!hp z{NL#QSD|Qs+xvfI<>}LB9{%@}JN&2b^ZrMt6$FMOzjb}Jf~r9*p@{Blu+essWZk5)R^}^06LJa`wVaEBi+2{u|iOMBNO({DpN_{WRp<7aMLOWEr{9L7nB2KP`}*N6seTb(DMRGJ;?J= zEwS{&{`QYM{|yV#sRlXzOl&o|IzNhaRWU^qF%Ges4*0?60Y93Nz|ZiHH5`~IJMZLu zmI{CKR_|{Aw7o0WF$n}Hjn8hBjlZxZT*kXg8c~yKnDQZwImM%6GB74b=XW>yG{8uJBQ$ zdS0>ro!u>^Y;66fBVh$e}53oUHZc>SM^^$J!<@NvlR4*wU$kyW8FB5$(4g`SP9&i z$&U9d44oDQn^Ve*wCo??8|;AelKc0;hCC;|r1nLzp;wm18;>XBZaOGFY0C)Q9cwCJ zP<)(?yQg*9s(K7?^Q@VmLh!q->yV3CB%p+ZE2LhpYjX{~rFcEa~%%crDF?b?+({?O9%7C=Nm%mq?D%A*7w9jnhDTEY)58!&LHy{Nmsp8!{CN-Q- zzlCvO2N_joq0Xs;$8a7}65d}}NOEY62w`{i9sJiX0UGgE#<;hLwz!v{)Dz{;uM#z;l@z>I!sXdX zrHAftjc(|O3df#C9d^LURraB3K6>n^#P>IwnDIjgwC^1SV+K-zR@;oEKzVQEZl zfxaEADVx@nD=IcoP)-E1jz3a(mZ_t_ZR91AMKUU_MeuXT=eC1(D)xrlFmD1vNGab7 zFvLkh^ij_q66)vZUR#izt;tP@( zgOQKeVQ3h1&eXjCNvRBVmDo4d0^~ypA~^x@P&Dirpr`y1#hCe3h1}Z0p!dI;j2rhZ z@-jclMK3RXCAQt%m(oxv>wS=Y{R?&#&xap(KOVeIcixMWL)_Ei6n-X3FEc^9_ex8a z45%^NKM5*}Fv6C#X;`==uDg^N8<-UuuG!*_rsxWES+kDlzUl}iG&*b3>4t%uqEbNW zfDf9iu$qJNbBzeq`D|X>6~ZTdwv?RvH-n>#5$E=2QNla;%cGe=0Vt2G*IHttPQbq@ z+R?+%ldFsL4yG|{i&v~^H_hm{KPgW!;P^<~D9>R4P}4!WnKVjx;9NPvI~yp3(?b(^ivHkA(s4U1RcfqKI>7Kb}V0f1aU9;G|8 zd@-`qinn@>%eSA4TUpxVC8G&oN6<7ry=99sbjIM*q>`sKj{P#m|CfN)mb`mEztTrUHHVFlte@c2rXkt%wMZ!8|01 zSqoA*4=swuRcfe8lVs=pk9+bf=>$4`2|YbV@wrL)qk4-}hAdEpHQ-qwjw$l%CAiNC za;*vY7Kqc|i~zghMCt>|6Q&L*Aq2h3Ziwh1J|9)&$%C z(x2`24}jVDZ!7Npf4XwV|9y}ApIjsIZ>{osx0nEloz6Ly#3!A}Nj5VT zcmmE!BQ_Oix+}kTPEJPINoQPyPCWVh9i=61@8dp3NJ&4w-#L`g=?0xaK^$Rpo_9y) zx!=#_vwk%YbZK;2Oh#hMUq+v@?2H&IIL`Lpc|{-P;|Q=xqqDqU$cLjGAI?Ry<%4{4 zlFK(IDhE8a%o1OQNqB9v6v6GD9*a<>hlhNvC=#J13oW)N7{yJW63PvCw zCsA!s46<4?8h1|0B)SrupVseL4rGc28ji9qSM_VHqVn=JOX5D5DbVDb({4Vuwy-Q*<{!4mN-g-~)@cEbY<>c1;LVJulBYQzd(Ug9G zk1_yBRQIO>{ta`b=-%gn`XS(gN@yRVMl}E}Z1B=cL86&WFNY76E8SB7&;}iOy%5co zhmatova&nMB{(s5n~1N3pG0Kb0hzfr2F8OFNLLcII)WtVa4x>p;gys(pr1q|S{E+} zeZ3jgK(lqBAj42i1zrlf_x>W_;Hg(U;j5Ni>J5f~Af?;`gWB9B=@hMVOfSid1=Z08U=*LKGFQ z^S5FY*Jh~Lem6o9pZ;gW&uHGnwy77*bj3+Xbs|6P z@9pk>gb*+3!S>eP``4r~QK!M84jpzXHtca{q<1F-UPPN6f_#yi)i`K>${=#vf)zdQ z6Kw8oG3wbcF-kP56ch)Cn_GWI!)OScteW!Y?Vrs%dxQL{!2HVuu|8ySzWApJ} zmmmKr{pE4oezc@)T14tO@|X;Vn{U#&>-l8~GP0axJ7VR1xA}otm5amh7qVZk{ql=3 z)`iz2^?GEz9;?@5>-8_{wRmFhuhr|x)r;;8|I##HR=ZjnqHUetZ6EIMY-!_U)81|p zZ4pyRi_a93j>WZQqUhR& z>L^Fo!F|B;ebPP4Ai^u@KGO0uKOQ5#HiHVPg1(-r(fe|po>p&!m3mwS)<( zG`IFjb_*!cSV?k&4#B zCY_e3WoSsJY(|>DNGVA%QY%I+Jpy-Tv669LbU|7$BEoVqM9dAb`o~%Hw;W`dX0HI! zxY-4w!hJzw73c8?NUewdu|H>D>qI#h5EMvI-J-8x{Hr_8!Nt%d+*zY~eK-^+(6tz} z%fYt?I@gUugH*5c(&7r8Z<@Dq-`kv)^A%S;in<+!(&n>5ifK0uKV8W>N^@DzXU1hs zh9G?Isoex#=loS2{%Hgh*w$eJIMMtC$+wB^WQDP6&GdrNnd8b}tx}=|q(@2A%fXzY z7$EsRKAni=+BwTgxtfat-T2{$O32sPpckp#0QhBs=unb5wFS&EMF~^xa8b7`$Ma~( zU($`~>s(u|>hWeq#xUCUXgO`6NXRXUG^cs`rdw*;)Q9MH;KwmlA09~($pN_Y>e1bA zT1(YDBT~%9^y42fOTmFGrC!zDfo`(yl6|cT0v={v7xC6E@fH@;9%5k@0~sE6B&fnp ziKoja>98t;GGl-v686}!t5U^elMm2Zl$3zEk0Y5lR-vjZXsmD8sXFfgE3`sNgNJ5a z^a9XxoalJ?4ad`*{bXuRWTT!fctRWI%Kb;!FEk7wQ&hzFba^6s2V90 z7;F&d@HSq^>c5KhsB!c|W5qzZobSqVne7Ap^*YoNYixAVdMJOxi3m1zh}a+zL5IFJ zHHkJd7^m`MXE^NVRKe2UO7Oh(t~-Cs_^3^ZO{OeXx}D(|?mE@vx_Sugq!|WDURZ)f zK$$5jN3Y^?K2w1hhQX~D%4ds@*PH|;{rr$TrQN4 z=jZFFMG=de5ykdsTk+7n03t1&oaB$~cJ&a)(9H_D0E<9$zxQ0H%B-6tbY5|~lW>EJ zQP=K6D4U{O?MN+Fu~SB+I~frd0QX zcPpr2R~wTZk@`{Pwlo6nM_qzE81a6mXZwiuNhhNAOuhw=zcAlp-6s{?wPv3cWe0=^ zjEcm=N1h*~x~MH)sZ@{%s;r+iAbgYc8f&g!G;YM{t#lbRC#EJZ3X91u8#f#5C3KOL zH&8xx=H`0w3P$1P`j>YH8(K@CS8)GwoDvg`idxJhNQApMnjp z7U<4fw%n99&m%npPa)ov-09uxDKg+z7oF+5a$i^94&za0P=G?6FHpQm z2tPK(PcHMo(B>$s;27{BuB^gFAoCLwV4v92pVGfiI^aUV*o~=W2Rb@Mtl@kHsaEn=l|AJ(v}!CF$`QTNfO~a|3YHb_ZWUi@bhwRw!Zf4C`xd7b)$d9rO>8t% zS%Un|?@z@*NLd3rqN=3}icD+i)P(TI$yjhlrj{{MkYzw0WPWKE5bry~V_0AF^qXHA z^d5TVv?;Rl2x8R~Sml+f+sB20C_QQ;42)MrRX=o#tC};L4E-hnlO+pPcdclYCkksX zSjHA{;uplwgPZj zQn#di`nFE9?wP3MZPqtV94e7?>XhF!)4z>c109`bg6Mhr>j4~|N{)Z!Sa&6fF-p17 z8c^Vr6uF?wUEsPP6*It2Njgz*&A5!7DOX?9l5i|P$54P&AU&^lcBrCJ2J%NRcQufezveSZhFuF{a^br*7C|fJ^MaP2=p z<$%*R+c1Q6$)N;gQEM*w2?n4DKKb(H|GqnT!${3v?fLt9TTWdjlppFGSME8@W+Ur0 zy$i=3hH-*|?$v97l~&ViMwK~^TlqgP{!`d@=N1TnS^l43?CIS9PoFN|-T%L@`=8n7 zMK2@EuFg7)XhDaMA(!P=I(L$CXxV$gY~=Qr9s@65e#J2`<=%G=0VIhw{# z2IKiogi5LaAR$Eg9!lfJIl@J|FFT+8m!dKLOKcl>qs)Emd~Fk38#ppVf5hhuwNo~? zwSj}C5_CS>O@CC;_D7YC4^TfeN7xXo3?~T7nU5rTb|+;1Jfe-{>wk+*)8ACX(@gyW2XaWKjs6KznF&g^kdhPLhg7YO7S&2G zn!@hCkQTL41L_9TwWW$1jwQ4=2--G@o0j{gXH|x0Cf9;*Wi8dI%vcFPkT({upa{!6 zOJz{Eo*lH9yk2@)$WGQa4L%2td`Wo1^<#hRd^R7&wPc%h!tJC#<1Z(g@#I{87SC4j zVs8D!`rfqr6)<@6X4J7IMo^Dzwta9uu;NRc;{5RW1LHli=d*1G#JkhhS=+JZ8Eric(;-xuQ@6~{O0A@EuR zG3d>2tMIw5a5AGpjqk|{40#*sqMtOXi<_sUX^jD7(HZSnik>gW%hiPdF6qo7VB=0J zq}REeSw@`-5d*XOG+v%EC;*W9g{6rcL~QZ8^a=~%eP6g zwY#_V=k(p)`@O@x_d8qj)Bx~&SWDyUtI?2t-^hNm^M85r2iyDNtM~yShRbm(c6vU@dh7Mt{*PO$PyX~=CaM92D3T?K z{a(-?O_2j^nNEFAn+X-xQ=1G#~Azt;x7@z2{?j+N$eR|L8`P0WF7`q z44N3uMVPOw98*qR&)aO2Jt!fX9AYZv<1)gogCI}cOV@0W~aOb zxwT&B8CuC?)Nea}`{DpnnSeexMSi%XvMW&^MhFeS<6+3RLvapeK*o$GkV3qP!4TVV zTEnJF|2x_LBUlk#v3!o!t@c%=vO3mutDe$yj8(0N+#3suaSWr&QZ=Kmt!IG)BJ3AjPo=0K{fyS%f zi~2=z7WMP9EP9Y6D@()9`1C zl$`*+(I_2uFlsLhb2CzYRr&&H8fv0(r`P*;k^hS;=s55H6C!}k!2e!-_GH=P|DNCR zf8Uw>zdIRaBSdc1ET6ck`r<^p5Z~3}Svo}r&a#RvoJ{gwWfZXwvXBMN@2QvKyrH7$ zWcz7*|6peiS-BM%O>B4b5W?latI_1>vL-{Vt}L%aZ~p-|91{lGQCb-q`AYUYT7o>7 z;N8yF{$6^xC+N)gdmNWMdm_KTPY*WVec0VTNcXq@>*LP;_G|HZb-|D2TB83UphHU< zSv*m=<-9jLva628sImal2_qWAh%OimWhmKk$lH)r6CJOEVbYXgTu1Hdrn%PxKoWqV zZxF&GzrMVT>voY@nNp4E2)sAfg4yjvtN<{DNk>I74rSCIRR%%9q&>k|!HorRfW1s^ z0+lfzr0~gPLkeby##^=jsV`nxZMj)$tczD}VK=j)#oF+@Y9bc=`O@P};mPX?c{cIZ zsEei;_)qMvEQyj&g4diQ^{DfSw)-4uwLi2*Bz3#84lbMZ+5!E<_$T<{y_isyrp&>G zc{CXefcgZ>x=(<~8XnAIIDIU`A0=0-WIt?lb$PO##c&Ai^s5F$nhOP}oa#+hTdvt@ z7eNVGs+}8QyP#jatV@{05_(v!`*^|e-MuLCUYo^f1;QVTQX51SRJVX~sQc<%P#yR7 zCbJLMr-1FPOYQJk5?N%R(%EI=*uKsM6+eQ=v8wOUQP%AUik=q=P-c-Vr`DL+sxAPu zZ%jEuP}sqB5ntU%eu(8|v|QCXtZ^k=BlCE6`($}cn;aY+{pHl2+HstNUFl8GOWs?P zVqb>#k+uG9)70>`)53wiV5DSJ=Y+M?6BdO`cJ-&K?Moa?X&saDok}8Dt$Qk&U@GOK z0x33cTC#Oz8+h_%_;OEw5+`AMTF3H1IXOPgyC7Chd!2D-uI?ccJ;J|ouqb>h?O*#p1mgFtNb0LE$8UmnI2ax==hmtk-qP4XZLK zZRi%~!^t>H)hm;{DNA74CW9^o%n-L92*$*MAE!iT)_IGdpf;1)(Kn1QU|TMCj_{s8 zO-%p!4XG+jOx66WY;vNX_*ZItBL6M~Op#5iS_yRm@wPtI9HQ!sXvs^e~H0UWcMbP+{Bc6?Fd*?;Bna9|xct8mPlyKsD76pC2F5{wTVK z`Dd*M!TJrwz@$jbk=8s#kPp3J=%BS$hw2Lgo2SkxC-!b`jY%V=2i`w%}C7VmLi%q%V5vWWgRDaTQMGAK}6 zn4P173iKgXA$voySn{$Y1Ra#ICQC~vVs0i!uv(YK=jSU+dfb;VX}Pqzyuyk>Je6Ed zilAFomaQO%aw&)vZ2N}LCeC}}D73kc#prPF_1~7QpO+#dED;|PU2#8q9$%-`T6py?V+PsoCLTVdm_SHA*pyz zGIQ=+Ggb3KEEp_)wL(NwVA49DI+yZXq7V9H^5{550a|Hat_7tt_K65PQCy0XlT($s z31N60GJ0fD{nC-(aaDl_LdiO&;Y0I*_P`1wQ4vqn2__hV-n9&H<2{8Ye%RXD<`$*AM4;71dfw z9@vf+uVgs@Q||LG{!EEgUK&wa0NIu-M(z_LEugU7kE=>)YMCdK9sK^>1_JVbCBnTm zJ-{sg-zQJJ_@Ap!?(iSKWBLC)@_S{$C586fs-Jj2#b24zQoRx6v$);Y>yD7N5sC`Y zErz)Y0&3uL#oCop#vMUGf)f0b4Cpd0CW3ItKIiC$jL?esYW#Q!G^$NY*o*FzSedK)*~c-uk+wSJy6=(!gE`gE*LppWQ=X_4Ni|P>-Q6&0-Tr?!5%nLZ@)p;*OlD~bSO}Q6KAPcWve2`d|mgl zMQ^ZgaracLn);7$ue8DBLgudUY~g|tSbW^P1hGlv z&K>qAC2i~_4W3HY4u;zVm69kT9w8T3uO&PtiIR(eyhn5j61M8OXz6N0HPr&cC&7(Q zx*W%Gj){!YDvDZ`pr?K3a(tWjzcxX`pkANHw?hKV(*HkM@$es)pWNyHzkmI|*6km4 zPEG_JK3(Y_{-%`$gQ<1_YGrQG!oJmU|L62@e{*Y_LaBVP^|%WOgXCM-_KgXwmd{xUS|&s6jJa#!{a%a? z#4oTV6vaI#)tFQi#;}O35-EFX7kqe{P0^ZS4z4its+7Riv+88Cvl#7^G7hNdlb{m| za9*QHh)_m0USF67pKVp3@{_%dC5vj=GSxnj zy>qS%ktvN+w=?a>>@8F<<#Yga4M|-q~-4)$I9N9H=)jdC{ju}JM(Wu z6T+$O*hfG-N%SSQF@un$0u8EvXcD_+yGfhE@T0|VR82}#oq*|azXKuEFl$TDrB4){ z=1kd|l>;jQ>QC@GiCxycHMF~srL?MBU{}x%7?fBeZ&qK5Cf{-g)Q{9gQ8kh6R3m6@ zA`{<_A!@4DNb|DAGy&QYrK4o68o&A4!GfJ4RLLjVK-|RRVx(-q1V4Z&!E^vGKGo_( zx4+@$jpb8D9jD-8PKAw%;nP`JdVk2=$!L62^Np0(9&QXWZdXK$)s~T_)ZVG{FwSc2 zP&U0xbs_f&(vcf_^YpWtR6PyqI5jpub~()`Xk6hip;e_j^o}Kz=OxUUpEF${14azj z)r7#p_U_qGvBh{Gu?^>dCtF45n`OtSkkI6dci6~eN;W8ikg8^iN=${ z7YJPe1DR3d)Tu zM-R^Gs~c~CZ1*c~zlD}x)jhnSZ%$Z|7UdEN+}IZzZEh2V7>=()Ff8m=MgK9UcmA)O;B$O&?W+4&I#L=msI zLAB+Pu5UZ#sUccrB+G85#6zBz(Z9Hvu98M7Q4dU!XdMwr6krlPwW8hE5UI|HbS*tl z!!eZwwz^7fSkBEZM~9jJ-m=$$IijYsb+H~F4D!~ zVWv4qgcens7>I5VajO^SlQD3j&iy*AkFPHWo%6gK9Vli{N@+}|RoS5h7U)Bd3N+-9 zz2I0k@5fWqR;!_d0~4geLvGB<7@4~oRQQEz+5)LnuI;a>#Z-&dehBOsi$j1UKDA77 z&+GhjVVJ5lK|tiAVgUZ&Sb*&s!M?IQqYOn4f%NhVOFNt#^(k<9AbGDG+>cEP*ERvi zLs`S!^Qk$0$za-MBv+>PJ-Czj->Uq7a^AUh-@keAzgAzk_+L+7+~L1`C-Q%O5^C?T z4`Qi^a|jLL8kHzvkcyiEPIOQX_ilr>{MWmt%0#VCv3(@d*RsrWrte)`=fQ#0Y{%c(%OU@O->&X2)%+ z11vqvRI!a|if$LF!6K87vXgw^Lt1q^LoxnYntc|O2nPDiBw__{&ewMN6dYSzjo`qa zissbaCJngT2DrIfcA#KhFt{XCnbXd2m<b;Y&+c=qDX{_}g-{}q(oen*13$>5)~Xtwp5k$3<0{{G&6y8YAk`@?kS zb^7OR1k$7B79%~DDr0nos`qYt>+RjG1gz_kPYZq92BaW>HKAQ@l$a25hIv&2GQx{$OSy>_KQK5iVx|y z&<5(1H4KhMT9qJmXe9$Hgkpf=tuxfz7XdmFnl)lrUu6ZY$-TqTk`+}MV7i&^y#H~p z))u68F&T9Mk6<$DH>8TiN-`H2Ydfqk_whA_{$}3QiNuGJ8Wn{jh8)X+4P(FU`dspy zBdvj@t+h5B>@v2YGpFwVypVZ4QNpGFXgWBWW(rY*|T!8>qDJF7Q?Kl*W_3VKY-_pgEIak( zOB4tJaJd=%!|j2@xK3cyfweLpbVPIM_^ef+-t%2q7%q)qQOSR;R(1Z(7}$l`EUL*M zc*${sfN9;+ju>@}!6YA}n?^jA(W~$lxVDD%qUGNn;Mt5xV~v6X(|lnh^iv{j&38%^ zLlvu@J1UYVH=Q2tiO02W>ZtQm(iff<04(i!vcCFQl_58A`ye#p=W#xmNc>6a=EH}w zXWj(*t{VnZvCCutXuT|S@tiH z|2|oM=JEf}@8UmvXZ-&eH}8g@OXE&?R-3{joMl}4yEznRMwe7#iavHQz%^2SUJm=6 zOA^_p(#ccYD`wxCTV!qOPNa7GJ8+&`Z07Y9rnO;IQVC!(E`}*dpW$s8|En8>{$gddrfG>4lz^d3g8#MWxsa_tIX zuQSp10wEUCT^&ORS2*a^)#O6rBw?u4C9>w-8({y{znxa=IARxbc^bifo;6rw(pIN%C4eZWRMy)qpV&FJ7ewKOY=!ziWcY z2`qxID};v6%=#DPKG@#>Ni4X{*RS`t4-RM@e0?z=_Vy2H6*cCP4^*2cSq?I0nI^PO z6I!TA@5qC?U^6?fA=8v}HWk1`feNHUBJ{4;+0Jb^i@ww2&8mCs(<}Xrd+ebXHPB57 zcvl@4oHG{Je|A!cyn6FEfvy92VEPgVdPogyLiqT-RFAY1kN~75iTukKeGukG&3(Xi zBD8UgTMTc3j_M6OD@H2)f9!pITiZyo@Be%X#XOs_Ge*26Frynn2sjC63FH`<-MI`` z2wQ+ojODd#5)R>f_S;p}FV(G_Lxj+fJ`I9i9bn(mq;25Qp8efH*qZX5F+Qx=Sck^FQ)MTQ9bW{ z*-j!EVI5*v3nC?L;97kl$cqDu;3Z%zvTi&cUBo|aLg@F#?*iess@ENaM(Bs>P`Tni zhF*|-o~7kUgAKyOlFO2WrBY=*nB=Tcxu|OtR{?^)1G%|hoWJXyyN0fkIXLKbw-Gnz zJ%hlINI&AVx?~5n8$m{M_sDtz0jNCGLvsp?@uavh_f>t9Eql|;&yyY&zN>R{2~^+s z=tWIj2d$KfcCrb=CZEX6r*`g;I$*t`-dL~flWSTpopy_LJ4gZ7vC9VTE4tv%{7>nD zM?6H>IB8iX8yH2jq@ZN+*<%?dlT9-RlN+SM+z9*8w8tij>;)~3+H#xHUcp<9-_6&_ z^)(Dv#`5X3b*DAei}+g@z*_Pjn)eE7FcL&7AO2zZPs{Ml!GC&?|NdO^A1<98xpL;J zV!)zu4->_5wbePWPSjMO@G*wL8s;CyQG*51e0m z?P*NQM@_7k8r|@d?5`=pWzI_pb-LF6FDJFPt@goRkK@C=<2Uj4!Mk_6M^$%(UosA? zEjQ?v8cXOxKqDevgr^rQXS?;wE)eFLC$HcOCS?u78p?z>5>G%Rui5+@W<>}u2(HFj z#1A4&1k#0*#A1^bCHIynDlQe657NG!0$A821mGkpIV{HK^~LZ>0^q@f;((|kr$08r zCyUMChu@ZeXiUGZtXRpV+q>IBG4b^ptaQ<~1q%2D9;1Yzi7oGDL)@IVoAp{KQr5m; zk#eV4TxQb8wcXllZ5_614=_ys8}z@$Anp7M^uJHn*US3fwe^Sd|2sJU+lOLJMA187 zUjY)7I9`Oj0o9N48%GliW67be>_E|5ljZ;goTLOo!a{Ch@`4W8m+2=_*(mMC+!(0* zvQFg@`Fg2bC^wWdrTux7T!Ll-{^$>GZP<8T6T-Y&J&~nh`&kw-7~R->N^7rS8 z0rMAt0|&X`$LG>unoJi-)`P24HRlzxD}$(>)Lx79D0JE z%~Yhm>@T<1FcqaPdPxKPI*IhRQ`8C2OIhwIaz}1DyAmH&fnOm)!qy}Cy=gYq=g$Fw zBCt{{`r{S>ADeP_`7(bomGRIjf*fF}Ol?V;MZ7wXUraT;fnsR&^^vxITcmKvk7cg2#_b86`s3 zgq)b73b4l_W>8E8o%4td_x4(uLNcsZpyjVW{%bnyr#%_RwjO~;exso;03b4qS{3k{ zskA>dgZOixH&ZiEdjamMXif9or*DfsGz^%7x1RqvJlGEh;*=cS#tIvw4hb|J&{VHX z_v|y1pSQr#;JQ}SoCBoU+a**z36uWqCUzDsJ8%v^2YRwqNhf$kaqn%2JS@wtz>~si z0=|JG-L24RoIGRHaHh8yqtTOy+9euFExz~2WQ_kOOQJuV|6h5!ytG!f|9Ig4zbpGc z1@x+~Yvc3r#RZs=yGcAS!sSHCXq0rW5SPMy6Q^M%1ni-P3R7`mx8zma_En00EOehn zTWRa)sJ;8@_^1W3T2CZdiK;BOqiREKL(ge)>Sfy}9gabZB5BD}uVPwe(wzY{0# zWjY*)VIP^&@zfAQ2w0){&?HvQF!}|UCYT5E>Cw+-cufhOdBIPoC8LA-6El7q$5z5+ zBD%WiOmMObHh~b00}g!gHM<^PLzt)YbO;cxJS}*Srx4L|NU%eQ+=E2NXWrw~6j=yz zZZkIAhA9w6G+v=QUULFlFg67Q@6=5J_%1OL+4&ftctne3?qW*VPV|?WwNf-=6vfM- zU==1>A~I_LqZWwvU1s8gWEJd5p&TcO;dE+$0uxq=}GAqKPlx>1$^(Oh3zQP!XGOwyl~Uvu0|aI_}1{$_{L4HsDcrq?dGVLrRH1i8ZJF@T+m_* z9KTdREG6nYZ5v!BW5K;!CcSq`Wt51N8tTbOhcpeM3&LOLo4p%-j)Rm=5i*F$rhbYx zs^3m(M##YW!aRAR(_PH8f@WD2cBz(GoISrM1jKzx;uRQ+l`+z|NF|2=-N?FP+icdO zD)_2KNj#`ZX;(f4I;#@%b3(^_fdT$i{j6%smvr0AE|^fbN3M-fc!{^~|@ z@qx~X#Il|k6Tj2RXQ*Q-Z7=|X z&;nC%cRbK0cY|A4a?FbYURBf6(9Y{Ui@Iq#h@Euy5$8+64_DuJPCC8$-Sez`#Dx>G z$RlgRb6&aGDi17gyMQ(Zl0fdr$@frl?R#AHFp6W54s2n$yYJ5 zZxZI7m_o)y8(@2c1KFbtPERsWeJyM0fjRBO?tVjtaAYbrAYB^F0 zeBz(wT9l5oN{1pp%7sWD;lavTUWIKf|G!c4JCNKrC+@`^@eKj?+ZB`b%Xqg)*HGPVlSY()(dIo z&fc(2S?^h2toPd6dX5{QTRV|B-A8pTmjIJixhqv_5`73s!LvP8GL*eg&hT$j`~#8K zoQ-Np6Bw$Ti4~sB#hSeWnUeQJ1vR71LOx0oZ|DWtUfi;Tm?ce$vZi?2*yc7{X?C z!-+xmTqG+Rn7EgJjQ=sl!ZznhFg|)5HxO`cQrLo|DDqB*;ZE3Ml545dv?C5sREk)@ z;fR>;Fkkarl{~#g7;UklDTjl^*9IVg(TWKYR)x?6>xSj3v)>abAioX` zuuN_A|8nvLh5xX3uCjuY_u}WNm*^;^C8$tky6KuqM{irVeH%;KVX)`J6mFB>NDCL) zY+rbgG=tDWMnKmAgg^|Sa3=-C5TVfIogqf-s}M$J+4?#ljYsoPFNgE;>n_ScThRay z1UrT#XV0A+10(5rrb~^#Nn{z;S#mNAdYzTF5g6$oTO)Ipv%2p2`3TLiR9hh~Q+F)E zXduiJw6CCWoPy5vZq1$g$03+hc<$6oAxZrA#*CZ6+rGSr_yt8?#M%ULIPL?2g!Ns% z(-U)Vi6l_sJ?E#b7gBmMFVtxtr3}Z?*_|h+6AnTaqRo5uvG1OH8B;V9f=%nBoXN^C z=M;Ns>&tYRlNSA#sr}VlRwso(Czd|d+>yMZ>l9d=u9btcV|)&FUjCh0WEP46!!_^V za&2xB;OSV-U~AL~$JWiX9Ri92CStmisJJcQ2Vz*Z&$rQQIEuCp_FwP5IjMn@ahw;m zQ#X9s4Y~5_V&rov-T64{b#*G~w^T~?0nHraSql}+{Z-aCeUQ&KR_(nP=!3~26Q;x2 zmu61f4GXuPWh~0_I1b0>w=u?w>-BKE*(0hu-adZyYrNAs+-~o_KiWOmhgtDClRA` zqqzf$8AK_L2yIvVNG>mjspO_03Y=099PAt{2!h!I8WluBW+|?K#$Jf(;S~iTLeNeJ zeE0BZ>*)9pEqnixo#Y<~?;M<{K8dzV^0)QoO}q7G>!=mm$=$Rb!&A*WQeOw| z-zkDrlz%V>jTp8*AXEvaOq>DT!U$~|+bt+Eh~}ytWnG5?SvB5UmN$qi{4mF z<+p=>nMVItmsef?kM-rX2BxHf>^b;t-47Cou<2A{06?)2FpR?=T3;o0GW1oE z&D7R9A;2 zFPRgS(m8y|WEvJWOI)u={59pD*iAeQe%uI_rvy88n^VyYdqV{B_>Tf7d6*UXPisrd zS|KoLWbsB9{24#9;!i#RnBtNyz$Fb2tOFHgFd2)OGaqCZVmZ^S!w z?^KPTs}M4|PSrJ4kqswdd9bk}71mu*mPqeCRNO1d7TGlL{y{JBC+Gj*!t#%g|FN>X zy1rJ5|GfMl|9@xxza4SDLVWrBy6ny?PWWNgDHeNqC+TUjnR~p0#{h!6I37d9zbfuh z-CfTIe-mPI*6Rfj){MMI1)o&_Or{_>Xy9}pX!VgGPSAo|GJ(iY=oSesa}Yv>%=|GK zYEuIU2~v}C(tWatRaHJ6P-?_4KH)-|@!5;Uz=xdzn8)UJ|FVm4ustZPMDYRY&+Zw6?F^!6b zr>EDqJ9YsQfnN3#uU$+p_kBHt`z}w(Dg6jV6BJiv!P8UZOn_^K<6R7P!7AFzFEg?8 zB%U*ZCQBdeaz#Ha{U7mv`1k44Rl6#HuxIr^F|3mJSGNVPW%qp`TLQKR$NlV6P~@Et zVvyx)PcN63!e`-XxMJ6Pc(DD~){&>DRGz29Zd;(KA-j`;i4+V7Ft581PYCW*DfDL2 z4_NnnOg zKHlHPD>@EYE z#iFjNJUgw!quu>2XoX(bCTCaB7KlHH2+O$EtLkjGwp+WuwBkJ>4D4_J>Tkd>?WEa_ z7zM$`_B*$eN&~dX?Std}qpFe!;C&2$5*Al0sqVY2_bjI0)1@V_rmSUsf?rprNVTR; zu#5@D{bVe5ub`Wt)a|nGtN2|U7uOl7%>;GLtQ1c%ML!?K7ouJK%g^{F>4B_z8zby! zVLq?WXR+eR-Yxxfl?X0{m;Ey(>A*47>#;A-bjQdLg+get&#GG)EOzL!m3dWl`bH4I zk^tR{%eHUKg44QtAaCTX`z4j2X%Vo!GuHyCO(kfg2XI&Yk#w~X-)1k2 za>h=X(t{bIjgEUGb$)o8Da|FBO_$wRBx$-}5a;oJTHi!WD*LsN7)PfScRVIijm-8M zgD3v}(%o`#gx&ZAvy5#y4_QR@KP5 zL@a2ow){}0;C=JdKaySc^sFU#hFj`37>X!39I{3ux|CQ&lA&~(3C0(KM#(Wic_`@> zf{OL8(qT3-s-v7Qn^{LqZDykPndOxT(XH4cZ3NplQW9)C9nnJT zolPd~xZID?YMm6`#uiVqR84 z*{B3Ll&gbJn=4sH5}_XOJf3KTDoNLdqG6&_9yY_ho~H9iIZWY>yj9oIiRo@>p8$<8 zhR_rexDJtm?3L5-4Wg9{+WB(Esn7cG}@Acx`43>i^SkiYj@_i_VN?#(?03KKFqWcB$AQw9P=Hzqo=b0f1+j+9=(8m^dJVd6Tx8dVLtnRZaEPaxtIWbHSmgO&&ANJ`r5nX_E3pp3l~4$BATf zj>mO>$%DD8qfe4RRu_T;yyO^yDpVcPMOLOfpd>MzbK<}kL%$8khgmSIRe?UuV|5 zb3DgQtGTllEKs0#hW8_dH-U2)$iT1!c%iTa8R{Q zZ|1$Vs?=N1MAlWo9=~JtX@=Qs%J8w-$i{a>W9z13{`-;zF>DMO*daU@nu2FVkbX)# zaN_BuAa%*|QMw{J;b$o_fPVa}6QdO)Nb-fC0pP$(9=IrXh|MjBg7!7*kIt_w#OJ@! z!t|QHQ)W5?Nsi*}swf5rT>8G7ad40>+$g<#X}JLmSt%P6HqRW3%3C*i^at}Qq}i5u z(M3nQfUzXtSp;`IF_D}4v!$iR#DYXoN#?T#nqcu*av3FRueB%6)CgW*F_tDxS^uLP zqw+yLA2fV|!i2gRF?MR_vWjj7e_7cO9@p3t&UlIxgpI9eElrN=hD|b%ZlipzY@VE9 z#}>&aNlh3xML$qaCWXMjm6ND#aa@LF^f)UWdbJXO+;SW^wVy}GQr z{?(W+ZBA&r>?%9>VCAdVcmd)YVZ25)!8OKm~rZSW@$-!hK( z3jv}_p`qP--)3OdVO0`ra0E?W@r#XMWoZd8-uc_-!OG7+GY79){-IVCU%*^~oUkHJ zJ>ZZP%Z|;_ZePeTc$k&pRQPrU!Cu-OeG6n2y=7sb%b*&_Oi8@^zze#JYbyb!o4539 zo92qq)%Y$i84~}5mLXCLX*hg(b4h0@fwy-0R;NFW3hhY=BQx(oIENy*OvXYKmJ))7 zl7N#9&SiQpMTAT-olvuqDO}4BZT4F69jzo)q|lt8=xF_umm3)GL7-@4O>`OIL4J@Xg0$sD*O8`6lloeanuoF2uP)w*vR! z#V}3(Tbfmy+wEjL${|Q;2p-cR?jmeu%`$SY7b!%98HwY;M8|_W2r#j_H1G(nj3IA< z6+&=@Wjkt?&4o>O6SxIWz^$wCxiO+S0QWQL>I-8p4XduxbOaVXbi=PEMs!F4OWAFZ z4FsM=_E4}Ulup+qio%#3L}`MR*Pj9YJ^e!3?re3_>nnuXemX}`}V;buyip1=JV2VjoA(L6YzV0lbNr7 zv{#H+J_!7llcrWxV~`!9h~BX^ESrlH9wURxV`Q0if}&#;b7zvNZd!cZTsfT@9?<>E zaJalVkKEx?IVX%BB||@t4Qp$js8zwC6XeR2Ck^cXI%U?Iqp7uLw9%#jnbRWl1(&ag z#7|ELz)mIsOZ6DyQh|Gbj?&KQl8g*b<1Y&`Zb~80n|e)F z9biKOs;3*Ak4M27tMm*MJFvgtX5!)^SO|&_*`Hw~&dZlne7-*X^bs~ua14#Wy+h-%K1~8?(llMX_ zZx>1WP1a2dNkB*y2ulzaxugdGa>?kiK5Fow!MHhCT0x#WaA;jKRst0WW__b@iq*?5 ziM>W$xDfJC{*k0HnRgG`{9d*>NI($pcA7|qRKQLcNx2)$p_wJI%b@G2>UY&Dkg z{pL&L5g3lYZ9g{=*-0iYLrX;o2Sd(;)yD4z26O_@i zVWasXhI^1BP<3rF8DxtHr_6H7BC(ydcC6NFDU&E&fR;f3Igge^~_KW z#eYIzE~7yH7Im}bvbwy&M!rbXFI>QCU%<{bo)^|GF|HgAq0kBsxqD@tujsAz5JN@_T}P**j!11>RSQjb?0~gme)F&(t$aMil(4 z9$`m`)T^wt|P2~Yv zvh<>yMwh1~28E7PBJE02^WEuCVPDozuiJNnA>BcV%AeX*SK-VX`XG*kqc&K>8?nS` zp-QQB!ADZe&c;3J850>->g@F zss&-(%a^R8ym~AhyyKX0?t0|N7uzcE82! zB0unbP43^e+WQZa`zH*a zy>z*ocEB6FTRqJxPz2qB>q(~9b@I4ts>>F6!y>O$)Ln|aKxur_^+Rzo^eP(S$b5qDPrqcD zI=30$pzbG6OpT2P)Y{qg|07V;U8TLjH@*CyuK!p%Ux^s-R;%udql=GRHqR}1m! zigp#>$B;h|Pyzom@t!OjF>B-^@7;i-Dk`w@{sNXq#>5C#a7o^lSYErewZ~foxXJLw7+~-I>3;1+Lxq~_ccVTXksg&Fo)U7nMZEs2EdiQc!?RqL5xs* z#MC5{kM-|GC_w%SEX+hTfY`Wr7F*@Gx~}ntVQJJ2;4JU{kO)@cF2dN4;uUh2M3{sm z(~VZi=O_L9NUc~fVMLiU`Pa?h&)Q~HX%61!FaEha$08(XWY|WlMDJ1-u4C*;r8_Y&RjtUw$)}Z46$ONj) z=dXjO@GY<@=qLM?RI=8Yk`_x7yC{~)VWgE(;awC7^?qcsjK6?-GJgvWxPZ30#!yDT8RT3tgaZ=gDoxj+P4jvO z%avYa9Bgr$nXNPPIQ*0f<1;!`6)KyhLv%UwK$mYxR|h;yO^H!f^tVEo6uJINkVzB( z^H`pBDj}vG!-x@pA~e5s5o{%7-!O(TlJ^1_0BId~fPB_t>JU$+fW4=q4TVq-G(f#X zvxn(Og<~h}EIN&F3D`B@mTZhDC#fVY`j)sIt88hNrzzicG;5nNF(CA=y5&b_6EdVLOE>Y;jAxB+ZdMsg-|21ai-oSl%nikOAG z0GWh`aaX+CBQmIM-4SGoC{Pu;z|%(#MJgUzC~eKMt^K0zKHhq|e3_~$X-~!|Vxpf+ z^%-yUvex8y8MBBAx5*fod6IO=LnsKa^NwbxS~8=WMH5dLTTVwev=A8vvqG+!|Hx`poE~u2 zE0kB^=Cm4S_bl(QNYGJm<0$035~GtwVeO7?hX+z0oE^E80-d-s`q~AOf5g zy7`c)ZFSRdOz6-7JS_~%T17~q6s^MKj;$ieqEcfU(6}8Zm&|xNwnT$Tx>3fYd~y-a z`XKG@C`nN9M}nNcVt_F%i3xCgXBV;04paPoQmf5ctqWu! zml(lFe&I62QY;SQ#%7J%+xc4(NHGVg*^}!Sm4nZ)1&w?JYExv>VC{}EnhA;sUi5p* zT5S5Hvu%?k8xI60ChMNNrj?l&w3QVM_A~>cHbN(vl8_9EXj>HB6`buNJS%Wfd^`xw zXX7b}IE~WAf9b3wp;AyUhoUtw5b>nEZrv$g+^Bo}eHcIr+AzhL>u=N%QsjfJw}*`H zRgW1xA$bhm)*z6AY*SxRTNf}XNzE&WViIWsp_VE(3nUQ#{fuN_cSU&Lzc@6jk0`sonSc5B-MF_V*Rf$j0dGjxb>2 z$)7diCx3!6LCM-}S8CwmzEI77yiEa5Pi4sOeK(w6V<8U2=PG9L*UTkJbCz!-2ksVYsuaXy&~ynbH^p%mIILjFOMuX;v=B$4G!L*s;7 za&upTsM@U(D%-H@u)m)qyDXw>e?o=(^F|66(e?a30enPSN9{uE&|sERB+%o$x<6Ft zkvUlX$AX57KxqT$jGUEe0uQ9|z_?`C3aa4N%(Q;Ki;S-tYS16{Pf{(HLhGah9RLs0 z*Zw%~i^Lwlrp8u-C}3M_=LZV#jBf}y#zBTUFxmbkIs;XHAv5d`b{9z+5Wv-h@7Tf0 z3nDr0Gh+(beOVeH6L_9-K()e3$BY<0>{sd7E z3^fx^x0VTxL8TRIK*@yvL06lM4Ckk@#aRCr#Cm__=_p_x4JO4^*oSuR?Pm}^nB0B` zWHQeAk^`5z(ycTCO(a*4eYUy)=KL>_;P+(2S%67)t|LuejO=V zCHk=AR>d>30WkJRgVIWWOzwU~m^&Ts!;DGwk+IN7)#&G#AyYN}6(+hgvyFWEnn1Uz zH!>zwg^_^YLDqUJmA1c)8O93aT;0nrwP*Nb7$COsFb!{?FsmQqG~!-@7q{gE!*_cE z^kg%~Hw_(gX#92cGp$SzZfI!KyEQ}1WzWVEbs@zUsGhP;@?hI{%gW1i%T?@Tuyi@p zr>`~Vc^Y0zJ37pJO*5lXQlQ(uQ1KNTPP^my+=ZFLsyHEDgIl>>v$gzIw8N>3KU|3m zCE3DO?U>mAq~&egt0qg9mZ?4)>&zVl2a6oQ>LE$yc7n0!A-k*S}p^gNa?&xK_;^%c(pAO?bY z?A5QRfE$R`Bb^_Z#6TIzNHVTKpREI&8%#M|N&=gc@_b)WhgLujphh>OC6LwFdO5=f zunHIds(_BDlTG`eI0NNkPrr%S5F*;vU_mbjZ{t~e2k;_$xsjCq7OJCcrs0=GJ1iu> zO?4S&^)1UA&W*j2k4%A9v?5%TEiLtRpWGW*cx|c(N_WX^2hNjliXa>h!JPZSB)@Ri zTKhrmb6)kIAzv?SOGFSC?P0@{eo)~ImV3Eo$3y=68KyYieSEo8qg9t&M8n-CRlYLF zFiKrGL!9+Y8zbohscDs4+56`-6PboDJM__@lL6yGYw(VbOY*3fy%Z~6e43|_NUwj# zLTMk2?$6vwZ)gs=p`afDzlzo=t4qUtj?7+AsU*W@Mw*TOv9(&^#nev_7802=WTPOH zGyx8mKsPL$Uyl!!0`tw2jhBhYi7OcBY!Wru6%xs0&zY3pLX za~3;;@TCt6Zm>V3bRA-UH^OKC9~9xM(?yjLo4o7cgP8Smiz_Ti3r_jsy}g-|k7o7|%Vh;d%Tg;nJRW24EbgBO!C|w6 zjAtW{V)Cie+BC;2)Zc0Aj*Y4yPHMYnGNCNV^Hkz0q@0MDLs>#c)+QP;*lwDlYKx1_ z{H83~rFcG-Gb(3LC{4pE#evIQ6=E=Pi?`C1)CtcR#qFl=5th+34?XTml!iJrDYZn} zT*A@&A?SqV;QExf4~Vr)%^5Sc;v?Eh*zi&&&aU`-kAX>78p9$jo!6Xn*4+2?LtUMs zHQpz65%Qk7Uf+)63zd(^{87s75RNf}fC_bOafh@eW!O+{RO)Qk2%Y}l4_j)#?yr$j zMpD3-i?er!J5ae>ya^yw+0+_(nCLMTSh>h7d)aG0+BLg40T5;<)+-O+JfF<$UmbHD>w{=vVlm-FcL>2<`i+X1)HP-DsVO2KR^jh@zjGBuo-rL`$~q{GMI1mM#}tDxLie5s&p4Z=LwAoFoc zpc(`l{|I8iX0dA^{ca0K4SN&aZ$K#wirZ+cZ0ivyKOm{amKywl8`W^&Rmh zJHw$ZS6RuVaOE{Y$HmI!Mm4MyC!Bq1?T%S(EC_n!^0-vd2LBf%SBq08>waLOzQ`0} z(bt3I($LGYlny|z{?RLbnj1+@ioXZ%Q@p{&^NN^Y<%ut@W|vhG>7t)3T=zb~c>p6f zuR5Yu?8xp}AlkMrx$mF|-VWD2$yf(w@)K>?05Iok8lb@3F2G(B#O?DR7?ewP8Vj^T z?!3oZ(*tj6eA~OCs+CM$@Ef+7j%g zFrEqs(LTcLrflWQ!yB~%`F-A*$k&Dt9DGOd_?(c8{)i;>cnN*wXQs=<2>qvwz7X=c zxl$aSY8zP#FDoQSQg2{`D(a$WO!%>rlY{A1ije6y@3eC|xz1;?DxfLaUySO5mu$?0 zT&G48CCkv1iO81^Mn2nrcpKJwQi^mRM^I}FJC%O{pweeID<}fqgXWsxJ+4s@nMI=s?TYD=kIjV)ybjPBd;Ev@7v}71WiNGxka* zQl`0sr^?#?lrk8t3#oM{tMN>uwP zgiqYUEQKKd8BO>*g6%pylxpAb5gn_485yP8`{JE6Q0haeb~n= z)vOLnJyqXbN(u6QL!ZfX8gdeGbXB96m7O|?GfL{u$qKq07dOwOFk?y8q_!EZ{sz?O z^iiPSmO7Q+pKSPYh(mE7$aI9D{IDHE^B9up-dA7lQB_JE&nRBg*#tcMkr}hL>_+bw z2*Ak&GP*Yw1t2C@oLY7B4+h>*JSv^(u9`G^jr&c!U+hjBvcb)D%iP>r)Rb`~N@}zu zd|X5G?e2x)L<%nz?Jvb@>s%0j7x1cR)mFQ_EEzZQn4@?wCLj~f7Y$9rms}$3#Se`A z2)01P284(Fm9#YZQhPWQr^L01iF)VMz+E~j7C4wxYNjc|Lszoim&L{1?ZX-Pap_UU zBLa`~ZM8{5L%6pII%gX0(xb=S#EQn5wYWNl zNo3$L&K|`%v$8zRScCFmWciH8+b!E7oiuE!X2LxxM1M<(zp7GzQpvtw@)sFF-?%R; z*NH@6UQM0QFz{dPM<1{X#Q2ZvUkwuFJ7M5`pnk2O3K{f^Lf`EB$m>4Yg>e3S z{dUUW_5AIY3-oW<8F57B=iY!{ATG4X%w^?BD0L_%(Gq;6^Af829p?c?aqg*Cmz>k{ zv4JDJjDeKtu<&XM@Ac~Mbq#(S_P;75T2r>@Cu@F`HPqS(6@I7 zM;SxC;u`J0zl~MmOGQGgj<_n1jT91E7L;+G-}wn{s22*VLNTi{&bXUa&s}pqDs~1x zmjGDJDm&i`JqdzWjw?EHWLbI~8ZfgvFovSu51rn^pf&TyW!Cowt=gkpXq2Z+T+<5- z5*Weox+oBTe*EpC4ve6eTrE&3|Q zT=lRBR%q`g+VZed)#bo`ssU0ZBrk^7xjH)%4RaxjM-6Z_$n{8)%}FfLMPlGX{%(`d zi0F4>?(0yS#&F|%g|Q@+hKj>4G>@^EHE{ir@= z&IAg;EZd~k7${R1IPil~g%dftlTrVHQID-UQDg0*<1bL2zsx0&5l|;omKaamb>v9e zoboXevUCmNASSvw%$1=evvI@QI+hC1@NuB4s*I|cm5hHhD!11;Noz4l`l{(M;}35h zZa@&|`_($O^egF!Y!nrVyIZ_T-7f09a<*ZV zSKUxSgx1Wzs^a$sHI$nQ0z`!#QejQnpMaMZH0@Nsgy*fc%9*lH6a?jv>Llm0AFs?; zGjROtuGU&|_pGtWi3%)4t|lxWGSOzpftip=V)lHVmRCxix={5U@)zJULI$W!?ZcDWl8<6B zty9?uV$gi!p^V#)T{195i)t7j&b{;c4mE z(dYG=#tqg9gT+kv7q3JHTGy>-al-Nmy_ULj;fk3vLI+)jL*@ZwWfE8t=Vzo=L7UNu z?hjjKpSC_K!b=zT4leL#{TVS+R$%}`)~VCwYM7TnN%4$2KgrB$n$2t=N*E!v40TRZOilw68S8R_4hDOr(GD4&ocP|$LW z7hLBir9#RFEPWlW+MEj?4Q#z5ACOa|6p8f^Kewrl>@dJKObjLNoVpB3Dw;&#x+)Nd z`V%$m3;genH}ZUlv-n`5Eslv@Y-(WP*pdb4&YS(fhaS9XR1RsxNAXc3Pg8}Ph4Lj$ zVzg_I)zcLGp`bqIe(C`20eL)5o~Id4N?;Gz7DVWn7%V|ZBiIecyg0N?(6|nko>Qc# zcS>_$o!trp(F3?M1>RM-~Im42a^p z1KabBH?Zy0Xebw`dIL<$tLb{qr8B!zXB=RT5wUidpHO+*=q`!8BGH=u|7oEM3dkw|J3 zcV=TpFFaFrj_Q{)TVH;0kT=itHd1WfI7*W@Cux@S$u2U=|QipObdm zd+-ygK-)#I7O17V?M#-G!OG`}k}VI6-By+Wxgw|aO;qolIf2M4l8$S6piG(`yt#gZ zU9z8|VetgWX6~bqZ=ovWWNEb+FiEVh`)#7|2Ky)Uj>nSUV8CWIdJaIP#r#!fCFa?A z)AvHF!ye}}ldjJ+GDuiX%B*e7PGnI5xdzetw#>p`Ss%nV>_giW_F7h8y$6K5hd8X_ z61-z+;hc+9}OL?{#t*&xQ6QuxOdK`W-h)4{2whNMbauWzDILEepuR+%t zn}TyuH3ZBc@vR+yOdE`Rr0IjNz>lqrdLiUDKL@#5-_nhI`zv2BkM|fYfELe!$sQ{C4jRs)^x}po7)BHx7 z#`1reA@*?=>t}#vJq(np5$&l)J`+erq@?-feHz1*x}26tZ#>5@pKX&t0XAMcH1RG1 zm28kJ@&v$D4G6>86otu8d)jTL=@$MmDgqdsMb9vCu7<=00-VLQK7Bw))}&6VRQ@DJ zkX-2yDk5HM5Q@k!tVNsmg0veHxIo2G-Fhr>rrrH~3?Jw{kp@ z^e8ZARs)7A-%Jc@nSBUbSUH2Flh0pjoHu%vfgt`dQNq^Sw>3+(zc*=9dZO`+nq5Se zgvT^?^#q>Ph z`h?7&KbfVFCGRaDNCoEld-kBrV;EFtXYy$zj>hVi*hN$# zVBVl3UHRdyv?TloRj18BPX`#5wnf78rsl{^tDbG%ZN8`%r0wC|9n`)ZUN8FRN1J(6 zE7joiE*WacP9;KD_CB>yQ7nBZ04;)eatzmElopzwu1qQ}`Ef;agO_fiw1(+PBGcB7 zG~&X^^^7eslq{9bU|M`rc6Koq4V3rjChNzvOS+B&AlYzcmyA13I~Yzp?~x72OA-@TL*)xOy#r%cE*F18uWNq`w4~!!b+L|$O+YLH zzi+AC^M_|Zsma#eQ-M9A0(fsAL&mHZl$~Q2;B_GCfLk4!sTBWEfo(8&c%S)r5 zPR5Ow&u$Mcu`P9&aOF^V}RZqc+DQ_s>>e8p12>nFU zVI^b?z^rP(#l~UkgkZEeh)zA>M#$C5rct+$o$RK07<_O2vI2okze~O*K6VzG%48|O zZq9;%voBRZ_tRaMTL6HB2w{f`gZ&y(oGll(l_8O`*(np(HT z7V!ee?`@T~bR_Kg5(dJk9-+Rr`^Ed9S4%{jk*ZXUF5kIhqy)*5-elfJi#c8o27kii zpeurk)gfac?8s+bNj_-*%{Bvqn>JnD&EKg3-`wZxZ`On*TGSi%8IrE#@$&q2*UHQQ zi+9tLg^jx*W=Z&+`huNm3GKk)McZ%X1m5ne_$0-~)Yq#|X5ypV?$v#T44@{0GDZ)c zA@`@Jw?p~n4f|7z77E{?y0&QYZkZu#_YWUxl4OyRQLyxob=`6li>%`}KK2==g*|y* zj3AiIXKAKUSR#LkUkfs;IPD?&AiV(}ESBzJbS9 z#uc-La80Ke!DsyGPdA?>r3*ibIv_M@EoJmVt3F>bIBdw8 zfGG%+zYzL-G7<-50WpRfCUrNUwhEy<96cLvd{xLV9EKtRJa4+hwFP8(payD|FbQ(~ z>e)I=+5=7bA4YLMq~3lUgL0v@1bPt5`R#x{k~8WUernO!fxCFiUfT zlp*^kbA5=J(=Ei|z?2Bx^9NXtmmxts%U~5MWa!)$|3G@Ob01Ce&hdjH@w@ZrWAP7X z8cym-&$_fwdYEF)ksn=tfr6!7tEo4wG_F<86v6qyd)HJyEhe?9ada3zD$DP~zy{Bv zK{_3<9ufg=s1t$%6ddwSl#eox3u>i-fm`VdykDQ@IT;TC*F8PXWhORYtPP{zn>1lL zk9ug(g0R<7Yk=Vh(Ja2$=69Ng@7xGAaLRkef_sScg2yb%B|SqLf=16d&Y1}`HlL}4IQ+@hf!>!d#u z>t(Jk7%j?9)o{Q|Pt4M~qrJwgPwx=tDh_Rpblv7oHECwdS_}?Nf5R9^XR>Lu-7X2M z9d3K;O1|dapi`1vs_Hg09Tmevc2P~lF83v@;cnmeotiQ1lSm>b;%UAi*}F##HCW6y=TmuPsUNv84-cQ#3e z>8)n-M$4z1hvgc&CEX;fU2X^;4gSDFj_Vur)D)ES<@>yhzoEE{FYZ;=jW0yXzd4&E zqmR1V=%a^X6B8N=FL<~CaoyWvPy0an6yG;_+9D6GieL?+5ti&4guZ`B@m@UUiGR4P z%}G#xtqaJ4@9kKDs@}A!XdAPfnv)NxXa1A2l*x%y5+S~8L7EX!Y^66O(Repsd8t#l za!D_Y%Do@*!zsrSZ;^;_q`#nF)&&jU9h2r8tQ_Sp*ZGQ%O*UbsA(5vYZ^F|P+pc%t zr+`5)DCt@d(xr8U^uc_yY0xbBETO1RELfdLD5O^Jl-CSp%P3E%FoTF88=W5}xelWt zjt)#~#WyPEmhz5L!6P|*tr9hQrtA0Gq<#9k9gp5<-pQG-WtDgG8E z4HP?;+r`QZG9*iz&ca~xZtq&$*tY&wk`y>1z+zx53dG4#D$x!rc&(Y$vGk=XB_?fV@KQq;3MUbUv0eQh+!f>@vfz`BkYoQ*aXUn^ zcPcpT!JS{KuZ;bnLnq$&?PHG|7II7X8i4W(z=ni2q4LwO;xM-Enr%21lN!)HtQs-U zh#gD&shOKwSm$64_3}I3tX=J*GT;RX1FfJ2BMDt_^Myods(EH+$5>eEz6V`jO&!{G z9+5`pF=s7wiBA?72dx_UrP{u(HFHZG2yAR_?baLg_k1@3z7Z}0?er+RykeOvU=1A& zP3Umcx;-+J9{H?n8IQ2dUO7q1m0ey}w_fh9zxMvEJkMVb_;tIwEN%O``YiF<7I<+& zeHzG}fH- z5l8Umzb9}+07xjCV5@3$NcSH6oe}<(y8OZg?r9y_9?gZaF+~T(t9ObHe0#?5D2Qwt zZ|x3s&qC(sanOait=DQwdvU+9Rb9dkoTF`EQRRQ8cUoCKlB4ftCaP#?ZmQ2N97T-+yB@@VEBF2zeQ#kU{+#bO@4z2*b=5zF=72(&pM4EdK;?h0r&o23 zHo)}P^qQUnEShgx?VXtz`;`W>U)w-qf=G*Eh|9~?2H%g9PLf!Yx!GX9dWw=2_|4Qo zUMu_E44&BsBGhH7Z47q_B(NsgwHl)+UuVeb+4v7r;#zb4k$T%q?t#Ch_}W_-s~HbT z9*JG-2C9v!WkK>7HpRQBt{R&@;|Caa6nN+rUYM2T7lMRRZV`v)u`J@{of?Tk3va9SR@SidNW$yMWRSMkda`--Nl-sZ( z!u8S^A{_rAEpM7EDU0?BEAisT!ziTvRUwB&?Vk0x7|Lgk( zQhaM%9P+_caIVJDN9v(Lj4ZDd()lPhV$g_9Vh_ar4rbBElc(>fYeZzrjuuAG0_AQj50@&4O&U$W^TBMVuEioc zA46kvLET18P43n6U6G$ml9N!yYW85FOJ z-)|~xYNydDDCr+YT}cM1tS4=>s$?~)8z6Evzc6+(KHY%B$Hq(W)n?@ejNM6);Fwr7 zGWM?mFEPZ#!cr#Gkx$N3r=y{q&ql1{4*mKsW;v!t#Q`X;vxMg|J%7q8?zR9cXLZ}j zpSPo}Y0t}%nl5TbpA!}4QN{c)#7%AHo62P}e?Qok=)5~7s`C5(Ir!_K7cD|};hOp4 zT4FzqC8p$8W>JmCmt4Svy^?)^$5!E<3}Pr?``s@Y4m*ycxo)2=^VTf7LoQ zW`Zw)$~>5md$dAe{YK5yOe9ZydrcAalM4fh7oZNuw#m-M$~qDOj=ceiApd=(@%CH& z2UO_#@?~k|dlm=;BE9+Fz9noLJbbx%c$}%-ol?;^KFDFX<7W^c#n8fU2{PnM+=N^i zraOSilgn_yqOK@EOt=`K@%vK~Uz0aKD}(iT={h%}?1C%88iabpHEE5zFvY0b{88Gf zNWklIzde?(LL@r={oJRAd${Ok5b5(xUjJp;9Kd2h-4>EGIUzUI$ZC*VB?^uvBMS1)a}|_vhc>QXz7X*#xl>9=2sPf2l{i&^hI%id07x-vPDrJ==elY6;3=3tRFlBJJPT|6zVa zx z#V5o{G2f{M_Qe_lg<8dPVVUdOO*8gj#DtE2N(J&X1wI(4sGQWGvbH=4V&I$XJxYu9-VL1gw$gJthbQ z+K3GkBp8cejK~Tw4DvQJlHa-A$mhd?K1hF}n*yk}AwB_nwQE6nm(Tm@P`{}HG|1or z$h>!_!kf`_bCe(Rd@^9qNX{nG*hiAipOj2p{rb?uNI44(nX(@sJlo znLCZEit{)eW>21>aWG!3bOje<*~>NgJ3bhi2{^8d`2=r|I?*i_F>cT(6ZIDr$XWi7 zPk4ozLB~Q>54IpTEx5o3;Wz3McdtthC4(dZUG{UT!iMHDKs$&c!Pl`&p)A_BDA;Ai z5gXZ;erVf&92=47kD#$Yh;D{vM8z>P?w^Q3q^|jTog})XG<}e?Wd3BqE za^m12-C9ArSlioN4vnw!GT4P0zU{3< zErW#=CXqyzYneChSsRMuo zw{01%bv|kj0`EcAo4@fY>7Y<=_OY@h$;0FOxvEsZ@WsR&KusX^Z4fQj1k`r?6iQpw zT-79g2Id1LSMP-O0p<6b84dcHzp6R z+<7Ugy~!uYGrH$ERQnm)LKNsJF;WgZ7-_dnpHzv|t75ijKRGB9jj)hlrm%RJNQg79 z^yo!6M<1su+kQ~y^f^nOeidPTj9{GqrdQQ14~)Ld{!Bj?FfkZ!cuE7@rLtURC3C`@ z3lk4RUtHJ<#+#;nIflA=Hg{+cg+E*vs06`a9(^^2nY4pC_>N(ZkFK|F!toMlty-?EVVyZgx?8J!`c z;4H5{pMmncmzHM^EX46p2lHGdpo@pV<)@_2vGFAf&U z0nl1{NEm5}&j53nxy~UPvVQ}ERnRy}m2k$Iej_O4r@35H56Vjz()(u25zr1zoR`tq zw@cGup?)J2rrI!4I*qJf(%7;)Pvl)HO>{qZalZyBT<}3b2Xi$2h~ykBHRY196-9e@ zxyOSR38+?$xP<*XoFlZ3a*_ApKkd@mbzjAVerP7sFJ&2&6^C@o=3w)leae{_soV4H zllrcTgqz)0Z>sSOxqC^CQcn+x6D7g@r6pH7=9qantv{l z@}2;J=pX~Xq_B025$xao6o`Kizh^0mtT>QWc=tJ)k< zo=A<=mU8IuM@*Z;?S% zv$Q^^twiR|lHHo%=YH?#AF@|DC8NR@$3(3T;a63K5u3mnGMI7cXFavX-Rd?qapE_i zI=AT&z9bZZ%612Iq5(30FP-^ggG#}Sq# zGcmsugp-B3<Y@xZ+PEAAQxsLm{I{LZw52fhZl{xx9c@M0r>;&pKB;78W(H{tH;Ykpl zkt!I{Nus2jrjn~H9pm98C&P(v3NDP)FCzZQP6_|-e3Kz1awW3W)qzL3#4 zF{g);cFc@4%*l7*ZcB3vz@>rZf@(>eME!6uSCjDjnMJ3l5R9#yeDX8lG2ncM&U0Bu zYOTw64cSRdi3}m^K+q%UVE+~7`e(~zm&K1g4#@X_iBPAxv8C6vncLNI9?efymZRtdV$~^>{AwB-?|S zpdTaSG+_*DO6NjNAJ%k$AG&2~{n1Gv6=oA2E~&`#C#@3FLF5s#o|S0K{Yu^2XmwF{ zPp)KWQRi)74S%IeFsf(dsZ^jNAJw3^mRvj%VMHK&_6E9CR|4t}5-0~$bi-S07eN%AL*H5i|klcBqLC~eZ zXC&YmDw*5%(Zua@!d{|mVm8L={M0KB#oSEC399BX5j`7Ft3woBbr%$aDC5Gnx`W%S z*c$^R-)b=p+)4eWx3Ar7fc2Phg0WM~Rn3+~TOxH@1t+ruN6dr}@HN@H;Xuu?RENB0 zK24KXA&mS*MHk7>w>Bkqx|_q`ox#lugM)B3Oi&_}G#8=N<$h`TSWSK+ixyRmnsYlI z-^6%Q1gN5|=?s7~T_n$61okra6C+w{-n4WKq%Y9F#x(JMc#Q z9T;2AMQC3B6T}*BI`1jvfhh4i=NS1CU2L4iC93Q``Pwx9Eghii&3DEk&uX573l_dDb8aFsGQs>p_7WYa!#<5duU)Ei z%C}5+kafy^Bodnr2NHdK`=;*o{eIm6LW6(+f#4uJf}xQhOOPP{E&sC!nEo<1wQ+W} zb7u53wzFll^!lHj_`h+S`Ma>QvxEGn{x1K|nwg!01%#QEm6MH&i;eR??JVq^EG!@- z%>Ntr{Qun5)!D_^>3c}-zs${T{};Xf-`fALx&7ah`(Iq@|D-13Xc&-ymsvD0aPtI# zMhsz?kOzSg10x1MC>#R|i)&aT5OQ=Ia>bihQA(16g11h?y48b!ZFLmy-wx9L&wO;- zcSmD4@h47KcKq41MRqHR`fGTO-731!SozQUMX2Pot_hVLY|Y@BH>wweeS%Nj>hy$i zs~gQ{E-b@Nz&52d!Nkn@9C-uUne1hhvMb{)k$a%ENyS-vc>~c zvcgVp1F?0|P>sA_Xjg>{`}l=jv+D(u(c)q^gh;Vyx=w`60W%|1^o!Uz62nHZ{=Vnh zlGewZ+Xl(iXeF)5hrDWAIJtJ7KfAT@=A=8Vh-9@v5KM|{%T$JaV2ysxnz_mp#f+@$ uDtW)%nr9+NLJs>1bR8Zb|5`mST>||->5=_+EdPzbekyNf&T%$tEsIb?hh<%~oa80)R4j$VQC@BuFZc`rmWcPC#BzQlf`2KG6)qq4`)U^}y6=jas5sY*)RZaxn4o{QJB;_KEhWpUF4GXXvWH4f%$bWRjKwQYy)okHh#J zafH>Xk)8~%-fzOJVmks)EfLlL^opb-;L1%GXC=E6{OA#qCrSmXQmx(aqn)`Sn(u%h zW|U$X@?<=FB;%3L5kT`o_r%K3v`7$BF;Q?p?a&yDg}mH$(=5x50xq;!(MZJXa+K{3 zVH=bJKU&mHb2~-J+mnR=QQQ|}8HE~RW#t=L+5 zMt%oUSFo1Bg`(3UwRgZTQJzr9Es(8Eh6Z)vna<}YBS|_ zLPce$&c6Kg~zp(j# z;y(vB$G`CZ|H1VBhh6*|{$B*xd2L80S@$ppO2DswA7g|SqLSrSGLKBN&gN)5C_OND znmnnO1johsk8lYNk)% zXz!b8zGmmr`r7tKEw#{L@6SiYw@%ISrlyw8&X&-b4L!ZfX|I}xEv;uN75i}3lxn`? zE2f7ldKRTCwBI%a`-4pe+lyJlE!gWH;&xekNCH{U=>pA`+VmtaxE#;Ih|eYXzx&Yk zKLrlQ7F600G7cWw+wwVLy5dAGAN1c^W{J!wXdm-NH(xL3JDpN;A5T2G;JyP}J>~9q z*0vq%PQiBm+&txhZS|&b_qmL1@Zx9Bd9Ceyw+6!cYUlayP2eKHy}z^fpH1ymFwN`E zRcrbIz|YP~0c^D21bRG9>hBO%j#Hp25rGFKR7mc}_PuOl zJz(+jigV-gYWk}9=jF6z>;{^{w@L-Oa}%$ot)u;^$S%RP&Gk$9VF$bQtxIRh8_QQS zB5MHRxmTUbIPBYEq9>4hBR5yZ3&=a4yERt!FnZ>G+1j$}7Tvt_kxtz&t7PJB}ZO`UFNw2Ggp1#C^L{ZX-F zeQc*zg|YISk93fx8D}hezj8C1QsE{VL20vvTn)U<6u;FQerxfxveVnsEriF>Yr+Q> z>I&51&5f8D*;$?M7E1-Wd;ayFu))cya{+Vpse&sIW_5)aNFrn(??rNXunGi8`r9hN zsLrWAIDFOn{EGl`79%zwZ5p5F0}`vXF;_Dx<6OK!yK5`{Z*sp|AJ&Wsk`Sy{aGeEJ}E^1A!+b(O8ag!?7jEL6hVB7Bg0qw^^e%|Ui` zYkTYU(?x`)$2z`n)EYWB00)!D=-G2`eC{%E@Fc}z=0qq)%qqmMma%T?OD(o8T_LbD z{%S|(No89H>FdT9muNy6fkD??Ks3oPm6>*iH%TLb)Ff`~Ag1RA>6~9@7Y1oC^Cgji zt|{tBo?mVzGKL%!At%&cN>t^C`EIX!yvM6v1VZsqhuSMou~>RJP&3XHrbs>tW)9pc?J~*i>q7j^c9LA zF}=qcWz;Ut5*EA+-;sEf39&4T>lo>zB03vmCuesomy&*5`H{8j@8s*cfnp)L3xmBW z*0L1rRU3)3cR#5rhNv~xACKio2z5enMVkeXUPSl7wh}-eqZA}z#j+vwvFdi4xd#cJ zPi8jGotO7!_99Du8Q71v z66@Y(v0)0-V9_bQFKHi64iuxnkEcBrn zcd82nt!q9B+33=mbwAnGd3{c1lYDL|qq@+BYPav7C8PjR|zi7DuRC1!RY!+bf zEI4sHf-VP=RN@aD!@p<;oORX$!qu{$^AtWRE6Q!!MwVB54>)lfe&&%5C=a1KLx=cl zS*UPI`Pob!hPd2g+dk9gDn@NVKX_XYu)D7%mg;8F;CYv`z+D_XubtMt&jq0uY_L%hhL?78+uXWQ3>pCfLg_%F@&!qHUsH( zsFBd#+yd*u{sF84zSDW4oyBH<-xUg&Ap`|2R|{ddh;qp4(?c;jQk345A|nSDb_mv+ zc26<-{XGRt10Jh{`H8Q3g)ZV(t5=G(M!rCwd_eS(pv32WFGvSXfaWS8yZbq~pJ4;* zlX2e%#4cpddn4xJo&D{>&r43lyLY(d7elwZkfThG?husc!h%FmwZ^J%k?*?`a9>Y) zFN8^ztIdMg=j*fZh~FNDAV^IB0nb1{%pO`<1Hj*%KO`R|oGJDX4@vJb6cDY4 z6Jiq|yu&mBp1zvq2On4a4@d8>3tkF~?-n@`9j|M^<#= zd;_}5v&~k1GvCK7&yws1hkNIlQ=ITOey4q8tDMbv`ItP^{3U)Moa~_wIC6rz8H0sA zpKmigHj#__X)~Aa@~r(npY+^r=B5pV{>atFnnc%jVH)qe-fZF>g~q=0y9VnT;pb&Jh;4kuOn9 zhYdNg;uglsPKjIPh$Vm4c1r8eFM(7As%m1W*JJMTc|o&VraR{b_QH7^5q%b2(SkKe z+&NQ|IYfsMsxPNupP#LU17a6)v%@uTAm?;VDcX1&}b!=bEQd z4J)7$VMy?;@L1t&En@`f>CQ8r7EqwOI_~{P#@yU|XVTxTd3Z_(>Rn>WUS|yj+C8s9 zZSqB9WhBCgF99v{XB%L8(js0|6~eLKvlxSi;!6f9lEZ@>;1F902`D zN*g5ixZ`N|^KavJhm%7zJp`t-3SVzdqU6}ZJ**&_y$T=&e@trSsp{3glreKxWE3*EiNS4PA=ZgXHd`m4;qTd?J(d zKyMa|F#sim-VpSv=CcbQzVVZI$sHqMyFb4p-m8n3Y3opYAv#}ozE}UeD1Wzh<7}Me zaj91XSnp+F1UnUj747WkK9H7H?!gbI0DB2Hl$&6O--A}cSk3~|l_>eS7w^ZRy?%gr z(x~|fV3wvUJ~S**lyMzenR-SRIg#LKkkL0|P5H&NBaYw`DOn?=Yrt`2ZwpTFM79w- z+CB4oZ+k6XbchDG-wav(M%H2bZVuI-!g>#rFZ$*zN8^rEV;w>l!>zBre2&1`iW)F)ms9n& z&qRrtSOtpuO<@Vee1Igg_?s4s<9Cbeq`;S@cRM#8#Nc;&Qe^)}W*^>1%55_>B#s`x zAmn7K!DQtX!DUAq!O6A9 ztyO|QJ}U~}x61~cG{{hSC-#EP3~oEoU{`I))1d@x1%{5t9!2#5kKx0dm>KzZuYB<8 zHuD>}L$A{gyh9rL5&qNg@%`(X&ii2_r=9pwNlh)8wE#vYL3K649JLyrrdG1O%b$3Xzp?YutnqMRz2JAbpEeLzdpSZ^e5FGenbS>`Mojle4FlBgls-e)t)2 znWG$zP#GN9JaNu%GC%!^qj?A6krTAleWk{f~p3?=%L6YvfFp$g{FP*~NO>Z25uhFOPG8g*4 zd!P3WuK~)yi-~^wfCFg3a|AxC+wA9T7mYPmLIfU462rYqRE?y{AW_b;QWOgAchSW@ zGS6*o2u*a^dp01^bwq@u5ehOjlL$82BdlT`dO(sPK*WzngjrQ71{_68 zMGfXnE&TZiUeu}Lr5uX;?xUPe?+Dr6ZXB|mae|k*Wy`?PhZ%>pgWup*iD%B-U$t*L zp5re&xsS__>))zNc?43jgKjLThU?^wf&} zbPuFMV?K0iP8r^>Fw%qGmA*M)hT|9!YMw)+`oEi-sPRy^6;00sdKHEpzsb2AV1)T` zLzBzqeo_)L#mJi)tpAc{n|ouk*Rc{o)1hQhLXRvlgU{=o6!>$eRL7hvTC2<=JhDFo zA~@8vDS|*EG>v1hnq%)gNU?%~#j)P~3WWwG(U*pWhrNQ+tLqC3g7HLqi?LeQsN_!_ z0>XNC=4H4J_miUh=5lEp?l_58x}QWk4ryN&$cPWBJ@Ti09CkKy1xV>4hb=6SkOUf2n&tC|} zh^Kc)yUUid*g4U4_Eyh(e=kuP?@2o$csM_z(i9fp5^A}`!Fwdj2PY1Q4ROY-ZF!o~m?lFT~*sWFz09je1I*3k`AJfR{6 zN$DsOJd&O#k>T%;!5%xfUe+5P5|{iJd?ZHqSMwK zDJDIUw`R;!7iAesPSdFScu*BK&lEF-_uZ-#DcuEso#QHs2u)@;iWHHm%9L$qKl_A_ z2C5PpM;l$RFco_xu^8mao6L6^4s{w+eoI0=e&QFN#gm9vB#3yqLi}3S+KL3)~AexIY2wRbxL@ zYP}k;@^V0NhJn$Sz0WuTPRNT7DwjaciA6-ILk@XSA$`o;+jAG&xIZT>+Fc_-bc{Qb zXy3eHCa4TTV+>XIh%{ovLbnRF{6*e-b=bFsw+Ou>KX%|+dP~4S{;igee}J^bgGR;p z8+`;io3;y4*2y+}VZvS)89D3wR3E%YX~wDD-f2k#SNrI@vT*q+gdcW)OHgwEyQssn z9w<%WuxsA%&}=b_MpIueM9@FbU4S41KGf=cC9?bh(?!b@>fQ_=c^*w;+i=Zoj>XY&!kulc9kK)R~lh6c?6?3Ytan@z>8fOK#_w zP2vzT<^?ZA9Aau_5VoQ7&W4DkIXnF5IhoNAF0A9Ufw^v~O0Jh6a-Y7VutJP8f{f5T z6Dq=oVfEO^hNwH5dV5a&uCmd)Fj^39*3H>1Od+W@M}3@pRSF8M0&p`vD>@}#i;0RX z=@Tg34#%oP|EB;%g$Rs)_Gm{qI62b)tnJnc0dD6Iymsb3@dx1d_qj^*0)S?*Url6MT zG<@{zRr$6Y1H&e7|a$>)o z*Tqz9%?^~~eI+hKn(-nTD|H%5^rexzUSQNeykt`k%4Bu(kge{aAjuZl!U5S4RBJrA zUj$-yLZnf^UtJp_JlShB53FMyT9{z){Eibli0`UiqO6`P$8aL>;4b})V)IRohlV6B zq$RlxN2P#0a%V*C#<~Q)tukt~Uyut&u{|t@t{y|(YSPRHJ8%@&J2oe@uph76pU6qt z%ibjqI#d9aI1j1;!JOb_dwgpwjl1bob4i~@a5FH$)sV`upLI@isyNrYVm=%8QM=>N z>Q%!U7SdYV>85}2qVfh}uL*nE8V*9`7mB1vtdb@~ngynRw;@7zROCxr>iFyM*VHdP zPL5p@=ar9Dgyd1pUb2Y+Ztyv#hZL+H$hHI6yILZaO|o zGk6canphh!K=%<0_aoj|+A!p7r3Cjk@%tHt-HL{fpB!f*!s97GcdsF^gmN_KGO@tV zI%zVY)cAh>prLUS`{9aZq`hu5T>-o&cDdujc?FY-fz#t>2dYZ1^n5AA$Ya)BVmfI5$Wbf`hHIt$AuIWmwx1V5D88AS zR!kRFNUt`uV+mo43H$OZGPnsLjyC9Y(Y*{;f0&lO2`*xyTSveuUI*A0#O8R*va^p_ zP($=AQiy{+W*0VfM$`ND1IQVM7IjV*wMwu;-)U{We{QjJ1{_QF^Uwm5jWt2pLFx(L73SI~&T&gWZzthJF)F`$s*y*SODL{PWuN->$0Cd^ zy|8>1ldP8RN$F;%-Rqy-#~NG9QU&gW;mnN?e|hHPpIk zb(CDjW6(QI!I(iIly>8=>WT2JT~!RbDcLbZ%#A}6%4v&jdXNCJ$@%H+EY>uK7)<%9 z)kjgT-&nM#6d4xDot#4j76HG&_34#Q45{!Ge6{t*`6-!qrLJy5N}khJ6F+5|>=K~o zr*~93bIjd(!?;-;Dct9a8V(~-6Os;>wP?~CD4>|`;yQimKNC-IAvJwolM7Kx9};sB z9Gs%j@Q{#cXeGVRP-I`BtspPeZAMqdQk#zx^(f8}(KhNP@N&70Vs_@ft!;i~N0Bwx z8cNipdy`Jt9g|UmsQDRG&5a?}Il`8+(NrWJbBZ_#OMvN@%5&c-1 zzFJoO)7#V{1b%VI1$Qw?iT6qs1^NC^{Eg~QotQbC=_x{e{g7s8+~%*|_~RP7rb31# zuIAX~HD5$s2T2)kb&X5`&X2M-Ne0kZCQ$KhP4)wZF_*D12U2=}+zL;jf6xL^y?e~G z1xl37Hj`@_FK<*xn1Q;Li&i{!fWE|-o835$IO?4Hgvq4fE55ACdRozK2D%Zi*)9UU zTzZlf=&*Ip;nxs9VoFTxjGPk$HVfC5jmL)UBwW*r?H>oqc*%6juE+rce!GU(!OF5c zBMoH-30LDhKT+O#qBC4eoAuR<;1jt^9r}5pzAi>;Nv2cWOvSl@uQBJDC~B48Q`oO9 zI!G$|)F@I z;fsdW%UIKw7uYTCT+lsaO5rrXc)h|b*K7Ie8L%ZTQq8#U+is*kr&5}mR|e5A3^Fuz z@JPJ~+K{qe=&3Ahx8eN*gG4`0dplj`$3yG5g;L+7@4j_OhQa>G-)8AiboNwV131WSnW(9@uT)JE_o5X=w5fd@@8x8 zhXLwDp~A{&$(BjyEk%CJ6+t|MzSUVji^wno$;-60GRwLNhTI=YXe{b;7VhpAzhKV! z%@W_|Ce|4kc7_ifS5)RA!I3t>!m|zVZ>clmF+@=O4o$>eUWCeQ7X|9w)aT6^=n_3A zhS~s>=+!6yY1XbZ8%SIeayVw_n;)FX8aO>=pIaFNE@QG{17*2_BcLVo_0!Teuos%CLO;YdRA!0SFaj& z4hUyMCx5|nv@>)bs@gy_UpuXp{c0C59poSW-ut^KC;kC;(*zv)V$=b~=((=B27ENF zfm3ZnD0=8cZOa^nG*NnkQ=0rx5=&751_^EMxYX8+u!7}Y*&5M7pP|tM6Lq9=bNcEG zuOWJ__S;>Ry68KfT%BF#0YU=4jxkQqZhsFSD*=odp`fwTn~HcR!!l%DzVg>{R6EX9 zQe*&rM&$bfXzs&l4O4|mH4uC+q$t&!`8HA)uZR?D$fBb$kp&SxCo~j(H*1}UCG`-a z#ORguYf+xBSC@`y=dMnEgaa3&VpQ3^Y=XAkLAT*UlIATvPqRTabt6!Dq-DLb=@;C6 ze8*jL;~W25A|#>x63V=!us`R}=BoVFUVrCtX89vASQAmOM(kzK6D0>h1$m^2Jy6nsxovCi~5(YKmT-IB(KZY zb!nLl8#ri$MYHOnVHL6Ri$8o^>J6e)?9|$m5|huLR>?YTmxWhYq{W((rx=>i)%dhOS>D_lq+O1or4$1hwS>B zXou7Q(AX4ztwp^EitqN86UUc4jHUIWNc*tx+fjw`myh(BNK>3Wd}71mNz;XLyKvj< z?Uh^SI5P4YF)L}u-*r~qoCq@snVPSJKJ&bH)hUvVNuzCEnP?L;idVf0SEQ4@O0=ZV zFRJL+Bom|E6rqjtPwR+qNng#)M&u6W&I#meK!JZ;P7!NU5s=5941<%>3mJ2tUlPQF zHC|mTBKo#oAX6`zGw^Q6$Hj-jf^nQR{>ufC3=p`e+Yz^WG10t zQJE=IANxXkQe}lHlFe#wVJAk=sEQUoOvxsu=>%4d(nnQ>2r$aVJ?w_fq=Ly==sx_P zf_7d$;(u?k=o#`^sJyi)Ln-#D}VdqUh? z5P`26_>Q?bQ#`GYhXrEHU}dds=xZgN*bP)&M&}mp4u_ zY0YZeF0&Ol_shx!7yAEJEU-ng7Sh&BppK{@;JaBKbG|pGCsgq|e`w#qRiq z^o?nOmycE)?5>Kx9wVc|vZ59i>^myu((dnlyGeur{v%AJ@yB;wy~TUPJAv=--kSH1 zCP=Y52m9t+Z2tN%OI*3=)A;T%+;r=0zAO=Qhg8n*LfzZ9#|!a{#_j7NY@b*aIV~#M z>bSn|RVh@%+F?m~rDQb`acYMA*>Pj}Gq1*p^)CI5colu|iWX$EXjA=MV<<$wXN@X{ zL<`j%KAgZj+N}FpfP(3lpN-ifdd_K!ynY