From e72466286269d09232efba333b30cc2a47f8e0de Mon Sep 17 00:00:00 2001 From: Ossi Laine <ossi.laine@utu.fi> Date: Mon, 18 Mar 2019 09:31:09 +0200 Subject: [PATCH] Added mock version of a new question type (embody coloring tool) --- app/__init__.py | 1 + app/experiment/templates/view_experiment.html | 104 +++++++----- app/experiment/views.py | 70 ++------ app/forms.py | 8 +- app/models.py | 7 +- app/routes.py | 38 ++--- app/static/css/main.css | 19 +-- app/static/img/dummy_600.png | Bin 0 -> 47187 bytes app/static/js/canvas.js | 86 ++++++++++ app/task/templates/task.html | 58 +++++-- app/task/views.py | 156 ++++++++++++------ app/templates/base.html | 1 + config.py | 2 + 13 files changed, 352 insertions(+), 198 deletions(-) create mode 100644 app/static/img/dummy_600.png create mode 100644 app/static/js/canvas.js diff --git a/app/__init__.py b/app/__init__.py index aefa4b3..c0403b5 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -84,5 +84,6 @@ app.register_blueprint(create_blueprint) app.secret_key = 'random string' """app.secret_key = os.urandom(24)""" +app.jinja_env.auto_reload = True from app import routes, models diff --git a/app/experiment/templates/view_experiment.html b/app/experiment/templates/view_experiment.html index 1574471..472a076 100644 --- a/app/experiment/templates/view_experiment.html +++ b/app/experiment/templates/view_experiment.html @@ -9,9 +9,8 @@ <table class="table"> <tbody> - {% for exp in experiment_info %} - +<!-- Why there is a for loop her ?! --> <tr> <td nowrap>Name:</td> @@ -215,53 +214,70 @@ <h1 class="container mt-5 display-4 text-left"><br>Rating set:</h1> -<hr> -TODO: add embody tool +<table class="table"> + <colgroup> + <col style="width:33%;%"> + <col style="width:33%;%"> + <col style="width:33%;%"> + </colgroup> + <tr> + <td>Add embody tool:</td> + <td> + {% if experiment_info[0].embody_enabled %} + Enabled + {% else %} + Disabled + {% endif %} + </td> + <td><a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('experiment.set_embody', exp_id=exp_id) }}" role="button">Enable embody</a></td> + </tr> +</table> + <hr> <br> - {% for category in categories1 %} - {% for scale in categories1[category] %} - <div class="row form-group"> - <div class="col-2 text-center"> - <p>{{ scale[0] }}</p> - </div> - <div class="col text-center"> - <label for="customRange">{{ category[1] }}</label> - <input type="range" class="custom-range" id="customRange" name={{ category[0] }}> - </div> - <div class="col-2 text-center"> - <p>{{ scale[1] }}</p> - </div> - <div class="col-2 text-center"> - - - <button type="button" class="btn btn-primary btn-sm btn-dark" data-toggle="modal" data-target="#mymodal{{category[0]}}">Remove</button> - <!-- Modal --> - <div class="modal fade" id="mymodal{{category[0]}}" role="dialog"> - <div class="modal-dialog modal-dialog-centered" id="{{category[0]}}"> - <!-- Modal content--> - <div class="modal-content modal-dialog-centered"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal">×</button> - <h4 class="modal-title">Notice!</h4> - </div> - <div class="modal-body"> - <p>Are you sure you want to remove this?</p> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> - <a class="btn btn-primary" href="{{ url_for('experiment.remove_question', idquestion=category[0], exp_id=exp_id) }}" role="button">Yes, remove</a> - </div> - </div> +{% for category in categories1 %} + {% for scale in categories1[category] %} + <div class="row form-group"> + <div class="col-2 text-center"> + <p>{{ scale[0] }}</p> + </div> + <div class="col text-center"> + <label for="customRange">{{ category[1] }}</label> + <input type="range" class="custom-range" id="customRange" name={{ category[0] }}> + </div> + <div class="col-2 text-center"> + <p>{{ scale[1] }}</p> + </div> + <div class="col-2 text-center"> + + + <button type="button" class="btn btn-primary btn-sm btn-dark" data-toggle="modal" data-target="#mymodal{{category[0]}}">Remove</button> + <!-- Modal --> + <div class="modal fade" id="mymodal{{category[0]}}" role="dialog"> + <div class="modal-dialog modal-dialog-centered" id="{{category[0]}}"> + <!-- Modal content--> + <div class="modal-content modal-dialog-centered"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal">×</button> + <h4 class="modal-title">Notice!</h4> + </div> + <div class="modal-body"> + <p>Are you sure you want to remove this?</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + <a class="btn btn-primary" href="{{ url_for('experiment.remove_question', idquestion=category[0], exp_id=exp_id) }}" role="button">Yes, remove</a> </div> </div> - <a class="btn btn-primary btn-sm btn-info" href="{{ url_for('experiment.edit_question', idquestion=category[0]) }}" role="button">Edit</a> - - </div> - + </div> + </div> + <a class="btn btn-primary btn-sm btn-info" href="{{ url_for('experiment.edit_question', idquestion=category[0]) }}" role="button">Edit</a> + </div> - {% endfor %} - {% endfor %} + + </div> + {% endfor %} +{% endfor %} </table> <table class="table"> diff --git a/app/experiment/views.py b/app/experiment/views.py index 360f7ec..d297abf 100644 --- a/app/experiment/views.py +++ b/app/experiment/views.py @@ -79,15 +79,8 @@ def view(): categories_and_scales[cat.idquestion, cat.question] = scale_list categories1 = categories_and_scales - - return render_template('view_experiment.html', exp_id=exp_id, media=media, mtype=mtype, experiment_info=experiment_info, categories1=categories1, questions1=questions1) - - - - - - + return render_template('view_experiment.html', exp_id=exp_id, media=media, mtype=mtype, experiment_info=experiment_info, categories1=categories1, questions1=questions1) # Experiment info: @@ -556,6 +549,20 @@ def remove_bg_question(): # Rating set: +@experiment_blueprint.route('/set_embody') +@login_required +def set_embody(): + '''Enable/disable embody tool''' + + exp_id = request.args.get('exp_id', None) + + exp = experiment.query.filter_by(idexperiment = exp_id).first() + exp.embody_enabled = (True if exp.embody_enabled == False else False) + db.session.commit() + + return redirect(url_for('experiment.view', exp_id=exp_id)) + + @experiment_blueprint.route('/add_questions', methods=['GET', 'POST']) @login_required def add_questions(): @@ -856,6 +863,8 @@ def remove_stimuli(): @experiment_blueprint.route('/statistics') @login_required def statistics(): + + # TODO: Answers are in normal order although questions might be in randomized order exp_id = request.args.get('exp_id', None) @@ -879,51 +888,6 @@ def statistics(): #List of answers per participant in format question Stimulus ID/Question ID #those are in answer table as page_idpage and question_idquestion respectively - - - """ - pages = page.query.filter_by(experiment_idexperiment=exp_id).all() - - participants_and_answers = {} - - #participants on kaikki expin osallistujat - for participant in participants: - - #kaikki yhden khn vastaukset ko experimentille koska answer_setin id matchaa answereiden kanssa - flash(participant.session) - for p in pages: - - answers = answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set).all() - #kaikki yhden participantin vastaukset pagelle - answers_for_page = answer.query.filter(and_(answer.answer_set_idanswer_set==participant.idanswer_set, answer.page_idpage==p.idpage)).all() - - for ans in answers: - if ans.page_idpage == p.idpage: - #flash(ans.page_idpage) - flash("X") - else: - flash("NA") - - #pages on kaikki experimentin paget - - for a in answers: - if p.idpage == a.page_idpage: - flash("match") - else: - flash("no match") - flash("participant:") - flash(participant.session) - flash("stimulus:") - flash(a.page_idpage) - flash("Kysymys") - flash(a.question_idquestion) - flash("vastaus:") - flash(a.answer) - - #answers_list = (a.idanswer, a.question_idquestion, a.answer_set_idanswer_set, a.answer, a.page_idpage) - #participants_and_answers[participant.session] = answers_list - """ - participants_and_answers = {} for participant in participants: diff --git a/app/forms.py b/app/forms.py index 4cf8118..ff4bbb9 100644 --- a/app/forms.py +++ b/app/forms.py @@ -25,11 +25,17 @@ class RegisterForm(Form): class TaskForm(Form): - + __name__= 'slider' categories1 = FieldList(SelectField([validators.InputRequired()])) submit = SubmitField("Send") +class StringForm(Form): + __name__= 'embody' + text = StringField() + submit = SubmitField("Send") + + class ContinueTaskForm(FlaskForm): participant_id = StringField('participant_id', validators=[DataRequired()]) diff --git a/app/models.py b/app/models.py index 85ab39a..1580393 100644 --- a/app/models.py +++ b/app/models.py @@ -1,9 +1,7 @@ from app import db -from sqlalchemy import Column, Integer, String, Text -from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import Column, Integer, String, Text, Boolean from flask_wtf import FlaskForm from wtforms_sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField -from flask_bootstrap import Bootstrap from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin from app import login @@ -53,9 +51,10 @@ class experiment (db.Model): stimulus_size = db.Column(db.String(120)) consent_text = db.Column(db.Text, index=True) use_forced_id = db.Column(db.String(120)) + embody_enabled = db.Column(db.Boolean, unique=False, default=True) def __repr__(self): - return "<idexperiment = '%s', name='%s', instruction='%s', directoryname='%s', language='%s', status='%s', randomization='%s', short_instruction='%s', single_sentence_instruction='%s', is_archived='%s', creator_name='%s', research_notification_filename='%s', creation_time='%s', stimulus_size='%s', consent_text='%s', use_forced_id='%s'>" % (self.idexperiment, self.name, self.instruction, self.directoryname, self.language, self.status, self.randomization, self.short_instruction, self.single_sentence_instruction, self.is_archived, self.creator_name, self.research_notification_filename, self.creation_time, self.stimulus_size, self.consent_text, self.use_forced_id) + return "<idexperiment = '%s', name='%s', instruction='%s', directoryname='%s', language='%s', status='%s', randomization='%s', short_instruction='%s', single_sentence_instruction='%s', is_archived='%s', creator_name='%s', research_notification_filename='%s', creation_time='%s', stimulus_size='%s', consent_text='%s', use_forced_id='%s', embody_enabled='%s'>" % (self.idexperiment, self.name, self.instruction, self.directoryname, self.language, self.status, self.randomization, self.short_instruction, self.single_sentence_instruction, self.is_archived, self.creator_name, self.research_notification_filename, self.creation_time, self.stimulus_size, self.consent_text, self.use_forced_id, self.embody_enabled) class answer_set (db.Model): diff --git a/app/routes.py b/app/routes.py index faec69b..30da6bc 100644 --- a/app/routes.py +++ b/app/routes.py @@ -83,8 +83,7 @@ def remove_language(): @app.route('/session') def participant_session(): - - # TODO: too long method? + '''Set up session variables''' #start session session['exp_id'] = request.args.get('exp_id', None) @@ -100,12 +99,11 @@ def participant_session(): check_id = answer_set.query.filter_by(session=random_id).first() while check_id is not None: - #flash("ID already existed; generated a new one") random_id = secrets.token_hex(3) check_id = answer_set.query.filter_by(session=random_id).first() session['user'] = random_id - + #create answer set for the participant in the database the_time = datetime.now() the_time = the_time.replace(microsecond=0) @@ -115,30 +113,22 @@ def participant_session(): answer_counter = '0', registration_time=the_time, last_answer_time=the_time) - db.session.add(participant_answer_set) db.session.commit() + + # Set session status variables + exp_status = experiment.query.filter_by(idexperiment=session['exp_id']).first() #If trial randomization is set to 'On' for the experiment, create a randomized trial order for this participant #identification is based on the uniquie answer set id - - exp_status = experiment.query.filter_by(idexperiment=session['exp_id']).first() - if exp_status.randomization == 'On': session['randomization'] = 'On' - #flash("answer_set_id") - #flash(participant_answer_set.idanswer_set) - #create a list of page id:s for the experiment experiment_pages = page.query.filter_by(experiment_idexperiment=session['exp_id']).all() original_id_order_list = [(int(o.idpage)) for o in experiment_pages] - #flash("original Page id order:") - #for a in range(len(original_id_order_list)): - #flash(original_id_order_list[a]) - #create a randomized page id list helper_list = original_id_order_list randomized_order_list = [] @@ -159,29 +149,33 @@ def participant_session(): if exp_status.randomization == "Off": session['randomization'] = "Off" - - #store participants session id in session list as answer_set - #old: was missing experiment id so made duplicates - #session_id_for_participant = answer_set.query.filter_by(session=session['user']).first() + if exp_status.embody_enabled: + session['embody'] = True + else: + session['embody'] = False + #store participants session id in session list as answer_set, based on experiment id and session id session_id_for_participant = answer_set.query.filter(and_(answer_set.session==session['user'], answer_set.experiment_idexperiment==session['exp_id'])).first() session['answer_set'] = session_id_for_participant.idanswer_set - + + + + # TODO: this is unnecessary if experiment contains multiple stimulus types #collect experiments mediatype from db to session['type']. #This is later used in task.html to determine page layout based on stimulus type mediatype = page.query.filter_by(experiment_idexperiment=session['exp_id']).first() - if mediatype: session['type'] = mediatype.type else: flash('No pages or mediatype set for experiment') return redirect('/') + + # Redirect user to register page if 'user' in session: user = session['user'] - #flash('Session started for user {}'.format(user)) return redirect('/register') return "Session start failed return <a href = '/login'></b>" + "Home</b></a>" diff --git a/app/static/css/main.css b/app/static/css/main.css index 73f519a..efc6260 100644 --- a/app/static/css/main.css +++ b/app/static/css/main.css @@ -1,17 +1,7 @@ body { - background-color: darkgrey; font-family: Helvetica, Arial, sans-serif; } - -container { - - text-decoration-color: #4EB1BA; - margin-left: auto; - margin-right: auto; - -} - #header{ background-color: darkslategrey; color: white; @@ -19,10 +9,13 @@ container { } -#nav{ - +.hidden { + display: none; } -#main{ +#embody-canvas { + display: block; + margin: 0 auto; + margin-bottom: 30px; } \ No newline at end of file diff --git a/app/static/img/dummy_600.png b/app/static/img/dummy_600.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5363d79486b525f41bf3b142117b8d509005dd GIT binary patch literal 47187 zcmXt91yIz_+dsOy8<Z3z<mi+RX@5#e!=0ocCEZfeAbqq-cZbrQ(w)*RAoVW)nRgrq z=j878yZgi^o(<DfSH#1n#)d#3c*;t0+TiC91cI!Ki4Okt^Rrnw_<?HuQtc%KQW1@F zYl;SeVDrLdWi^#$Wf>iv9IW8BmJo<iSVofD>(|rdp(8DBpR$K|NjYSXTJRWKguai< znSP}*VMoE|hgLA<AQQ>Up_07}c!C}o@}%NPc(9+zPx=@}M5hU<mX-&9<(rS2n=Q%7 z%M8}uHd!r~64poFQ;m?A=DUXGkGj}?&`dvuwM~`i$nXO58zkIg2+APDr1AwnvW!HB zpOPfK{rRg{lB*|}enM`YoDiX?=D<H6j~|p%6Ms^C9!CwE2^i|L2&>oZ{5~6iTj8zH zIeA6O*TK$rCXYc{(fpN!V)nRd<cU~BN=CPNgs#^Xt}C^{pv04<RF;j;lqVD)w8)d= zpRXA_nR-Q5@In6e4Q*PtsTH!{lduD1d`{)gf+wse9Wo1Y&7=@ojuXx=58-I(wEkDx z_B&J!UiM~jex(EBxoNX=Fa9j0@4x;cZ9>{<k<WW=+i37fA3Z)9r+qC$N>#zopz&Mp zlvVB2l)_fGl`+|FoBh37m}iqxS%B0fZq9{w#a*KDCkaTTo|c`fS4Gzm8p50(a(dY| z10_Ia<k&U1X@7f}9k$J)%-CDb&(}9REV$*Q+r1WWpZ&0NEOh?+GO}yuo}FMZBfg!q z0Q=8cW5u}6M6lN<EA;rTY??cd&kr9~jI%m;gW}s)o!xUjJB}rM@CeIsJ)1E^63S5A zKE2l=c`%*HsurGpqD3u<^uCxch8lsqF)itrLx@D|EM1LqHzwrkB}~}XjQKmPtKos` z&vMl-%Qcqxv@4O}=gg7A#HUr{mz^WT2qYvW<Y$_YXVNHtke{01+xkg3qSLoipa$>~ zqP;;PS3-vS5mdgEoWTs2#+pHL4ScVOLoH1LLt>N05XR&78(0yoN3svZFhPwB+%`dP zMmi%zHD!7s=TFM`pAyaszd<JS4NMQ|dreGIw62$7gapJg*Q2c8P@jeV$QJ#E^^aZ@ z&B(7*CU8^&Mw%Mn6S~xa`6}Rh`HNz_w07JXw7-EJD~XOznyH5aaaIo;$qWe?0_Rt8 zj$N(<#gU~#t%>{yiKufzD4B3O@v!7_Vo`&li)F)ORr2WJFB@atZLq!wc=hy1ladro zUXdz$Uu)^xCOi3if%kMjNdJox4S273fw0d}(Bl850ehj3W#?BbdxLm77WT*XBT*yq z;%9qVW0_@z=-g!!UP@{O4D-N~ZaLF9J{#WruXkVH40;SQTH*3XbeWNrqw8YWGA4zQ znM9O(R`ir_m&?w4*f*dhDh%iE@mS0GAa00MO6*4JMlKYT);_eJf2{8==Eay9HPV&5 zN^@*<g>)<IlgX$y$|Owq3$rgMD(IOE&MNUL(<)i4(rdOk;=nM&HFPtw6X6r=4+&Ra zm}SS=8e+|qWX4^`O~*aPCB`{lq!g>UvMR=-Z5(W{p30w^pBi9=2UP?`qZ*jC$VJID zb;fk!C^zRN<wa~f>l5!&>5Gp;iJQ=N=dj}t;wYFD{Z9Q|N4rD2YMd0#zazZ^-O=93 z9e<n8W?BAX?gjk|+Z34;*%uU+-Rzk1folq;T7p{C?8)rwuW|ni-IY}<NYZS}{i|bb zVQKN)vcuBZ!p35x_sb|@s^Cy)k_u;T24XS0C0QrQId;9*F5V`VCN3@B_{kC1NGwm1 zLt@+Whj;#^E7>tQ<vQ82tFcd1w2b+5`3z3{)>yiBSSDHis_LqSC#UN=8DqT}e~Yc9 zpZihiy9WG?p8Tw;h^$B1sr)9KEH%7JrBWrhUoVm4zwjTq&)(L^T%_;vH*zfoXR4It zT#i~#CQLT}4tnqM{_g$RuITQ-Z=6Yk-wbd<C?z!(H5v6HHGk@lRHW4F)S=YNnqz(3 z66O*K{T6-aIng<yIfH7kYBrY*7q5?}A5&fEcjH_#KEB<X+FKg$_``Rueg1cEaWwRz z<UIb|<{Sgp1jPoW^ruhYOWEq|5~h*zCC8c178_;>mXo&7_pkW>3UTuu^7@$Oz=`cD zC-SB@;=d=tf4~EGQ243%jjNEWxT}_jE{62B1h(q9ddV}%_nwPBf2U8a>%>K%yHt~- zi>7N=v0M8OW@kQBXJ3(7IaVE3HEYd3h<Fh|nIFkn3p02-e^Fa#w>+yikF~Epb7$pX zk!9vP>ErZ$SbKOpB;Oo=7ynhLXeg0lqj~!J%N`;&0k#62mI)GTJnLHL+_RvFOx4N( zzGRBhf>N((!D$g8vAP=j?L{Ito=dY!9|EfAP5R&T(GtHUNF>rEtecCQr`$6x6+CY| zj?U@-YW+36hF%X|&0UpV9GpD84*vJwjl{|H<@SvmT02rJQWG*g_k@18!4wfDvNy6D znk4o(mOkCNIWMa)dp+wF{Ii~tkCFpB3smqN_9u;Zy1cR+W56XDC)q7jHKZp<D0oD^ zUNJ#2QZ7}lG^&|CpRy}zH?mtHR8dG_r1V&~!n4ag^1oMFgBgjUoX&6F8RgeMbNQX3 z+ox-_-zWUhP;OzYo?uYgO2S!iiOt9O7Iz@3CiEixV6fCg;{&bmW_lQEXwYd;pIm6C zQJ9Xhx^klOgrShVz@=rSo0HwCp^8cWYC`bj=gBFkp}yf9M<y;$@N|4>TxPuFSJN1+ z1is2S`-{Wh{9aN%=Bx<~FRFB;$?jfVV7UaR1?TF0(G$>fsOqTF*iza)cKYXZ;as<= zzTvUu-Gp8fQd1yi{M^_4{*QigjmsXw<z%mM+NPMtP^$H(O-F20P!tD^?=#-#>^$x* z9A-Livz=B$epL*;OG}Gj4!@G`Fxan~w3oNrv_Dw3s<1n%)#%z^vtcP<Nn~MA(aWE1 z<+~}^O$$E2n!gz+9>Cvk-(NYXubO~w$2#qtHlJ1)AvMi${vqokD|72PY}JSB={1Fx zE7n`*^|$?SF56n7^OSnc_TO^phZ6W=VYS12Ys20Coh(K=LG|Rb>7>b4sa^^9y5XYI zmUm69r-WOYQ`v=ht9UKTFIw&1zqaLq-@1QwbKg+vjm>0DD=5fSQ5;BJwK6@MtoUj! z)av|DTGjO}zcg`5--(u%g5LM9_rj%{`c=js$v)xP)4(Z$n>lv7t^-X^`<qva+C56v zueVn?mUR}5{u<dyQ9rm}RnP6D@>g2-4-*fQXBr77yV?Ks>b~B=38Uz4G;d-sjBIu< zVyiEFh+EF*OqSp=-gnuNaO+y_-zjo^t6^krxL0rQ-O@7hqwIjKC~NLt$;~{5ExM?~ z%+eofLs56vUihD1YL{ur4%Z8fKAy7&Kg9-)7U;fE(KigVih1x{EDhY~U2Zejx_|c3 zy;a)P+BDDaxscksTM#vqaI%{8u0B%!6OUnDT(R9|aer#se9UnT-wfK7o5;J~*x?xY zPBZdGoW?iv#LK7g&)Xg2%a&2^lMaXBwu>RT;mEd)Hp8oy^Tc089c9mr-A2%dBz@xl zTKSY-mHe82dPI5jX<4y3>+8t9-<{@#){*%%Tbl*}#W*?nJsQf_vs+Rjc`<+`8O@cn z)gX{htPqG_5CrlMyyW)>0&(GmKz2<a5Yev?2!&&Mqn0@M4|FqCMLEdB;~zvzVLW&R z%TY<s83Mr}dHjn6Nlm8&FJgRDR+GnAM<Ku_7N#%Qhy`B)QI>o8+I?=n#lzj`x5v?g zp3PBiu3japK`qxny!e11JyIYaItm3bEu*HBEH_i0zo4@0%{e?i?XS#E%R-)VJv=Vy zF9oBl@?201sx9%Lh3z`lK$XQnpoKw_rCz)M{Z4wz^uN0b3_6crCUiG5OAhp1fByV| z9knchZMbY&dI>8L@JA)?^@zZwf63^Niojxyfk444eylOl+~$0NiZQ|`l;j`gisn2n zUSlgbb}tLB7iONgEsnVO8fWd~qF_nKllBUu(JiUgS`VX9LfAEH&&njppuc{*5p6>- zZ8>;f-!f<+YHmvCBeAnHmJ?YSHT}kiqc^_W%ijuMe8vXvXYE1@pQ6rAJY!`VRT>@t z8PfjNC(7|BYYb*J<&_dk`U5d_!kJD``!yclv0_aGmA}(HH*%O<{n41{A+d`|0P?8e zvk!^BF*3+99E#srV3ygzC>WR`;oKMoEC(}$J)b{cA#}2X&L5J-k(rF7GvBi(T!v|l zQZq4Y*LPzf9d2K_V->%Gq^erMf)twOxbvi8!IkDPsCNCEuK)gH!dSzbuf>qgh4x=G z201RVjk43pM#PwhCH(#Q{q|CLnI>e_Os3w?QA%%~-2e$09zwgq9;FZ%gJdN+EJ<a7 zYRG7EZsNIG{|eiVa~p{U-6ZFALTM?cghUH_{<o5n{F)lFqm%hs3HDy0!HG-$`AYOy zw2)Of6>Sx492^cBesnmcg+*R$V&WG<R+C&i&lUY@$6|bxig?Tz65UkQpD4oiF)}tZ zOfM;km9pE~lBcHDZ5JC8-IhE;htlds#}{OVTD@g`p6jq`<dlE=9E`K=d^V)|Rm7S6 z`r0E%23|T~l}pBmM~JS{@aDO0cl)^Es|q?rj4*Vu5NRe{l9+VivB9FU(v@I}cNQHX z7lA%J0s@Jq9U(;6!MD=hj3!byaq0i)O9aMX34i~({=2!sXmRU{V-Y{?-ELU_GT%2c zf<ii1DXmmZB(qxYrT|HUKq)Ao_?MQ5m$R7goCLG^T08OU4V_}$3S>V`_Rh~lPuaP- ztrqG(Y;0{+!p5F}ZSZDvKTNWlx4!c%Y*pltH#dJuBWR0gX~}486s4x25%IaLf5?>b zSV3w%iE`le?*7<ArX#3NJ;SX-k?x3rXt+8|nc~Ld+S%E$+6*VV9dWp)!@#GN#{AhC zMxs}4f;5oKV?CTMvazuNA<KR53ahP~yM}mVs2))m431S9s@nARuTrCue8(9Kvt? z=9oZ3qN{S={;7ZfUJ02#W{`~?GM2QnmOMvPLcr1zz0Y|E!^yeS{Zk_&Bk&MT6KX;y z$-dXgud*cR1}Z~v*|(83RaCIGRcdW#e_ggccu$oYslI(nffkG=ezBqBwHm94Sy=FI znobEs<&(w5MXyV-<<<G+d%>1i%>4X(@xL?XUVp2ySZMJ{q7-=k3FH?PjL**YMewxt zo{dOpfc<G`5V>6xYU^9~{cAZst{oVBLum$fIbH)jdKKy$@lx?LQ{L2ZD)MrDDU-YP zqQv3k!1o{96L0UqbdmVNET7cPf#j$8ot4F^PMk@WMEId8LJstnmX?!~laA*w6dED> zCjtV43nEo~L!$_ksrtcs{)PG*5+XlV$PnWwjLlSamGiUAdghV2&A~&j^yu_-N7aZ= zwC}%Rx1EEia>t*@nI2nI<lKgzE%mTmx`szwUSl$S758|txw-lH9aqPu&+2TM#5m(; ztE|l_Sp}&LMC!f}N{X>HcWU!IJYV^SGMfI=obGDcF~Ez{s_6uIrWS3Em01n-`1XwF zH2UGn7nC}S!-WR%Gv5aue(Pao@`zZj%(5x!eA4xvXzSanll`TZv<}5D<=#E&3ent_ z-H}wKmQJO!F~sxQ?DJtBLCFqJ9r5!@okme@*Qq3+tGX0CcJi3jcDW^#=-3?+I=*K^ z|9NeTEoYaML@CF!p1Ap5y1hyhjDkT`DucuIZT|iHr(5sHWc=`NnuC)wx1u7}!F$iZ zcBY&@tX<9=G5Q8K!Rb_4fW1V^UK=i5gN6{nfu$S1u;d&i#HON@5knA}q?-OHay>hr zc<A*<!RQ?s*|sshp?2OH{BYVAmtZiaZ>~okLBX?i(!;<eCYDAg=6c-raQTp3`j^p) zJ<{JZi&&<>-}!dKLJcEQ3zAy($yx?Gk10mGF)Uhe+;M>)o?2a3bF8s^&22MX+67g+ zKi7CjFmPxg<Je@0HXUZ`=EDsHfp9h|OTd(GvDu$^yAmpuS9Hca4vp1jWMQ-o8dc(m z4LOd>Lm5SlUcuc+!JyR<X8ThcJWBnPB{E#E`S@2v^X=&X#A{b4Ywafn12ZS*UOL-# zA9IprY;tl>2Z7XJrR4y`{iG}FxXAd9+Kw|afi$T0XKlta^ohQuDSsPszpdh?ik>(Q zw7J{_h-u~Sf!p<1+bt(Zi^o`1WbjT{TU%3g!gppGpPufi|FC|wM$x9^;UU7Nk-6bH zA~_H;WFY-DQwrnIx!iDy*KrJaG@S~nPg2EY%ef`pn_v<Gw-xV>&hpI!)dU+G`)WM7 zRZd>M3mz7i93l6FsI=)&RPy0^Bt9)o)#ZZzo!1FlbuBb71v>;{%f%UDX@I)Df&?2T zo2vI|aV+A>=&3gAQh8^5Eed%oE3=iB>V94+&*I${FBhB%>K2@EAP*PD4}G3CQ;h^N z$ivPtPkOa*q@D5kg4&_DxD$>XZ{lTLT$=yR*~mR<d6h04D|T2P2nw!|;D^D6wX|Qq zWDXnmxK&hDcXoHz>e}v}M@99}3aMegnrMecLWIFm&VJUzZyZ|g$cx^TAg@drI9M(< zdz@cf7!h4khso(yT3}5ZxzRz|u7@~nL7i>i56Hry6NZ6zu2lNvw`(JppqXg<ZtyzX zo<yHtUh;oflS|^#lTlDm7@ru}rt9F4fAfZXAnAE-b#;PLUh?$Y;uX1x5AAX`{w3+# z06aj3b`VUZC10DG>=)|8{&Q%?YG3P$0EPA^nYra!$<Xt<g<t6+&a^gX{YNu3P5s`i zW{k%C(rS>@2_*<p$j8<o!gIwZk6mo|kXuDXr5-$R@8DpwS@GcaDXWvUE>beGF`vo| zyZKt8gCkjNqRUsvbf5q~gHfi(*IR3l?M<~1w4d)xqzKqdS*r5+egzNz;h<*vh5dps z+ZWF>HGGC2V(ZRW(j>i%qn!h>PZeicJSiYLh3b~)f5ws}%v}X5?9x80ck_9iT0ow0 za>C!g7u~CR{QY*>F_h<>mki>)eP8fH2pEQgut<1u*TW??CiKlyS>svNp78KQCr!P< zpZbmT9`WBtMzF2w7}CbZLAAB6kpBLDb{-x!@(80bH~J`r6h3qGuC6Xfb#1MYD~Ajc zjGNBt&%wdwMqfO{!qPG}KHj;D2x46+=;7gEVPOFo1$rAmUT2yC&{PQ28ZEMj#-*ml zcIg%gl9G~wOCz`+juE9D9uR=6t&>qeV>4B}sk>gmm;*M)XMAx&R#g=T0+!hLOxk>2 z5Dg9ORVozAkAzKqbb7loSRZv83KnYypIpfhqQ#F-ObkwV+p`|09Ty)T2p3(Hxl2_u zz(9b{61;qM<5yuv!<7DPxQIhw>AOCe`gN^?5lSa2LL?p&ZCr=gf9eae(epRmPf?mZ zr<U9W9J5p*=@4k4Kl(OeYcjd4@-~)#sciD6DL8d$$*F=z%&Aj5gYfU1T@WNffEe<S zNb+A*eoH1jtlRw@)E9(EU?py<{7$)5t)02v)PE$?m`t~^jPwy(;%U-GAgM`&8T0+& zsc-El$V&vWHQB$2;6CCyg8!&px~w5yUzwfL79mh&b~?HYS}C7}WxF!gO+MV7enBX7 zbYg;pT^9VV^Df=A#lyX~T&`9K9*u&J&;5VqF1GUp-@bj`-?#nb=_%s40#V__)E)s} zh{CU1L3wANv-V9Z_p9)SH8O(=j~}{8UDfaj_GizK5oJOFbXCY*n9|Pnqacqae*Z=j zULVxa)-I*Kd}X61Oxq33$Q-82$k46Ol@`W8h}6+adVR&C5rho4Pe(>Z7GXodspjS7 zL5>fbj>ab!_HVf~qrfJHJN?e76Oys9p@ERFzA^#5EZKHtKi_erKs}@XE1x+8W^aFD z^xLFb2c(n{|68`43id^bMNFpNp`n)DZ`Sj*0G44Oikff+@Xa0r$&;~kVrgnh-P>CN z4u|Iz78)nQp#Uxgb(rq%?*7@|$0Y?P(vVTzp@@IebO10~DfJfD(s(4jMC!tVVa^!) z#l?jm-8ThDD*s`{jBBLsB>eYlUEN-=m{OI|NCv6Q^mJOtzg#U_F>*~L5M^8;3168) z?GFwQ3tC$4e*9QKWrJ7c=Lah>BTM(<G6gEvfL|)*V+zO42y8L$`BLHg;PWuJ_C8jV zUCza&W;x3G>i9{}D<<LZARbveA-wM=l|ToVb#oJ<qoaGvLNvOxq|Quiy4D#+N=}ad zNfHT$9F_~A%~#UUC`2G2el4Dt<5N?vzw2QkrlSiBgG()*beuZSbVuQR$t-Dby7HjJ zrU<#wLtI>3_7@r^q?p>qSy)(thth;5W@a$kb7;t~Jz#(}i3A$2op*Awv#+GuSfOa@ z=yZV48PzvF`JE<%nV?<#t|hf2lmLa-cS+pI$*DY0`LWXO4+I|kV?3i6wEh`@24W^v zz~)<NY3o`E2n(ydsgh#jHu`*0)g-QLv#nPUTQLa86MhLoH!sHaNGksN%Oy`F>-I5* z`(uo@^{vGBmRtjCiErO!7ZjlTjrjbnilh^pigF1!@dsb^P1vM9oGJfjrGbMfXawNP z9^VG4+8yFbC4O@9HGrQ3^A2rMcJm9>?tBpr%|F?sasLP9MAoQF$Y2pERaU3R9RyGF zEw+a<nos*VKYsjZLfK8`G642&YO0&Z_gWR7Ui>pW)oZ7shf2zn7B=8b@Bbd`jg4Wh zW(9jK85(oeRj2QIrl%xYdpH@V`(8;MX0XiLNr}R|yyK?jyDz_s-l7~gj7W423Gtva zyK;qxchRl@D!R2_py00!BQrh!^Wy%-_W>8w%XHxn0g0S%oj|eXWL0G(#nv(~7yzFN zb8slE{)kK9eON_GhNn31U7D!%l3^PH-Nyf%Z~7$9{|$9{!^M>4g6EMpr1|deeDm3` z*xSemt5nvqmcP_#LJsIFXIZ{q(QwF-1@+;1(3lW^%t|B>4Dom|=)ZW0La_8>V`KZ+ zj_y&-d!q8|>XN~-jftjMNwGg1ue@CHJdyyY@9PUoY{0+R;NN!;0>3_H`Qv`80&7sf z!wic8-8Hy#O7M(=Yh_sM2z909a>*RTOL9vMpIW@ovR8b6zY65gcg2TQBO`KLP>@&^ z%a-{wq6B1?^XKt;zn|CR0pId_`}(bR#tqn?KhLkKiU(cJ5!8SIa^V8F6F|<7bV5Ue z0MvDh6E)S|-rk($sTqAj9rci)C}}h%5J^=5=$~h)qvR-A^;PoVW=KK{^<VQ<lmAr= zO_dn%7_dGEab9CHT?wCHg-BlaHKj=0P$vK;I_yous)EC1fYFx<0?W!0I#<g#8kEP( zjHWGicN#pkK`^lSh&KR>tFEpt2dHJ>1<D*RZfa_(Zkvw;KxBCUGvwECu?UIbtPW$u z=##`D>!>gfJ7fJ51qINkS^>8CEFxD}n}b0Z@(7lujXa-206MjNxW7v_Qr8FB(es7Q zcD54D&vGEC!f{o`m?LkBQpFUerX-_;tdI8CpF%L61j&|#>%1fRH6p^v#bvQ{d#%Lr zy|lETvNBGI*=cqo4~yx~&W`Csf!gHMlo=&D4h6S`u6^l)^O29s!VzVNKQ3i8sEecQ z)-n*>1msQvK_|C4kRur$XX&5P9%Ju#<>x^6TwXyzrSrD>lFyAD1Yo3JIr0(ci&=!o zt4noL>Jic$meOM2u{5I9M4aERDeexX3Pe2OYbF*DYgQM#zt7LlnZ0eF=I4Q9{IBRu zh0QcKZpR9MoMz*B%960^DR#2KEiCCXK0``}<O>MN19iJKy;n>y4msqwD(f!t$B!R* z*5lebI<xg3o&rGU0I9#2GPv4clUzk%UCQ}n{A5@Fj~Ozgh&=lJh2`$+`wb0xMj@eO z0Cj!t_KYVcCljjmkh3*E%ZB2goDT3zjE+j1nlcecUQu;_p>cb6NfQHktXAO}ravkY z#<PO9n&5{ck8l{M2tp{w1IG8`W$v$PGxRY1?dF@ocQ^mrErM_vx2E45I*0E!Qw}#t z9cBKnee-OJ()gh_yg$6u)0@4W&AOukWDhi2pZl{c=d0t@yeh#}$FIA)?|m+cj7{~( zrwyI)qQy@!cXp^?=!e^r!mRgHsNDLH)H7uD=AyMbx7$l<-Nug`4+q0yfT+0aO;uP8 zrRL=z@)JI~xSaf*chJ$(3j;N2H`DWxh*96}TRNcLe!rymZF?-+4lmm0?eID%&-Et- z<f6S+abCZE4LRO3en<s5oL3<Tb_Fzv(>a?mB*%^%`Gtpe6c}Rx73r}jBFy(WP|6rY zy2A>My;)Ab>EX4sN5Ur__g-09IU7XTVv`$5L>G6%I2O}qh1^Fh`{Tzma83<(U&Pq6 zc>UkCe=+Y{JJRSH+Xrj8?p3j-M1OJUHz9QuPb?ddyzVt3ajE(49e#U(S{ls8rfCBK z9<jSyq1Jv8yIo+~u;ZX^8Q%}<>v%)5&XI=7j=^uxvkV>6*W0$9WukJKfUXkxoD;?5 z=I=qexW{Q6gR2S$K(RTEjnsa9@oZXJTK=2w>VBpaSs<6AB9v*r(rVxhI4#t1#IrHw z=jG-G>T)HKnnWw)espy;3z2!1Dog|!7)JzFRz^RyI>rn!*(PFKzz@`$omCc+T#Ojd z?l65(`NF794Ha(TpWgt@sSchZA3vBhn|(9BWjkAYV4OxuUGh8uUjZ2%(NOOxtj}2; zzM4J*b3H0$rH&%T4vu@meXM>dn@t$26tuf5QEISbC?pCSrS;o-q6jTWP;bGD`)#vi zK0>d^u|1Nd0iYR++eCtPB&|rCUX>M6x!s<ipl>-<m=2A3Z<Q7j*i~gjJ`r+`tCZAT zpN4nRZU~J%qm<M`T+{nnJAS7PrBWA8H6gpD!7`r<PVigW^#^V!sw93}W=&EdN}FQK z_uOT-TV(CZLFr;{+##lhPO7;z-B30A`c-uMhD~zFJNH%jcULD7O0l~EtmObYbLV)n zT7G@Fiq1M+Xp>a5wq^s2VzZ)$J~uCq8Q%TPAW0t3QsaN)$&^w);s<tiUPn#K>%ZUn zMkK77P)X%bYDfZ!=BN49)#<n@&xzE-w$S&oGHXyw#m@%$2eYK4;1H6dg2co`EltgK z05XI>owFO%+2<D*50=g0f;5Mpgj&<7dvA6uV<FOY2J07!tusAB9K6<P9$V&WN9fss zgKrv(Y7(<uYtmFI2n3ziuRFJf(nP=~`QENG03+TCh$h_gg^M@hcX~U{a|;B%0dFIH zv&+IG#pmH^-(TXOJV(_RRztdwRysQWJC1CC^9qS6o30$u{>9%_zq<84RLFhzyYI0< z133i+SocUdsMdKJPUoln?|iN;GkyNSQ`6FrbgN-R;CY!<$$4bVnkGt`nVFPd;c(%F zeB3hT?37mazv0f#SaOt^Ka2?QA8dv|lT%_VG8T1It3P&o%nDPrVh2l$>9j(k{KtRw z^=Xsq%k$;=^J>pjTH^Qu4J1P9c9q~>Q3L2Pk8;*tX%jccxYh7mZEbD$^(djMP~R&c z0Sd3Q`5d)eo=oaIM8GEsat_#QwK1PYlB1KGU`Dkopd`7ji!v7ws{0iS$iNBvkum|6 zPYLL@{Jd85VoY~V0Uj)8u2PmA<WGn%mBWQoJ#>GEab0-i6K#CEMgd4CQcP^@&qcT8 zp|@@S{_FlirwXNR*{4?pO>87nLi}dGs#w1!d}-<3!xFv6#+lavPpb-i2Nnd)5Uc?Z z=2zG>SH6}K?y46abyv1gsCqBh1qq*O*NWV+5BRC0*p^}uTzR1G(n@?v@V(z=I9+fa zAqta&D5<KNKWeZiog{;x<J{lh4>WGcVZMC-{@LDi+4ih;mL<R(_uVlmDSadw;y;sH z&kJ!G-UY!a*)5UOll=b*F%j_o!n-Lwt~hy%0!yHo#xKryHLTTP^@LlR&j*B<tBC_O z<949!_Ve(tdizefl-(S(_22KZO552NxE)HOA^S3&P&Km(%C?8QqwBF~pH3iPm2=_v zH8+cAy07tgY{V+EKcn4Z_RQ2jMPNj)kE&yak%AOb9UgRAw9)D0H?>cHx+pC~o|~QR zzYWA0fLRsO#b;MJCjdFVK9hQIK5RZy2gk`>G_$$hDGI8_+jkzp+nJtUKy!QW!NI|C zUkhWqTG*z~`Sz{%;AAUO@8cT91V+?moMS=rsc>}>GE^&h@k7$<>-MqQoU*d4knZ){ z^FpchtcPn1Q1-6+`GH<Q?|rTX*q7w^#Kg|gQQI>^T_#ix4vxnT^O&R)S@#M5{(X|N z9{}oH+5K+W)nFij_Uo@2`tK=m!`$AK#_Dn(eU*Wv4or;KbEj6@<vCV<YHGR>c0Xo( z`0Mb{t>ODmhk@|>_wNabi6;PLpS7b9fOGMf?Ric?eFSQET-M#bb@TbSDijL6;?wx_ zN%S$eJkG}ysU#W`1_#Tlp2JZrDV0|3UW5J9P|eLQt4oWwv)f;&$nbr5@B!+5>sA{N zKYu(Bg6Ti~VWM|mL8`2(+S%K~p;oP5QC3yW1qx=?!|gWs+%^QzDKj(aA0#f9AK<N5 z!HQpB*olfXbYNOrpeAiOCEn{slGq(orwji~^VRK(_Ps^ExjZ^cWCEZ92qq^$Dm>}a z@QDL-?@6o@B#8iN#KGr`=G~_qmfgKQ5s%Znhs>Rc!m~fQ(UlgnFHTQ!C^Lm3W8mlr z<xhz7%ZahEmp}=huXETIDr^45<9mYhunj0FkTxQ}>lB{Oj`$?a+c)7&K+E)n_H)A% z;v9uv`T9z6zA0YGPkv_xP-1mW&9!|g6!*SoTe9bLbKv{8Z;TQW84C*w1NK+HEm5hr z<EjVx-9w|^-N#qj;Swo&zE`s`plNAo0UKQIedGG3Sodera|77>_oq?<K+FMUv&#L% zEQ!Z>xMupDD)_cB7!)#qMu-mJ3Ls+9%Xf!v#YRm@NlD~$^YeF?QPcwA9%ox0fXc>a z-i@meMJ@kHpSt7p^!AcHUsGQUrDn}gv?L?F4Jq6J74g$j55nBfu`46iV48$Rsq{36 z9Hlu~6T5`8q@?7d>&J43Wl5ih-J;iT-=5vy91;B62TH{0>FHw+aa;Bls$2FElb4r& z)c3|FPr8x-K?ZpaK(aXyY#(JrTG5Z6Yik7?o0@<%1JtuejatKJjpTo<e8KQE1P_H{ zj9WO}P%yZXj$S<#T_#Y0F=%zG)rcCC1r2tKt6!q&it8^!&5Eda&XzdNtCmM7m!n1f zWwL3g`61%ss7+%rTlU^Mr9fFri%3sT4-nK45$CP)k2~6J3w3R6Qj~8#5*Z5RlY-9m z$haQS5XhOv#zwHm)aSQs>R;ROgqC`}FBf}2a&vG~slD%&;|R7B!BfrSK#Hogt&UNe z$fhWLKk8mWhe~bPMcD7!C`OIm{|3P_4*e!I*B+i&cD4YjQHGe?Ra;hU>`MS*a}}ct z^74Wn<x>uw0$w2HfqDdvuKZbYy9>Wsd_n^0tBJhE##DgJmfY9zsHv&Hm6a7XG|Xyf zAb%C|MT(ZV7j|3lq3L?6fZ(DDlA$KHo1dwTN<tsU%_hQ4$2AH@R2Ys@mMVAGzMTKU zU?a>nxi{^wa`SMc_s*aK*>PA$;R|gaP^7;~dW#Azxj&5{e}0PcdcO7!3jEcUuLV1S z?8IT^RzuW}4E%7h>3dNTunET4h$QcJG|qmPc_m(-ZO0R<zns?++G~e&NaKVJNrz4p zkwE7}yr7N*Ni~nopDe9|_^@i5dst!Sr|{BJ?sny#ww;2sM`#QPWz|H>at-TCY2Rx? zOi;J(5#K?;qygGm<&fn}s|hrkcn!(EyUS&bmoJg@_3)XPnQNVzNkrHMcAqgLCphWy zGPOHa-QqJy{t{}tR=Z!9^1&DGdMC8_ktAB`UU;HVqo=aCh_z-@1tTUQ4oI>mpa}sW zPTeMaSivLFz5H;utRr4I^I<d5^#^{Cbbrx|gtNl5zY|*|m3Fz^ykP77g~M?-jW24t z{bjV|KlZHq^TG-{vCmqi(paG#K&=3s&G+;d4o|t~r9I@ZVf)=9gaArcfTd@k^CIn7 z5gGKP$~cJ7>-Z;z`2E$okH`sN)dS1-2g@(42EVSn+I(iRER#(rARzFFqnhvk?fJ>- zJgi_yS#(G41a9pZhJVNHGleI}z-c-#0R^*fJq}j9S_vcoTG2KzEjG#?{+0Fh^<g33 z6e)oZQd3j&+A~;Q+e|hF(A5dpsUC;M4~b!$Bo%f88Q+~xUdEFy!ceg}fX*!1ncQ}3 zIaO*90f@-;fbo{Y{gwmxTmp!5VwiS#x`AC;)Bn!`q|=tR-G6!#iwW{%^7n72;uA_C zE`2#y^)EVGA6x>uIr!{tY&IS4|L)x$y0xLKL>S*bF}|6b#tiLv`#RWyahs>sE<Pzq zL0%pWXkb9Iiod(LB-z<BAG??)QdjE{TW$KrZDCf6HCp?(iQ$93`6sD}LElXfuQ#{5 zZTC1O0-&1l7+?3l1popEEKrq;{3$4aW!?ui3m<yuz*%VcoRVbv-Ut80c6)Cvc(9uh zKB1V=i5Sz*O{6J?r$4;0zbi^JE=ZWbLPssTzrSogUW<6N5Zn$8LEFayWed3-bqxiG zK0$3)5p5=O)$osQZXk8<XpWlilGYb&X!33AcxtFerOKv_nk88|VL_zB6x?j=&^f!D z!WwCgU`stE)A3Qwk;}|Gdc|mZ7SMRgyf!&O(P8Z+z_Ew{s{{h9`+h|a@C+=LTfJ|= zNpEz9vF2d{QmFz@e`Tz=?0Dma*@<}B+_#g7g(2*tkU<J-rixZi`e7=JMfh-kBxQBB zMF4RJDCN<7h|8JxVeDgBIu8UQ$th^ikmIR&hciHa3rW&x3I_5-?DB5?b6WB7jsC>z z?!LsmecB26oEJkG(ucv|)$ZVXV*pMSn2;MJSy!k))ActX@6{_&^YM{<^oUM3`W`po zk$D2zXiiz+Z1uERUHd}`PUu&*dUvl3&!D39-Y;3V=WP3PH8_5u3_f2$uSN62+K~0v z(bD<}vX`L!=BRCCfagJU_zBVU1~*@^{+jetbS2z_Mw_JsQ$LWH6{dIS?IH(8fC{fV z3Of!UixjfwgOgtGrg5+U!XTvh-5tH>-@^;v(wZWNlOaa=@xbo<_+VH5q{Jp1T*Lzq z7*CudfF7g)U>7m13A)oeV&Gvw;ly=|t~3zf$*)97-G6}4&C!Lf?PN;bF@??YOQDb) z+-i8zr?&H={`UOgv7O=exy#JZc}QR|Qz9)PA)&n=)oCeD8uYBQ?GfwU$?rfCcvGS; z56t!uCiG9M?+x2=X?>Y_V4dw<pUyPbbhO`=>h}FTm`ADyVDBrhsZ2}_ZLeb7{k;#M z|6Px~xV_P3Pq*dM1%h%;d5g4^es{oMg2euI4Wig|;N$t})A!=yJfPiSk+AZ5{<Q_H z9EFplSFu(QDBgo<LeT&xf!;LJ=)xJ>DjCFR|H+?1k-$jvDT$j7_9i)Q*L1(_O#PDe z;A6G|kvLG7H71&+LN^kaz#oPLrXl4(HgnydIehhAXD+PR=oHQ_w2A89jm(utdY{E> zh$u5?3IPlkGMFKj{Oi{*KP&u=b$E)UmbUhq8}$#cHm89tB<~4E-UVAfO7$1|;{n|# zOc|;6K)z%`V@su;tuV(xq)2!Q0{!IeEd(J=%qfHU?AfzN-BI5LC<F=yHdV4BoYv*# z=jg|*0-hnLxNJ#3;i*Uf-l+dQT-<K50+KqOVU;xZjC`7?%a5ZRyXDsSRBFYZ1bRla z^xEeyQeN`M>_2rp8}%!huYKI1cF>ur1Z{O=zEbs~h1tymRbBhtyTbshrlWf?<&MA$ zzV9z{YouqfOQ0b^U&+?n{ZU{g0DGD2&r~3pAX5=*sXV%A{R0D9Dj!x>khtc5#o#j` zY!4XRS?lu0OlJE_Qv7#+JX`L6^gM~4Du8h$i(X8Ba2P<>M`<6<5c?+KK8lfGSM+k0 zU3ou~%IAlmwD+AB7yv=C4(aQSeTp*06~p8_26)z96D*W~VfE^yz~5Z~mp&&g9WlmO z-5x`1D$GMCwe%;tg`JCwnG_ohBh?=_su2!EcVO{g`h|p`>l^6P4pIt#`X(1wIL1DT zokvJ1lcTvm*N}F2NDo%BUQLAuA?YPFNLyPo3y+8p@u&>^vHPABTUIHL5LRX^T^XRz zqqT-C?7B~Rp}2?iRn+B~d3Pk%w=L-q@lp;R9_wF0SP)R&#}*dES7PvtTCD;;p<+h= zcI0+89+Lcf1X6jX!kkLd%Uv27^~FZgBZkq+RX{2S+92q{;)qZ)X`c8AiFm(BN$05r zuK=L)ULhXa6R;;o6;M@Tv$Br(VZapza=5ck0U4!i@@9I>3BA7Gi;O)~VZ*mQVI*w5 z0|TJ6^L(~OR;FYEC_u^8RZuZnaMZo}=WK_XrrDn_LL?*;SN5rLMU*{XL|!}V=}|pZ zh{ObsLA;fdn3VJaC@7FG0<^N6I2;><R+%h>(0++myGPN$g~w<=UhM!D69I@YV)Rr1 zpmj7gA<_=aGEnl40Zpcqmx0r-NMLq$x%v5Ie$~~`U#pJgjsDDo5~`}IV5)}9Z@ouj zbZl((-d36|o&@@fN)*Sj{4e7T0WAda?Hjw&I4*Ox#iLLOd{M~j|K5(RbPFJ7EbOOP zApUTT(_|MGV)%i;0W1e7k8!-CkMtofju-;c`gXLP^4E7bmgxv83RHfu^0R_DCR4yW zh`%8z#d8S>I!Aqp*;*k>hd<Ks_1)C=D`a7Ez>z)K?!zEf%3&eJHce$UGFm*pxWpUp z$wO1~iugV^r>}2d0F)C}2?>dEs6X?<IPhv8x%J6<6s^cwp2Ky?RowJAEN@iz&7j5@ zy^uXEz^3@aFl6O#pj%y?fbo(~P)JWSLr<+4H(%nU1adl}yVllLh>u@NDhn_dKU7TS zRSRi=&_qN;@IRaJ+2)5-`>O^J3ufQ|I<U5(9Lkog{Vwk0x4)sc8D&VBja`Y|`QLN= z@qvv<_=2wnROmzT*lM4%lT&YhKekz_G_gG#m{FiZqOLgJna<74W9(RJ2Xs5P1F2qk zm!2Ce`~?h`vNz`N%9^;0a;Ruc{No=&JG+uT0_vk!KsK&1(yp(sDTX9)s0mr?SU^q3 zGJ4v<3-Ssz9c35>70t`aDvyLXre?UgxLjXLQv{-Fs*Hg%%|gY96VIvH0tLc$zBUSo z6G6MufYm;d>W?3Z!_M)(SF(NFbAZ7Rxw##ed^`%`6XWB*e*9Miv>jDxab_kMP~OnM z9ESYg{n_~Pi!uEhzK^P^5zC{&78p@eb8Rzmad8n-mEQ{rLVzfI0@%A5r2^u+@>VLq zg`S`u1p-qu$iI6pP|)kjQL2`{A5YBG<9P*akYO?*K3-N`eOSH%3gDs-Et%3O;Kw)x zaP9y8OXMA8&j)#PMpX@ZP4QQGc9w*NBn9|<9T!+TMgB+%VZft<1A<IiEPhgAZ*MQR zsVVJXzK(5@1Yoov8GI$%`M=w(tTp)+TmyAbianF6!otvty=fHnIra7&76zEO$j3jL zGKvbK{P6S(x5|uAZm7~%Rv|j6VKAfsVcR=51D9(G<W)KPdV4YPwc~jU!j@l00~a=C zXmYQ9$MQFWxO>c-%VO5=FM*^^^!M<C0zD}OMSOB{vSz;?=1*Yn+#NYPJEJ^Td$DtH zaPcr-dk_?h^bW015%qCn3f9&72vT9bQn5;?OsHVij3U@+slmCB0KsU<cFjy2hO50l zH#ZmL&&tLY3NnnLxPnQ1<rO8Yv8fT18@A`qqd-d!Vz9+#dIZq7M=e{}{>;&x48olG z!r;+<t*Ot~0$2}><vD$WFkGhGRNhf2ls>nxE*Zpm#JE;fLqiG}(7IW+wy;3ePwh<V zuC)U$2XQyTquLo1DK;@t;X_w<HT}_<T6t&Z2!;{ne<nJZFD)%M5z|iK$u7CV%&AKR z6u;0a&sgmW;Gcg&WWXf-E92c8ogFlIjEpk;oXb;SXyh`W8~%N{Y+T$iDJ@A46CZE} zI}p?*0K)nnX&Y#xp<E1nObC&&g~99&{KfQ?6y-N>-uz0b0$2*~(@@a@4zoz7*o^pp z6(osNh#FP^L_sNo;M0mL-Soxx;iLjR0B9cGm&KrDWg{xU0OPPYA=;syQx9~hkxuj@ zI}>;@4b=8)7UY^57oWPJJXAGi;uD_o@^aqnyWt?h$2KuLOQoC2ob0X&pnZtlJa~y^ za6B(R{~7_*l#Q6gr_89(gM$MQud#7)Yf|ZQjaEPtmWXPk1>M>N9tSOm)qdf+uM5cU z@87?%%tvkKS^4=%CZKSTVMRrp9xru_jWqxx0VcJ^)gNajR590m;e#5)*e9nzD*({_ z;scYE(CsF_X>Dw7f(-syVcru*0<E>1I23$A3HsEp9jgxBnP!hO#v)=`Th=;H*8KCH z<jeE(M^_STD3}}E*xp7Notp|T+224>1K)MPMmGwIB(r$NqlpS4iZQbx5-5g%)?o|d z>H~%)GXWPzFR7_XY*kwBLIG+0P-%Aqjo(EAJtMdyG#x1$C=FP4gzWhimxqf!e%mgL zSi`V5o#wD50OP=@<)ZJw%FjTorzn7Qpu@KBFxIwy|CxYnO)ld8xsK6Ky&`z6g7>er zq-3Ztt>x8(od4G3pp`?X4A?TU0%Z*iYY+{RFk&?^&$IWSUZBS!>F>R4^k}6ixn;-R z_4c5{T_4-2cnjvxfYo`0P`03pN{9m^cvlxB?}{>4B3VVc#0o+2cnZWPaK=OtT{CqK z#xj&p4IXg<z(+{#1u&Vs?*3D`4vstdB*~nlz!4n27vagOGX-Wj!5#ya$R;Etl+Emy z5ck}m7E$wf7?0`}Mw&l>!$6P(2W#0+T0KQ8?#{a!mImagr;1<Flln=@nlhQLct`#O z*si5$>Vf0sBF{x27*|X6oSmzdPqu)kwV9X3N~D{*Q3sX5%)<S1c&N@E_(oe>#@?RW z+uIu`%IDBKHA<otCcgXbAi}`+70(AwceVgr4H_TPR(YHr7|8<0Ga`d4W`iW!2|u(W z9cG_xJ4k8l0I+#7?`T3&(!V7|1B0|O{=(g(l#k*}N!`4WFHc^9C6v|A&dy?~Wqtqg z<5bEQJeH3wS^5NXp?gWq`1p7)=+@yW{78>IMYT{%1y5x`+~@WRQP29$H*{gVvxl30 z&+!=}=u|UJZe=4TWTd13I`HEL0`EL4;u60c^4R$C)U+>OVZH>Nr2r1ZpN$}Xm<oqN zB;_gv%i&zjz-5TK<=EPVrxJ(t5y}WDFPQSU=2Q6a;e$*es=EMG-)3tth5y@26G!#< zg~OC>Noy-B?bom6pwwX4mX*l@5UNN@zF*d(U%-)5Q?2ZrhWc+l4P=%46HS0v^PiZQ zSf3bbXlTINb79Tj0D%Y?9!fc|tFus#rAd^W!lvfxpy0ri-txqjzU$VYjMffE!N6y> zjR7{RR1vW1P6;~JN8rN+%M^#14J4B2UN1#pSKA;iU@#aXnDzwbIt!Ep6j{k*Dc}3s z>p*Fea%<(mOe{7b-tk3MVV2<WIPGOsxSgGvQZ8OuI6sI(pp2{6-ysJP!ti8zUsgm} zeO}<Fld7EcKw^R}NpuT|Gw_*#$%Zd#?9R2;BlHYV9CEJXiKhY1sT+yFra(n5A+yr| z9GT8#HJpkjY{Ywcw4B9DVF$cwp9Pv_!o@LD3HS3VGnn+#Sj^|ND>H)qU$PT|3HvYK zN^}kN^(n(@3QQ><bsF6yd1Ym+;NalEAEyCdSw$B4+te!j9Dn$mQb*DW4P&U~yg+H* zfxT<<1Ine4XD3pmHhKRSf4e|*f9XsV>TQOP?r(I&mSIrjU}>aq61FcoMn(r1pB|$M zMGYvl!1i=59(;8D!xU~%{_eks-5<pL#qnJU&TGHmp7m1IB0dTXF12;P2SRCemMw~g zZw)Yi2vL?2D3PDEGjx<@l*p*?6pZ;HYD%I4F$n$*&VpGc;<Zewke{VSO}9ox?vw1v z7nF{R0o~huY$q7u-{Dk@YPR!0f~F24lnhMzhBADz-gA>b0)WIv7uW0X=lT9I=$In9 zBRrT;>S|;=8wO?>QDY@6%(?lwyT!KpdSTPBRBaW|>~7_Sr$%`(nL&j^g2g4GI+9)0 zB$nN98(1rbYFxOwxv^OsR8N7~ga3hW@P<D-hv>M~F({42FF6nXG>D2h4ii9sRT#>w zq2HqjzN%;VaQ;mvFat)+NG}c{kT@SjU>sav;`_y?Bam)c*|k;L(#?Sb59VT8WF=n< zF3lw*Cj-o&=;<leL!D-bmsHBbDh*TYk&vLE*v+K!<49*$$G!I#q9sQl5Pp@Fl>kja z)t0=@)W9eh7?N6WowqBLNC$Hg=x2iQuRu<#+qi-;3qV+vIPUbmFEJKmlMhq^@*dzD zGQG64)xF@<o<Yp5YKpD6%p+VtwNc{17ZjK|H6{3WzXXXEUs7ubDL>)S=Zc~cGMg6! z&k*wv<Ir><2o%0Y$H1ZaM1j|Ve>UJ@-xk~$Ad<PdLlS>`4~78PsG}a|SO85VdDE2= zAHN=t)a3fM0S*2|`GflFkV;Ioz)FGsDVSZZku;0~3R;h?GbejQcsTLa<6-aqF1jOG zq#`3@M5X=;q>jg_gq6qzpbprW*u^P<5&kvn7tst-OTH4|VnownBaS1n&vc1FGNBEa z&IS*BPqkDKMRSMpf#8`wNA;W5Qe)j$vW7pYPB_qq+ax3wp@O0ZAApQNBG}#sRr7hc zS-wFun2zCrAr!nI9UYIW)rZv{fp?-BjD1W?pD06qq7W<`wPnV|{fZLeMo%yHn>O~9 zU_xlAJetCP#&Q=aZ`q03`a+IVB!)CuY_WN9!%UU(A_qo3Jj~qR-H14CV1hIO#p?;v z8wHg<zy-hk_#wm5WmmVTU}}m)ty#-YTK5fBPjC!K3c7_faoF2imLNoVIi>+ePHAQ& zt=?di&=Q#2fBoNoW8>p-qXE_D=O6KDXGXGRT_iyztWNkfeSyP<Y$*5>1yMp;I|a>v zJx<!RCW1=@?_?+mJ9u@QTuZWsynq&zQzO^VAghfT9-(-}QUnIyaMn_p;{a?&8ovF# zwnn7HL?~ls!#l+LXmhMoM=zF}%F4tEnO9Igis?Prr3Q6h{{F@1$}eBs895B=C#17S zR^d!|1BUSDF|&ooCVP{f52IEB@&^Qx+cy%j2dOPLhfR`<kFk>n9o08g0+%*GE#-4q z60e>DqACAswHxDhTgTBt0|^r<(4^SFH4mot80vhoRmW#wCMkkp8n``zOx*fh<mSLE zzaLD!*jwJ-=o4&L;Fv$rul_fBvcrG`wNI*2HA$0U()#FD_u<&2!~ssscL6#QfIndR zhm|~n&vVKaj5lKjqyC}PS46_0i2#FV5cS|Cpmm_USRsyhdpS8izUF83(@P_GtdZd( zn2qlPRp{#r4{Xq*fvw)f^OSP8o|T7ZB&$nLrz*O&Rs9v*9Q(kid>{u;izs!<K8ruS z(ySzBf7#7%Ys(5iA$Cqq)z69GatpAY`+4$P_lBEz)kyr?35op`RyPQMS?%p(Smk;! z*DkM$3<fKrj?9)lM_OQJ?4-!N!MOoD@SWC(snOB)rlVF>uzH!|A%JB7``rSn#pG{# z8O{MA9CbcwSxfjrF@)gmS6&t8FMkwu-v0~@2lr>I?$XP%(T5(hs=p0G>Wq<zAFZU> zkblQ{|M8NB+YGPmJU$2kLJk%%^@WB&l*gp-Tjv;-$z!r@tIn&FZ5K-2!L#I5NiS$4 zy1-aZwsAtO+mYm_r{qc~;#Ru2R4{1Bd`rjTQ(>Rx6sgt|RzHWoA);T7<E}xf%77D7 z=)zTqrjL5dy>Z(nZPQ~n*xzqfN;3^`HQwy2IBCgDF!R5=n;zu?hQ_!F(=W#FsYMG< z0EPuMkt9rRrq+%o$r7(2!fIX+bV?RZP8`4Gw#I-jU${|Ou@&3!m_phmoJj=7%m`~7 z*W~!c+z!D-BOsoUAX863^;$mF7_Ybvj2qBev1ATS9M-_uV$$@qkc2}^0qn*sR*UQ8 zUux_uOCEWH1mA%#e2jOtaz6i~wdDJ7$5bZ>CRczb&8n7)Ds5@Wa&SO*FOP`|``J+M z7YzYc1c5SIz&En|#>Q~KPyyC?35-FRZ(HD66_}2^wZgpg{U@pYi$mQf<6P8R1ywyI zfZXwN(d{O}b+@-sn!D6}k2Poo@a67qxXEg9ay-{gi8<h0S^D=J?Hr^AHShnESxbdM z`@!@+Ai}wTyzWZ;*SY^y=RfQ(nVjCMdc!M881)`@Mj1x0k7iMXqmZn@$lJzABq7)z zd_X=Gq12XEU9SpWrGzJpOEkD#qMI@Xug5>LB*8Ddvh4#T7a9G4SU(lu*ee?%{6a*v zlhgX0fb*1=4cmPRu+hNuIxFzZeC|F0njPYG2UrbA(aU%tx5I_a=#^t6=bwC0kkxnf zZ-#klYO5=)qDWRYx3~E}o&RBS8v^DH828A`dU>~EP0uXw{I?Nml%1ICh!{J6P?&$- zxAM=L>_L`#U}RU+afF)*w&bx**Z$r485i(W{YhD6+`9sh=cm|{EBpI~R>8C<5(2PQ zz~9+A<!QuRiwRQemOiB&mf8muEq}S735bNO=8x117J-{;C^z_w`4(Ur889J&>+4tS zq-!A6E~+5FX;u(USmXD=#DLDB#S$XRrUC~2s7ohk%L-ca#YAIJA6<{6@P`5!?Ws{Y z`{t#f)2^-|+ED+X+0J-=YeW(zxf+K&5W|2F2!=d{mZ-tjG<#Vqj%>zMJ356!@nlD> z_4b!)A`Ua{!37s^0fFJvT|q_J)3fOa+~OCB2QIa6sD}NG-p&>VM}CI<ae#`%=nWTn z1eypeSyMcD(STsv%fV!*xmkf}0iRcf*JnYv;8o^E6AbuFvWGeHxmsXMO#ws-Afm4i zmeeL|`EdOc($9*wnoH$4qwHp3o1`d@m+4H`71}w_biq}Sm>zyGU<bxzdo=!!rtg5p zx_|$_?Y(6uD<LyCZn9U|vNus?$_!bznZ5VkD=9N8WS7lTc2)=>BtrUMzW?((r_<>? zk8yuK?{!_T^<E12393XXDUuXUTjQBe%FWVT48-(H)N<$i#^b3QlTjxZTAqpTk9AyI zV$vQ5xs|0a9&x`U2gSXje6<EI%^E1Xetu{N&hf>I7iP30pHGNbF_8@G`K=0@A4Nr< z&LB`Pv*09F$Ri*pedz<z<BQ1|)AU7EM^p^WQ(~%t2Piz9Q6~#+`XzB8#AvDKgk<{Q zkx}T5WwdY&`=iHpu1AyE{^QlK8xEFxn*NVpy08UzMNO%|YAD91mD5p^6wa}e{!-SQ zGDogCQ`4DxF9CQusQ;j87cGg}YO#fVptp{fX4q1;awm&*aW4;LmGE>7X47R$?3ZrK z62(Rdl5ZEizLy6Da?44m(KB)ChWeVhn|S@PjAO%5nZSxX-~Xy%XSbQqYH#8MB^8Y0 z08-<s`jeg|HNr2v?%zoc9ZwLo<~j22m$9G_yuaVxfoOu%M-rSVrcF-{+S-;}&z(#9 zV#j{=cg&_;yC-emi4l>470ZO#`seC3<Bd9*)vxZYs&YRWa_c|sb8ZJCA+P7_Sg-q1 z|1nxY7g<ykJUpxpHcxSvw=_V-{UnGcvKeDKSFyWCd*eyXuaGu+VO!!Br;VU~CzpV! zRYnyxtz$2q>vp5L0tq^&k7PL}2Vj*48;hurk9oU41b_svFwfjZ(_vJ?7#B-TU@qq^ zv23MjbE2ojx%lINkAm89O-l&$!|aJ)rL8J#pE}CYHRS$S9uZsmrGf?$hl9h@cDlwK zIxJm1upHFsgbLzb56
L%J`agRIJAPbH@_(h<wzWVCwDLa-M{9v3wECU7!&3n+7 z%LBB_*mQei%2NgZm)A)ih}OhFcL1=&OugM$LNZ3$V<Cr04jCW!^-t4VyF2c8ok>^x zvijEsz@112T^u|!M|D6MczIp20JpMrn^T!`U<_)*r~D_Vr}`1NNf2kstLd(6WQ#j@ zX!fTLx%VGayZ+11zB`;h<g*RsaBBw?At1|?<D#}c|Lu$v3-o>#8Lz#^8=+*wB<X^1 zsY7f)UGUAgS4S0;3ZMza%5l`5Qa{MAPKo<`*RvvJvxorWUi_Ey<)PtW;+c9id<KDR zx&=?yX>N;)Mh`}v7X<__b-ACnS&NE^-FlSa3~dr9RC1S?{6RG{^SdQmJU37s%cJdc zGJ>9-UOi7zob_P1!~guE%N2muILqqXUZbFSH$yV%kO_+i+}h^)yCFbMfb8%l^_%md zWl#Dae^KUfxL>r|{@L2u>4LXu*<-!>_3P`0%>d%T4zZy-2Lg!#8HVdc8U2rCfg@WV z5RUv_!W~-h?%nh|wk!A4&7AH3e)c{#9?)9x)J#t$<9Ji<!9`tEUCj$Sa$zYrDUYr# zn$mV+&M3vDOg?;dF>JLdwMCy95RaU10!@?Jeg6^gWL?aP01C#=5Sv#|y2~C^21nI< zkx`a8n0uU0UbtU`05ao#V;gb9b=$W+?B}<P`H<Hj6SI4U*@8^U%hQDI)Wj*!y!|-J zQaF$>GtTSX<L>FPo%St}dv9uLF2@trF5Jgb$~rorM==1n0a#ESdDZMO>~6U-GZIOc zeL12xeGPO^9DpLix}A*urC;~{GxPSej{)oLcl-DCSj>4N`>fS-B~k%1j1yrlUNH*s z>%vq1KP|wN((mAH2P9zl;7|RHVOd|q22f-&SC}PY)8$XdCJU-M)BQGx-hh1|?xAnF z-YcAL(LS-+*w`3%cRwwQ_%}_%67%qF>^7tG+{ea%WemJ?G`;<fayQ-rWU=FnTaVYm zW2Nn(eR7>Ri}DeFOc<N6_p#H!%Cta)hWwgUPXTL*oMbXnn(Y-1ru%teA;xWb=x_ml z9`p5u8`(PU8`|4qi*>xfxvt-Et1)d$%edC|^F`LBz0A3z<ApcpgIznVczxuZr~Gj= zgey~aqf3S;qJpkBOD=QyG`MM;1SRmkEt5xUYUFm-75|EM^PR||EJDS|wydl3b)ukR zhXMwpD^JSzZK~&rkcOq@jhCd?yOFtUZxlaQ<eVkI(Lbm0gG#<oTQe>xL393kdbp@x zG*Ylh>N18ULG9MTPC+U|gN3H-cFdkGL-~y?(-az+h3724Rfr=($-%nBz<m>5mtt`( z5uOGh!@1_>SCFKKJrzo?7EcvqI^VU6Yg64`U51(_Z0xD$eBG7el2#*)w8RV4J@UhT zy-<^;xmWNyhmCsweV*@bspd^p$!&2a(y7V0?UR}F8IVOx&28t5gW5sR@APMAKVkU8 zQ!)t#ARNDGde%=T@^sjx(PaqU!5@Y;pA2d7(m=+*b9&rV_g1wl>tk-25DWaoaSJk4 zZkR;=R!vO}xu2_YY3;3RGi1`PTrb+%34-JHuR(HtK*pa-iNGNwW(5`OudJ3oVd`!L z8Qf2Ug6q)V5>7pT-pR@p*rFwO6pIroT|w^XTA6-Y!Y)k-l`jl!v9nl0kYzMB;*C|U zZI<f){rgu>|1S5HCh<yCv69v=mi_6slQj+|mRCjvc|b>)EIUSza|-kQLm~S-*mZ4A z*B&lTH;OUhmI#Xu#|N(7cA;{1xT0b0boLh-cdEIqH*pw->il@b*xA`vrn1)->n}Sl zn`4Z2O{vR&$hR@YxCIsafGqbS3=EQlGxZz^pmDPlGJI{a{><a+T;C10{&$SOMW2u% zBY!ca=me-^X|BxU7&DZnSd!C_zEpvxJ>!n!YakY+?V)v1>ikSL$@rThKS*Mku`Oh& z;<aag05vtW;Nwpz%Q>6`)x-Z)>V6y<QQ8SQrf_An@(bOL_edPSzGWLfpP-|va@E!x z^YihI;AwbyorLuv5B~N5+)CBzJKv;XY@8{h-2fn9P0rkW?kWSqH@SLozpX8IXBZgI z!_g!~_|m`fZ}Rf^4G$E}KG(+;<KWgwU3mw|4Wp7G!c)pIZ?Usuxztqw5Om<@Q)CYD z3DA-Ud~wiv7Qb&A)toy>VAsn{pqA9sWUv%VY*zoRR@A~gd7yi>W%_A33E!%nZ1Y38 z;X^gW!=ocA3&!;=W|z?p+D#IMeFe&oR=v@*37&aBx}uCb25v{}to_h>?e@GpF77#W zKvCq~@AQH=UV865Fg8{R41BZMb2@c=@x!+Kb=aF`^QS~_PV3tggZro2?2#{4(m0us zv^I8!!;dU2vAN$%4I<?4uRl?1BA=n#dyugvuU!0~B*iT7?=kEYif(_8r`z}qdt>9B zsjY0Ri0q`oC}juN<#UM>IywfG2#7QntH<=2S!ANvh*&8ZV){S_4OOVtvp30Iczfzp zSe5S?+*iH^Bd8b6b1(Nd*Vln7p^T)RLYK9*3G>If4mcww%`Nx2K75J#dLO$-P@w9o z&so5Sf`f0?Idx920ka<vBxZBf&&f08ETPkjW(~EO^xFTr)=Bd%_h!2HPGL%!;|ViM zfEzklm8;~ZsRstve3<|xEA<_LtWx@l2}%XLtmtc~7t+<tbc$>HdLjL6XN#L0JBtP_ zWe&I=?n#l;`pVpWXC&D_@6ARAT?(_+L>83e#l2)tuF`b`_H>8JYF@N3L5S<)m_T%_ zZ>O8xd(Y<*9=4jAq*sLRLOn;)zx?-NWN|yKV~U;bqq`*bKknALEuAP8ahN1=-)^#* zb*-LBRyn+&yd`pE@wl!%FsZ$FokREyr*5U{O--I-i`6PU$r?SK%FNye{ZZ`^b-fxT z&B-kIXhf|*FDWu@&v(oxFsJlc2#XRX$@15JDIWaTJx-VNyrbMDw}8%lCwqIr-Gj5! z;5Ovhg7c3(sjqdssJQn$lw0C>S$aG;qv9~5Gz>Xi8<9kYiTT=<YS-JLeZup!V`faz zF?6$&c2@btByXDP!H9fJ4eYxMlif&bs6R<ot&s6!aFk8e(eL?xtiY1(M}}rjZQSRe zG@>UXl@c)7%_JurHMj1ePsKp@@hY-EK*fbbMiPuY3C&xKJ1!D<Q$48ePNaXG$a;_- zzc3?%t_QS_a{ps2vBte!zWay=UP^Az+REXpB^Ol)quwoDk5kk(c(5V$YD?*MvN|V8 z4`*p6MuCfY^CPcxF+ax_{TJupzrZOtSVnnnr_7R<mr>bXRyeUnDLDn{Y(0*Nja8Ap zL)I&jhecvToSU1Aiv(CEK#|6jE4#)C10VgeijYxOd-2Ca;nb)+eoV!mJE^wvgFc?I zM!ezS;mQcXlHV5O*MFCkf}l$%%m)ZZCDfB3B12R3AlEE5OKSD6aZjfYKfknZ`?xaU z*^T9@b>epU*A=LV9UUDJ2fg4)O*#w+s7K02h^YJ(kF((oTgZ(Vav?%<1@I<bBKY`{ zxNlJtt^lO>fj$;*V50b5spkq4pO@({W=b}Tm^#w!wX3!&iBJo<wFXyD1KmuN+#1cj ztc(n!<Zf{ih9PTwV;ZjeS?0;5R?*Z<j0M}$aj&*FfFntsBMv`V5MJbw5n?SBuE0Vy zp-C8nRVHqID5cDNY)l{A^J>>^r<xCaD=J9pnmwIO*>ihaTU!nFlC~VVvXpdkq$|az z<KMqA5wKAPf8JUF<q{?<HZ)&1M)r8KELAJSi%o~dW!p~U)m&vhUuzlR*!0s_tdD7{ z+CC3e>-xA-XS@|`{qKprJ$@2`nfXNkzeRh6hl2-S;r4pT9z*4DQdXl&OCynyw)WdQ zBN|?TO}VV3ZG>_(rF7S?i`?ppG2X!4p5u5rD1!cmIdFQ~+|rSJOAEK)z~#;|AT9ic z_Dq!}f}74}6Rw#INKC<0Hwz=9u9=ycDrOf#R`s5><jYarkbZN_6^oKt<`^NQm{{BJ zBL`(Av^F(EmX9<wTUi>x{bUq&Pj<n?5qoIY@Gw%IwdlXGZwsxJyL`7pCnqVX)ZR5V zzBXAYORN6R-v&72+x5Wb(8b2aa+bBYZ;n>24;_nZuqDbWDTxDpi0EGCuPq4XnY+;y zHAwdAwHlQARt}Pq3kCFyj95fY!LmG?A|cNr3JVJ{l$63UGBRZ0=&5r4lJ<B7IzUd} zCQy{8_8}+isb7*ZBW>$CI|Dz<Do}gTZ!(#hN$Nc%&{d|Zc=c`dp3GSyNU_+u<`r(G zJelv$^cth{)7BQ8-l(|8OQQhUFiZm<Kr>Pm6s~h+J)xRnl5+c2Yp`2Mg#pzNr?$y! z;w=8ct^M>UV+f>CLklm;6pNLPj*?QfUq`vHyhSoU9|PwM8l2h#uH%(Prt6YA(+g!{ zDnoVJ+APW1At52J3{;DS?IbLwAAKLfjeS0W;AZvS|N36P78xT1Q3ux6)|d!T^J*#< zKeWeXh%2p6&MK}dDzer<5eL^^K-x?!wkn&@k-Z?Pxd}V_OmMK@lcf$4G;irdu=%TN zYCFG^ZoMup$JLOOxiR1L^uxu4Bs8Rked_$9IoGBA=zM%A5TvM07i>cghQk8gTL;XN z-Yjo~5@b#;#!I;4)`0aULg(C@jpwAoh$}2^e4s}?5K#KF9cXt)6)t&vII0s>OW!`* zXI8vs*cHX6;cWi?;GW@HH@!`B;J=O)o0{q>d9GfBOX^fQdO7Yegxjh-sri-a9q7w~ z^|!ESHO6$+qIpUS-K1NJd1IHWymeV96GP7tg5u(lH8nNx9#VAbji*JBl0s@H|J}~l zwx+v%Pg&VODQ~Wh7aGzGYBvRcDtrQkd{W)}v9kP#nuVnY>1l(|jA5#+9msL_!M_j) z_j>n?96GFs94&st>R<_iwbfM2ktg@wy?Ya1zvdk`2m^e5bmV>dlNG@tkanWD+YRrG z%laWCE^Vxunwr+fd5?+%Rs_#|Wrr_%TY%p>AAAQlT3awP61!p{^6dPK*t=2PT(I5Q z;g_T<tNP?UZBlJCK^L1_$MGRAANN3$^Sq##*vqe9zgFL<+3~h@bE8DOwHYAw`GiqR zIga0ZbmV$*N`Of6ck%W{z2axEA%^Jz&f5nn=*9jz@wjToGQCW<9us+&KgGBETLFZ{ zc{PbwFp+6A-{iW!-RMCmJ0hU}=p>H)15~?c(9&Qbz{qd_`m*Y$GbuX6q@-CMN1)Xp z`8P`_t3Xbuq^+;-fLYhk(NP@?6C7aB<oBpQ7e`!NT!>9lroECz%==~Q?Mo9Ftk`rm zz#l(b&ijKv`kw6RXBURVk@nFR5KM@?dB3cqs_g=Z?^=fA?Tp;qzVUJGFVhxUTJez% zRj*z>6e5a0n#hwbW94OMY4bU<HSkv>VYr?T(M1`^cO}OZbt35UXVM9_qR`~Y5yWZ% zv%<<d6inVdoWD^w<^IHbJTzziQxy;5(EFiCd(JDvH(5PXhlg%dy07t(2yJj@O8Ne_ z0y?G`BH=_5VH1Gfe<P+0?3=^ZI&2B_4{_Zm&TjcDQ^gO2^b6+`zl%bTrZ}qERFkk4 z#9*d$5gJz*xQ>IQ!xa`Dys8)>NxxI_Cg-*BLWQa-4z+@ZF@^1BDpnOb=}&^oIy-L& z3k%OQRQ8{~*Zzw%bHPVN&jdcK(t)2H*kW%&*vD6FJtz{&uHR<f=I^h71u{+{n9M6H zEAX?QPSiz3xvlqACkz><tA_Iutyhh;f$if}N2&8X9X-7e#`|n_1%ylU>lZ#A_Uywo zI4l*|KWE2}Qf;-asrnjKpuULe?;^;DhI-00M3!@GJUoz2ug4^K>F6LjPmib8B(Jdf zo%*=TAk_&-gD?_QAI#oKj;W0yT59(pD&leHG&{b}=}?BLcwHTGI;~Cz=9<qh!?qre zsmpHNSUW&%fA)d)(eg`mEGdzP=h4T_d<71s{^Us&t!b@dnrFNM;r_lS^y3R1{&#QR zZGVb4&UpxA2G?Lb<0l>2L(2!HHf&~Zngj0%UI<r2I~qM3!DJ%eX34ILSvNK?2@i?N zwDt320wIVo)(E)fiS0oG6rqi3ILzq(-a!==-meUSH4mRWAx;Mi(OlTld*5je43OzY z*&{g}?DPvcZ$46SlE=R@>?i1F=RO&q!XKOGBz0nTUu~+P<s%0cn2PG_e$&}ByR2Zs zISjVoIIzzsbZZ*q;cFvn*VnyQ!e|i)C}BXUXnxQq%;}SHi<1*nooM*Fx8%AD^q5SV zCIgw<*;OIU2;Kl@iA=?asB`n%Nlr85Xk+47lGwqa=+%`T3h<*>qmWiHg|A)>QD1aG zbQ1{rURYBuXUej(_>Y6+72+R;a1Uq&EX-=7`{{bVedBmCuUuUB=#w9s5FPZX%9d4K zLg&_=ItzU-vLo7I;b=fSr7pRFHyDc;ySI<c$iN_~we<x@GEqieo`owV4^%iHUmr-B zJihp^+(Lmj4R7@0CmRO;MJ8;YKdzGh+Ih?AnVI|hqG|Ju+<qcEcE`sP3axkqypDVE zF*woWbP)+R6sr(a_>Vu`x^*kI;i2F~I{rA3!K2|fPXe2|9=$Ha1WlDlZa$0;%td1g z7m(ruo8qtQ{(Ck07Dc2oE4~l%78rTHKQJ_W$$pQNJymrDBrJ4HOlH6Pg!>`8%<leN z9J7>T3VM+j6{>w~#N|VR%Zl3jnwk{UFM-oTi{|FxNm9?Ql0s|a*3dBM+qo+`SM3Ea z{5>b56R-ol#%v)*DK$`b&Hm@2aQsFK<SC|BNpuw*cXTVFFIpNJsIN?Z7=uSy;0KVA z*SX{sb8&S1^xt2=UV51PTBefD`nTx9b%Ftog)Q$>^~+Dy*gZEgg%^!PQ7HU*%~IiF z`3kIE<iFg!a~P!m<s(!F=D;g%dI?E=E_(~&F>$K4U-Hi?1=whY)CLR(G3~i9A`*g3 zA3lgoY-XmX|M1%MUE1~O@4^h`nh(s(c*)XHVtOTe!x`s2fcRz~G3d&X6I&W(X=IC5 zYK$AV?#_zrzgQy<lP~Ll&+4coVh`nyVU3y4-pVcMgSsd?><FV?<K_iL#LcsW<Y3Au zjmE}`S8tTq61(6x!I|@x_dh2K#BQFxzJ8ES76CP_5??9xnY2bsJfm>cJbv&B+4%QA zt7cYie)7fz4R@7kt_#^mgU-X5R}WC|x;yrv_XXC^j(0Nh^9Ryin`-Null1etcowME zPlT4;JpZ-N!_VIjABEruBTa2bk-P7||EM=MHm)pw3LhFyH(H(*1Ry0OZ1Z51efT-x zGQ|`h8!xr0)V#THeIAs4MNo=GDq7E0-;WW3b&;VtGHr1eihsw3IB8CBifY*3xi!ej zWrfAX#SaW;5)ohGecrZC<pHEb#`N8R)s&KX{i*!QzX5GN=C{a#SMn7RENf}!s<-ud zvo`zwDG#ujG&r>s6s8olwaqu&WD<9yPHd-RLIh(X@Iphbc|HAP$u?`HgCHb~8vkzw zTUNELv7w=QP|tDv`>#e#%;sk^s~Uitj<wqzZH#<y{6%5^%TGKmq@&~V=H~Q!<86`U zy=;>jgQUmC&7M1H-1Boyo{WcwYi|ovkDINZ`3!dkp2_s-M@lESp(}8ZqM~eh`SGC9 zAtol~9g?Dw&loo5rSZk~R%@|6>o3#co@%UQ{PzC`#cixJCRe5ZoW?Xqo9odk>wHtX zzH}d*!n0=rSNoHWPA~|K$jM8dpzoBltuRl_`+mt#PXG35sfX3qNc8g;>xT~?&Q3m! z5jy%{Q)?6+F=j2c>navOPD%abj2NkvC2(R^9?#HROKIYw@+@QM&p8}UZ=D$-V+bT+ z%hBmCo>O9MCnRFhB+D45J<jS(n@>nn=hR@=;h+=}`|$d~8g8_ahkN=9CgT10fssX> zqn$5hz%t|z%r!Y1UFLg!U!sj4c&to=eq37LoB8*{5GDx@Ee$GzgGH>U_99Vs*BGm= zwzf7#I*=r*Z<gw4{gO*=U47JuSt|F@gr9%~QQG6oX0gQkRv@9CC8$73h|_WSQ)6`D zVA00k`r>_-p`84V@9f@-WTU;XyKy$!mKGLyDrGB&4vQNmfmYj6uG?0;ct{p4kC6p; z=IB24zx11av)6N8yeHJhR%fx=Dif2xQ{ymOP{`qI_?_q4y={)J)ziM+Gn}wY#sN<l znvka_FN|_eQ!_;N_~}h4?C(U0dWy=r?>;)Pb@=x=*O55*A~u)9dtp|isViwT1!H;3 z(Wy>n{87O`gnnZ6lAtlCLWtWxE6F<kL7P@D!wyp_N&ffkY~$ZqG#-7Ccq9^C_x7#T zf5qvo;#>SOln9=Ci+A1|^XFM!4{;ey&lU2mzQ)4wzMDW+iKZ$?#Bq>kfx|1y$I7bf z(IoT9C7N9Dom{c`(E!QF+e(||9}m0|8*bq|+R9NrPgOlPzYM5lV{sjQU|^6|$n<*b zN!q6}`)R(ncUr`0#`bkwW1Q#1_uC+$31mdK7w&t88=&1WSgGyv5es$^4xvP7CY^mY zU+LQ{PLVX_<h1YbvC$v>mwBImUVwd@e*BRaU-R@y@<{A4Z)Y+krnYr69s%p1va~|> z44@4*4m4t{uA?KG)G-UpW*_ld`Qp9`CVwp1+8QIxuSXOnQKviZ+SKrp7)SbYdVIcR z87f=1ihAk(^wZhhyLUD4%CU)sn2e%Lae@=uTw}i`RGuaAr}+81xnaWTf+#ubs;b6& z|Fuum1S_<NMC7@WDWYSwYr&OCVgA4A>6e$6(nn$?=wx-VJN>fwEYh6X#NnM7?9`TG zHpHPiJ+!hBW_IT0I{#I+w=;np@%Dy?g+u^FS!}?cf<o-xx<}lx(tj}CzD+<PC8AAJ z@}Gkj6{^IH$p|OIH!MOTRVG=bb8l*&VX`RqBCl`4{~aA2wfg*L@bBbN>cs87>*OCu zrpoes2^fMu);?V5@T5XNiC%&Vo;|YIE;bi1jfA?~20n5Gm;R3b&4Qp38ETeg`HZ#9 zpdbto{IfF07gtw5nJt*@43znl!tmjw<3u$4hO{1k0h>52Cigss7ZZ8b^UrZi(odLA zj*oF(P28hVa&m@x5IR;pL=j6$m+O-fCcHQcEqO%2_wBuYkdP1|W*Qu*o`Z~rcid$Z zFv&<r2mtea7IhP`ot|b!b@M0VY+f&^jF6Yx@!*T(JI4ax2z)w_-U*0Qj+7U(^DY^3 zy+~YdUA~LLZJyOJy`ri@u)tO94o=Ux!WiviV*P8^D3K{VDjr-<?;1Xfc5x~H!(3zb z9#@qcc&!jP&-jL<>YW)uGbnt$fb8YV*qG>Xq|WWn<rpby9FrUWX>tk)-z*&h%@LHn z>DQM4=UoHeKN2WK48*^S#lR2WPeWbD5SYsJGeyJ3Tq&b@5D$QJd*a?+Cg}!77okwP zmO>X7jtw>Wi%agabG)COUoXWFSC*!$%$@B2j@<ZSYbx@yGO*uWi>OqLBgQc3rI6K= z&8x}Dv^44(A1_e(t5iJk81H+f9$~p=?j8TNr9Y!y<4XdKj?L_{1YH>y=X(XtLru=O zy|a{m2>R!Ur7US|X4)U$UXa6ij2)vY5OUY8!*qTQLPZAtArMzK!dsd-MonI<p|VH@ zPyM1_?5R3YPZTjW3G8IGNEnKqlv>nB_VUi9-gyS70R;Bc@sVsY9e6Xz98k$znX=Ti zwAKJ?pr914A4jRYD=5>jLuEZRadL7ZGAN4Yjm;CVHO9YJG#Jx6HG$2Jt(&Zia^E0^ z^A`frLcm6vT&LuNvoqrCu-DjRWAVAZGMTiI{tc>(_3dthoBpRJp~{MMpgkbjtF36! zqRl>w`{)@2CJ0GNV)sW_Ck6iM;--wG^Zx_s19&jgBGIHu^9>;AA2!eB68A`TDbmYZ z`nv`pya+4kcfHqB4byhB9Bxm~%tSyuBBHDJTc~kc+*(&tzS+UWFC9j<zc`4GdX!XD zYY4PGvUPRJc)<0o=Z*oBOaK#@A*SD04y?yZ2d|+D5Y3}y-xV~ESsT^T7e7r~Rg2ow z(9p<oE9u%4J4u(CesjSn+*oXKHf#2#0Qgynm!=0qcH=WM&DLHE8skEu(zpY)sn^a< z$=AR#_dx5KrJXhB!{;Zdv?CvdpqT~_$<)t_4#*M$6iB<qxNNm1F28%_twT0xc&8c2 zwdFr4QPwPGCj8n!p->U~ok#vQkEM??$E-kraXZlRhWi!95@2D%-~WB!dAp?UCu7{T z!+aPp8+&^?Py~VN{?n%-jZ&Sf{Fp0j3b8qsEBqrn<xXW!#qB(L{ju_M-ryC1@#amf zr~PbF(>w<L03z^PUTSj&G(GtMQ66dj1uZFd$@%&5P+}?=alg{4V~MO8vtRfq<mL0+ z+1c5E<~5{XxzGVBDhD=K36P|o?3tr@UTO|E(tR;c#>bak(;6=^&7Qh>rpTxM(jA&F z#`pgITs%BbOW~0dhSljPm##7F7PTy%$KQSBgKJ_!`XP*X&>S~asHw=~Xtfql3y?l8 zrhLwk@};R4){VLqD$B(!=M}GkVEET+NB<hZM9$w)8(B+X*6KlkPSG*`I6JHZl(6lk ze?=7HwPmyQNen&+$+=X@Hw+%awgS_Ker^&Hb*-P;GNIWYFGk>K6Bat;V2*za_2twX z=Zz@cNV9SCqr2hnfrHRCH;;w90b7yh=2b5&v@zwv*y4>HeiLh(XD4Ax2?-}34AlDw zgQHDjyX9Ru-VqTIgn#-fOup1QE5nOK1d>QumdU6dEwtnmDO%I~^?%<#309pqa~mjO zVRj-#aXeZ{#z;iVeQ|7T>@q5X;#4}qu$TqQCS{&fd4Tb*=+C)%AwfZ2HE+d@59#x_ zM$2YN`?pDR-8e%t&`VNp+>&X(Z|&am(jo)ZkG7#<dMY;hoB{qleAWVu$Og^E2OLA5 z)!7Ps?MIF&s!A}w&+ySH14b&5zt?2l55KACYKuvWknA;|+necQL>2u~31#~5^D7kG zc&ykI#h<sEgfKNfedta3WeYo_D>N(BH0yIsS8s(OAS#-cA7&(JDE`gs8L2#WXv%PM zx*vL!YpRE@;eZ2nex%BmBUJXmgTz@JPEO8J<L8ZrjI&+#)S(HFhiGwa{KNC!G+?6d zzULTQEaNPX5d#xpg8uZdD-&#ALmnjYaj|kJQTdc0ig4c2oGFindST(_=@(?^C*mVz zsjeZ)hV*9dUug7;;8OFe6_X7FKh<1nvETcX{9bp<U~?;zexccCsNGJ)BwM#K<-wyi z-xGeCjZHb$S(j#nL57>b-5|n*aNL*U^YhWc!NJw0^zVtFO3osldwIj6`=UFT!h>?J zTbfqoIluzUxnhNv$u@93kzvi?ura6w4NS7rP3%DRqX_FCeE32VcL@DSPdWUgbyMp- zLTo3hs?|XP4}Q=5V_ZR2Y=F|$ah<nbupHd~!bf*`Te!yU|Fi(Lchp7<aijC1V<94v z6c(`YJ8<8u0S3ld<Ipl6qsOzQs`N&%j5QR~DkCeWA57}8PH?U_>8qT$jhZVJ#OIA} z#~16S%|53Hscj8$=hwRA9?8&Z-i_Nq_=<=s!A=L+3Rqc3n*vq=PnogxUVBxOBdZR) zZEgD>je^4HEoANK%diXKX$?Zzjh21TwIpq#Oi#jc=h4N2hvqAadWpCY0Ozv1N3K>6 zYYPG`otX0@GxJ1Q`Nk?V(_nwQ5>9rn{H(%R*{d1$;2Tdqe;2Z1h~PWq!d^zb+HrH@ zKL9I5R~;`5+O_0ls;+_Rx8<0zh-Fz$%y3*h4M}&9>*(KX7}S2HW2dBU|NMmI=NR8` z^X9bR&g)j`#G2~(fi(b+>|JF0&9o4sx<TQ$$7gcb6BFJO18NQ`{8t-U4%e#tNQ-WM zE0&cI6qB=w?0c}YZL2K42}%4S{|yQY*DnY6Sa91TU7E?4<D8`jTl=Vjywb8SXC+2n z`CfOwb(6cKmrzcDMFbPS<ae2}{hds+`XdT|^=~N2F7-H4R>S~>Q-=UQFK>ykXVtT4 zDY^KqOj(-;QSBF!h&qv$@^ZV8>e$g7S4~W{<W~hj90X=VdSo`l=H}*Q1bhNAH)1Fy zEy(}U%VHry?|{C#htL=>iw_WT{f#HY2rC|tz1P7Urh@G&1r#EkPN?n`!O?t~_^mC6 zUTYye1N}_ltZPC2>nw$Jt+-<{Cz7G$(E8Cp+*W-F)!``s0UXhii0<HCWB!nE!Sz|e zrtO_ib-WAhK2#$kBjobSrL>lc4#wg?dlzPf(c$v4_>3Z-vwuR^(h&j;>Hb$~=W>$F zmSK!sIDTBEkZgj>OiK0&x53JFUBU&04!R6jXmQ6&nbeQY1=tPJkS+<au#!fOA^qM^ zThEAiboUnK+N^{ahGLP>6_7O3=t~PF!Oxx>m*fB`A#Z-2Wq=ZAOy-~D>H!KwI|pkg zUqf<LrL6B5`ihynseRC(L_2ol!NDP<9mK;01`wL`_<cHV!aYuz%Y%5=jbVC@WEBX! z!7rCSC@M)|>(!TNRUgO4FKI3g6Bz%`DBkkl@e%?782hs6(peg7;1H+1X1;VRVISAO z>A=6!bl2&9dL29dU7nN6e>2;i9UmvRHRD@vLFrUdkLF384<5ajk~-aoD1OB3h986# zR42*ls9v4g@Q!5eJ$v({{POkErE^Mps(jkv;4#0!Bm)b}qre~?#c0Li(~C{%mk^dZ z1g|>R>+1(d?{-!=%8Xq>kwPtbu>I-{3njtY+~-%PmXJ7df0mo7NJCR|b+S|qzTtS< zax611>%#}Rs|5n}$k@j@iGDf@pY>~Sbg8BDx3oT8x4xWycX<s46T;$qZog@7f1(mQ z5DNv*#k%F?O?Uz#R_u=7YMr6eGRIj(FIUNfAFbtt2R|5!kdVWFQdQae=I{0!>+`tl zP<nJ-eY}hB_hjVd<m3!!_s9M&blwBiF=AQZa#cW3R1{M-j|u`S$m;9stzuR{1unii zMMX?T1`a(O_y_>-jjD`a)lX=S2770X<Z0*%mLW^!9~J_lmO#JPnbJsTH$wCiB12d9 zFZcEn?sL2i{1<RB7kH+{#ht_`ZFti(#w4C^&Tl)VUMZqTCV9c8smJx#snEqz=h5AM zjq?q$&Pdo}AH~{3_xJE*?>*#weT9m)4^nz3X5H|}xn1_GY;EUG%dgIxOeGN^);^=Q z)>a67PIj*)DWwKkq)>05u<+FK0>&xk-2OuMd*9bwToG&T`My~5@Ad~(CD}t|C7A~x zG3TH>@T?r1a=5J6fe;`Uk=y1~si05zfq(^{SKc7cEv@?H_P<bh@^EdgnEcDF{Ql|A zOHV`>=+}SZ1^&dl0{>PIybaJ)q%VQYuv#sx?3KjDJxi#g?aFvODCXwi3Zq?AUrz;E z=8r1l_^fdB5UEyLhZf#1+Yk~QkFPWyseDohy>X#7>UQ9pw{OV-QU2d=G3($x|8RL4 z|BvoX=cNQ!BMX;qQqV7g6oxT;hW85gawgHn{W2GgmggcD{m%w_yH4QNiHooMf0?Dv zzO$#Kq*U8?6R=+K9B_1B5jt0X!`2!M0~A?(Bt6g|#c*Q7kpnUA;)%p8p#XeP^6~M( z6Ft`qwgsBvM!;#|L?kyKch3`R+(LWlZH8=ZQ`6|mO6~<nRtLlJZ3_iB6um)x{j;s} zyba~G$AnmBTsp<=_}%!1l`;~oLpW5Yp7?X%X2bXT0{zK|R+QH@(?G~e4A}Gv!0Y^z z{f`!LWp?Yj3Rzo)#Y@9GB+o(VQ$<!2Ez36~&qXZ{qXf4VxPp2TpA~Xv1d2L3n6Itt zXJqBc`55Csb^@G~VS9T|W8&jCV@fmg^7=0>{6_saPv{sK6~L7dN)8rfayW<urIKZR zjBkR$@F#>B1-ZvTYTg>Kun_}mkYShh_@lyJxtUtl^WR#Kr}{G+K3tj4;Yr}XlY^bk z%bjpPZ9*M<9EQVMjb~r#S-yB^^B}ea-rHQgZ~meQ!ONY%zwA(=uU<WVz|W8y%d~-T zZ{zlV+^~tm_I0#>OfsI+5vhm?>gtTFtUH_+`w&Sp0SLl<j$lA=^W|M#g_H-ByDGwh zyD@*vzq|48C)qzV><nO_FDNSNJ~2k__E5>g^vTvuQ^pU19tlc+{1~Ah^PM;T9H4AB zZ3U%;!hwHkKj>#Xg)pILkmvgyWiKg$C=|e4S$sLDO+=r4eUdVcTtWw^b1T971?2Yb zetQT!Zs!Ncps}Ak`L`Q?iU02aA}@g^z}%EvlT>f^Cdl&`du{i(YY(TA_U<MV@U4Jv zcOIK|#zsXEUTn%-jM3$1{O>2hrd0?N3;MI3LWP%Ctk=PTE6BucV0uweQGs{_{=geh zef7FjXJhj!hY01p%yQ=2nrN94uaWKep&|?jq3moA81t({!VXI#2^-E(SwllZO*sB< zqGxA~;iWR&btA4df)XHGP*^x}<x*PGYZW`-w_PC3RT~W>aDliweg5*N-CUai`~jq5 z;CCVi`}<W0OjJ~qpr9Zc<^Yg!SfF5oy-_gx?B9{)CDG;L*d;GWW`yls7jfmN>g}#0 zqcuw6+?fXCAPeoXN8leN>GhegXP15dq9MoXo#352!HJ0!SECP-Oskj=u1qlEH_6Yu zhZ54$Uy6M_WeQl?{3k_Nj6FfF#4A9ScJrCFhCT^QMF`pshnV7J!+>=|zmc748wM$l zv|H)CBVk0e3F@4+;MdgCH^4y17YY&{9(5(Tza=a>?fdsPu;<q=Bm@-i-ZT3T!WLrA zOBE2H@1DP!{K{Epn*n=EEB`LYEPE1*$5^vyU#_9z5ekgxa^t&S>ivw~scl@^WZsRG zwUDE*2spmw^6fMlcqq2Zt+szLPKGtBuq<GZwuX(kVx-!<3M<|suBE094#gKYHPL{# zQbEO4h|30MM=w-?4~&fPRq^pvf^-Q@T?FMO#>dgnautGXI-TEK9$b8I3i?CGCnqc_ znx^}il#E%j3u+(iemW?V<AFAsy`_Y*pOKeSy0+Tgean&I?Y}P8tNHTc1%tecq#r8y zwqcExiwi<{N*7M@zSCapxw(BiJuNU@*!&B^LcRFG_4Q&h-R0LH1yIv+DTWRINj%3I zc>gt>gke`~+p={=$z6B%{$mVGjBulNe1ZG`5`ml-1Rqmkzjb3KRjs_F48G4*@*Mv$ zC#&Zg-)&+V!XRx-)kmXda+H{?-);3U3Mxv-El;~?e`@{vrA2q+#sI972tcbWLu{?B z*?Mw;${LL{igk~JG8ys_Sr}qhkMjRX9<Dz4tib-6i`TKz_IdDO6k$qA`p4-obgt^k zk>zQ--UTk+CT1M_+XQvCO!c5w-}F!nN*qkeuqIJV7{$a)h!vfSG;+uGvOc*^QZbr= zyF-|<YpAkj&1}K`44)C~-znWqI8W}OO|V&`Ss$&lkMW*+=rV@==>Lyew`@WkA%C1T zD=*3!R#B~<5X`7U3y^IG#H2+ivR#oYkXRjdRkd_jm^~dw91>U6)lHrhP{=R8e)koV z<#voET#wYKUHC|^!sMFUQG+-OK8{|SY=)3F<%s0HmBV~{W};d})tTqmPZ;rqy6Wy6 z$9QBWSxoJTTsHrAG^LNtCEJWqhbo(hxK?#PmZFQ2l<S?GA|W<6LKNgdmIy_{ZWXy1 zZhWPQZ}_AGE6e<RK0N!P&1<qQjA)Kbcho(eby*kg(<6xE%)r^$q(hS@VPu)9;eP+) zbI_Lzmq~>$%kr#ut(fsClYVe^8AvQ@<VU-(emm1P2);|&%r{NZY-Wh9(m1Na!iMw7 z*(mrGiNPbIjJ}8A(()6o=TX)SBn&44W;`_%@@OJb<%l0$YnU!fXhH`QYQ*GHWWybk zmP{fSep&1XJZ)8K$%Oa=2AILb*x21^`;Q%It12ro5Wjx^wsv$R1ihU2Lx)guItGSM z1mo)J>IHA!kfrDpFOOUkK;X!7Jt$a7$_y{9Yz-xU+foeKnT3i~vbr^*Mi`Eis*-<W zsk8-+)VFUtyc=>>qG1e+zq{;L7KP}ap(0EFb)!6nM+XDf=pkAeQ6WH?C^Pl;!up|X zs-U1MMJ-)7O>&nm?R^3an}^yoxLvY13K_=uFX?~T`R;|Pi;MxFIoIf9?5u0#L~H9x ze*tO-O`}XO;03w!6N$!OH*_L|ua^H0lY$tH;~4hA2>-uETsl^KQyTce?rIfgV!SyP zYI~lzjic3qR>p|rsAa9j02$j|Nq4+y;azXFj&$BXKR<S6^B!3ILDJr7f{~#eaSD)D znx0&cSgavXzjzAo#nyt(=8DUXDP>i=b}wn5Iw$6Q*@E_4q#9rL&iuO=U-{B^;^}kZ zk5$up#)P_7y_JR6H&y={1GMocr!-1tcDOKJ`sFh@_C9oEQtd`XWu<7h%niSvLC+S2 z#q1kY4I$=2v)S(IzswSYA9Tef^Dyz)0>l0bLWB|(gCN&QTLWb<0^QLey%fNE^1;@@ zfg53bP4e#D9p4l6>4{v4<D?f!J-uh}EkCieGkvJ!3u<acAC2SU;`(h)^70qXLRgBi z3j_gmH0HfvXJlr^Ev1HRkN%Hk{{=oR-<M-Yqy}JX=3hQiF6)nveqwFi&1Ai|)G337 z42W~8vFxl76|dS*L2Iw7)#(Ku-k`W9OIWDt%;86RUBZec^Ttic6Q|GYgrtCP#P%Kr z2|7_Bcqdp1{=8<_BXmE%x@MH6&t!&Af4@pWN0x<wG*jvMT0e=U34_<CS!V}kxLt%j zExf`f>4@`}<k{fHDT+c?mdkzpR9sX)y|}U#BgfsW!*4ddz}P53>JZSoYuB!YFP3+9 zF1;&Y4bAAd7}3z+dc%veJV;3|5+9(N|Az*dLb*nz=G5~+9vh%OT$ak93xnnF(&ZCd z8<1A+GU~sZ=Q=7REQ}>Td4zReKyIJ}i5TI*`^SVZG+~qH(p1EdqgPd3FEobw3oaP) zdp8crGOVG31&~gHV9B1i$dd9s{aL6YHuR^^t)ojW6mio{6NgN;UII;lb{=|;L5S8N zmBVHtN4<49Ea4q<VZwX&bn$Reeku(Ty|}QDaAtQrAz=w!hLr1#gOAAqvgmG%AQsG& zPu3cv81pLAN4Nzae=C{RS!m@&Qj|E85WBN)GC}3lQHR`f&$>#DlJ)n0|3?ypOC25) z5)u-_YvB9*fFX9IL>*sR(@D%bvfca7N>7yEb(boHVa0?`;*<CQ<o+$+<^MKd%)lBd zU=E<|mE-_XN74e4Za&E>6T<Zgj8Zp?zi)4yzO$Or|9<c0Jd%qGY~Zf)2e!v2C+ANS z9n|VkWh*)7NsmIvtv_Yu`Cj@!0E^0&`ywq4`fjVw#EqUq0efmS^dRphjeLQ!2r4!% z&Q`zZAzwIW#CTd6B#HX*%cSAnOje1Biwh>V-cY(hNj@z}NbzXQfL`b@PPa(ODN+TV zFC+>J-aXuCfVE`AD7F*Rgal3=7inW-(-D33#OkRbdFdW+1!Ram+c~o#MygtEv0IIj ztKO@*rI5@2jMVb$Zhu!_KSfKVkv{&NI1@Mau`wVjIGYRU{_=YqT|>4Op;-drfvtZ1 z0{mGra#)MI<sT^`RPhE20*5w6I7uNo=p?q()ez+*f(;UcjD9U423Bk^6ZY#o{aUBQ zCt<rWEEOLR>F7tmP}gi@LXIy-oUgC%DFPrUR5G9x_AeZ2Y37rq(ju2v9}1z-J07x% zp-;O6q5@zP?n_A?8@j~VjUTk^+gjt_HDweAYcN$YlwwUIU@W1)hYC6S1^*kej~v`r zb=b%!6U@UWAwuC$KQ8&v$kOCHs<~gBx<b*gf|9i9_=QbbG;5DJUY!?RW+W5a$vJs9 zl^he&C`H=b?d-}o7a8R7VYT7Q^0YbZ+~@A2?L1Y2I-Ts}Bg*~uBT}}+2m#*BD^L)` z8wfz*EA;M$2*#LC-k=IUSQ6+N=w*<<{**A6NLw*nHo_R?f7XDJaKjoy9v>GEPk8Xh zuOpzs0mYZUli8d9cQ&6j@xHe-t1SLUl;Mlr#;K?TG8d+&87wykLhwznzBuYMh^LpC z*9WRTz3tES9YtzlV&X?3yR-NO;zFgS^5u?jAfj^(yxDngJYb<f5bcJr2of1gUS-7V zOwJQyC(Cu9Z!kVxU`&kdzD6LYp+N#AFGwU^{v1BG<iPqRJ_5C5c)K4UomWBUh&w%B zzI@s685ivTx$^RcJbn-;+aSI;`@a!uv}ByUB<uh`2A@iQ?Ylz&x4EEPmeDGA?G#wO z8()$hHlh=KAH4tBO=Ro(r|=VNrh3t94b@zTwGvb~m>+Sg+;pk6GD2kOBSv(@jI_c7 zb^&)lSe4+s-z(bcZ}FDw_{J7<g#-FZmrZO6_w@A8A0>QoJ{HT5mNCVm$#fTs_~n#z z{H?*&_pASjxmKHfD7mgz6SX})tL?kzL^eL3Mb1Bv1y}_Hz<puN7{fX`DFLn%ek4A8 z9cyV(?pRwO$A&i02=v4->u$LEUOaL@W?Wb~@D6o@8SsPnJqXGJu~2IX?^5!H06gj5 z=-#4Z?GOk`Y*(||y!NdF0>0Kq?;7*Q?!7zNhMrp_vmS2Wpx4|kwNAhF@fS{kacNjt zqhbTH&2%GyJXlvirE0FW_DZDeJD30EsUh5aV8a(Xy(p~8{dBSQF;BMVLG|cwzO<rW zrW?a21+F1>wWWnA-F1^Mb3Q(rJaQeGGGh2E{e~aePZx07b0aHX=D1QT^N-OFiqll{ zf%F2`bo1tszdCi{=VU+bLE8s_oXhVYSAEl1o86u;!^zH>kANxIzM~*LjjYMJ7%mxt z^%B_YY~h$Z#1##fxc*(i{iKsAd~y!a8?k8U{29SJDY;YRpW|DWf8xl7)`@~JtSN=7 z8cm9A?R(mWJJwB9xpBzHiRk{n-rVM=;JXIML?Em0`TD18W3BdCfiJknn-_)O9O~(+ zx^7M0boYPO@u&2r?nkxj_s_R3`pf?!za>(w55&TECXdNHqnU>+avQDS{#`d|{`G3P zHGRWyp>Rkum@Y}T^jrBxwYg!uA%qxVh~M7k`LPs;fVC+0>?;KN950BBj*LiAAVbNI z+6|O`&ap)+7dJoOWdNlX5O>-&9M|2QpWu&&_OJr7NRBSK|K5EwuAGp0Q3YM@I`+#r zcG|2SZp5?#g&*ST=1L>=Ls9I41Isx?qRSN?L)EY3<lt~%miqQC`|pw{1W6WbD_X`3 z{d9X@-#hU%$^dtV9$zrCU_>CX4N$>Yc)uCNzITTa<wZF)l>R}TsGBl~5p|}^9zhs! zhT|c`(FE%dbx=+b%O?L3diBcbt>=(|jYE4H@hR%$i7Q)|lY?D99iYAs=S6?-%|?Ud zA8<G$h8q%g@&QV04}UD&470?;#g+VQsemuXmgrrkh@K`zC4b}q88rr??fHK2W8)-I zBY1}Ox7WEdJ0PVQk#xKc=^^lm7Sc9cuVFkL_x>nl69ac&jtn;K&(vb2=**CgeLPM% zFG$qO0k|LKt!+CFZ?LyF)Q;vlD>i_H{gaY4VXRD~jN`*2BR<<_0|NsivlEFu_r4Vh z+qBS4J|R|9sLYwUQ<?<X3d;BHNx5Tc;D7k}Q!tbq<hw?bllDZ^q%T)capj>-1guxW z(gLu93ZFpeqO=H7hdi~Yu8I<opjryR#}4=S0zi}U_~39ORy8^Cg_#NQzdDsE<&NLE zN&&?aO-1N`)+cB4-^Ut1{iSe6`GNUO`Ue}En^Jw>i$u&k%8N~<x}>0yhXoCPTUzFq z%R&$#CR{p57zXB75@m-`{u+`bw={N{ym-LP*Z_fi@nTMw+ms{)U{Q7p?SjFhC+K;^ z6MTeHU*AlN`>jxNwI;GRx4xH`l`W%4uha+jyjj_t$|O$gAjh9gUTy5~kdIIaGEFP( zs`fV3_+-$8vvYLw%>$jS;3>HIQ3;bP;nm<Qd73h>+s$7bz7F>M!nv%z4Yq2J+Vj*o zr5<x1{~i85PRy(Ev;?PpuKs|_UXRYXI*vEjE2KaBi{#14!zdDoc515c-$EIY4q;MB z2lWAqPO<hDZTT4Xb>H$R*oHMTR7)jSzLLw2FD*TrF$EmHK<`6C7V~sr>?<BC5V}Gk zls7ZGsMm7%LeWHp9T5xUv3yKZv>_ogcPZRFCo1#-jPD%U#75Z72oyGNzss-h6j(0= zDp|jqG~eggHciV!Ak}6VgMVr6UOQ19!ri9Kdhh%D{%1#W{F}>cDTw$!y5B#(I%DpG z8f}bM+h1nwz>ob4HJX!FRw1I$g@K;_ptp!U6lDBE=(4wOwfV&ORteerZ{y1q^3=k$ zgiw9&JavHkWC6p5m_!i23kWF83Bd=&%61v-&Xa13y$k89?R)+rF+y+wCRW@UTns~Y zZM~G9X!36^WpGr~9V42a?ru!jUmN%IN#LtmJ%<KE;RrW0`LxhCtc($x!VsfagnIEU z;^S}cQXasVadX^%EWM+huved@$LI=T!A88KAs!oxx7p8Igq(9K*UTDR!9&i0_z+`O z&qg*x>@y8wuPy?NYVy@EC0yj%+FBkWmb55Z^%LTQEKXM_Nfb3U23L|*H!cMtD6D8z zXN*G_pB11=;mDZaB5V9lT^O<iQ($^oVL6kL*VZ$$#+=3@W3GPXTkHi1cn&SgtFGj1 zA%U0=qqHMxCF@M?TCgP3LonISQ$Fs}D<cE<4mS@!Mnv2|@EwMK^5Nv#Y_yiHt^`no zUJ)8sKg)?lgS!tT&Et!UB#5$lq?Cwi)0||QQ12H$Q;aLYaWlA5S~2s5!T~=l(cuRD zdx5sGo8#a=Oly*Vt@hhpeAJ{6Y5%boxs&T}9h2#Fb-OCZ4S~il|BZpF;_4;~lJ8&c zQWU(txyhuVk^O;pBg!r~qrVePq1l?6@qn6kXz?w0!*$nhRO<0y@yd%o?mjMIVJqHy z@?NFKbDQzXf&|i<iRqi(<Wr}#Vo6EihzR9wkZ<E5tf1uv(d|yFslcoYCjx)Uou?D~ zL9Hg|X6+hkhh_@$NT;T3?#qE=G&13)92Qnq*W{@LJqyc_Bp6(*Xnw#I!mWI*eSwDg z^aQmYHfT|vr~0+W4ak&9;-_fP)`tk)etFkHl+qqwr2alPsAMXQJ$B5STi(9?S#gIh z@gEg`*Pv*S`db3lFYlFDGS#zo(nB|E#>f+J&ghX_ICz+F|29v_ah$_~BSvcma`BzY z9c#w0n@7?D6?o12mMA8-pzw^Qa0If0X(2U%%_>Ivi;{`c$*?(!A-0O}Ato9>bzj#< z#;1+|)4D_+Y5&Db#%)NXt|9Tki4-C>P#DAE*2_m<C~LfaJ3!H47Gg?<%oQJMkk~8I z6)?)`bJd@#z~kOzI?d=^7fFc8u$A(1@KT3JZ(#*Ya?kaede10gwfa1v*lcpee>wdE zA7|Gag;1FI?&5a6;~f%l^?Sc+_RJ+HBL~&%TQ!L$c}x^(KI1n=m-}FUS<(UVS=J9@ z&Rl*HYla)_{od2^_jQY}y?n2?)&5Ig=IpPEP~Qt92CuOC6iim~?&~AikC7duPN4}4 zcCCp+MBJO@k^Pcw*SSxI7iICte=hK1&)65Ry5v4*p(g#q6Sk5LyRhDHMKU7DcVq3t zV{MHap7e^O@78NR=9(+E-j8V5xZ_DtlJj>b^I%v*tIa0IeJp9Og|;yLWg8p1%39;S zz`Fg`ta6mYB#qLvH}pv0j~Jh-POz}>0$T|QNoLVhO!qX}h#gP5)M+SAnGJ%IdcZf; z>h<i5UNl7qpmrEhYsj_A<hGM{d+zC+@Z64Ps=)CGE)AYpXrPZ<v-0-#R`^NwhQ=Ps z_7CC%Uq(zzQLhor<f{L1bIts!e}>EQ8u=uQ7djLS^kzw)e<MAG^$Uk8$Ex8C_E0q* z4%o4FV_!*iK1tsBKP`Z)+AlCW`=|y^X&Kl)deoZ`Oig=jND&d#J|^By;hZq4A(ePX z9)P=<I!_{mG4ABj(!Tik_cGxs&6zMfIavNS_c7l&FX8r6dnS|Gxglxay8d!VajC+Z zJ(-yK4<Va2IXpW0qCTZxUtz89IQ>3{daKV7xb+zl&!ZiCPB|nfWbtLW^gVUz)@N^* z1Z9qv41MeJwcCN4xME{7IUBqspH|dS--OFlb7W&PU4jqm+^`q~w8i;cGw<In^qC-3 zZNwtUiaI33Uu7#M8Fg@DBeP1&)4p3A=OA(Su2dF2d31;GfX38tR%;QP46~N|b%gjx zb*<}+J^lkpG99<#<`Qhka>>Zf?g5l4LCO@@9>5m>z(FY%T~x$I6-p76qq+7BrKTV& zOQ2+7K@6%vKn0qdeI1iz;<`WH&Q5TiU(PA6sv?}Yj}82WjI5P|8%K4J<m)s$(MOAo z4rvxK@iMC}$=lv|%koXw+CD30_}^YEp5kI_v>wnio1xWi;?S7Vot(E%&RJz)h{~4t zg?oN`&w|AoI_N@lEVnX1;&nIVopo*OgSZB{K}=zPS7*<5LFB>GWPxiksx*JX%q}#6 zI4SnHX?5>Bdx&mM@G+8Hbv?{`r$LZ1G9!#rKTo`%xi^%%ko6M@6?u*g2)1~~?{lmY z&}vMj3l`DMxxKS+#{#79{+0waX%sb+^vjN~%)sNjn<qn;2zC?tabjZ9;1XNbA3ms@ zkf8-WCixY(&3uD3iGY}tgnqjE|Fv}8@l^lc|6W^0$c~Kcu02BLrQsThkd={f@iC)F z_R1)-T_Yt#A|u%=BYQ?>wq%pY>UZw<@$28XkL%v|>vhg~p6B@Z(QR7ga%dp1!=LO6 zk&qrYXZp~*MYtI+rgUjHPf#sqb#C;RCj8vcb}Cf(ce1yJW)%okf#_9aZ*{pnSCw$J zG<i_YOinZ>Igwt0oSAIErNH&XqQXKGrU9q~8S-9uxbs%79%xd+W*<$oF6NO<kRYj$ zO+%j$yBXolm9~HJf<%4&;ToFP*ZxPoO8XUhd@#u=fGkB_*Lk_@`8tsxnfNAxo&5lb z0NM+LG#?DHUVX11y8?Te_mKtvO_Jm?PW32T^6&?hTb0?Hk*&@La@t;iaW=imQqjD^ zO}2<fC~)v4ZJ?gM>vFQ!kQdgh@x0!Ibv+$&`RNVg&Y2k{H<9yK*(2WXeT2(@V&ZMT zoj_h*9zH$rqNcuq!9E$opovIBJY9k8^wZD8dk+N>@i&a#jSVxHQ<g{iR7}<KYX(I{ zk8RWdiKL)FJo^;54os+?{E^-~Idg`O@UB92d5Kk_-QzPLafDSD03+sCGg<rO0MaAs zE`!)mrX$jDNyGH72<Cw?<<RD4F7+I}L1)F1+J=T10lnK=I>A?pQJA!skIt(s=r@s( z-YC(#rtk>Uj>L`mOi$hDOIpveX-&(_d^q0PvxO$xdjiSA%^{>?28mHs-la>YJVK5< zEclARQ7>u4@H$Whc=`Y}2I&e^Y(|8j$%bi25sx>e)Z9eg1FH>9X<4-ZAONGBdm?06 zyPEgIhzt!qtoY~K&I4kR+J0;E+-v8!^|XmXIYh*@ROVL*&f(sYhNE9KW&e5f;WttG z)O&pgjU~Z9wb*qCf^3AsI8L@B5InBC;GH=toQJfT_zQf7tJ$woQxQy4Z@-$CsUWdW z$=SGU5C5CvOvB*9AgQfvvvwa`V}LnHhWJ(SN@2Oa%n^YABgZ@D=Jmy}fXJ?^n?fk1 zX|>S4sCy-c+NpEz!p3dpyB{yU*2PYD>xR;V>-~ZS)$G#(hMRc2Vr^8I20i+Tu1Rsq z!QLm<VM3UK4p|*|k>zdi%I1lCXCS1RY3b;E)zRlv`{o0^E+HWy+@)(cIp3ib@Z}JB zO!gmhxb{slu#`$gQgO9j$lXVifjD(~{X1|7gxF?j+*AOhRN>|tM+tYg010c9{RI6i z=D0&H0udq{N1FnAbV2MTqtZ==0YLLu2H@80ye=S16nY{O>T~~!f^V~8LJ>|g;|eW| zU#FzJ1nZ?DZAY;n>e;ITok*aD3iG)8X<aeNHUYK@6I)x_^6Wh^G~pIGX%%EVUdBvZ zq5N>J@t9?GG3W|y@2TE^`K5V(?P`p#p^?$&%`u%@c292!dI`VlIldIw?g|DlwKTWF zwM&QxAa@HK+K3UbAy2CaYjEQV^-&TPJrCT8eKYiBHFD=cKX?W;XRH1wZz{g#!3YBW zhOl&Tap@!<>c0tG*4+xZ7YXgR2C7#VUSqIRzi-~}&RTt~Iy^dR2LuTofJcDOTPk(` znLVR@{}g39Pk9L!RJonKuhd(-OwVb8eGg0+?uP#Dle_8UbcOjrmParApbP;=Z@3=S z_HH|WD4sP9wgBJ{67H%&U)sLDjshKL>4OM<bFG7R`gbIUGp%Ga9B);;<`$rXXX_aJ z?b}Y*nQZ-w<zPLsiHm@<S?+niByxtMCZ8`&tFW9Ut&Abq{vM<2`#WosnYC$wRBu9) z$CcK{*`M4YjG})^g$(wVp!Us37kp;;h!399i)R<Q*;vS0{0Lbw%$#Io`~5G3pA{(+ z-Wv#Ae!LZPNWaxEoqw{xK$`7S6nn~iPGoLhDt1it_O~|0U@yoyxA#D{E|IwRjfENS zr4^5V*^%Pn$uTfHK>S6nBe7W%-(LFT_=abJxpr%@Vr1Gegzx38)SmmYY=+jKs)h9) zII}hV>~Q$Q)F%hSYW;cE^A<BxQyK34JoUxfC(@+J%PgntH^{8TJHIW-QiC3+j)FCI z%!L*$rl{zQ(!PKHQeE!Zg?l(ukt&iP3gk?WI-z-Y<zRfmjF)GB{+wO~MW~6JXGOIf zxkN~Q?%X^U`|c(z{{eTX3uxK=)}|&1l0-cJ7ASvQqN3r?b<3))^!hf-5`m!5-cEvu zpKBY=-r3IUWtOZXPQQAUi~d}vrlF&YYS;Ky)f^l8?@Ww%V&d1V6PWOTm+UK9yyJFo znTtqYUq8I=V?~8}(!p05k`hBJ_zc6V0)bnLA`=V!LMtWXOv1?`?Ca~R=->=AQTzJ} z0lA59K+heijyAywo2s&e5R#x#G#G+#?H>UcG!i`*$VvCy`e0KL@irL9->Lj4st2e9 zYK^ZWVfR|k{UQ$3$B4_zJEFQ~>W{6Ax!jsL$&&OgN+F(?z{+*%Ww)q}@w<2L5S$uy zATLxz;<B=`wB&gV1lAj*K>j{CS-Y78M(uE5E++RE7GlJ%7d5lLe&+?4f<hkcjiDFf z;blX52yhUf1VCoY0Ij<<1*9F46*e%NFm!JHCC%-S4vONJT72%1*XBhEUKFsv0H19F zM0Q;frMkJ~O3Sgd9}=siB+IG3`2yXR4^&2cGYT&W9n;wK5?83Dx`Tt#!4$bJMq4x` zkcU;-eVzzm>FGIgA=|;#wF3n5K<WTxbb$;%i!v@71=of6Wn+Ej%R(W1G_fl%q0vIS z3Id)B&&}nP;Kd~=22SgXili3&)~I%28}@*OSG%}J*F>xA<QYQhjGc%m^p=4*#?~1F z9xnO`Bcb5DWqQzs;0ks3@_d@h#QxYAqvAnUv=VHC$B3u^Ge86aspuUK$=k$hTu~Cy zaJz{*l2t)kZ($F3lOsUZK)~7U5FQaR);j^<!{DIRR|G|LRL|ZME`nC<cOE)&kcAXa z?gQOURu-#r)_J=j3d=)4Kv4M3v6@EiJx7%l9kOzRGfA(jphfko^}7$#L<m@4Ta1+h z8V^097T>Sgvr|WRp?Ea{F-)n2qU)p#H0EOrQXt;RTP|v7px!mppZRgOE6Dj8{*pK? z*E0I*ZYgd#oX3jLo0x|%!8JY;O|s^nKi~bWE-RDp8|Ud&HZK@j%y<Y7K#3_%fsJ|r z7?7!HFQ3SL`Xp^hLqmO2*Ejh}B!W7L%yKoJp5U%glGRvWCcLkkkSh`2xmbfzN8cg| zc<6Jzy3WOG16|*tQ1Xm$jA9l7ECEabvUf`}A?cm_CU0f?h&YLub0lb+;NfDHM&uC1 zXgG_Dtsc-bG0wN8=%m>+fjRQ%MjcQMT8IvEb8W>Ok*gmmd3ke5q~K(&5x8}ixdFTi z6g@)3eV=`U);F}Pni3?`<g7O|bU&^-ZN+p^ChA5a&?p3B6h_GX=r=zSp{AyWr)|Yd zwV8B~>18K>DMPg`xRW*8BB@^bsi40u5_5JExdKokB7P5uca5i$jaJs^uC9P($yYa| z8ksp^x|5(ohC<=Xe@Tn(^nAEi&RG2!O}qZ1kpmv()QpT)Jev~|Y^2Y_sLTvI(-k&A zAMUcp5umZT;^Z0L3NJwD)KuvVGn!kkFwpj3HHDXxfX&<>2s-fpS;j3E8iN)Pu|Io; zF+s3$P<1?tDGFbZ71F$Zm&P<29}$KKgmgRz^X>Z`R<txAj`8uS))1%obojgMLChQA zA)%jnaS?$tF1&J#+^fI8j2fe0e?&;>=jt_A;5-?WyOZm5gACQ(<!0;I7(qh-3bjMX z3w55y;bG>Vtwl@HzkYw<$-gBzh+E^^9neh(F6s!5X|q0@IcTtF?Z<}<0u$vT%MJ4a z&QQby%4FLmp5gxRk5UuUL!)-?<o^2l7r;-R1iTM`(1h1wJJhKNN+;jo=MJTja8R|` zMLT`_IreG2-Gr*084f?7Sd<;^+kmR$4VIUWyt;!;OWM0LhM|sd7t<D>vp=u_W;SGM z<B4AF*RR26#{Kdu&KSsVmq6&5I?WbGaMA3O!^78_4$pl2EG-cLm^f96fqy$b(;Vht zBm!^i4QWp}LSrgAs>R&YtMK^sTpxBxn>-l3V1D;5K6jNkMjT#l7A#H8B|iu2MS-6J z%j31*tGBxvKQ#P)@OrAp$ij~yut?d-+1Y$}`UFzC+P{Bi1}Qe4eG4<=ImzjR5#fI3 z!1j`H$&SwL&yuY5BdszrGV>G`hj0~ESF^12Wtt|OL-y(wbj;NIj!0M6^pErdr)|7^ z64e9#S<=R-04Z%X9E-rp5`n<y*bNy_uw>?~`gY5uw0u(i)ALG=(9Zq81^;^B(JSvs zDnFnja569i5FD0v)$QK?N>lm4+za(8{-D<+Qt;lk)J8!xR68tov<v!0Pg+EQ$|jX_ z-KyXopHZi@jLn~(`YU<9&dimrKVHDPTT5Ge4#>KxX=%p$*E^ZNfd4u4{kuTTHb_Fw zI&5G>dLE#O3g34(3$)?U#i^>&U!6e4f`P+ru7wz`IA|r=p)iEo8n;WE3i*?l*~=l= z9%B;qaHW#J$V=XTXj^-Al&C@W6yjf<JnSUp<j7%=;7|&!yT?4MV}c5-3MC8;3HGLk z^8*nDPA$%$q`_}<9?I<fy*i@;QL62J!^xA*R<bLqS_u@T&#$R`v)H_2VE%l#q@D!f zy*-N*F{}FcON5oHHSuj?Vlq1L*0mg+(Sqa>8g$tZO}Mo|h>W;+>91rlxa%NKN7A^w z|LLD{0YO2ZMaily`(i_a|72nFcS-J*`|YYrU~1e13&sBj6giVHA0}QDRDS{25d@;G zjo0lSr64N_Sr9QPQ6MoXCy^i>^0PHic4V41S67XtXR)Vgc=94JOd-$f2F!{Nwle*7 zeyky+<mU7IrtoF(e^w|El?r3*ufl4WRp5JTy4M7Gn}nfaUmoU_7zV5$TIK|lj>r3P zHb4y=D-7ZT*8$+Nl8k_(pu}{}mHK`p)&q+tCI4O>M(~^;2Txxk>0)>LR2=KYrE$tj z&Pzl6ciLeRNu7ICJjzWK@#PS*dbKY$;TfQ;4OPz-2nJB%ct9VPEwF8WQ(f(2ut0JU z%pdjN?PjaU60N^q3@q3Z=YeJeghsTvIXh?`Sx_$k35SK0BRJdBBL>FDBP%N_rJZyx zUwNu%3KuP&O%DeW5eNy$XD^9V5ID=!J4P0<O!vK!2*BrKVb3bP@w2Bw=IciZCuy)Z zcKOlZOf6;Mw{MV0T5OEKbv(Z(6=h!g2#Ek!8?b9H%S#Tosj^?~a4O)#8Z+V-i1TSM zS96!?v|dJHPpq92&nqh{#{zn1ps85fFWF-?CtqtP|7{BBhc*(C&;zELlv@&I`*_mU z&f|c-M}RkEaR&=ggHjn6PWj5y9r5QhEL7OgxFQZ7ljJa1{OJ?p*J2m?pIJr{WgDN9 zB8b1R0X`&r#m2%D6O^1ak`A0KGvf;a_l?$Y_>~yh`0WhYASkfg2#8g`be=89O*R;M zO=O%G78G^nNyJCqSGed?n1?c~out4R!)GtgG3GK%0Ub5le9&3EjvgKP{tVt6R}u!= z59jBpj;-A3DSz)3Nq7t70xu6gUBFOO`ru}10TlNp!fO!x?yfm{r&w1_P4NX=vWN)` z$?%jK*5_f|klc(cOh_746=Iw7zlEr~%Ych%cTVcI(!UH1f^8}lxr>2zVeWv-N&i_- zE?5D*EVv>96*QJ!0jJ^4pBnkX!?2z;P&^z@GuTU0BRv2mEe~X`4Lt2Zha(~g<7imZ zSyc*n8sYq@j`|(nthq=YBxWMzFhKJLo5>i&H<?xrdrq(#1^0)RGL)2*41$LUc~iU; zM!((*@koTOsZqqn<YPEsR&a@f?T_*F#`J$8H6!;?w6$2e{I;dT7YjBUPo!vlf#M5) zI$WW5j15+g)|$yw_SBs&yJ~BDNy9xx4bfmQ1pNEAk?G`Sw&c?huq9V(Vs13{4U;Tv zoc!N^6xYIOE_9?eS5PxuwMvx=3R<LK9}-M>bo6>-MN4AXE^pXDMCDetTB-_y(48R9 z*`%0Cx>aS}vb()Kxu|W_)`-d1%h=%{<6tA=;o$hUt~kdr=kS9atj&iy-#(wylOHQS zXIl>iSADc~=l0B$4OGqvME$F!Gfe|8A1D@7P0PK0{z-X;3{*JHz&7%hOfqzti+PDM z=OZlkSx`_=cS=NZ$`ivg&bn>ghhzJ-_rA>_1t>%N1Dyu2#&rFuXlu?p80%CkI1dm{ zI1A+i^n;b_*>?iz{t9P|*ruAzwc&XKfXc#pAjHbBO1qagFHXLAFk8^Yfs$TNqmIU} z_m^}-w2ZvG$!=9%s=Kj-j@eTGd%?dCDVkvv`?30PZ&_*ngL^~~JQ~j|^b1vUa-Yp( z!b-SzDyu9mZheXqHZY^LX?%;4RYJ{Y2?}TqpBt9a;Gt8(LT1zL@{9eq!tyetu}TCI znB_YSKt_UI009`MraXDg#}ZFfPX;$uCMq4Pe~Ws7U!}C6X->o82%t~Zu4pweYwvSw z@47<8PKBE{RYuDNi89{<;7;1fu;h<$FR&Ig8OMl(N4clX%%l}bwNZpMN%08#{;Yis zJp2L4KJI*fnP0pSpkk)NSw{(~oD2H>B(64UXnb6wq9JQ;&Z;j%PQNVqz2+~6^^9vW zy0Q;Z>^8D1k^+epn1(UmUiu$Eb!zYEaBy+4`*clYhW*QOabzA+3LCY#Oj0R!y61XZ z`^l4<)yX=RK!^`cz~o}+#^^8I<#whln5v)lG?%(SNT??C@dLrtVkwdNuV0`2m^~?c zU;O4vy5hnmrwKBf?D|BK=gBHOTr_<J>P@`y;F3EuwnCr#JT_KRT>K8*m;hNFFeWI6 zJ@0-J@Ueq1YkvJFE(U^|V8YY0_51JY`x3i-+_%6D9UJ}4C(PZW``Ce}Z&VjhQKi^( zh<C34aWgt0GcbMNEMM|{NFW!I3ip*)z;D{)#+~S;BD(K-9zO@Tn&gb2oEn$D|EVpv zms<YkkBsBmuRStyS8XX9_+#a<+ykxLSl3an#~}ES14DNWti5Y%#8}|gV&}n~p&Mpz zOtWp5z?+Z<0p$zg7#!QOq5Fg`0KQLrL@BJyx68-|NYh!RQYvLMD;Vqxn;<x$bIGHp zrzdgI1l)hUr{vT#(sYh5x23Fo6wI};d%_y%t#H3gJYv<8b+Xd9wlcla`+cJy(UyA1 zjSxGzSLAPhe|Wx!+xv{I=yMf&d5Z_Ck%_xmPU0J2b#M^@TaH8SlU#bQxV%ib6*KJf zioSO-hpP%D%|k6hz|-}vpm=AY_IipzHL)A3EUQ#^8Vj#(S92U8N83cP$iKLUZf<d4 z3l-lg4d7F|7-b(NrP#G=DX(VheoD)aV(r4!=ha%~+&az5U%%$!kV=<vwl*-G;@Frg z2@<NJrD7HKc}GjYtBQI2kRi~yR49%GLd4u*Ow*(rE3#<3G%Qt$N(a=S<2ys*HBI8m zyIMM0M?8RNx@xFAoNpz6<uX&@ep&d#huJJr4dNk^C3Z6hA(fE4D&NXmBq%#33NiG5 zGj%V+j|AX|1Jsw?I#lG*ua1Cjmp$=rU*Dy7j|{t5KJ4_>ZXLxK0nnh4T5cnuA(Zqc zw>pjL;*(~|l{=j1s-2h-!y6&X@#4?FoE_D0XXH9Mxa2`{_~Rr)+=1<+3?4D#FFswq zN}XwzsxD0VQ8*m}Oh^L@3x$r3jtrj;6eL<t@H1LV$&A#_6wL8`c!H`rmwF%meB#m& zJ)w_ZYMR^w%zx-^-R9n_sVr)p@D_h=#N`83lv2%`+59Ay4iOI-35dS!f~0n-JO>Xj z_<;}Uv>)uYO=HXwePtGmO*4J-RQ09Wn>1MNv>0c^A@lCpkQG;1UobM8^L)p`!NH%Y zQ&LrVgABM09N|`O@JQR)=Vivs*Hzj_{SKq3gPfF5G?$F?M8)pEr=L60QpW4{^(TLt zOl};9=DB74aGSnM5i}z7Mzvf$h>CE|gj$dnBfq*GUjA+P`*-ya&1<){wSoFsZVgd= zz4l6bER<h3(|dPozclie+|>`NaQ1(^C^oAlP`iwCGF-<&*bYb;ZsiZZSR1FyDHi#4 z)@MbT<Xk(d#TnIu`j$O7AA9g8al8zr>~aTV#T@=a0S;0E%yTYne=YPd;3f__hLV4O zwq7XbCA!+81pgjboOapQ71#fnh*cQ=E88>P)D*at)n;8<cf^)UpG?8(YA%I^qbl_A zb4YsL>XkcUvs)V*ypYTyF5bMjxERHtf$4;RhLezC=q2PzOp|LTO~H{~vR`S%B$N^K zF?H6OmqVfGy6?<ihpFS_*WE3jdhHfdkdDc-N|{6nBz!J^@?a!4QOON5jhFHpU`k5l zkp%N*_hId;R?H;%q$H3On|hl>fL9LG_$zSoAv3o>OYurxO}!SPzYF$^i&U@oi=scf z(_aiIR?TTM;yW)evuNY`c|XzaOE}dT*UHbISdFiU$;xqvLp$HY@$azXnHw{J(B6l0 z5q@sdPxpEkJ*pX$R~8rFD(gIeDseXQv&H_;Xft6P+@rkn)!Z{F`BIm}z*suKFrnA3 z6!o4*WCDOzzqaYmt{jz1h|A@1b7}TjNXzLOFOYdZXv0T(n2D@}h+c|4uK4_8Rq`XX zs^)vuoTYdX6LIii_Gu0%NEBqF-U}0b3RZiaHu3!ae|QkLPuA_<4m$w%8gIR4{OH(C zwyvl<e_DbH_oG`|QuK1K<D?AG%t|=Cl@F%M5ef$xY6u8qf!Oy;W#j)D%S2k2_&8<b ze?ImuXYL4H-q#0-fN_4ck+5~AFf}nbk*R7t`W7ITh1rFv_yIEsK-&4><%4n=0;Cv( zXqu^LS9S#^gJ_c8vaX9nu?Z^GhZDblS6GA^nwn~YMy-?HSg;McBjnd5kGh>7u7^ZT zpmQ)O%VWg|0#H{_Tud?xvjc2NkD9i#u3^JGwQ^L;izMVMqPwiC*)8i{U5E^|2+)Jn zJuq?6P%VetUXG8ACrcDc*kZ_sim!Z8_~An?$Yb1oh17+!qsdk*jZA`i)!>3&jwcG7 z<N1wo)r;|LWXs)QB_V*+32<f!j~99f3~2zW8i)}Q(rcTWBI92FP3A!sB7nCXQulLI z!q7sKKKEaLbdF5a$=4R98Pe2!_o*+1W~Q&uOu};K6(z5djkk9yI5R<7t>)$$1s80h zt_!xUl{9YtGkZbx22x635()3ivh}tZu?W@u>Ur(Ae3+t(5UyBtIN6S+M}XgIP)w!z zLu1%6zoKM!>DdDW_?$qnAtuY@O(I~d(+L09lQ8XR`m=)<|IeS6-wF)`X6tiqrghp( zg=@EbDxw=EvXT|S6+aryHm*4?yLWS;>T+;c7>Yuq_nNfaTnd}(RMktEJs3Eo7!$x% zQXv|Yn))6P199EewPfpDUc5%0s60zQfMX(`Har#fI{X|pb5!*yrO~KSQ*tgbHNNmw zl!1Jv-IEE;Tvskuc)V3a6qp1_r?2F`Ehy-`O<(V36*X=g!62o^m&bB04x#y8!%Hj2 zwm?s?LpVB=$u~L|8rYhBerV?*a|0lDP5%uWiL{mCT)l#L!kdEE)zk?0_jMxoMn;J3 z?Cp^6$P8o?13jK0r(YPF;$rRHx0hK(<@d(JP~&05O>#Mc9RjLcL?v~*Q2|tfys#y6 z>?9o#%7u-ZQs+l8<yR?WzuY5&S`36)rLNO!1Pd!JdDUJWXH2eO3dstjFeomkh;?lE zGvV}7??^f2#L;lS6M>*YX{f8-^_j-8xcPF|^si)S8@r$u>ad#jep1*9dVWFz3~!Q0 z|9^}Rhu9w5MVW~hd3@HutfpL4&(Zn2194rQNTE=;i;olu(0P$_S#4icxNyq1Fp~E0 zCKx*1>;we?O1<ljYjNun4!ozZ$&}5o?2v>3miS2wp{O~;!-_%kn_ShN0FNIlj$MzF z-UG3iNOFs&YNULWww|bso;)n6JWfxf>|RjKU(RyF7v9Stt?+-|2jO8qTlL0Kpu$i! zE`QDtB%<v&ST<3~lTv;fLk1P_`pIQc4gKuURW{cedmhY$z*wp1V+F#2vCnc_`yO_z zR|N04tn=kc(%r8f?oV`~f2aB|GLV4FxrK|+D)j3(fmNv3G`o_YRWOBq!kLKK3wj*% ztpBzKvGpabpx(2s&N@iDP{30@Ol_$aPTu0<|AkC$jmtT|I}a{HYpp=fett?dS;m__ zEPX4tD5;R(oN-ftUZ|jr7QMY@@oys59(-Qm?6g%n1ETjley9&4h<+V+TP8!v4_7)U zKK8xl!T=?I=8bAXC+YnnRehW5L|rs4u851nZt;w{6u6wN{RGxm*>HAY+ApiZ-v7|| z&B#I<JUxuey%_W`fNFN{euefa@Ad1TxtDizGGv#0-U$>;t$Z$htIiT`M<9hwj(xT# z-||LGJ7nSXv~EBBGvaV0U#Tse>S9;?<7Eb%Pg>v1+=GIA`4Ih|%Ze0DP9=@)vrP!D zVYgQqO?7OUr3I?`3aliy7bG%eiZF9RG$$(o4Xtn&P&eTNw!q7|i-7gEf>F^(8X_!v zyv|1wS{h<}V9LosbI7Jwrr>b6gEg+@;@uqZuqkUDB;^&?CLDIl)4~zF*gq)$$8>x; z$c&Gsn{%rw`WDmt=i^dc_*kIZ>Crw^(Ba$4ZB4U?yh)u2DdIe?DXQzHtW>x+@2wB_ z4Y>#zJ!JY7kBeMwU8<KDi{ZpDPO(*Zm;}upcyz)pqxR9pJVgGuedvuoS&RPH9?VN# zePJRAhJg|tuhDEl5@t%mNXbWEi0%jMGh7NdAx8k#(h2Rmna3zf0Awvq9F>cH2lquI zK0&3L0%;@!QBwtSoc`pZZrqc}tEHy1e-ljdoJ9K$ZHr)`cu<gfaKxn}uKe2pD)1#) zob9Gm?{;13cC=ME_x-_Oorw5S;q*>XFDM+VPyb97ynnv{CGzC(=6QF2)T%%v4XYUR z$?G)&Z{t&$d;08s*7;*gLFbNW_?;_S3V=pgttJ5B(X&)f;Z3F3lpAl>?diDGtnwi) zop#>#w)-K8vJs{v($nb8bQnM}6!0Wh=n9;zeM|BAO`E@S2#|3V^lA?O{fDC1H;n-X zth~jh;M3|3GjDcBeB}h+e}bmdAIJ9o$9<CmQ(lAXX(YXLV_Fy?t%P#55QW1g!l%$G z0OPyi=vzq{IER#Zj@HrB#&z3u>-m4o0J`o@b-&*Ws9w<^W`z0g%c=4q5{mk{Ae|hT zi`xmAdv53Z>_)!Y0o^rs=xpVr%L1tSZCzY8ciZj;mSxIc>TfYC_V0oUJmucO4pTQ+ z$lO-k=Q)0LELW{{<G>TXxV%!U8CmaVTLD|72tYzJ@q%Cf@tq|-lR#Zrb+E+_xOBHz z3TN$N0_jc=zqL;~fA;0aKf=aqj|f6tuDn*&=LFfXLhV1F_IM3gO+&gAKRmX=ntL%z zMOs2h1Z<4L5SsxupL$U{J3HN#!}by^fO+(>Kb}(c^Hb!=y4GKQY_YxS3fE9W-SOm) z-Nl64$nEid|Kv%R+KsYy@nqY-*)Z7N5QOY$3Pi!(!gU_?*KM`%@#7x}By?Oiz5gw0 zP_a@aJmvLS>%FRxKMZPL4+ysy8X55%r#B#LULDRqed!ND)MQ*gf0-<V;FD%kdMCbD z;<K#qa!@KNDi}?6(?8D$`SOL5^m4?-<m-VyBvByXk`KR7T{Sbja^YOq_r`$6S42l0 zE(LoW)juTDDDl1-AlXXsx?H`KY<hBI72r+ojX!?F*@I|1{~6aIusvLb*1?JK;cGB4 z+iRf^%}#t%FWl!<TTEy<R=fs_UjFo64>;y!TIkxu+A6Cr;Jd`e<nHPDyX?M2$nwAH z)I1HIdCy_676sGWx*~_as`%%9@FoZE%UcMyj?Blp`fG28rKGR!B$Yg634~C;?Zbsw zh?ovAUT%Y5mPq@ZR(p$QH!?p{8cQ(redKGB(I4bCe4FmGO-S&X>3Z@}AQV(}FPJQz zzKpo^gzSG~Z1nNwF^LY2hdI2{@4zqQPo<1R8s&MVLr&59-|;_mDl-lY4Gi$tN-x+g zAgX>9I@_`w?~s0~_6Jq_NnUvL<(E<C%EpP|#^!_~0NTreZ{ON*(oS7N+LCP4FroYW zD#$<Vd)%PL{gRXI+)fV1S)BQpMXaZ<z!jwPj*NA$_Q`xo|3hf>fh7;>wC!PYj88aE z=(c1bUI2T^dlpF-Ni;pZcG%r`L~>E)zeDx&-b2}fy2;pz@QhDQ%^|MtFr~pSL+Cdw zq97?1^0@Eby-O3R4jdEUsn?NzZId4%;}W9`(G^gaWrLtQU1Q@;aJT*o68-MWu?j8V zM?z5b&-cetaqU)%Sf-kK$xanb@N=WzL-#nAl<z-Dvys4u=-uK=fMw~>;NZ*0=i9P+ zYx{xfvv|L51yBVdw!F>Kj!O$?$6G5Poq<T>!}P{eCzqp>OO8%CuYSJ%gkDvRLf%>Q zFjhL8rH6E3n%I->MzCvDf$&6dL4fSbWXRL9AP=K~Js=D{U`q67#TBAJfGQ3P7%n1k z>x8Agq`W*vD9IY&0AR}E#Z#b)!HA@Q|JLq?t6y~E;a<sw;v$o*UYyR}=`jcRv7E`I zX@vuRjt^>tkrcR6Iq%;`1Lz4a46QVtT%5?A&<Qx$DOc^PCl1VT;S+}w@BdksiwIVN zu&x5Tad%j!02OPl;rJ}LB;d6F9)KXa0=u0vX42SXcn2WyOjw^hkWxNfy#R3PQ6q&8 zxtMkW1SvHpC8X@qMXEz_&wcX-A`JjXwUJ<fdfaIv@pgE%?hfm#>Sflm<*l=1(X&pb zcSVIJj~HW&wB;owzw{p{cPNA7+|JBk&e;~&-wa|CVcdtsJLIdrDJ!EB<b|#kkefKK z3o7+nm!1W0n#YMx0a{^kIx&5+`pQ4dYpsSntmT#W=|Hye4OBOGrVd2Xi{JPEYm48( z!QYA|vuFlk#J@3nMkpBTQ`HHg{yWiNg_!>QVo8%&PaV7RPXdMp7h}eb<71z{Nk(`z ztt^1b|BeP=2zq%BwH!~avku<V@-QwpXDRxA_iketsks=!NQL9&&ed<6r_A?Cd}L=A z4)<eSsK)<v8*mp%TutXn!dX6fg7Z8gSc&KtmzECmycjWA`L^B}>}IrECryB8kY8S& z0C~+o4vAFfR_dI6juvH<^e!O{c-3hGat$j_&qQ_ZW}xIhcpwM>p$1=vm^NYJ1BP^5 zy78yNkeV6+(6xciNl#y28+JYMrJImQfKOKsbDgO{F-bZMU<Ve7e{=Bv>|H{E;Hu1{ zr}oRs;AtD~ml*Jk^J%WMAB1!unt$%lo4rjW<Jv_vot)H3iazA(MnB@(VgbLTq$C4s za+-6r=PV{Xhz!&Ob5(Ox_r$SCqdN*qzXKOH{^%rHp(2&*SdzL|ll8htlRB^r4{Akn zTU7^q4w$GTQi!V(+qzFOV-u-wuPCMHb@hKXeL*{tJ?NpagaVg!F(3Wb;A<tM%-b{N zhc%LjtBomX2Qy|O5zdo7BW_k&3q4V#ejk0jWK_po2HP%gP4qR=Y6d=-q|1F9Fl{Y9 zax>^}0-t=@mC6KEjzBl@>Wt2-lEl7ZXXEHuiQe36kLK*3Fn$mV-`TuOM!8iJ=JHlA z%u-B@vXp3~Z>7Aoi)iaQOtw+x(zg}b{-9p$;qK9Kj8}#wM!CtVi#c_cv#EB^8>gVx zXe%&z4$H>xvzLtTdW7l8B->WQMh}tv*fkolgVNeIt}qzf9N!{-u|&`RZeYeptdG3m zM~(}-)2uOh&d*Q5$-KAJiKcl)w-1`;%u5C)h>&Z6H;Ia3gxq+UrhBrz$O%5_Dtg8u zoE?;gq_4y%o?D2~tbW+tMn1E`pg*u=mV>rr)VJ=ZBQdYDPDhIye*Es6oYU|rcQAPw zI`rwM)y(<dj}^Nwcy>k^e~Qg{+g;zEKD;W>xZU|ob9&5UOt>Q0L<)O$d%Cf#uXkir zHRMKg@;}!%&Lxa6N10S$2e5;0RCBI(bCjK&A1ZVYsaSJ6LBKza>pJSiXv^UL1KlIp A761SM literal 0 HcmV?d00001 diff --git a/app/static/js/canvas.js b/app/static/js/canvas.js new file mode 100644 index 0000000..a8363ac --- /dev/null +++ b/app/static/js/canvas.js @@ -0,0 +1,86 @@ + + +$(document).ready(function() { + + + $("#canvas-data").val("hello world"); + var canvas = $("#embody-canvas") + var context = document.getElementById("embody-canvas").getContext("2d"); + + + canvas.mousedown(function(e){ + var mouseX = e.pageX - this.offsetLeft; + var mouseY = e.pageY - this.offsetTop; + + paint = true; + addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop); + redraw(); + }); + + canvas.mousemove(function(e){ + if(paint){ + addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true); + redraw(); + } + }); + + canvas.mouseup(function(e){ + paint = false; + }); + + canvas.mouseleave(function(e){ + paint = false; + }); + + var clickX = new Array(); + var clickY = new Array(); + var clickDrag = new Array(); + var paint; + + function addClick(x, y, dragging) + { + clickX.push(x); + clickY.push(y); + clickDrag.push(dragging); + } + + + function redraw(){ + context.clearRect(0, 0, context.canvas.width, context.canvas.height); // Clears the canvas + + context.strokeStyle = "#df4b26"; + context.lineJoin = "round"; + context.lineWidth = 5; + + for(var i=0; i < clickX.length; i++) { + context.beginPath(); + + if (clickDrag[i] && i) { + context.moveTo(clickX[i-1], clickY[i-1]); + } else { + context.moveTo(clickX[i]-1, clickY[i]); + } + + context.lineTo(clickX[i], clickY[i]); + context.closePath(); + context.stroke(); + } + + } + + + function drawBaseImage() + { + var img = document.getElementById("baseImage"); + var width = img.clientWidth; + var height = img.clientHeight; + + context.canvas.height = height + context.canvas.width = width + context.drawImage(img, 0, 0); + + img.classList.add("hidden") + } + + drawBaseImage() +}); \ No newline at end of file diff --git a/app/task/templates/task.html b/app/task/templates/task.html index 77cdddd..49d185e 100644 --- a/app/task/templates/task.html +++ b/app/task/templates/task.html @@ -8,6 +8,7 @@ <!-- TODO change session['type'] TO stimulus['type'] because session should have multiple type of stimuli!!! --> + {% if session['type']=='text' %} <div class="container text-center mt-5 pt-5"> @@ -89,12 +90,36 @@ <br> - - - <h4 class="text-center">{{ rating_instruction }}</h4> - <form class="form-group mt-5" action="" method="post"> + <!-- Select form type --> + + {{page_num}} + + {% if form.__name__ == 'embody' %} + + <canvas id="embody-canvas" width="200" height="100" style="border: 1px solid blue;" ></canvas> + + <img id="baseImage" class="" src={{ url_for('static', filename='img/dummy_600.png') }} /> + <form class="form-group mt-5" action="/task/embody/{{ page_num }}" method="post"> + + <input id="canvas-data" type="hidden" value="" name="text"> + + <div class="form-row text-center"> + <div class="col-12"> + <a class="btn btn-primary" href={{ url_for('task.quit') }} role="button">{{ _('Quit task') }}</a> + <button type="submit" class="btn btn-primary">{{ _('Next page') }}</button> + </div> + <div class="col-12"> + <br> + <p>{{ _('You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or ⌘+/⌘- (Mac)') }} </p> + </div> + </div> + </form> + +{% elif form.__name__ == 'slider' %} + + <form class="form-group mt-5" action="/task/question/{{ page_num }}" method="post"> {% for category in form.categories1 %} {% for scale in form.categories1[category] %} <div class="row form-group mt-0 mb-0"> @@ -104,7 +129,6 @@ <h6 class="col text-center mt-0 mb-0"> <label for="customRange">{{ category[1] }}</label> <input type="range" class="custom-range" id="customRange" name={{ category[0] }}> - </h6> <h6 class="col-3 text-left mt-0 mb-0"> {{ scale[1] }} @@ -112,16 +136,20 @@ </div> {% endfor %} {% endfor %} - <div class="form-row text-center"> - <div class="col-12"> - <a class="btn btn-primary" href={{ url_for('task.quit') }} role="button">{{ _('Quit task') }}</a> - <button type="submit" class="btn btn-primary">{{ _('Next page') }}</button> - </div> - <div class="col-12"> - <br> - <p>{{ _('You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or ⌘+/⌘- (Mac)') }} </p> - </div> - </div> + <div class="form-row text-center"> + <div class="col-12"> + <a class="btn btn-primary" href={{ url_for('task.quit') }} role="button">{{ _('Quit task') }}</a> + <button type="submit" class="btn btn-primary">{{ _('Next page') }}</button> + </div> + <div class="col-12"> + <br> + <p>{{ _('You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or ⌘+/⌘- (Mac)') }} </p> + </div> + </div> </form> + +{% endif %} + +<script src="{{ url_for('static', filename='js/canvas.js') }}" ></script> {% endblock %} \ No newline at end of file diff --git a/app/task/views.py b/app/task/views.py index c92ee9d..9b77945 100644 --- a/app/task/views.py +++ b/app/task/views.py @@ -23,7 +23,7 @@ from app.models import experiment from app.models import page, question from app.models import answer_set, answer from app.models import user, trial_randomization -from app.forms import Answers, TaskForm, ContinueTaskForm +from app.forms import Answers, TaskForm, ContinueTaskForm, StringForm task_blueprint = Blueprint("task", __name__, template_folder='templates', @@ -31,19 +31,20 @@ task_blueprint = Blueprint("task", __name__, url_prefix='/task') -def get_randomized_page(pages): +def get_randomized_page(page_id): #this variable is feeded to the template as empty if trial randomization is set to "off" randomized_stimulus = "" #if trial randomization is on we will still use the same functionality that is used otherwise #but we will pass the randomized pair of the page_id from trial randomization table to the task.html - randomized_page_id = trial_randomization.query.filter(and_( + randomized_page = trial_randomization.query.filter(and_( trial_randomization.answer_set_idanswer_set==session['answer_set'], - trial_randomization.page_idpage==pages.items[0].idpage + trial_randomization.page_idpage==page_id + #trial_randomization.page_idpage==pages.items[0].idpage )).first() - return randomized_page_id + return randomized_page def add_slider_answer(key, value, randomized_page_id): @@ -51,19 +52,71 @@ def add_slider_answer(key, value, randomized_page_id): the values are inputted for session['current_idpage']. Otherwise the values are set for the corresponding id found in the trial randomization table''' - page_idpage = session['current_idpage'] if session['randomization'] == 'Off' else randomized_page_id.randomized_idpage + page_idpage = session['current_idpage'] if session['randomization'] == 'Off' else randomized_page_id participant_answer = answer(question_idquestion=key, answer_set_idanswer_set=session['answer_set'], answer=value, page_idpage=page_idpage) db.session.add(participant_answer) db.session.commit() -@task_blueprint.route('/<int:page_num>', methods=['POST']) +def update_answer_set(): + the_time = datetime.now() + the_time = the_time.replace(microsecond=0) + + update_answer_counter = answer_set.query.filter_by(idanswer_set=session['answer_set']).first() + update_answer_counter.answer_counter = int(update_answer_counter.answer_counter) + 1 + update_answer_counter.last_answer_time = the_time + db.session.commit() + + +def slider_question_has_answers(user, page_id): + '''This should return true IF there are questions from certain page and no answers''' + + answer_set_id = answer_set.query.filter_by(session=user).first().idanswer_set + experiment_id = answer_set.query.filter_by(session=user).first().experiment_idexperiment + + if session['randomization'] == 'On': + randomized_page_id = get_randomized_page(page_id).randomized_idpage + answers = answer.query.filter_by(answer_set_idanswer_set=answer_set_id, page_idpage=randomized_page_id).all() + else: + answers = answer.query.filter_by(answer_set_idanswer_set=answer_set_id, page_idpage=page_id).all() + + questions = question.query.filter_by(experiment_idexperiment=experiment_id).all() + + return (True if (len(answers) == 0 and len(questions) > 0) else False) + + +@task_blueprint.route('/embody/<int:page_num>', methods=['POST']) +def task_embody(page_num): + '''Save embody drawing to database''' + + form = StringForm(request.form) + pages = page.query.filter_by(experiment_idexperiment=session['exp_id']).paginate(per_page=1, page=page_num, error_out=True) + page_id = pages.items[0].idpage + + if form.validate(): + data = request.form.to_dict() + for key, value in data.items(): + print(key) + print(value) + + # Check if there are unanswered slider questions + if slider_question_has_answers(session['user'], page_id): + return redirect( url_for('task.task', page_num=page_num, show_sliders=True)) + + if not pages.has_next: + return redirect ( url_for('task.completed')) + + # If user has answered to all questions, then move to next page + return redirect( url_for('task.task', page_num=pages.next_num)) + + +@task_blueprint.route('/question/<int:page_num>', methods=['POST']) def task_answer(page_num): + '''Save slider answers to database''' form = TaskForm(request.form) pages = page.query.filter_by(experiment_idexperiment=session['exp_id']).paginate(per_page=1, page=page_num, error_out=True) - - # TODO: determine wheter handling POST data from slider or embody!!! + page_id = pages.items[0].idpage if form.validate(): #Lets check if there are answers in database already for this page_id (eg. if user returned to previous page and tried to answer again) @@ -71,19 +124,13 @@ def task_answer(page_num): #this has to be done separately for trial randomization "on" and "off" situations if session['randomization'] == 'On': - randomized_page_id = get_randomized_page(pages) - check_answer = answer.query.filter(and_(answer.answer_set_idanswer_set==session['answer_set'], answer.page_idpage==randomized_page_id.randomized_idpage)).first() + randomized_page_id = get_randomized_page(page_id).randomized_idpage + check_answer = answer.query.filter(and_(answer.answer_set_idanswer_set==session['answer_set'], answer.page_idpage==randomized_page_id)).first() else: check_answer = answer.query.filter(and_(answer.answer_set_idanswer_set==session['answer_set'], answer.page_idpage==session['current_idpage'])).first() if check_answer is None: - the_time = datetime.now() - the_time = the_time.replace(microsecond=0) - - update_answer_counter = answer_set.query.filter_by(idanswer_set=session['answer_set']).first() - update_answer_counter.answer_counter = int(update_answer_counter.answer_counter) + 1 - update_answer_counter.last_answer_time = the_time - db.session.commit() + update_answer_set() data = request.form.to_dict() for key, value in data.items(): @@ -103,7 +150,14 @@ def task_answer(page_num): @task_blueprint.route('/<int:page_num>', methods=['GET']) def task(page_num): - experiment_info = experiment.query.filter_by(idexperiment=session['exp_id']).first() + try: + experiment_info = experiment.query.filter_by(idexperiment=session['exp_id']).first() + except KeyError as err: + print(err) + flash("No valid session found") + return redirect('/') + + rating_instruction = experiment_info.single_sentence_instruction stimulus_size = experiment_info.stimulus_size @@ -111,9 +165,8 @@ def task(page_num): #A value of stimulus size 12 gives h1 and value of 1 gives h6 stimulus_size_text = 7-math.ceil((int(stimulus_size)/2)) - print(stimulus_size_text) - pages = page.query.filter_by(experiment_idexperiment=session['exp_id']).paginate(per_page=1, page=page_num, error_out=True) + page_id = pages.items[0].idpage progress_bar_percentage = round((pages.page/pages.pages)*100) #this variable is feeded to the template as empty if trial randomization is set to "off" @@ -122,35 +175,45 @@ def task(page_num): # if trial randomization is on we will still use the same functionality that is used otherwise # but we will pass the randomized pair of the page_id from trial randomization table to the task.html if session['randomization'] == 'On': - - #set the stimulus to be shown if randomization is on - randomized_page_id = get_randomized_page(pages) - randomized_stimulus = page.query.filter_by(idpage=randomized_page_id.randomized_idpage).first() + randomized_page_id = get_randomized_page(page_id).randomized_idpage + randomized_stimulus = page.query.filter_by(idpage=randomized_page_id).first() for p in pages.items: session['current_idpage'] = p.idpage - - #slider set - form = TaskForm(request.form) - categories_and_scales = {} - categories = question.query.filter_by(experiment_idexperiment=session['exp_id']).all() - for cat in categories: - scale_list = [(cat.left, cat.right)] - categories_and_scales[cat.idquestion, cat.question] = scale_list - - form.categories1 = categories_and_scales + print(session) + + # Select form type (TODO: question order is now harcoded to EMBODY -> SLIDERS + # there should be more flexible solution if more question types are added...) + if request.args.get('show_sliders', False) or not session['embody']: + # Init slider form + form = TaskForm() + + # Get sliders from this experiment + categories = question.query.filter_by(experiment_idexperiment=session['exp_id']).all() + + categories_and_scales = {} + for cat in categories: + scale_list = [(cat.left, cat.right)] + categories_and_scales[cat.idquestion, cat.question] = scale_list + + form.categories1 = categories_and_scales + + else: + form = StringForm() return render_template( - 'task.html', - pages=pages, - progress_bar_percentage=progress_bar_percentage, - form=form, - randomized_stimulus=randomized_stimulus, - rating_instruction=rating_instruction, - stimulus_size=stimulus_size, - stimulus_size_text=stimulus_size_text - ) + 'task.html', + pages=pages, + page_num=page_num, + progress_bar_percentage=progress_bar_percentage, + form=form, + randomized_stimulus=randomized_stimulus, + rating_instruction=rating_instruction, + stimulus_size=stimulus_size, + stimulus_size_text=stimulus_size_text, + experiment_info=experiment_info + ) @task_blueprint.route('/completed') @@ -188,9 +251,10 @@ def continue_task(): session['answer_set'] = participant.idanswer_set mediatype = page.query.filter_by(experiment_idexperiment=session['exp_id']).first() - rand = experiment.query.filter_by(idexperiment=session['exp_id']).first() + exp = experiment.query.filter_by(idexperiment=session['exp_id']).first() - session['randomization'] = rand.randomization + session['randomization'] = exp.randomization + session['embody'] = exp.embody_enabled if mediatype: session['type'] = mediatype.type diff --git a/app/templates/base.html b/app/templates/base.html index 89bb793..e566944 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -9,6 +9,7 @@ <meta name="description" content=""> <meta name="author" content=""> <link rel="stylesheet" href="{{ url_for('static', filename='lib/css/bootstrap.min.css') }}" ></link> + <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}" ></link> <script src="{{ url_for('static', filename='lib/js/jquery-3.3.1.slim.min.js') }}" ></script> <script src="{{ url_for('static', filename='lib/js/popper.min.js') }}" ></script> <script src="{{ url_for('static', filename='lib/js/bootstrap.min.js') }}" ></script> diff --git a/config.py b/config.py index 542e701..b945f2f 100644 --- a/config.py +++ b/config.py @@ -28,3 +28,5 @@ class Config(object): SQLALCHEMY_TRACK_MODIFICATIONS = False + TEMPLATES_AUTO_RELOAD = True + DEBUG = True -- GitLab