From 895c6e721e6509367c8a8a4487c36eb72a4b6e3d Mon Sep 17 00:00:00 2001 From: Matchu Date: Mon, 18 Oct 2010 17:58:45 -0400 Subject: [PATCH] auth works - yaaay --- Gemfile | 5 ++ Gemfile.lock | 12 +++ app/controllers/application_controller.rb | 16 ++++ app/controllers/sessions_controller.rb | 32 +++++++ app/models/user.rb | 15 ++++ app/views/layouts/items.html.haml | 7 ++ config/environments/development.rb | 5 ++ config/environments/development_async.rb | 6 ++ config/initializers/warden.rb | 16 ++++ config/routes.rb | 5 ++ lib/openneo-auth.rb | 47 ++++++++++ lib/openneo-auth/session.rb | 84 ++++++++++++++++++ lib/openneo-auth/strategy.rb | 18 ++++ vendor/cache/msgpack-0.4.3.gem | Bin 0 -> 18432 bytes vendor/cache/openneo-auth-signatory-0.0.4.gem | Bin 0 -> 6656 bytes vendor/cache/rails_warden-0.5.2.gem | Bin 0 -> 8704 bytes vendor/cache/ruby-hmac-0.4.0.gem | Bin 0 -> 7168 bytes vendor/cache/warden-1.0.1.gem | Bin 0 -> 29184 bytes 18 files changed, 268 insertions(+) create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/models/user.rb create mode 100644 config/initializers/warden.rb create mode 100644 lib/openneo-auth.rb create mode 100644 lib/openneo-auth/session.rb create mode 100644 lib/openneo-auth/strategy.rb create mode 100644 vendor/cache/msgpack-0.4.3.gem create mode 100644 vendor/cache/openneo-auth-signatory-0.0.4.gem create mode 100644 vendor/cache/rails_warden-0.5.2.gem create mode 100644 vendor/cache/ruby-hmac-0.4.0.gem create mode 100644 vendor/cache/warden-1.0.1.gem diff --git a/Gemfile b/Gemfile index 8cd4bd8f..601dd204 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,11 @@ gem 'haml', '~> 3.0.18' gem 'rdiscount', '~> 1.6.5' gem 'RocketAMF', '~> 0.2.1' gem 'will_paginate', '~> 3.0.pre2' +gem 'warden', '~> 1.0.1' +gem 'rails_warden', '~> 0.5.2' + +gem 'msgpack', '~> 0.4.3' +gem 'openneo-auth-signatory', '~> 0.0.4' gem 'jammit', '~> 0.5.3' diff --git a/Gemfile.lock b/Gemfile.lock index 3310f168..bf80d8cb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -87,6 +87,9 @@ GEM mime-types treetop (>= 1.4.5) mime-types (1.16) + msgpack (0.4.3) + openneo-auth-signatory (0.0.4) + ruby-hmac polyglot (0.3.1) rack (1.2.1) rack-fiber_pool (0.9.0) @@ -102,6 +105,8 @@ GEM activesupport (= 3.0.0) bundler (~> 1.0.0) railties (= 3.0.0) + rails_warden (0.5.2) + warden railties (3.0.0) actionpack (= 3.0.0) activesupport (= 3.0.0) @@ -121,10 +126,13 @@ GEM rspec-expectations (= 2.0.0.beta.22) rspec-rails (2.0.0.beta.22) rspec (= 2.0.0.beta.22) + ruby-hmac (0.4.0) thor (0.14.2) treetop (1.4.8) polyglot (>= 0.3.1) tzinfo (0.3.23) + warden (1.0.1) + rack (>= 1.0.0) will_paginate (3.0.pre2) yui-compressor (0.9.1) @@ -142,9 +150,13 @@ DEPENDENCIES factory_girl_rails (~> 1.0) haml (~> 3.0.18) jammit (~> 0.5.3) + msgpack (~> 0.4.3) mysqlplus! + openneo-auth-signatory (~> 0.0.4) rack-fiber_pool rails (= 3.0.0) + rails_warden (~> 0.5.2) rdiscount (~> 1.6.5) rspec-rails (~> 2.0.0.beta.22) + warden (~> 1.0.1) will_paginate (~> 3.0.pre2) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e8065d95..6a7cd602 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,19 @@ class ApplicationController < ActionController::Base protect_from_forgery + + helper_method :current_user, :user_signed_in? + + protected + + def current_user + @current_user ||= warden.authenticate + end + + def user_signed_in? + current_user ? true : false + end + + def warden + env['warden'] + end end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 00000000..3e234965 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,32 @@ +class SessionsController < ApplicationController + rescue_from Openneo::Auth::Session::InvalidSignature, :with => :invalid_signature + rescue_from Openneo::Auth::Session::MissingParam, :with => :missing_param + + skip_before_filter :verify_authenticity_token, :only => [:create] + + def new + redirect_to Openneo::Auth.remote_auth_url(params, session) + end + + def create + session = Openneo::Auth::Session.from_params(params) + session.save! + render :text => 'Success' + end + + def destroy + warden.logout + redirect_to root_path + end + + protected + + def invalid_signature(exception) + render :text => "Signature did not match. Check secret.", + :status => :unprocessable_entity + end + + def missing_param(exception) + render :text => exception.message, :status => :unprocessable_entity + end +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 00000000..f77ec893 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,15 @@ +class User < ActiveRecord::Base + DefaultAuthServerId = 1 + + def self.find_or_create_from_remote_auth_data(user_data) + user = find_or_initialize_by_remote_id_and_auth_server_id( + user_data['id'], + DefaultAuthServerId + ) + if user.new_record? + user.name = user_data['name'] + user.save + end + user + end +end diff --git a/app/views/layouts/items.html.haml b/app/views/layouts/items.html.haml index 41c92535..31bf6af1 100644 --- a/app/views/layouts/items.html.haml +++ b/app/views/layouts/items.html.haml @@ -7,6 +7,13 @@ = javascript_include_tag "http://#{RemoteImpressHost}/assets/js/analytics.js" %body{:class => params[:action]} #container + - if user_signed_in? + You are logged in as + = current_user.name + == (#{current_user.id}) + = link_to 'Log out', logout_path + - else + = link_to 'Log in', login_path %h1 = link_to items_path do = image_tag 'http://images.neopets.com/items/mall_floatingneggfaerie.gif' diff --git a/config/environments/development.rb b/config/environments/development.rb index 3a320a36..fdce68a7 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -21,3 +21,8 @@ OpenneoImpressItems::Application.configure do end RemoteImpressHost = 'beta.impress.openneo.net' +OPENNEO_AUTH_CONFIG = { + :app => 'beta.items.impress', + :auth_server => 'openneo-id', + :secret => 'zaheh2draswAb8eneca$3an?2ADAsTuwra8h7BujUBr_w--p2-a@e?u!taQux3tr' +} diff --git a/config/environments/development_async.rb b/config/environments/development_async.rb index 6f7f8c49..9b82847a 100644 --- a/config/environments/development_async.rb +++ b/config/environments/development_async.rb @@ -25,3 +25,9 @@ end RemoteImpressHost = 'beta.impress.openneo.net' USE_FIBER_POOL = true + +OPENNEO_AUTH_CONFIG = { + :app => 'beta.items.impress', + :auth_server => 'beta.id.openneo.net', + :secret => 'zaheh2draswAb8eneca$3an?2ADAsTuwra8h7BujUBr_w--p2-a@e?u!taQux3tr' +} diff --git a/config/initializers/warden.rb b/config/initializers/warden.rb new file mode 100644 index 00000000..e1bf1ddc --- /dev/null +++ b/config/initializers/warden.rb @@ -0,0 +1,16 @@ +Rails.configuration.middleware.use RailsWarden::Manager do |manager| + manager.default_strategies :openneo_auth_token, :openneo_auth_redirect + manager.failure_app = SessionsController.action(:failure) +end + +require 'openneo-auth' + +Openneo::Auth.configure do |config| + OPENNEO_AUTH_CONFIG.each do |key, value| + config.send("#{key}=", value) + end + + config.user_finder do |user_data| + User.find_or_create_from_remote_auth_data(user_data) + end +end diff --git a/config/routes.rb b/config/routes.rb index 05aaa14e..b3ff211e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ OpenneoImpressItems::Application.routes.draw do |map| + root :to => 'items#index' match '/' => 'items#index', :as => :items match '/index.js' => 'items#index', :format => :js match '/items.json' => 'items#index', :format => :json @@ -18,5 +19,9 @@ OpenneoImpressItems::Application.routes.draw do |map| resources :pet_attributes, :only => [:index] resources :pets, :only => [:show] + match '/login' => 'sessions#new', :as => :login + match '/logout' => 'sessions#destroy', :as => :logout + match '/users/authorize' => 'sessions#create' + match '/wardrobe' => 'outfits#edit', :as => :wardrobe end diff --git a/lib/openneo-auth.rb b/lib/openneo-auth.rb new file mode 100644 index 00000000..473004cc --- /dev/null +++ b/lib/openneo-auth.rb @@ -0,0 +1,47 @@ +require 'openneo-auth/session' +require 'openneo-auth/strategy' + +Warden::Strategies.add :openneo_auth_token, Openneo::Auth::Strategy + +module Openneo + module Auth + class Config + attr_accessor :app, :auth_server, :secret + + def find_user(data) + raise "Must set a user finder for Openneo Auth to find a user" unless @user_finder + @user_finder.call(data) + end + + def user_finder(&block) + @user_finder = block + end + end + + class << self + def config + @@config ||= Config.new + end + + def configure(&block) + block.call(config) + end + + def remote_auth_url(params, session) + raise "Must set config.app to this app's subdomain" unless config.app + raise "Must set config.auth_server to remote server's hostname" unless config.auth_server + query = { + :app => config.app, + :session_id => session[:session_id], + :path => params[:return_to] || '/' + }.to_query + uri = URI::HTTP.build({ + :host => config.auth_server, + :path => '/', + :query => query + }) + uri.to_s + end + end + end +end diff --git a/lib/openneo-auth/session.rb b/lib/openneo-auth/session.rb new file mode 100644 index 00000000..c4f81998 --- /dev/null +++ b/lib/openneo-auth/session.rb @@ -0,0 +1,84 @@ +require 'active_support/core_ext/hash' +require 'msgpack' +require 'openneo-auth-signatory' + +module Openneo + module Auth + class Session + REMOTE_MSG_KEYS = %w(session_id source user) + TMP_STORAGE_DIR = Rails.root.join('tmp', 'openneo-auth-sessions') + + attr_writer :id + + def save! + FileUtils.mkdir_p TMP_STORAGE_DIR + File.open(tmp_storage_path, 'w') do |file| + file.write MessagePack.pack(@message).force_encoding('utf-8') + end + end + + def destroy! + File.delete(tmp_storage_path) + end + + def load_message! + raise NotFound, "Session #{id} not found" unless File.exists?(tmp_storage_path) + @message = File.open(tmp_storage_path, 'r') do |file| + MessagePack.unpack file.read + end + end + + def params=(params) + unless Auth.config.secret + raise "Must set config.secret to the remote auth server's secret" + end + given_signature = params['signature'] + signatory = Auth::Signatory.new(Auth.config.secret.force_encoding('utf-8')) + REMOTE_MSG_KEYS.each do |key| + unless params.include?(key) + raise MissingParam, "Missing required param #{key.inspect}" + end + end + @message = params.slice(*REMOTE_MSG_KEYS) + correct_signature = signatory.sign(@message) + unless given_signature == correct_signature + raise InvalidSignature, "Signature (#{given_signature}) " + + "did not match message #{@message.inspect} (#{correct_signature})" + end + end + + def user + Auth.config.find_user(@message['user']) + end + + def self.from_params(params) + session = new + session.params = params + session + end + + def self.find(id) + session = new + session.id = id + session.load_message! + session + end + + private + + def id + @id ||= @message[:session_id] + end + + def tmp_storage_path + name = "#{id}.mpac" + File.join TMP_STORAGE_DIR, name + end + + class InvalidSession < ArgumentError;end + class InvalidSignature < InvalidSession;end + class MissingParam < InvalidSession;end + class NotFound < StandardError;end + end + end +end diff --git a/lib/openneo-auth/strategy.rb b/lib/openneo-auth/strategy.rb new file mode 100644 index 00000000..8cd882bb --- /dev/null +++ b/lib/openneo-auth/strategy.rb @@ -0,0 +1,18 @@ +require 'warden' + +module Openneo + module Auth + class Strategy < Warden::Strategies::Base + def authenticate! + begin + auth_session = Session.find session[:session_id] + rescue Session::NotFound => e + fail! e.message + else + auth_session.destroy! + success! auth_session.user + end + end + end + end +end diff --git a/vendor/cache/msgpack-0.4.3.gem b/vendor/cache/msgpack-0.4.3.gem new file mode 100644 index 0000000000000000000000000000000000000000..03bc9d6e4b9e796e7eb619dd966f09f0fdeaca1c GIT binary patch literal 18432 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 literal 0 HcmV?d00001 diff --git a/vendor/cache/rails_warden-0.5.2.gem b/vendor/cache/rails_warden-0.5.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..373c19029da759d56cdcb6c0c08e205b6b922e4d GIT binary patch literal 8704 zcmeHMWl$VUlSYCEcMtBcxU<*-3A$JycyNb>pb0DxoW(7{Ay^0=g1bv_2@b*Conl@OoN6cy0ZV{#69{Ln1;#NPqD^^iP~$ zK!9KLKga$<&Mzn^Ab|7&@UK$nAJ={7@yGf<+k4wtTRZ)u;Gf$6o&4WT`v>FxY5M=w zE`2m661@3P6$$lF+R=MqAn~R)0F*KEoHg1yhQ6^3_hkgk*~|G9InyaN4xi}@x)2#r zK{%~TBBD(XK8^$M>03MG{Q&7N(KFFAS^iT^%FFP+bx?^_C?l$Cw1Xj@ZXHkZgHJpu zLy@Zn?e%6WffxANZ)jEBvEZ^d(8un0?FYgJ&`E99gPC@pH!9jw{lgpIa=cv?U;6+N z>(;H?mIbjg6QMDE70ZeHRmopt-w@}W6E^V5!WLGRcV;{sm4mRISkIkQUG=2To8EEv zmUCx&CyL%{6K>0r(f931gt%c9dr30Tq*RxA87yO>=N$GJ*>vNbAK9lH>!s!>!E9QC zN`;RjTloRTj^7=*3aicGX{s1ohxdH+DWV5~v|GPuHKiN@&j)^hUuiS*4`aYKA;x%W zf5U93Nf^)n#}XLax}y{v-!Os(#_KTIYO&+=R|dJJm&Z_c`BlEoH^ygyR5* z-mD)NsyB*)*C9rycQ!=7-{Bv}X>2Y_-c!cbw87wOz^7pzbl6|fziZuGiUPl&vKQ5q z%qc6UDy<*XE4wQV(3WIqbfC`m0G&6kh`XA4W6FO23L7P#lwz6bBR@C0>U#+;h2Q9v z&AKGnL{IZo^6u9qF_wzP@>OW=!vxO>7lc34Lcs0cypimSU&iOk>Q%}$>ulA`%C8pb zzzy0C7|kGO6E1l)(Ba*mi6a-*z?OLT9$aol zHu&3WQMC-l(GYmyQ+(kr!$A?><&nT;8Z^y4$pLs^V z6^0`2EQ~B2Mf^sHlE`kZ#GRYnA(4s@sdMMRi)VZ5i+(GTv9nX=Gkvo+3eH2Es%84p zjo(U<;Z)GCCb%%P>%fy!H@;>Ba6xk67vf#=dNyav?O2no_V?>-f7egB$5#a3B})7h z(%)(!Xte3$oWTc4{;IYM!2ZRZ?-m3xb<4}h=?hiGRL6GS5!>*CV^mZmn!aTc7ft#J zjJami#fkjDFfs~RMTuOdDjV~K`&o0*#*TO z4d3Qr^Oa-9mi+Jb1hJjZgWYS#V+|4crfSUKJ)Bru0!xUNZ_>Es2QB4P`-Nmm*;7U_ z%(TcNll@qkTso?=6Q-vJ$y^3SsS?(sgFIT#4{hP{j%6^`bN9sHBh>Bj0uu^!Z3gn= z4oIvC+i3@BE}g7)zwX)?SC{`n(b7PDX}?5Y11M-7z^w>j&t)c1Q0(a64^d$H`a{~G zA=}X074wjMzF_E-B+{p5#OT@-&K5v0Jd6&Evgt`8 z$(lvKoX5Urq7v~7R}Um%432Ee(OSc?ndrgobc`&FTH!)bgvXkeHep>7$@6u%@f&}` zkEB$s_Yr==Sgv_-c;ky}`lBE?0gz@xp^x974! z>zY*Y=$#96@_|H6q6$N!`1eogFN1<#{Zv>EJkR+&8|3ovRe?U87XxA(*Ns1etlNR6 z!u&P=mtcvdNvuO2wF&-p<0<2*Je5Kq+RyG4&$~AAtu(K3^POa32I|{SCqkN^?-ntG z=wp?dM1#EK*(a#uKdu{EvIg(fvop;p_`TgEd)Glb!T*cVhXI4zFZ=@2I28G)i=e8U z^LY$SSwybAm%0SH^h;Vx`SZsQrtEINTBsS&hKn+U$2=xTU<$u-c6!+3o!vm5L`>{! zc&WQL9c3%ErLR<$gRF5SUoV|HRyl@tc9mL0I`G$shtA_<4k;3|Qj|x95gUWG?3m}U zX@kdP)P!#f>`MeX-8x(|pHCQLy0Jdv3|8v)#t!7;1~#lm?_3=$&zU@;@uE?SARot~ zetf#J@Gm||%A)PAGpX!IH@dp-r~K|fg>wl^?v8m{_4lZXM3fh<-8%C9>?vw7xYKp4 zJNVi6%AVU4p=^k7ZEtBeL>#cQTxs#R#_m3?k}d8RKH8tEWoPvTUj_QOCBqQ3sn?>{ zfjnEJK1*TI;g(cbAy1>g4S2TaPyzNb<~RR^t8RWec*nNp9Y{x^pZ*OT+SpVTLU|B7 zPkYemmZ6uP8oro+fSejo&l5WC%a`H|G z;_W&`MCowl#~A3D$?Pr|?pC_Y4OSr~cLB{qv22>$^gY(kEzCOCt=zb~keh4f;~TDi z6^*uHLg!`7!~3a4v?``xy?N(6DV$nSJeE;?I#eheoB(qnZ#sp+2pVz{O^!j8sMpwF zmKUkJxZxUJ$}fzTa&)ICX@8%PU#eL3R;A^k`pW?6R;1|b#Dt=2V}o|K2x?87O z+AkP)2XXKb3m@L89P#sVrasid-`t=FtOFUnRDQpfpO)!Gst{AF$lt|kiFrdW@V zJ7Z2KX@D^Ymv&Y!cgpru7x#sMb_6#%*3)QE0#FDNR7N3iWD?ToqUgxcIVIyXQzD`G zH6t1sm&)LZE-mVqgKoEAaF_(;{td|m@+KFK2l4=P$Sh3#-3gq8RiDRB@cvT)R-N)g zg>v(6w;+&^`3gB!A1k1y^DT+kY8xEN)>dUMVsQoQqjz2ZaK415(`lGy*5>&} zvEXNsRtK5=gbE@@E{|DewIy+*+B7K>*H7sD2}PEgiMR#bG#2VX<+qseQ+JLuy^i`3 zIo^^pZ!qIqSnMMq)P(eNgz7W^C2Xhc%i9FKw3P!d?L}$B&w+;7SdqL8Q|%p}rnRx| z7(08F1NKnc2?8Lrz9GQIC4*ND)1arA3a8|qMCQzQ9#S=!v!BOFnSY)1h?F#}R+`d>|=UPBh z-KA5dgEP4E3i`7j-gU)U(u61-34L&~mztR*NGZ{yW2SCV$;hmko{G96ZG5Y%=;t@I z>ce;b3+tAUVrqjqDKXqSUmidlg|2A<#J``x8q)PcXuQDzRBsXLBH3@qKiZ4|O zL6_c4iXAXa%Z!VoTz;L-9kSPs#m~zkks+MH)MEG~k$car4Ku7L|JHvbGzWX@FuvlT->R+Sj{60#p-?|g5r;EJE!nBo9jp5N z*57z;G<;2mbh{Sz1FIR&wa4yKZ11ZWiu#m!rGwek#IJ30!AcPT&r?vTd!kUsvkMLn z5mRjyn(nQrsDWHFEym&DY=E%G^O`_6X%GA77f!@$`+GKN)jyD4GbAe5E`0N{yt5@> zbkk)D-|Kwq%`Ipt{2|)%i6%?Ey(UX&JOOzdn2vzj$Vk*e#ii%$it$85F8l;5%^;>g ziPvC^F^N}8Vll(1y2s=z2nwBzMtkma1fHsE&7IjpAq-KU8r-y;N2fE_8redT*TTrA z?$zJsrF{}V>f5Rg2#U^}Hmchg?IlO*;3Cr%jsEyqKfdur2*15=ZA{=*2M(=o0dXys%l4c{?Q9=GG&6s`ENgQP`A4c57HN ztus$)^;7g(fu<%%Sd}PIkW1ZACL-o~*H@Y)>^(TSzG6t5@zdoB{FsV+Z zpfk%-FOk3YwZa#(Ob4EktNBAxu$fSSkD3B02PW230`0}AGumwgf}_bLk^7{^&4lX4 z6iZK6WA(+o7WOeREiDJtBj9&fBvzt8DCUF%{WA6Bz<8W9!^L4Vr!C}%+B@0x$Y4GGQm+mL3t7P|M zIp^fwiYwESI+nhG9s9v^Z#cI!;F9BTPdV2D?0WCAOF6yDC`z@n{byGH`*D=@%<^&S8p;O!ys$?XTABL^aUwmq{O7>yE7 zeUS48RcgORh8PAq%Mn$ce`t5T#``Nt1635wmwkGq9%K_`j2wnmj2#oM^T^Vb?^?TT zu(;BmE&52!(>PLuZjd#6=ie-;bia2GVTHl{{ zP=d*MiCnqAf$`uEG*Vo#_P!smRT@sUvy5kEi3R2D-IKG#e{Pn<(wo3=jte+(qrmD| zj+mKsn8>zQ?HFTmY^i>?vDz7-Z}qcCwx~$!a-JgkK1#w`b~eH0*FAEHABnOoitCBX35tb{@$rTwR^~Ck?xG)HqAzl(zGd8{dGbX z&z~*EM2sm6h{qs0f5KbJE42_6++0S(_^iZN8glfFCr#%f-WBO8VlP=U-1OF8@}U_s zEbqMvYjO#cRH!^HkpYYpAr9xB#(!vt2vEwwWDWvYE{o@EG_ou*p?J*eSg}Cc()?x{)c>^c^rC zuCJc7%Y4yEF!FG)Uc5YUNi0>>Ym?rxH!&U1f5lC~xqK|KUVL2z!Fm3D6G`1^N^ZisDhbq9j)=!o9x5z+l8j8+dg+C3eP zG+N#DEzI(tKsx<-K<44B^Nv90vb69Nf}BC->t}aq$BRWyLw}VKJ_OTWuqXn7io|EP zZG`l%L!ke!qObq^dO2HrT3G${2k^g!{{#31|LbqyKk4`M^fcbz z++EzYNwQ(0+z$y2I($jWiEp~4`6|{{!9d!m(n$OUobQ9iFKnzbOxG|do8S*1`*4=s zTb~t8^vV$xo!KpV*n^iR_oqBK2qJO~g(@BSEX9V4$q*^8yZfj(44PD^hc0f&d=#yi z?yJPz{m6x!I4VnG-J5b_kJ?UU;U=1hnSw>E^FEOz#?pQeZ888Mr_x6&k5}MMqS)Vg zOAE_yfKSz1B3@8#wj{)M5>57qSh2MAKU^oR2Ye z4ZQhz8ga`_12`Xr)ZT&o+@09CxM|tx!9dZ>Pin>7sIjcBpV@QY~L`?Zw{KOPyItp+%`}sJ0pL z#`j-O^`A_Vq!r)o2k!P|nI1~IkB5gKwMHS_;~l@f9u(Y=HZ^a9x!j48ZybyFt%Gl~ z4GyKbO}#LC@kw26**EX^0DQp6lWB9NkwX*sQxB-fJ!ELc-aN z=E^z3^u4Hy5xFeLj3k|hP;9BDlWau|mjkvbNFdejoPI2d@I!$IqvhX)Y31@O^3W0R zNbThGNxGtU8|}b4F$hg0;J4^_9m-amB{|>p*u~C)1M?Sc-z8qP`t%se@E+}Q&1B^+ zn2XGubC%D4QT)L5T<9Tfm`u3VPaU(`@ji{~=HjMmW-$C5MOxa}fKu_`<0x<_cb!+G zpXY6a^-w5L_hk$Xznv{B3##!aGEl9ueyX<~gIuI3vio`}CLrEdI=sw zdFd0Kot@0pJq%gNG|mK+8dcKIpi~QIW%hrjfS)#3>5-3o?AzedC}LkEa%hU`C|uol z>p#>)*-S7HX5t3|Ga`u%R->K~o^_&lc+?$6+{baqxNz+(RRR`U?drSYB$H(@m_d1L z@8@#5Dvx=N?Y|kG@|%m$={tiqjaY`Uv=M&MJ8RVYa5PtkI~jRFsw2x?&7i=*K8$D% zy>^<`IYP;@<9BW=d`Nu-7`kh79S0-xMpIHUz+5-M=|{}RMqE~}D0AHXTu^tv zX6KhN3X()cYLY+(G@9?BWM_;Q7)Q94xl9HQk#oF(U9x4deZ($;Ya~mjuriJwnI&B9 z;JU!pz*pW_|e)vGOWbWSK(^@q3)%s%;7&PTAGCBV5JxT{Hr@RdP~XzHkmr?)Rz0ahm5U{#gy*;IG&y zp@hiPFbh2_Ptjw4x|e}QOvElgis~d}FXccrj|Uc^&I_kGg9}NP{0K4vtx=2-eUnLJ zzE+|5CrY7p!KQdj_Pr#QVJV#Ty1D-3)?>|^#MnVDL+zi7lHC)cf$T8F(kK?=tg<6Z zjW-G&F@Zu^tOa)0pMV1=KbK-6@O2vf`cHmV+lEr`zLdmwj`{mYVEHjxgyE*2R@rDcZxf-dSgX&q zd}{=;1awe7AO?by)E9cX%tNcNEr4`tV71lD{$&h=;=KUpmM=*Dv{2nnAVt1(zbh#S@ef3)grC8w zl+jTr-Q4GcWMi%C4(SlEo*;bZgS61}909aDF7CT?&ZksdiC(S#N#uJ}zIb*{CmaCj zjWsx8nIz3KGt%^yg7k=qknNGa`7u5Out8iwkFIv%jE!M{W{fSDk1+9S!fD_g|DD+B zP6V4H6<6>`R<|U#iKwS(D0s|mvY<3}_-W1gsG*?Z6$J-=_e(Mtv-MGu4ql(&9M{p| zKY9zm_}XI{txc9=YNi4=y)X$5CMsGIyFpG80>`|_xhHwpUmi#@IfDu}mBvm3anN7r zi(t2S%C?xxObK|-1^d=!1DPi#LYS-32MMW6LOG66amsm4gMh|~>$?lf*hP)_2j#Jr z`8(`o3h#&jinPTei8!)%nfFrInM{kOygldvyoU9s_oSRaK0R(x-_OqH;RwgL>}ev;L~DFcD2zN zc$6LEujFzj{OH|4=uskUiBW6)O+&ERH9U3!VHtL$gy_+$vJp06KAB1_v^H?=GiR;n zir1!@RzpG`e2e+|@3XMg;#VnhGa_I_g8py`D9_a8%=S+KNr~?J3yF)*C@pu}dx(nr zef5Je)1e+}pu(#cD~3;8_v#$XXbqUL+2?9%xgW)#M?rWgjzuNn#A;!n}jvCY^u z&=VOWDkTXgh-W`A7u2Q#`M?_coRDsPCHC0sld0VGgZVJdn=z%gV%>vik`yc02cviW z8Yw87aAs;vYq`h(%eo);O*<(AdyO6}eQ!|u}4+H;WEf@n)xm|Xod|HW=_ z0kw-@@uw6fEjd$#76@l;b7%Wd)Ma0&9mzmh-8Xmt6!Lz5x^y?Vz@^;FM1SA{n@V$0 zjDtKV`pJOh`_kHW6%Ix89fdU5X(~%J)|hSKEWvKsDKJK~!^1iLeS^-iI{M>&5yuk1 z56aH?g7pg+NVEeV-jgnc7e&A+Q_h@ zO!6WeXj*%E=DJ|2>-y+0tO4q>!k59xGjHY9(A4t%0Y#eITUP?&Iul=ctkv92<3A(g zTn`ys*lj1~^Q1@by^TL_uZ8pEC700N?1xQXq=8s4S-yo@=ay-;$X~o2gUEgSuvc(} z72w0my|Ed>^g{~IknfgIoOX|_*^drijeZGYT}5v{$WsnrwB=Ki8@Tu zX~Q$yjPF;d*A2YWxXva$DreUDRJvFCfE+JsE58$PtpWJ)ba;!#UHKu*znBFvXvR>& zs5d_OG#PkXKWvt{@(QuGjmIbB^y!W6W+l?6R<1p;xgw&Bhn7|c=x7|&F+J^HZwzTH?X5SMnhAMoIkUqoJc z4umre8_~9=JM1TqeL*xQ7?-8{P7^+>1W1G(>3$=A6T%L!;&(KJC}I!KMSY7Ar-TjU z_iexj%nRPeo|^Zk6@!T#KYyNjNhoSYNRW_CvNi9lD|<8tYS-g-aFW;OHe(XO5ii!( zug!A`^>FSK;kK*Vz;Uo(-BUUI&VG3D_?j!|ZO45_P5sIP#^&!wLLAlKeR$U4f~-dQ zB)X+wW%>jskLRJ~vUGC-p{Hj;QRfSB`!_2_tNAw8#-H;rmnSdfKF8eB! z&9&15iV3+J-zWMw3Rfv=>6SGVdYDs{p^fX0 zua=Z%cdGWXfvYnbOPkpjRA*nqnX067b@XD6xh}|AgY2{?n8{D@g}H@4 z{#q*T!DmHhb`c7leEjBBLu6CzyG1C;4?wW-ThCR;4S=%-DD^E!DA=~sN8i$aY7p=mMJlq30UOTg?orh0(Y7V(o zCLqTKZureVxIl~QRNAzm+xpEW)GeiHhbke9Pudpv?aqb=B{|<939xSn8pW_VSI0e( zsYC=f--e^Nj#kc?U)bDPH~OBJSOGP49#?gKBYa?7=k>Q!UP($ z=Bh4J6`t$Zm&i|Nb`5>7QEvRD(q{+a>9I;bcbT8@>fuPyU%2)($_t?c;+z;K<0?mmC)echZa1gi?hxEe@OSpb z_-u%{*?7DtPOkQ}8dVP>JlNiB#_hIh)Upj5jcFO-4$~1i2&<&2C#}l(Qv4K}YI&r$ zAG<>aR~N49lZ%IzyXp4QBNGj|ZH4P>+$T+GcUtUsJ?g==F+j6v;OczA$nt?YCcJ0D z;A^j=u(CU&#>bw`1LrfmJJ%leExXn4*_|C8?~5dXzLF)5+-Cv%eD?{2$lqUc>5Bz6jI7u;oizsUT- z+IDs=<-c>ws+`n`IZJWBL}{!Uc0lKz+UBTPrlL%eBGef(mi`iS zIO9=w&TwsOcnvNnh7P`vd|{eTQ132h&el+{s3Lmg)so^&ZUh=-{J6Met7ErG^8l+4$0EB@?!WdYPf-N;W*g17Zip8JJLBHpWVp=<518za0(VxBL}qGGTzL7)R= zEWRXzJHog#vzWpTyN=+OQ3bKO)oE$cA0A@$tfOmyd1;LCii)>+Gfsw+$00=BDcv8& z-&$Kxk;o)HHfWbJ3f@3X7Ux_ywd|AU_lb5+}HEQX`S#kM1#2)X&{d+0EZUZP? z%eeApY;I23gUJ)i#HiG=$JtSvr*>zZEx`>CQ#KYJ>vg@ib+9qbc=td^+Dp4Bb+h=% zlpanS$rsaC zbHcS3hC4FY`l{|^@l|Lh@qbZ3)Ng6gyhu<>-ala>W5X=;NY5n6XUVh7@Dml@{Mg7e zRY1Y&U(S1$7Yvus`Z?BxPII8y^_;j%c#0?cP^$P+kjdi`r3HTay@qO0Y8!ME(v$6( z+_OY=7r`J{1y;<^Q8!ajzds@vHTUlIEva`hKczb84?7cy9a+z~L;w5F^f85%GeVM1Jn)R@? zYGYNc+I!dfzGZ6UYQ*enL1p007wk)c?u(=8+i+=xDSc&bxv|Ju~p!4p>`j z<9ghC^*6D37#Qtqc*-VB@;BEeDVhH|_QH#2m|XGmpn0M3>YPLUi1^6}T6{dPt^61Q zF*1G43n0?S?Rgt|%+>O<6eDSXs-e#W zQf+SFI$4y|!UiL{0(KLCNvx4;vE?vx?LDK9C!i$$R(%rr7BQkNgL9`FR_7vGr z$AEYfT`XDj+&a%sIdiYkqKsUc2?-6`?;zXn!i~>PJS*0I5jI;Ef?q~4^D11@Wkvyb z@xdEBFMy6xoz2d^-a=Sjg&|alzeI*bRGEj z@ZxW9K=a!3n=L_3{Lq0G*L0(;5u_1wOv#D15(k6c!&i6om5W5C0X$e?$a5W+c9xsZ21GeAh&sTNRfDs+0oc+Wb4M{R z*AzAbK|1=eBj29^2&CSy3BlL|LxS4o7A-MGN7A@r(^f%{y1Y3GDq~O4QO6a_j{eZ|Fn5Ps9a4w19ML#CXZ%dFN3HFE{yH|Ql+s*A$*%dayjTVew&re%J? zm7w4Qo~z}ai+O3nu7+4b4 zPF)gyCg*SH)1rc_bmc(k$OL)+Fqo-y%6duH&3N7+cTwY?Hx9u6qR5}f1eM; zzb!|Mj9lp35HgbxbFm=vukVwgB!#@jYE}ZwXv$WH2HzY=3vU@Ux&AdCqhsF*a^)=X z&SdJ1`5K$&b$$I2O_gm`h-9I_Zg44$F;_p3NbyWf zzP?Az@iz>GZ=5}yKxYU?IWFsBtjuRn8iK)02o%j7N?K9kBFs3@q{3O^;E4q%5h_Oc z0>Jjr#NiEF(F4JPM>9YmaS9mY;uM_ak&xjkRHkyupg}tN?Y&i^InjpK4R-V1Vm2c9 zZG-DGxC~s5NP-0!meW9J%-ii1#s}mss!c3~!sPMcgQ>hRf>6bDVYgQ+$o6Jte|LtM z6;%5C+1K%Hxbzd`U~liRn+tL{^h%SjUp%`cGR+yF->2~*8CK>ocM$bNEy#L~*i0k}wpL zs7PfBAct)4w6~m`)GZy41iVkdDy}pUQYtDqu3?p?y6@!dU7#}ovs0jxA|c+A%)jyc zp+U%cGtb2S?`y_`_2b8UVhs%|Z(+>xK zvp(S-Zij^R>aVpAsrj=7-EiXQvgenA-I&rfAJ{ql!MPoSXM-!!ubv_OOVXYJE(77> zuFIY4franpmwI>9^{yA#n_ZG?k(asj-EO~T(8&n+W7CWG&5SaxcUax}uET8zaqqU@ zQ*`I1A8N5s!JUB5$Mp^DM_(_$G0R@BcP}hUz=p1OYv0FIwZJa6{P{-p&et08v+v8( zb-j<;1yhT2e?tb|&JD}U8TMlvBFM+R1@t_F(SNkD#VrMU+YH&v&!eIquqU*A(XbQp zB?dJf6Vf)%AB<_;T`F0yn=P=55S*pW03mVv@-ZYJkap_RRbNmmR%45E?QetN_OgBC z($Mzt`J~T{Ds&=j?NFA``O$X;8}?rj7vb><;>zT>nk=*Cj&dN2hpVt8n&t#m+0)9!!4T>+`&ZIwlu=QZpH+a_;4Frd z_+SVndr1syPVf;T5?A>U+$~YzraEUO&s{A*1ZCaKHemQ!Q}9+5owd5!G_8pT4Bmf| zMuOslXF4dXIR=l);?g<*njl{xqJlW?o_TUVzQ1^m-?1eU2KQ2lgu5nr4E0hd`4aSH z@Ju-Qk#+`x^uZ}Pq%!Gp%!;P`y93S_J4yQ?j%Y#IOX};JvKwj4s1u@3eQ&f2bQJLHEyWsKLx?$HlwWvm@hWTQ8U=M( zF}v)uK<%3p-L)sICk8K*7I+Av0!xBQMTJ;@O}6AAilB-=Jr#*BfxR(eS1lJU$07@& z(|{{mYV^$f7e55A?<7(ztl257m6x}VNLAX2G!ELwa%0nqP2ORTu4dS0O$1yw9Hxm4 z>(EqT)iK82GF~Ds{)1FxC3=orkdreqT}8ZtiReSd9x%673|k)CE~1lw@S;a`bx;Qk7`u^gS%bXTUsHQnz@Z)CE?06Ks z*`M|2xygr=f&p#UH1aCn*nw^69H}a+mIvz(n>!!O`3gOL3^#^uyU!m5b( zsqF-_Cq*j+H6Q)S5_W{F3G+#*OMxYJfz}sRuWZ86ib5G<{L*gG_0AAX4b-%j%rdNo$N-<~ zM9F0`l0bmok z^oO{_2i%eI24OC3;*C3AEhQjmt=c*Bj)S|5*@DGU%N^?Uv*_vC@B&P#BZrrE z!BudzwpR82b#DMAfr`jO*IC+r$b#rdXFzN1*z?Gd;GCbJ{h`_j6i`5WqyHGl;h63o z1QCLT#V^`4m1!1q`NK5rR{>N-VUMhNjv>roUXYHs!lfD7gPbP7hfGe$ii$*f2qQj| z*gCYO!)e?>4BAOFjI~wj@SNVBS^mV|oF(Kk2X0W{nGrdtG1(}t<^4olASN*G7rDui zWTXX)U zap6k)iByU~Ce78D?hdDo%xb?}Bfc<7)OU<@tKhygorrDzT#+h4rq?$4^zh*S2+1p0 zc>E*BH9d}dTW*dBH6v&}zcDAY7trJJcz^YPl1wlDd9m_M_!{#y&V@7^NZI}ZpZ#v! zZ3d`1%zJe<_Qk+RDgRa^#7ue;} z*rt#s&6nRhe)n5@kUfBD?`}cIF87utU+AVnv1ahkSbr4#=f9Xf1!~3ojFDxkE0LFl z_kR2XB&rB%_)o`8(%CXQ3#`FQ>sF;29)#)&f)N3$#Z(x}PH4Woc-)G3I6cBnh7uEt z1=vI}@g05EIPWYic)%%+r=Ri`-e42*+@f=&fGDFAn1=poR98e=x=ojph!dW37iV8K zM53L=uIXaYs0NhR2kcjy9>t>N;AbLSl5k~=tC7j+Wz?H_mb^C51kWC+Mlae5quFI#OTkf-9!^vV7tnY9roTkO+i`<3S6=;fJiKMugZn z;cqze+kyh%D`UQ3O?e_e3Z>46AynbtSjo!MxQQ%`mULitDw(%Zk5DDe<2ST(L7YP$ zx--{I*-HC&VnwpYla`u9yT18q>56U;$-a0HWbR?x==fd$PPF@+l65?De1E+qcW z-E}LB7r|~nx{vbfJ!?P>X4gxU4usA$4-Kd?DR=rlq;KC60@>MNU4uyN`PX~-Ks%$V z{Ghj|;v@0#VXgq|IHi9QSO;E-u=OI5$V;iQ$TTktFy`Y9{b5KW-ql6Bs{TeZ{<*(` z$l_+>**>7*IzEw#rpZh%-)tTUiqpGY7W>Vk$(=6L{@~69B04$%zoAjQOfg9PW2Nu@ z?JglAX*wTAX3w)Qq){TwZ&A>6kL5CS*Sc@`>?5!aayaG3qIp{wAyE=hqK*IuBfK+c zHJlR+%z<}c(KJRzXQarU9E&Z_WYbC7yl}_!HDQC)&)Igj!Ve&|;L4d$R*L!-B3(oJNZ!TLYfos@{yY$Y?N{xyhB{sF#C z2(W_MyRZ)y6P~e>h!wdwU{oyFf!Ijstk|`q)11UJqldkgtS;$X(F+hoaXSa(SQqYP zA}Qy|w1?)FLf5Rmzyq78L1pB-Kpz9I#yHp3G};Q0hQMR-88~{CM{- zV#~)u+x)iXp=iVs+5GsB*8`cY+7<+3KcYC1G><;4pimPLnDe?ZstoJYeu>kN4wMpw zh+4`{kRi#8%!6s~Ju~u?^;9i+7FMT9pK4h3#_@htoDknMLw$vp>AbkQNO6P}fgf1M z0ue>IL(@b#gbSmW*4$hLEm?B@5bIOonFX%K2|U8VBO;1f&B|bYw<9hkI@Mi6J`HeF z03}BKxvej%^B|1RU9DrM*{aD`=F=z&#H2OWW^U&J3>ixVjdOhcr~#`w?u(1i%}yYC zyBR3H;`_MK^*TQmy8EC;RTeOc1pUdy`_#vM$7VlnmJq^zu-HFghsmcT-V z9$>79>40T8=egz3qzpQX0*%AmBKmxN-@-YlK-L9o((o0G)qeK?*GJMu1pD}*qZ#!ekD;cDc!jJTeeb|5e& z+hlLtqcrzweae3&nw+#1Kn609jj18&Zc6i-Eik5C$y;Uve&?x@I(@B|BfgH+{`P&&c}SwkO$>G=sN+!i9*cPQ@Uz*4$#mi_-0k+d{;<=ILmWdQwcq;?}sdSlBgj z&yW{wZG2_QyVQl|Q%0@8bZ}|Ng>oawqp@K;a`HOQ5_B7D(DxbO;*barZ zf`e_pu2Dxo35P?7D1x$GEWcJEaene)3ZiI)DjrS@ibg;p<08#Oguf5}dO^Z&vvf`{u>wB*t$K+(dsI)B zHik!mg26=){OY^IXYnY|(VUMyTogg-%I6bWL{yUKoGEUI`fJ-Zn(HD8y7`mp4 zM%UGdd*(sv;>T0onvb8F!@4inN%mNd|3R!@Vid?ce_IxoYj*k7V#Za-9O&l284|HE zWn`1WqDQ$V+(F|GuG8y6p^NPCxp;h+2{XZ1R(vOE^`ej6AQ1e={3^fKwIpl<ua36siS5q;g1>Ft}Ar|ZTzu@%l-qis+QFGHY9$!5eLUgt*OTsG@&Dwz7+q z#lAigaPHtgvz}~{e%FrNjBOIpS(R`7s+lyGy9xB{$`NGrC$9KaDGE~*(X_%H$cKC= z*{{H~Cbp3{6P0a3B!ObHZt*#qByP)&!?rU8wRCz?>@OmKk7Q2EoMZ^He>pP?0L{d- zc{+{6Y0~vegvKP6NV1UI$f*W#(&+y-)&F4g7*YQvlWEC5Wwt!P`i)j9BmYe@U)(T7 zVjRoT%wi&|Q-!h)?mOEKVyOyHb&o2-rK`V(g2699t`Btr%oOuzzI|Ktb~%os@y;Au=`jQjs^_$ zpvl|=LZia`qBLk1Jf-F|Nmq%8`F(mIjhu)g((P#bHjnoZvCkVv=oxFiMl3@!3U%$M zI5s#s(KBV>aNL10=!{6%$g+5mZtmPGqG9EX(HOJz9}-dFfKmXIU@Psb`b=5sKsu$+)=Zg z={Ml%PnK8|go(@p#>ChJhg-iDHHXUzFhK4b?(x&RLyca-3`j#pf1Xofr_gr$x~JRI z&;jD0+v6s$uk-4k@Lu`` zvE1*t`#GNj68>=Qyyl~FlkScLw5OI2g0=vNw7eQFQ-%pbPXflal4nFzl~{@vYZQj= z%Jg*aXtRHQ{%T9y%8Zrd&o=iWfWb82-foKd@YqOExm8ags5G|E`IQS3v(P_+L*M2SrJS3} zpk&Z=hGElAvzhaWEsiEHi;(FS6~!lVZGTcP9T&j?tEi&2+>}7_g!0i$57r*)8#CUj z%PIJs{#3+pCYVKm#+pX8#c6Zph{#e&`%g)kdN2$>OeJ`rP*5EVnu!q`vrVeBQ>l%x z2!86wE>Pt274|MXe$~~fh#>s!j^da7e*m7?-L6sE)HA?q-I)&EDnvNR&k6N~xF`On z%2-_3#t^$17D16SOs!RK@u}VGtEVlG>@aXEYt%tX3?*w@XjOOjI(n%uKVbDEcxrYZ zARYD`B(B1+-ABl&ztP&X^E%mCD~aK5eWZ?uLpf{W8lYBJz>!L;=)DJqFM`PDkl6`w zd8}z~E>QM*=J}==r82rNwb3@aX?&C&Z4AmV!USS^MkpUu(yk2(pW^PT%Vq81Fdt0# zhDwb~87rV)u$B0d9CM)Cs5};UHz~S&yJYVLoMLLq`<~E8T8{T(Z8D>M$r?~-o~%|f zopsGRibOCwQ^y@Nu%H?Utkhub#qbf$lu+}_%Tt`6{erVno_m2C$s8qcp7(Q||I>f@ zBad|f;hQF2IA4%}`IJ(eCN70>&t9yQB@K2X5=u2@>AOVrdpX(>QkOu0w&C&UcZi-{v#>nC6``Do>lopc+LWlLDN19(1MvZ;jMA<3N1 zZv^{Sq;s=t&Z1r@}Tpf`WM1>a_y0MuB=GHryENwn#G5nc>O^*vl zf%dUJ)Z8j(v%z8VVdD{pX`S=b)dj1YJwWDN0y$aE&$;uBpm zg9bRJ^THnWzq-D4FE%|g>xhl=T}zcn=$y9LnxqMQv(Aik22*@1b5A6yAQMSf-4dJ% zNlwkhD(dAV{SAQ;YlXK_POEXyKbKU z`6eU@Wv(1B9V8-$@Fyl&^>1-+U1Gxo&BIj}h!D_vr7FW>N_EZUWoaTwjNUB^nu>Kb zfgeiK)QgqKLd<%~;23dP?)L^&zOVzPL~ZpjmMsFLh;?nu!~z{*;=z!Z3Ic~CV3E* zyXhXbht^p%14B{>z*D82F!ss|pi-(8Q$&jydO}zO$=>N*y67|8lv>G(A4kn^ne-p% zw*K2GP8j__zLik7(Zku`heJ#+K{?B*^T^Ca zx7u!)S=u@q0CB=BHvOM)bP+#h1Ws3g!d~S^3QhjyLS;G4;}Nmf(h^-P!cT0Pu+Q0w zHJ?Hg+9g>0E>TI9t0$hIVMKH$g{z*oTF}S!z(WuBS5F9}Jm3%I%}ytUk~8ko^%r{8 zL4;34#$*xbnfT?$X9$?ir?@zG(UpH;5V zpMTJC4AVTnb-UbUM$HT7_tLiJ+fE1=*(@PHD2^z(cO!g9ju!}0_+=w86f$$#^;k{V zIU1-A&aspFi59BR%s5lY%jwMkv_R)q47{tuQOX8Ac(lc<$_YxegGDiW2T_;F4cd=NJ28CXj71z@MLd- z%f)Ee#}ZX9460D?PSRdVk8U3R1rS+Of0~Phkv59KA`qupD{R=%f8oj0f9^(P&)rob z0)IYGK+{B4=GT(r#_mw{FU&9H^~mFnvJ6GM%dWEvx-mmFGKKIyS|O*`k}p4RAciN? zny;Oe*Al~cQC3q66fazuC84+tPfEBl>v9s~`W@b0*EVUy5lZ~nA(Ma;D{#j1JQf>Y zD?#1L#@KK1!tUUX5!cNk(7J<1zGt9>AW$~VK$kp$gdJdii!dewC)t8>JAPFCd1jzS zn}Zr^)7JY!CLxMWJp8;Al8#GCIh11->pYU`icCUdVe!e;^p|iW-g>rS|x5RaYEXA-m#FTm`7ZAo0WiLuiHM@vGW|j;?H9*-t8sgeLG9DhA#0@ zh14RDP3uw8hqmANl9H;tvn^dNf`eRx99CIDa7j}wVT0-P;nEQS<>K@OjmW9@DS$OS zYR18OraGAxn?{+UK`vw1HcTIsFp1=_TZdG<0OyF`@nw}^5N>2!Nw{f_3iOPoqa+v9d)ZZPgnWK*y{f%-KWQZ2mo+65-k(dIm3pZX#56fopwk5a z+Dcb%^&B7HLmzQTPs&0gtMY3|kEZ4~+De5dA10XN3QbDGWcVs>=ZOzO1rh!jAVAr7_8QdDa{GV_3BnEEUs zWMyz(l9Ug2<;V3q!1!z-iJVlJbL;xIwjGWV#?i1p=HO1Lr?CUzjB~T9DTxe>G_U3w z)BPKgpY*7LOLu&1Jjn>g#>v_w2&I(Gl^B^VZDIn2r*ggqK1_7MQysa`FU&s7gP-@G z*U;$p{`dU8i}sAmJWr&X80!EHy=eJKIlei0N$mneiduMeRL#bPx z640&4A>tu_FpYb#*u(`|`kO18=TTRl4C~5cfcpoV7eiUQ+0S#4sOTP4tSfF8S#D!Sq_fZVp+}3SGFp># zF866AHlbbmmQeJ=l{zOfXcy}_n*gLu2@{|wA4IAPUfGDs<>%;@Ad>1briC>>8BKmU z3`U9SwHVJU1){LixxN2m{~b-VD;c6B8?IB6;;Ya?t>tl7qh7}^EP;7#DJY7440c*L zbidv$evy;oPLI0NGDh$~Ji~KN+Yq-L3CHfyBy4-#c{;#OayDok+i_HY*FTPI5fo!? zn0s1ayGTbgZQ6CEE=C@pD0imCxf0TQc21wf0>x`Htk(!Z=T2s$p>n7oQ{Rs~PUf$Q>L zUBD>VPl~Y*$XULGG)1{fV1kh#6;v@C*EQ=bR0_u4S;pv%S$0BxWNWPO&OAjHU8546 zn8#y!E06yiOgEQ86OA1=BQU_zKs2u-j!B&iFKwEKvo};yTIdBnXwBL(k?Llz;WX8p zDHBR!7j>QInkU^rWOBo9v*Bf5Ses;cz^#P(AKDxFdsJb>%EtBQtaS|5K{akX={h^$ z-8KB}y?94O;%5lr_%ZeYEN@;=i zw(fiW@#o%JNZf}#Z^e=*M;o^BMC`Y?k=F)(tN_APdXQdOR)z0LXGa4Ztn{CErN`*S zGb&e`autyLh=|w{jt}J5rX}pLo(Sy|}`tf0f{j7&z zw5GgHl1)*>zj+R`U}5N^V%+RPzPLBw!f(fO9&mx|BgbmrO{z7(n|x0yEeD`)@Z?D^ z04Fa(l0>(N%VGQ{o)c_0{qn7NOBtgTeO_xMe%vY~9(&d<-^9XXQl6KYSb6?MeqKTx zu@VpJlgdHe!3rVHX}Cp&Fqv+n8d_E89pcZb~G~0K+)e%Bh=P zg19-kdEy+VdxarStuE3_(w)moszWCYuoQ@j3RQHnc4DPPG!cejy$*j1$2*0ofSS1_WMkcB@HGmB#FiGKGRJVA@-XBsXVe0 zvo5bdPNcJf>tJCmq}FrAw`OUrpO$6((rzpn`+9x0NEAAiDXRLaP^sBjQ`0nbIR?H) za)qgVFk2{u_+hheK`(4GO}~eTqS*J+jX(KRh^Q0uoiq ziPH;NMLw-TPe?6qENRUosgA#RvF=XYWEIzy8DeUY6q!W*>w z7GN*9>G&m7I7s}}7gyd0Do?&#C#4BL9aCecLD>Hk<(q6pvOlpN?*46hzs82j(J&Qb z1h(Rl(v?rA-AU{I;@t%=HQ=a%TXhKKd0Tnxa8%xZfSL7QoI$gt)3JSqMgKQ&EDB^sMAʢ=;cl# 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%0DNFb^oVw3k@cOQpn=n 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 literal 0 HcmV?d00001