aboutsummaryrefslogtreecommitdiffstats
path: root/editusers.cgi
blob: f53fde98582edaa04333f1a959954ad8ad75b903 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
#!/usr/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# Contributor(s): Marc Schumann <wurblzap@gmail.com>
#                 Lance Larsh <lance.larsh@oracle.com>
#                 Frédéric Buclin <LpSolit@gmail.com>
#                 David Lawrence <dkl@redhat.com>
#                 Vlad Dascalu <jocuri@softhome.net>
#                 Gavin Shelley  <bugzilla@chimpychompy.org>

use strict;
use lib qw(. lib);

use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Util;
use Bugzilla::Error;
use Bugzilla::User;
use Bugzilla::Bug;
use Bugzilla::BugMail;
use Bugzilla::Flag;
use Bugzilla::Field;
use Bugzilla::Group;
use Bugzilla::Token;

my $user = Bugzilla->login(LOGIN_REQUIRED);

my $cgi       = Bugzilla->cgi;
my $template  = Bugzilla->template;
my $dbh       = Bugzilla->dbh;
my $userid    = $user->id;
my $editusers = $user->in_group('editusers');
local our $vars     = {};

# Reject access if there is no sense in continuing.
$editusers
    || $user->can_bless()
    || ThrowUserError("auth_failure", {group  => "editusers",
                                       reason => "cant_bless",
                                       action => "edit",
                                       object => "users"});

print $cgi->header();

# Common CGI params
my $action         = $cgi->param('action') || 'search';
my $otherUserID    = $cgi->param('userid');
my $otherUserLogin = $cgi->param('user');
my $token          = $cgi->param('token');

# Prefill template vars with data used in all or nearly all templates
$vars->{'editusers'} = $editusers;
mirrorListSelectionValues();

###########################################################################
if ($action eq 'search') {
    # Allow to restrict the search to any group the user is allowed to bless.
    $vars->{'restrictablegroups'} = $user->bless_groups();
    $template->process('admin/users/search.html.tmpl', $vars)
       || ThrowTemplateError($template->error());

###########################################################################
} elsif ($action eq 'list') {
    my $matchvalue    = $cgi->param('matchvalue') || '';
    my $matchstr      = $cgi->param('matchstr');
    my $matchtype     = $cgi->param('matchtype');
    my $grouprestrict = $cgi->param('grouprestrict') || '0';
    my $query = 'SELECT DISTINCT userid, login_name, realname, disabledtext ' .
                'FROM profiles';
    my @bindValues;
    my $nextCondition;
    my $visibleGroups;

    # If a group ID is given, make sure it is a valid one.
    my $group;
    if ($grouprestrict) {
        $group = new Bugzilla::Group(scalar $cgi->param('groupid'));
        $group || ThrowUserError('invalid_group_ID');
    }

    if (!$editusers && Bugzilla->params->{'usevisibilitygroups'}) {
        # Show only users in visible groups.
        $visibleGroups = $user->visible_groups_as_string();

        if ($visibleGroups) {
            $query .= qq{, user_group_map AS ugm
                         WHERE ugm.user_id = profiles.userid
                           AND ugm.isbless = 0
                           AND ugm.group_id IN ($visibleGroups)
                        };
            $nextCondition = 'AND';
        }
    } else {
        $visibleGroups = 1;
        if ($grouprestrict eq '1') {
            $query .= qq{, user_group_map AS ugm
                         WHERE ugm.user_id = profiles.userid
                           AND ugm.isbless = 0
                        };
            $nextCondition = 'AND';
        }
        else {
            $nextCondition = 'WHERE';
        }
    }

    if (!$visibleGroups) {
        $vars->{'users'} = {};
    }
    else {
        # Handle selection by login name, real name, or userid.
        if (defined($matchtype)) {
            $query .= " $nextCondition ";
            my $expr = "";
            if ($matchvalue eq 'userid') {
                if ($matchstr) {
                    my $stored_matchstr = $matchstr;
                    detaint_natural($matchstr) 
                        || ThrowUserError('illegal_user_id', {userid => $stored_matchstr});
                }
                $expr = "profiles.userid";
            } elsif ($matchvalue eq 'realname') {
                $expr = "profiles.realname";
            } else {
                $expr = "profiles.login_name";
            }

            if ($matchstr =~ /^(regexp|notregexp|exact)$/) {
                $matchstr ||= '.';
            }
            else {
                $matchstr = '' unless defined $matchstr;
            }
            # We can trick_taint because we use the value in a SELECT only,
            # using a placeholder.
            trick_taint($matchstr);

            if ($matchtype eq 'regexp') {
                $query .= $dbh->sql_regexp($expr, '?', 0, $dbh->quote($matchstr));
            } elsif ($matchtype eq 'notregexp') {
                $query .= $dbh->sql_not_regexp($expr, '?', 0, $dbh->quote($matchstr));
            } elsif ($matchtype eq 'exact') {
                $query .= $expr . ' = ?';
            } else { # substr or unknown
                $query .= $dbh->sql_istrcmp($expr, '?', 'LIKE');
                $matchstr = "%$matchstr%";
            }
            $nextCondition = 'AND';
            push(@bindValues, $matchstr);
        }

        # Handle selection by group.
        if ($grouprestrict eq '1') {
            my $grouplist = join(',',
                @{Bugzilla::Group->flatten_group_membership($group->id)});
            $query .= " $nextCondition ugm.group_id IN($grouplist) ";
        }
        $query .= ' ORDER BY profiles.login_name';

        $vars->{'users'} = $dbh->selectall_arrayref($query,
                                                    {'Slice' => {}},
                                                    @bindValues);

    }

    if ($matchtype && $matchtype eq 'exact' && scalar(@{$vars->{'users'}}) == 1) {
        my $match_user_id = $vars->{'users'}[0]->{'userid'};
        my $match_user = check_user($match_user_id);
        edit_processing($match_user);
    } else {
        $template->process('admin/users/list.html.tmpl', $vars)
            || ThrowTemplateError($template->error());
    }

###########################################################################
} elsif ($action eq 'add') {
    $editusers || ThrowUserError("auth_failure", {group  => "editusers",
                                                  action => "add",
                                                  object => "users"});

    $vars->{'token'} = issue_session_token('add_user');

    $template->process('admin/users/create.html.tmpl', $vars)
       || ThrowTemplateError($template->error());

###########################################################################
} elsif ($action eq 'new') {
    $editusers || ThrowUserError("auth_failure", {group  => "editusers",
                                                  action => "add",
                                                  object => "users"});

    check_token_data($token, 'add_user');

    # When e.g. the 'Env' auth method is used, the password field
    # is not displayed. In that case, set the password to *.
    my $password = $cgi->param('password');
    $password = '*' if !defined $password;

    my $new_user = Bugzilla::User->create({
        login_name    => scalar $cgi->param('login'),
        cryptpassword => $password,
        realname      => scalar $cgi->param('name'),
        disabledtext  => scalar $cgi->param('disabledtext'),
        disable_mail  => scalar $cgi->param('disable_mail')});

    userDataToVars($new_user->id);

    delete_token($token);

    # We already display the updated page. We have to recreate a token now.
    $vars->{'token'} = issue_session_token('edit_user');
    $vars->{'message'} = 'account_created';
    $template->process('admin/users/edit.html.tmpl', $vars)
       || ThrowTemplateError($template->error());

###########################################################################
} elsif ($action eq 'edit') {
    my $otherUser = check_user($otherUserID, $otherUserLogin);
    edit_processing($otherUser);

###########################################################################
} elsif ($action eq 'update') {
    check_token_data($token, 'edit_user');
    my $otherUser = check_user($otherUserID, $otherUserLogin);
    $otherUserID = $otherUser->id;

    # Lock tables during the check+update session.
    $dbh->bz_start_transaction();
 
    $editusers || $user->can_see_user($otherUser)
        || ThrowUserError('auth_failure', {reason => "not_visible",
                                           action => "modify",
                                           object => "user"});

    $vars->{'loginold'} = $otherUser->login;

    # Update profiles table entry; silently skip doing this if the user
    # is not authorized.
    my $changes = {};
    if ($editusers) {
        $otherUser->set_login($cgi->param('login'));
        $otherUser->set_name($cgi->param('name'));
        $otherUser->set_password($cgi->param('password'))
            if $cgi->param('password');
        $otherUser->set_disabledtext($cgi->param('disabledtext'));
        $otherUser->set_disable_mail($cgi->param('disable_mail'));
        $changes = $otherUser->update();
    }

    # Update group settings.
    my $sth_add_mapping = $dbh->prepare(
        qq{INSERT INTO user_group_map (
                  user_id, group_id, isbless, grant_type
                 ) VALUES (
                  ?, ?, ?, ?
                 )
          });
    my $sth_remove_mapping = $dbh->prepare(
        qq{DELETE FROM user_group_map
            WHERE user_id = ?
              AND group_id = ?
              AND isbless = ?
              AND grant_type = ?
          });

    my @groupsAddedTo;
    my @groupsRemovedFrom;
    my @groupsGrantedRightsToBless;
    my @groupsDeniedRightsToBless;

    # Regard only groups the user is allowed to bless and skip all others
    # silently.
    # XXX: checking for existence of each user_group_map entry
    #      would allow to display a friendlier error message on page reloads.
    userDataToVars($otherUserID);
    my $permissions = $vars->{'permissions'};
    foreach my $blessable (@{$user->bless_groups()}) {
        my $id = $blessable->id;
        my $name = $blessable->name;

        # Change memberships.
        my $groupid = $cgi->param("group_$id") || 0;
        if ($groupid != $permissions->{$id}->{'directmember'}) {
            if (!$groupid) {
                $sth_remove_mapping->execute(
                    $otherUserID, $id, 0, GRANT_DIRECT);
                push(@groupsRemovedFrom, $name);
            } else {
                $sth_add_mapping->execute(
                    $otherUserID, $id, 0, GRANT_DIRECT);
                push(@groupsAddedTo, $name);
            }
        }

        # Only members of the editusers group may change bless grants.
        # Skip silently if this is not the case.
        if ($editusers) {
            my $groupid = $cgi->param("bless_$id") || 0;
            if ($groupid != $permissions->{$id}->{'directbless'}) {
                if (!$groupid) {
                    $sth_remove_mapping->execute(
                        $otherUserID, $id, 1, GRANT_DIRECT);
                    push(@groupsDeniedRightsToBless, $name);
                } else {
                    $sth_add_mapping->execute(
                        $otherUserID, $id, 1, GRANT_DIRECT);
                    push(@groupsGrantedRightsToBless, $name);
                }
            }
        }
    }
    if (@groupsAddedTo || @groupsRemovedFrom) {
        $dbh->do(qq{INSERT INTO profiles_activity (
                           userid, who,
                           profiles_when, fieldid,
                           oldvalue, newvalue
                          ) VALUES (
                           ?, ?, now(), ?, ?, ?
                          )
                   },
                 undef,
                 ($otherUserID, $userid,
                  get_field_id('bug_group'),
                  join(', ', @groupsRemovedFrom), join(', ', @groupsAddedTo)));
    }
    # XXX: should create profiles_activity entries for blesser changes.

    $dbh->bz_commit_transaction();

    # XXX: userDataToVars may be off when editing ourselves.
    userDataToVars($otherUserID);
    delete_token($token);

    $vars->{'message'} = 'account_updated';
    $vars->{'changed_fields'} = [keys %$changes];
    $vars->{'groups_added_to'} = \@groupsAddedTo;
    $vars->{'groups_removed_from'} = \@groupsRemovedFrom;
    $vars->{'groups_granted_rights_to_bless'} = \@groupsGrantedRightsToBless;
    $vars->{'groups_denied_rights_to_bless'} = \@groupsDeniedRightsToBless;
    # We already display the updated page. We have to recreate a token now.
    $vars->{'token'} = issue_session_token('edit_user');

    $template->process('admin/users/edit.html.tmpl', $vars)
       || ThrowTemplateError($template->error());

###########################################################################
} elsif ($action eq 'del') {
    my $otherUser = check_user($otherUserID, $otherUserLogin);
    $otherUserID = $otherUser->id;

    Bugzilla->params->{'allowuserdeletion'} 
        || ThrowUserError('users_deletion_disabled');
    $editusers || ThrowUserError('auth_failure', {group  => "editusers",
                                                  action => "delete",
                                                  object => "users"});
    $vars->{'otheruser'}      = $otherUser;

    # Find other cross references.
    $vars->{'attachments'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM attachments WHERE submitter_id = ?',
        undef, $otherUserID);
    $vars->{'assignee_or_qa'} = $dbh->selectrow_array(
        qq{SELECT COUNT(*)
           FROM bugs
           WHERE assigned_to = ? OR qa_contact = ?},
        undef, ($otherUserID, $otherUserID));
    $vars->{'reporter'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM bugs WHERE reporter = ?',
        undef, $otherUserID);
    $vars->{'cc'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM cc WHERE who = ?',
        undef, $otherUserID);
    $vars->{'bugs_activity'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM bugs_activity WHERE who = ?',
        undef, $otherUserID);
    $vars->{'component_cc'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM component_cc WHERE user_id = ?',
        undef, $otherUserID);
    $vars->{'email_setting'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM email_setting WHERE user_id = ?',
        undef, $otherUserID);
    $vars->{'flags'}{'requestee'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM flags WHERE requestee_id = ?',
        undef, $otherUserID);
    $vars->{'flags'}{'setter'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM flags WHERE setter_id = ?',
        undef, $otherUserID);
    $vars->{'longdescs'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM longdescs WHERE who = ?',
        undef, $otherUserID);
    my $namedquery_ids = $dbh->selectcol_arrayref(
        'SELECT id FROM namedqueries WHERE userid = ?',
        undef, $otherUserID);
    $vars->{'namedqueries'} = scalar(@$namedquery_ids);
    if (scalar(@$namedquery_ids)) {
        $vars->{'namedquery_group_map'} = $dbh->selectrow_array(
            'SELECT COUNT(*) FROM namedquery_group_map WHERE namedquery_id IN' .
            ' (' . join(', ', @$namedquery_ids) . ')');
    }
    else {
        $vars->{'namedquery_group_map'} = 0;
    }
    $vars->{'profile_setting'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM profile_setting WHERE user_id = ?',
        undef, $otherUserID);
    $vars->{'profiles_activity'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM profiles_activity WHERE who = ? AND userid != ?',
        undef, ($otherUserID, $otherUserID));
    $vars->{'quips'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM quips WHERE userid = ?',
        undef, $otherUserID);
    $vars->{'series'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM series WHERE creator = ?',
        undef, $otherUserID);
    $vars->{'watch'}{'watched'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM watch WHERE watched = ?',
        undef, $otherUserID);
    $vars->{'watch'}{'watcher'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM watch WHERE watcher = ?',
        undef, $otherUserID);
    $vars->{'whine_events'} = $dbh->selectrow_array(
        'SELECT COUNT(*) FROM whine_events WHERE owner_userid = ?',
        undef, $otherUserID);
    $vars->{'whine_schedules'} = $dbh->selectrow_array(
        qq{SELECT COUNT(distinct eventid)
           FROM whine_schedules
           WHERE mailto = ?
           AND mailto_type = ?
          },
        undef, ($otherUserID, MAILTO_USER));
    $vars->{'token'} = issue_session_token('delete_user');

    $template->process('admin/users/confirm-delete.html.tmpl', $vars)
       || ThrowTemplateError($template->error());

###########################################################################
} elsif ($action eq 'delete') {
    check_token_data($token, 'delete_user');
    my $otherUser = check_user($otherUserID, $otherUserLogin);
    $otherUserID = $otherUser->id;

    # Cache for user accounts.
    my %usercache = (0 => new Bugzilla::User());
    my %updatedbugs;

    # Lock tables during the check+removal session.
    # XXX: if there was some change on these tables after the deletion
    #      confirmation checks, we may do something here we haven't warned
    #      about.
    $dbh->bz_start_transaction();

    Bugzilla->params->{'allowuserdeletion'}
        || ThrowUserError('users_deletion_disabled');
    $editusers || ThrowUserError('auth_failure',
                                 {group  => "editusers",
                                  action => "delete",
                                  object => "users"});
    @{$otherUser->product_responsibilities()}
        && ThrowUserError('user_has_responsibility');

    Bugzilla->logout_user($otherUser);

    # Get the named query list so we can delete namedquery_group_map entries.
    my $namedqueries_as_string = join(', ', @{$dbh->selectcol_arrayref(
        'SELECT id FROM namedqueries WHERE userid = ?', undef, $otherUserID)});

    # Get the timestamp for LogActivityEntry.
    my $timestamp = $dbh->selectrow_array('SELECT NOW()');

    # When we update a bug_activity entry, we update the bug timestamp, too.
    my $sth_set_bug_timestamp =
        $dbh->prepare('UPDATE bugs SET delta_ts = ? WHERE bug_id = ?');

    my $sth_updateFlag = $dbh->prepare('INSERT INTO bugs_activity
                  (bug_id, attach_id, who, bug_when, fieldid, removed, added)
                  VALUES (?, ?, ?, ?, ?, ?, ?)');

    # Flags
    my $flag_ids =
      $dbh->selectcol_arrayref('SELECT id FROM flags WHERE requestee_id = ?',
                                undef, $otherUserID);

    my $flags = Bugzilla::Flag->new_from_list($flag_ids);

    $dbh->do('UPDATE flags SET requestee_id = NULL, modification_date = ?
              WHERE requestee_id = ?', undef, ($timestamp, $otherUserID));

    # We want to remove the requestee but leave the requester alone,
    # so we have to log these changes manually.
    my %bugs;
    push(@{$bugs{$_->bug_id}->{$_->attach_id || 0}}, $_) foreach @$flags;
    my $fieldid = get_field_id('flagtypes.name');
    foreach my $bug_id (keys %bugs) {
        foreach my $attach_id (keys %{$bugs{$bug_id}}) {
            my @old_summaries = Bugzilla::Flag->snapshot($bugs{$bug_id}->{$attach_id});
            $_->_set_requestee() foreach @{$bugs{$bug_id}->{$attach_id}};
            my @new_summaries = Bugzilla::Flag->snapshot($bugs{$bug_id}->{$attach_id});
            my ($removed, $added) =
              Bugzilla::Flag->update_activity(\@old_summaries, \@new_summaries);
            $sth_updateFlag->execute($bug_id, $attach_id || undef, $userid,
                                     $timestamp, $fieldid, $removed, $added);
        }
        $sth_set_bug_timestamp->execute($timestamp, $bug_id);
        $updatedbugs{$bug_id} = 1;
    }

    # Simple deletions in referred tables.
    $dbh->do('DELETE FROM email_setting WHERE user_id = ?', undef,
             $otherUserID);
    $dbh->do('DELETE FROM logincookies WHERE userid = ?', undef, $otherUserID);
    $dbh->do('DELETE FROM namedqueries WHERE userid = ?', undef, $otherUserID);
    $dbh->do('DELETE FROM namedqueries_link_in_footer WHERE user_id = ?', undef,
             $otherUserID);
    if ($namedqueries_as_string) {
        $dbh->do('DELETE FROM namedquery_group_map WHERE namedquery_id IN ' .
                 "($namedqueries_as_string)");
    }
    $dbh->do('DELETE FROM profile_setting WHERE user_id = ?', undef,
             $otherUserID);
    $dbh->do('DELETE FROM profiles_activity WHERE userid = ? OR who = ?', undef,
             ($otherUserID, $otherUserID));
    $dbh->do('DELETE FROM tokens WHERE userid = ?', undef, $otherUserID);
    $dbh->do('DELETE FROM user_group_map WHERE user_id = ?', undef,
             $otherUserID);
    $dbh->do('DELETE FROM watch WHERE watcher = ? OR watched = ?', undef,
             ($otherUserID, $otherUserID));

    # Deletions in referred tables which need LogActivityEntry.
    my $buglist = $dbh->selectcol_arrayref('SELECT bug_id FROM cc WHERE who = ?',
                                            undef, $otherUserID);
    $dbh->do('DELETE FROM cc WHERE who = ?', undef, $otherUserID);
    foreach my $bug_id (@$buglist) {
        LogActivityEntry($bug_id, 'cc', $otherUser->login, '', $userid,
                         $timestamp);
        $sth_set_bug_timestamp->execute($timestamp, $bug_id);
        $updatedbugs{$bug_id} = 1;
    }

    # Even more complex deletions in referred tables.
    my $id;

    # 1) Series
    my $sth_seriesid = $dbh->prepare(
           'SELECT series_id FROM series WHERE creator = ?');
    my $sth_deleteSeries = $dbh->prepare(
           'DELETE FROM series WHERE series_id = ?');
    my $sth_deleteSeriesData = $dbh->prepare(
           'DELETE FROM series_data WHERE series_id = ?');

    $sth_seriesid->execute($otherUserID);
    while ($id = $sth_seriesid->fetchrow_array()) {
        $sth_deleteSeriesData->execute($id);
        $sth_deleteSeries->execute($id);
    }

    # 2) Whines
    my $sth_whineidFromEvents = $dbh->prepare(
           'SELECT id FROM whine_events WHERE owner_userid = ?');
    my $sth_deleteWhineEvent = $dbh->prepare(
           'DELETE FROM whine_events WHERE id = ?');
    my $sth_deleteWhineQuery = $dbh->prepare(
           'DELETE FROM whine_queries WHERE eventid = ?');
    my $sth_deleteWhineSchedule = $dbh->prepare(
           'DELETE FROM whine_schedules WHERE eventid = ?');

    $dbh->do('DELETE FROM whine_schedules WHERE mailto = ? AND mailto_type = ?',
             undef, ($otherUserID, MAILTO_USER));

    $sth_whineidFromEvents->execute($otherUserID);
    while ($id = $sth_whineidFromEvents->fetchrow_array()) {
        $sth_deleteWhineQuery->execute($id);
        $sth_deleteWhineSchedule->execute($id);
        $sth_deleteWhineEvent->execute($id);
    }

    # 3) Bugs
    # 3.1) fall back to the default assignee
    $buglist = $dbh->selectall_arrayref(
        'SELECT bug_id, initialowner
         FROM bugs
         INNER JOIN components ON components.id = bugs.component_id
         WHERE assigned_to = ?', undef, $otherUserID);

    my $sth_updateAssignee = $dbh->prepare(
        'UPDATE bugs SET assigned_to = ?, delta_ts = ? WHERE bug_id = ?');

    foreach my $bug (@$buglist) {
        my ($bug_id, $default_assignee_id) = @$bug;
        $sth_updateAssignee->execute($default_assignee_id,
                                     $timestamp, $bug_id);
        $updatedbugs{$bug_id} = 1;
        $default_assignee_id ||= 0;
        $usercache{$default_assignee_id} ||=
            new Bugzilla::User($default_assignee_id);
        LogActivityEntry($bug_id, 'assigned_to', $otherUser->login,
                         $usercache{$default_assignee_id}->login,
                         $userid, $timestamp);
    }

    # 3.2) fall back to the default QA contact
    $buglist = $dbh->selectall_arrayref(
        'SELECT bug_id, initialqacontact
         FROM bugs
         INNER JOIN components ON components.id = bugs.component_id
         WHERE qa_contact = ?', undef, $otherUserID);

    my $sth_updateQAcontact = $dbh->prepare(
        'UPDATE bugs SET qa_contact = ?, delta_ts = ? WHERE bug_id = ?');

    foreach my $bug (@$buglist) {
        my ($bug_id, $default_qa_contact_id) = @$bug;
        $sth_updateQAcontact->execute($default_qa_contact_id,
                                      $timestamp, $bug_id);
        $updatedbugs{$bug_id} = 1;
        $default_qa_contact_id ||= 0;
        $usercache{$default_qa_contact_id} ||=
            new Bugzilla::User($default_qa_contact_id);
        LogActivityEntry($bug_id, 'qa_contact', $otherUser->login,
                         $usercache{$default_qa_contact_id}->login,
                         $userid, $timestamp);
    }

    # Finally, remove the user account itself.
    $dbh->do('DELETE FROM profiles WHERE userid = ?', undef, $otherUserID);

    $dbh->bz_commit_transaction();
    delete_token($token);

    $vars->{'message'} = 'account_deleted';
    $vars->{'otheruser'}{'login'} = $otherUser->login;
    $vars->{'restrictablegroups'} = $user->bless_groups();
    $template->process('admin/users/search.html.tmpl', $vars)
       || ThrowTemplateError($template->error());

    # Send mail about what we've done to bugs.
    # The deleted user is not notified of the changes.
    foreach (keys(%updatedbugs)) {
        Bugzilla::BugMail::Send($_, {'changer' => $user} );
    }

###########################################################################
} elsif ($action eq 'activity') {
    my $otherUser = check_user($otherUserID, $otherUserLogin);

    $vars->{'profile_changes'} = $dbh->selectall_arrayref(
        "SELECT profiles.login_name AS who, " .
                $dbh->sql_date_format('profiles_activity.profiles_when') . " AS activity_when,
                fielddefs.name AS what,
                profiles_activity.oldvalue AS removed,
                profiles_activity.newvalue AS added
         FROM profiles_activity
         INNER JOIN profiles ON profiles_activity.who = profiles.userid
         INNER JOIN fielddefs ON fielddefs.id = profiles_activity.fieldid
         WHERE profiles_activity.userid = ?
         ORDER BY profiles_activity.profiles_when",
        {'Slice' => {}},
        $otherUser->id);

    $vars->{'otheruser'} = $otherUser;

    $template->process("account/profile-activity.html.tmpl", $vars)
        || ThrowTemplateError($template->error());

###########################################################################
} else {
    ThrowUserError('unknown_action', {action => $action});
}

exit;

###########################################################################
# Helpers
###########################################################################

# Try to build a user object using its ID, else its login name, and throw
# an error if the user does not exist.
sub check_user {
    my ($otherUserID, $otherUserLogin) = @_;

    my $otherUser;
    my $vars = {};

    if ($otherUserID) {
        $otherUser = Bugzilla::User->new($otherUserID);
        $vars->{'user_id'} = $otherUserID;
    }
    elsif ($otherUserLogin) {
        $otherUser = new Bugzilla::User({ name => $otherUserLogin });
        $vars->{'user_login'} = $otherUserLogin;
    }
    ($otherUser && $otherUser->id) || ThrowCodeError('invalid_user', $vars);

    return $otherUser;
}

# Copy incoming list selection values from CGI params to template variables.
sub mirrorListSelectionValues {
    my $cgi = Bugzilla->cgi;
    if (defined($cgi->param('matchtype'))) {
        foreach ('matchvalue', 'matchstr', 'matchtype', 'grouprestrict', 'groupid') {
            $vars->{'listselectionvalues'}{$_} = $cgi->param($_);
        }
    }
}

# Retrieve user data for the user editing form. User creation and user
# editing code rely on this to call derive_groups().
sub userDataToVars {
    my $otheruserid = shift;
    my $otheruser = new Bugzilla::User($otheruserid);
    my $query;
    my $user = Bugzilla->user;
    my $dbh = Bugzilla->dbh;

    my $grouplist = $otheruser->groups_as_string;

    $vars->{'otheruser'} = $otheruser;
    $vars->{'groups'} = $user->bless_groups();

    $vars->{'permissions'} = $dbh->selectall_hashref(
        qq{SELECT id,
                  COUNT(directmember.group_id) AS directmember,
                  COUNT(regexpmember.group_id) AS regexpmember,
                  (CASE WHEN (groups.id IN ($grouplist)
                              AND COUNT(directmember.group_id) = 0
                              AND COUNT(regexpmember.group_id) = 0
                             ) THEN 1 ELSE 0 END) 
                      AS derivedmember,
                  COUNT(directbless.group_id) AS directbless
           FROM groups
           LEFT JOIN user_group_map AS directmember
                  ON directmember.group_id = id
                 AND directmember.user_id = ?
                 AND directmember.isbless = 0
                 AND directmember.grant_type = ?
           LEFT JOIN user_group_map AS regexpmember
                  ON regexpmember.group_id = id
                 AND regexpmember.user_id = ?
                 AND regexpmember.isbless = 0
                 AND regexpmember.grant_type = ?
           LEFT JOIN user_group_map AS directbless
                  ON directbless.group_id = id
                 AND directbless.user_id = ?
                 AND directbless.isbless = 1
                 AND directbless.grant_type = ?
          } . $dbh->sql_group_by('id'),
        'id', undef,
        ($otheruserid, GRANT_DIRECT,
         $otheruserid, GRANT_REGEXP,
         $otheruserid, GRANT_DIRECT));

    # Find indirect bless permission.
    $query = qq{SELECT groups.id
                FROM groups, group_group_map AS ggm
                WHERE groups.id = ggm.grantor_id
                  AND ggm.member_id IN ($grouplist)
                  AND ggm.grant_type = ?
               } . $dbh->sql_group_by('id');
    foreach (@{$dbh->selectall_arrayref($query, undef,
                                        (GROUP_BLESS))}) {
        # Merge indirect bless permissions into permission variable.
        $vars->{'permissions'}{${$_}[0]}{'indirectbless'} = 1;
    }
}

sub edit_processing {
    my $otherUser = shift;
    my $user = Bugzilla->user;
    my $template = Bugzilla->template;

    $user->in_group('editusers') || $user->can_see_user($otherUser)
        || ThrowUserError('auth_failure', {reason => "not_visible",
                                           action => "modify",
                                           object => "user"});

    userDataToVars($otherUser->id);
    $vars->{'token'} = issue_session_token('edit_user');

    $template->process('admin/users/edit.html.tmpl', $vars)
       || ThrowTemplateError($template->error());
}
{8#v.>$iLDsJ'C ('H^t%Wk_ U ~?Iin goR3Eͫn䭏H-=9 =ZZEANw$^jauDg5^3?>RfS;Ӊyujs>&._n-!c,mK,bPqB7~ b,f: u,zN k>Nц) ǝLB*_9cP@d?c9],b:f/*K%u)WMJ:~Sx3#Љ bj,ak-Scst^{1%uyfjxV{e 3ޟ3zIgό4unq7h>xI$SOSV 33AGB:L2Aڰ9J@]!fVI}%Eƶv%<Ѩ76cɴp{'Ρo%;y194ގ0{*vحY ym[КtMhW1uYFA0:,E7c˳9Zߠ Gt4Ł0Xb;dB;Ӓ.@~Y\ᒴ6\8W߽5. #`npV9"d= w߯xcu?kDak,NDֺSE֓\ۖVL6T^!pTu[Ưg!lTk3Q.ZCJ"${AV@E{x64Nz"ɆH9<<+xEF[7460-t^J|vY6KcID0}RʳYC+qMvಭB1FPX^z/} >ry: Ҫ&zRN٦1@׆ Z;bTnʠ|vSxFH*L[&j $uBvK!נKp<٦@1!(4Ɋ T }IfWe3qjmmH!sXQV򻸊“ l^.ǀ=z|*Ʋw9vɹ ʼ잂gv"xwzs8VMԲ. rz`;mUXHW547kA G. ?K/ܡTD6d j]`#4cj=Otl+QSSܖoµ >樟&b_w!ή6}|f 0I '~zaw&mgq"tTOX2oGX^bFQ|GWY"vd;G56q͍ AS;4er?pמ\(&D?+Sc /"32mC]Y/pbZ7lٝʜB%+8{1'MJ*1uwQ^uCP) >`(Xk=&i wXEp/ͭ}PXn`?` c F ͟`ւ 9JqV*6u@O. 8Pw)-/gCcp=VīKY@Jд:-P=Wm=W$V0D8Un! #[rЍ$n\bW{̍>MDf]X먿ӰIRGS?3'tby/̅eј7Fbz5 k}%H_K@䭦ڼo#G}qLj6@J)@:s㫄SSHH_/"^esCH߱.ii5rLV #ԡuO}Q<[m YXEhqF T&QeU>ib{I5wr/u bE#2\=NrzwO*k}fbo _' Ni5!pZQH}Vz_sˁcCtİ{D^5P4ت+bGB","$xFY ! #^ʵ6s=e1QqGH^z;G흹 %~;VH&JFpUi(|\ѣ#0|p SA1sֺ2M7\R-rR8xR${1sᇫq04޸zf (ㇳrAd*$`V9\uMql[RBS![~ozzH+~Ty.ļAd%|sh<:yrX64o2W'+tHN dk z$`܊g)Ձ7q̇&cz}JlXd~i~xf-gW*U˹7aUOh6pxY']39f=𗱗(ds],,8Dԡr-wlx@>zqJaޕϦ7 {}-VYŜ:B42⣭=X QE023Yz ёF @ bzK2_2>1) ̣pt%m/)k&d X5 aDmdEp\7JuGω/ra@+h;&i2{ wL74`dz ZhuXf3{0̂1JpE~7G,mĵ8U^)}9lysI^^N,&:D7 7?+"GQOSRLݘWwbɳTtsAϔ?jCO Qڝ^ߎ+t782M,%";&`*9߽*glsp5+hӢ Qd|ѪbB} G=Pg%SZkaf`6`5::# "M%ӿ@%m.;ek v'5(P! E&|V6|)XV*BѸo> N)gKgloZ Ip^|j3"^8A-bF=aZnLXR +<^&rߥ8PӢ5SGaVhXG$Wm:IQ &5 kQ xָGb3 54׎^Aڸ#;uIDU-H-N,۰$8 ZZ?֑#"^ai2IȀ4D%&\/nOkjH6u) 9s:eW ƅɯ1Q̤p|$:rV}EzLJ_/%tT MmPUP$+u}-nZi49ۂW 2O1g!#i5!;p.Q"CT҅oIϳ>˳ٔtpc:@$5:+Jfntp!r"}|]LSH`TC(,kz LQ3S=(7s| :e. Q߂([}I> C+[X$cU藪0oi9@:WAR7# ,KC6v۸䑦9nER"]ˆLtrӋF F* "ЙZ/k;vEyQkq{E,X=H Kxvk0fYp!vk^9uieQ-;N'8 2HoPĻ DzHi-m39Sqfu?,iq8s+!v!tgȏB7_//rFzcԡy]ybG+,`! d’n3S-5 1 2I+QrfowL0~sSJ 'ϖµzQŞ-*3>ܺ|2ϼ@v?HE=OAl9-󙘡׉@ )M>Y{vYpSVeV 9LGkw&Is}$.R])Bɜ'PVLrRLQZ[Nwi ,m xzZaG`>aMQ}Rg̳ 2io~ Pf>h&s@qdL(Bg0m`,q`Y./ 8ༀn.p(z]ǏBchS7d5g _>#90S|_\lIxRv`1KIz-5&OXnE1-KB ό)1b c5}A>4b81=MZrY2w%G5?wܓMEZK)ږ+N+ppm`Az0x:K$eZ0\p:q:=Ci:NZRP`@[JT+ A7(jɚ} H5i f$ 0'o|#n1OW[͜bqYm7!=]fN;V#X?ْS>m8G3=:ع&_ k66s0oiRdĒ#֯0y2܍3!-M(n$݇IZwqm[(-lF  vW!<:'N>U9{|C HT$B-Yp`߼B DN$A oeԙ-$#% ՈzQ {9~P'g*IXj \+W}P` ӜK-[L_Z7¨QZ==T3X%>o6ؕX J3 `1ס9ډsiNW!Yl(o)h vG28M jnWS̐5nթ X& TdYEoߵ4TVT^6_76:[]'d,SXKY,vW d߭)[*fo|wWrD/rCr־Oܢ6$mfmGwk[$ 1"~Zhsv#1(XDZ*  !*fHC*`W#I˶}iXȊ|Lj~UCwd CZy9>r[HbWk?kt`O6q?bʃ3>FێOG@exe j?c Π@#Xɸ:ZƐ0 H5cߺky*ۋx7 0d2ad=%jn !S]k ĎKA8o;W,x.߿]Vv&Eb @@,%B Қ%v':o%AnRBZ/8P|=DYB bM4#dF|6X=/󐵷`)\-ycyTyI@ 4F(LrW+;ƛqn%j& p=Ưx|ǐ\]By(Y:PI OA/}Lβφ^k:K/:N8W5%q-6W/)tώk +*:;&ZY{Gz@ƿHP?E=]mg#qJiXu5nhzvkPjW酧igsw, F>{vBg^4msSkєR2gmt̸6So"zx 6)%d6,2kzӝA UZDŽlәy&b+Ee>9ɀ r;[&vn95NoӬ ں^-]LLMrHЉhT<0Ra=6>>QOwE )K 34ӭBCL#DŔ ~wו~Az`I_sԂ_^_~DܬM풹hC?37v߿n|5<Ö=;2E+E&w7hddbO"#MYQYuU2IB6ABAF.ޘLƪFKA )!(Mr&9 V ]$(ncLӜD`-iQ\׵l-To_DlZkG$pӊ7 zyC&@{$Hex}ǡ%T5CRFCw;CN5 xlmSeAC0'6L!2j+x1c.w\gs9 m 2xlQWv#k2oJx .^u޼70\'9SK=%eݓK@@Q]r߶e t!q{ @]}HHK>yV^7h0mMH!YN>tAHs|>pi&t?YP8:t-dب_ъlgezv*=zz9. 2qk; 50>8v[4J<tBs`ϛZ#_"OxHUCK{Vq T*טsP.Ca `ZٓCMUyL+K62'P!뒂Ruyf+8Ѱ9x;$y*xsG7gmxf jNpC7߆^SE->c}wUO6Lʹq"[65kEQBVoO՘9 M t&'*~m65u+݌Ѫ[uHz"Ć HGi7Yx7ո啫7?IVƜZN ÂJ/ļU^^1$ ,1'DGcaÓVHmK#柈Y`Koϣ-]͈, <%t=ٖt[@Oй,% :k^Sss7;4PB5mmp2EȂi]c/=^1\ؖqc? HXq0V1=s1qf'GW #f]+5U3YQypL7#^0%wT6;FĻZ4_rnx08˛,[8O~+dᑜ* ?˔](MNjhy\EY/b1;i]}]`>Kr;4D|+']DRz+k(?S&_xS]c3m5߻Fn>sZa ɩTvYNuk>nҹG1ZgzDD$ B%HZM0TFeψ2f;@xnQqp%?SIaՎ-Kt!x6'0p \V۱;;vx#1o܆jfer >=c7ᰪYpdnN 5–N,q߃C}9{kr$zQ(Y8#cwx hT90QbptPmFZ U7]ܷE3SM'/h0hkBx/h:֯~@^ dl4tu˯%`R;깲 ʝ7mg@>) Hyd"ZY!;shb'SiO!fw âOG8L .$0i0QHN;mu s0hŪGԚ\Mqo RXLÇaE{u~b1jn/Vq&\B'5ͯHAX;RCAQ!>5$)Y?6)@ڣ;Dy$0w77YƒžDc$Rs yu4(zY%@$3kؕc^tr=|HO$eGX]3i.*\`3tGP.޺|gۭ2?|n\*$JGTaдDM8,Zs^`owV 0X 3UrRfگL.7D-un[:^1%Vk69= ar|Sݎ?zU&px=ߝEڢeP܌>kd4dW#oքRd' dfˑ6Y DŽ̺PsKbj?2 붩$73{n*sKd9jAlv}C'n% rt+^~ϻ $'2sx2aS>|xpڶ\X;$!$8RIS ]5ܥZrCB!*Jbݻ2n /h8 uDf 0–9QV<j Br]0r4td@!, d2 |#@Sc1 >8;+ f)P%tZ#aX;U_g`'LU\kLaDhyy'96*?z0ڙS>S/kR8 aX_gO &H2Ǽfy-Cw%*ND`EwSst v9xPɝSqةgEܰ*?R|*ќ*Ke*pWwkF A _IZ^A⦤ӘMr>gz?>:txA =Y4c(??Lp {>@tn*|Ʊw_9_:(q^ZիyզU ; /[x%ssJ<:#eOdߗU3W -\ź-z߸vΗ|yqhs&G֞ k$W\eZ|g#!rHM2eS7ڵ'LVL5n" PU%P[ʈ"L@XFf`n}jD^!r6(~14Yqy#k c-Du&wYH(5CsܻQ&r[ia߁Q3 8^l L0СB9T=)0f{'ϊ~q+U֭+nxH6E4]juF 6!3~~5Н ]V/{;2r=X?=z_b> 1 {ʣ{\rS \(]9BfA@)%:aXbg Ev`lF=#^W^C~; Όn;E1ڃ)jH*No}=mU/㏯[ρ32\\GcR ~}(/OIJw!y5/˯z \c"P  (ؖ8 /$("u*awH#>A|XoItdi5*ͺ;0i}4v\L|A͒US8^^{23UMau5OӨ'*Tۛjxd6iR %VjkEߧ>q,"Z(`j =X4G=Z9$TARn杜D]H]Gw{|3'pZw5\lmXCB|e9`¢kK YJK7lPx b@|~Wʺɘ`S]o@yjbM E{vB}Qߝp{/:cA"1pͧ\u\dZg|ϋ&VNEouX%1.iPQIFs 7HgX%)KC 剞F-x@2e1Fl-[:MD *NzFU 7AN8.j3pw|SՁίtN:"g*njoZ]*/U/Hr.g^5f%y<{ȁ&/19E !I=$陣 &4$H1B9pvs7`J;6e"y-"ӀM?e!.*? dIz1, ZDP٣k~AðGc+Z <$7TO CM?km=d+<+*=1Q0hnxw 6%sY悊ӏ22s,akH!G1D ]]r ipjF̂tfErNNp(&Ň;T%ʅo_Z?J+!VtVcw/t~a3/n+,J-P.̵a$W~%#; 31}aR hy_L%{93,ɍp! - Ly~o| jYx@P2-udUdv^|9!3A@Ą /Z׶Z.ᣙ5fl2 ˨rʆC6(B{! 1UQA/3tHK\T5=/6 U^=]mVNP,IMa ήv_- qz ʠ8i@oZ 9"o 'l=oo]?[^o*Zڅ身J_ϝْ}0J1k{H/!?Yfzk"Ս6]rzK[# BGֳ 6)`7 h{qZR }&W'E`FF|yHN5ӫjd˾ۈK8k4EY9E,EW<&~o?J E yL}`}z:R4[Cs1סxZLH7V8g+^؛$MɫɽGj,f7[+U8?Bk&v:JOA['j(b4Y# aW 8 1̕%\ As>'ccl/:QpP2BڝV=:Jk$ `\v-`q7(^"{[tx_(Lk%jzf=E+ö9M_^PMlzњ!ʿY\6ё3=eIkxȐ< ##h3|@P# u'}֨cԲ#bQ},&_b/Tcbr$~$~*Ih }0EhY.^h%} Bّx܆v9i5!p$w syk6e]CU rXq@%˺p^w9o^.6t;[bK0ZPl(-?^,?`)5?W)vVk)`865 7 4E-w; [y+,,68>=qh"xoG_p\BRʕccvP҆\8z~?[j(I6jKAڰ5c?A? 1e "Z6ٔڢ{N^p`)"k34Lh8['*hLPg)ȫesXi/X\DV`aME.9Ϋ't$ɮ4tW+F/2AK{ίlkÓ+X(:+J$Q>QGu),ZIIsǥӮMϊ>>s:#C]sJRܙb9TB\ If#6rWӲr WIzj>sM +KݕK<*';( Mq̦#j@rfTv=y7~;;ރM_\(Ɛ0<σԢ}iXβz{4YJz*90,RK*BH5ncONRK{yOeu ʀS_ֻ-E ,?K3Żr*WnF+vmstd>7hΆr;2D 95Lx4k &&WjBXQ^=H5xN`ƒPx*ܤ}0a T%Pso\Ll (럲 ߦJaj^W(~-mQNMc93Bim!UK`??:'Qݺ.W{<}+ŗ}!"M'BQ nL%jqSDKK0l1[>@)gT9"Ā=oC5(L%M`'ŴpLpH9mjKj}6*s&A2ܖݯsꈛ*sS%K5O+$6(0p\I!#{f€xX߶P5MwUbVV|M&!fHm؟93HU{IYK7R`SNn?t)=zi-,1|5e{ s7,)AvLg%Xa&Xih3 &rMs%X_D&)1 D|«?fW.itUl8e-m(11]XOB#:lu-ّ#0AδϧEo?E7/p-V #^Bg;SybE5:#yQ4hUA"g^L߽B )EzwsS2:ufH*oJ摫ùpj^1t<&|;qx.8y/ ɓ.ڠTIn=Rp`n %T|J;+䲍D(WzRNcnYk%֩as5d&:LjndP:L?fГd7/#?B=`oP fFN K zu.dn}) D+=ܑF`?* lb|O4r?K^\v_wle {Rjq^6=# 0s\0c qg;P\g)ל2*, 2]{Z&^L.o}ȼYΣI-}8x\ KQSc0ic}5Q=ƿUJCPƲB dc[nϓ-Vv-ˡqcYX+4ON i ݀)dU =PC`VCzB_Wgt2FX%w 얚4dRLqq%*"CX|ΖB:Хn{)La"Q˜}lޜQ5* 5P߽WA$j76˵5T^n1}+j%*^ǙTbu/4yd%74P0"n5M'#a؁ 4©ҳak3D&#ʹ$@̇=1Umf ةt0XupR.rvhmۑ0ut(x4Ι|1@z$z`rb 嶰58k 冐\<#Q75/W ̦h/$R ϛlJ wtvmuIAdA +w,͉2QQ9D΄+/^D\7F('&hLg*er$E"SC8!Lڠ-gR'?L2cRƝ~l,$+ 2p0]G&f  O#M/nbXm%FV[bΣ\~d=w{w4V0TL)-kd!r ԓ%A$[?qdHLYQ$%1썝>Ӽ FuubPaԚ1;~\9MNC1Ȯ!xiuL;lyG~$8`Aآ8vA"k&;9QJ4&ğ Nm8+hovmRiN0sCO."V׿2n-|gc3eۓ6V*ή6)%'V Dg"sj^̡}HG .(w8Xd^_Y6,]LJKV,Pp\)ڲ=RnW4ciӕ懭E#mրB[iv9)HMWBٶUۭu釸!|b_OU'F@YX',\Gܤ*ayѭ(٠&BHTx!+@fT&S|K0ag7rb2۾(@[g^)4\CƔ3[ƒ?f91xE)%^w7-^|%[rdZuhe~B>H = m&:#^RKZ?`n$T=ZR(c;ߞ*$'Vj`0^mB* _= adwYY <`s&GRH;!L,4?X:~R&?sɝlHW| =KI|˥\GkzRh3݅h;sEtU9tޮ{+.@]#ur 8뢘[{4LbPEew-pf|Gꞡ#9lI ǗzIƬ=|vvo4kvW# ӭFmmbY^weS=^SD}ٍ q67QO7d gr:F{c5, <1`SabKV\DWk~NenSv|3= b! n/ۼ c!SoQ> >vEǦ"g؅&6condʱ _{ g uUi[ӿ]3U0Z6Nf/`Z2-|>GO_q5oΈL3)[xbe9_9jG@X=n9I4TH!G>8,g"9xm6DUg qFË&5>nBz!mdqQk$lN}u)f"܆0ah"xѠKrBs;6&*P5B6-lmoƨZHNFLo]oVy!Y>@ =Au'mtM}G(%i1I4 .Lߴz`B|839nsmجߔL6q veSI'[h𬆷Dȴ&j{/NB =SIVlE%;'x(c1 k9S~E!鉯Ō1x ,7(bIad܎sQD5xK u=hI9eTEK ӷ=N 3f M&d y5V\@OKԁDL#j )#/%sJZ.zgzxJt*;PY)m%Z6Wt{qQO=9B=絘p[`%.#! lCMCCy~#8s>7 F[hP_X*!}e#D|Z|^ )(99IGl$]6',V1Bkf#/0n AVrBc;u: fp?]Fr ; h-i+>nqH@>uÏ {add!vsKGtZXr5 ~HB w?Q#]kXE ɸb ,˴:{K% YsOl8>e4(D BG],EKs$# UJ,>6I/, ([΢ g 7f7GFY[ 9r Η\*ؙcƌxph\$XsPk_o#iBfR%vQubӢz~t#F+5߭ϝÛCt-kqޚY)\ĕylWj`*IiZ}`߳vv`+^v  Tvѿάhky0e νYui>yϒX!CecHhC%|B$ڙ]3jXU@gJpcJ*1OiҁKAZ&-SS5p׍;(w䑄'ɺye.yEGF`'/w1iG>fV:i`Dv;C.ءn}FeDjuHCsaS_Zr00U IQCwfx Zn?CP(O2&­%\<':P mh9sDX>_|I KVpC58P6Yfz]@ư' خJq'*!USϒWpz0B3&ļY_M'guoa&~y|;# 6b. j0S%vjM.OHX!H >ZV\_nص4``[q] |Ry7]dim^a|B }tL՚$<_h+:;t s1 .C僺t-X5: タ!eO[P1io ]%]K K`.n3ΎIo^=H(1RRtreTqǩF.:t匁2u@o"K\0TX̀WL6J]Em}ABe}jz`7L|(Gdg>!J}h墀kEorn9jZRSj,< lmmyzGGTIʇ3qsSFXZ@]zQd =[ 9k{OA0{,QYT٬ 5FWWg4;!y1 Ty~a4 brfxw瞬D^vU9|wϽEdB9r*CoU ?S|h4:Nb6OB"w:v**UU(F=qNݸH\ϻG+XZ<{#o 4ғP$u@)_F: JM= tAu<ʥb Lҩ|o`c6\?ŃH[QrGȧ;, 5`N_sLkJDRk\Rʉ #Ù^SNeo:SUWGӣ G$XQ[CCk`X$\{$_Z#!2 B53,ߚcgj/ ?lC}X# Jͼ-_̔߻%Ƃa>)T>bЈ7Im!4hC?kzL,w'ԓ1ʖ kw G4̴GӞ}^"zתZL36r+-GƈmM]dyfIHY"1ِd3; >8/QO7,3-L19=g mG—X ɐň?weG -9< Fe<0xSݴ)5JHږ;)r<)j|_ P`V +M""+x>^)[6a*x>= >e ELUЎ%?5-)8401S䔋ϯ'wnѽJT+< _ s7* z&Ot16Na88kxhx薬]X0Rt៯1#q1 ?kiHDŽ/`3*@r_oM?,Z{.z7 QV$w2f1a50#FI4295Ek{zn+#ay$|dzr :UEjOro< #g]#k;v=_<#kuo(C&2X2q5ge0r6P -\!C+ŊoQTз]ԨDp9wzeԔ+LQ0phiPFE lNR‡Cs Be\q7w&ђQCTQ41 ]hӛLULuc .$Xn[3v'C{>6X4n؉'6}>1_h)Nfln3J-B/]@uijgm\uM"ֱ.:{oҋ%6$|[)یdIGw1V)nn V( E@ FVM3讚c+[b+N$d7јLNwvQ[6 + E!q lpK8cdJQZ~'$|[HKO&L @=rpyþafpTX i#|:bc.} ߡx:%L _ u6Fdc0JQ:C{F5su,Bѭa5<>OQ-8еNx{W I9C}'@ o= zYH2F:qS2 \1rTVs[b}#sXO ťQieey~R[jd8 'Mr~]kCXt® Ao#14қH#*nPW)@26Rșwd"R } aGEwiגwTZt@:OF+0ֿPbcn!uڢ}lxY^ɴ%$e%`@3 G!Ve+ҘVU<$׻B:ފ/dQbw]Q/&X97lqaCbgaILCA٢rѸm쪧P6iΣyL=u <ɏ&$7}L{ g+?R*OIg?GZ {lò[{*-{ozqr`oyCol c-~-Sf?B.;Nv9p–bg{]IB? v9U ^ s9S2 /_|'c&}]P)h,Ό,P0i0Ey?du6韉((Anz9VuKd떮1z.jCDr˫[G,cGF!)8oL/ %h%ɎB5,eY54|.DثJkH1xV"Z7B$C}FeDL0[Rx6D*H^jcR8-Tn yM tmN]ug&ص+6~9 HeR5޿loʏ>(,d\\Bd l_; b 鑖Y#a~Q*ܰI>SQc Eַ3"\e GF$[ut$qs4[țOQ|$ Z`/͓7ATt5?"!|ɯ(By|KE^ItZ31.an=_>y1wć#yMj9z)>B1Tr?>j#__̠=2Tpd&)nd)nZT:- ŔN;͖U(|J>I<}q%>xfϖR2\9!'e#5Q}O|Cgse]uڱeyt٘1PV_"+w$tgĵݼaJp!\fJeO O ;ڸoMk}Qn(87YQx2޵ICm jw-"?;:TÍ[@ݧ<Ŋ.#Jn'!ܓMC4ՔSSO9Uէbόy v V̻8k>wXj+ &Nz>FVHW tu7'ջtR6eHxrI*;FR2++VHnٗ&Ƌ|$WL/0ؾ`Q3Hs@nLOT5uDhV䯲R@|ʟï3]3ݵZI9u9kѪ' LnВ9ൿHԽIk~zXh`1)$ƻ4PLϟCyB)_OJpz>rR 14r H2~gƽ>17k>qc~C^aa>E%Yûz B 8͠1TN`69y<a bϥU$ xֆ30HAX߯J}/u^ֹOU}ťq$jx]E?ik( u1]uO 1 nPvv2gӭdDTzYSGoDOTjd-s\jE$WXL5k PCPοZ[iyUّE"ٿjot} !I5H:@FCvz*R>n!¼v珖s6(w%{&m_}.CRݜtw_ hp2w)^;8&mOve˫.YD jjRܰd-,ЀSͮ%iA.jlśd}su5T!Do*ˬ\0zQ-G'X'4?M{o*H[|9|CvK捠[ P07.Dn`zQyŊzlKT G*Y{w[LC1Z UR\@/JZfZɕU|-cԊKNSB|Ea.<śRN7Q}}ywh.`'Iatš^~ ):쵃sNu ScPRB}^7? =LEr9 )U+NafY"8AĉxVαVۧ_gQ4@B6 BIqkN}J7k]{|]> LO?EژnYmyO TmCLO w5f6EJgm߹ 4Rt# ;twHXr9<[B9HpIMOnwV+d=loifRO[bK0mCCX4%Y[!  9OHSgd)*:K)fm׮d^UyFrN$?(:-9e -YΔ*Y+zOBUՍ24iԠeGTR 0뾅X/*G;)6,<ΜTut"l4R+Z=8*W?Cdh+$/@;R=5E5@2yTЎg0dK=0Iᠹ5#ǭb0:L.43ȶDq fefiqF.Y nfOm+k}#UU(1߼6#4xjc  &D2uxe>IDnЎm^}*5e{rf௹$ OBA@7G1_ T'O31sUia@TD#/u&pP<OU)cklrqsVVlw_ u+`N Eawࣳ)gܠo;蔽1sh[5س)LKڴ4e0ZiP/j^€!=cx98jA|ZMraI1ESsۇǸ ;eX{W5 TIl=hPޞLx}9\:X֞v Kt U(^Lw O <++쑄CV& op9  LxWq| ! ԅc϶sk!? 1+FZf?99iMyv7 [d"䐶ʡ*cz[t_^ 4v924[ȅQC*@kx{\5E~ X y@TUFL׼"HP>Ĩ{ܝ8k#d4A4Wf4@Kg.T35Mdգhߴɺ)_qq+q:n'LZ6xoqBxhފSdWFۑ:{z+e& ?BdHduޓ _gS4"|,&3s&}H) )3^jUuկrίT0ftE[-ܔ(+|7_iȞMUbԋ `snZh0 dpE B.a)o˂.zV`\Ϥ#aSy'S4qSոo wR,N%3kAɰHA>S^T^tg< br!)'vF}#6"dGtSɜg5Q}z.Vke3~i1?u:֍錢/'y^J*Y@U*y$:⪝7@~ Ŀj0c`<_T{_zHiy8w3ٴ=u|*˓GDЀH880sމ/@ܞ~2iRWC+Ba^&]5=mM,3bg.I0t!eQ˔7@_#!AFyѩULwk<Yxܰ2g5JAR4lZ\Jt;JO2!N>X}*y x'v6̤?l,VcnYaFc_pO}t>UFo]̷ҨfY3JA\C=7#*/;pLʘ9_Zw1k7:nz#e7gQܣa5/Efx) WVM4D` ?s/̣i,m3% <0B 0tJ{Sʛ̰Gi*}my "᩺Oő7`'m%Z%FiXoƦ&yhfxw͆Pa~rLī ?('otJEY2( TcZ:A(Sm e@ѧ Gj2%3Kcĩ]gR£@}1\dM ⫹-V?݂ b)HGk4TAY~*sP`KoFa );jF]*>(|+o}'OQ5υ5E%jXi1gkm\ɤZ4i?X5٣ )~So6K٪`V_ *A}"(:@ciPcqB0 ~) avGUSRpd$^TX3E3sHM$p'l/ ,>^|¶, 'H )鱞mCj$ zZUfwJف{Щ[. >nI#h-J58U6j-b ߿ʧ\Hjv%ƙSfV_W\ HLtIxT|q<ŋh3w[OҵJhKY?Gfۤ;zg6zKkdSSW x4V?i4~"'sd$]U]5vNB &VB{ڑbг+G2*,ɻj1lC9'踧m6$.@)"$r(bJB_T3>hIEPn=EQr-<5=t06k|Lah.hUq2Md' Ov"$F'::^=H_{PnH%Fp;؀o;?ů~Z!ɣ] 4[qݩm__hU: nPbMsk2f>?٬i$R_TR&ښ:/,Ivi&L_? (>R(|]+@; NGKKyccPد]u:苨d Qd#9g)._-c`:6Ӥ'i36d;OTth~F߄@o E6oeM_+,Go<$ ̓񢼆=-{?/;N Q~̗w)G)JݲVҪŌl;,AV-6`K(bnCFg΁7?cW-RN;R# CO*\V9yAת( Ha6MjS,@`m+ٱENk'{&ZbQ NbTEjj\BFptk_'gkAϮrG#Sʃ;Nz|CrDωwD}lWg WL;ܩp }fJk:16Mݏ T#Žv0J5W ௼d.{t2q+0.|*EA㮙8(> FZ FȻmPЏ7ʵ)-AϨCƲe<ثtFky8zY\|}seZsJ5K8d1$pv[@۪bhVaF;LM4Ŝ#U5X\[8?'p7Ȍ `X<L-}Cڙʦbǭm@846JlD;L|vr8Px9VԬ-}7I9ZoF& +zT$I^z/vVI\(yގ,k؂d h#<*@D?gJ"ȟWs8̶7U=~*U"pY;( q{e5. PhCgWk܁o%$Nĉ\Do7 $5n"S!/AYyk+%dC›NyXΉ[Ѝը. ?r4>?EOzSGHjލA֧y6 _w4͇Yư$|K"n p;*cY6t<[;W#v(R.5\`Bv0#cP,htzT{XS55DCJvW 7U d|Lލ꿐E\+AEWW01&zQp"z=IWJV0ol-:rw?suzJG#,d%Pؤ؟3ߖ@7$cmD2wM؋.XK1FÎ>u-Z)O)9Q*FMB=%5.'Fr _[0Ag_UT~-@#}$ Vf,)1Us:Io˥pzhip gu M-'6ujlPTH %4*ٝQ7gp^qG[2J%뉡DcxBA3έSmBz#nX>Ug&pnV.HxK/nJIx,SW`hӢ3&G $,6__rЖ`1 **vW0a)iJx=yA]>Of ;?gD0n hX]itYb=n3RsBDgkn8}7za&4\|5sù]L$J?gay9%+UFsuM27mn KG'ܫЕ~Nj_xw]P_[17u<" 7;VprNCM5QNY^zD>B Aߢc3@ۈUMӜ+Bm^-K5U*W<ХF\6QIxnYQFnijHn6N'j5vz}n8_V`b1_ qHQaI)q6=ڳf=@}B Yͩ`i'Nt|*PX4.IVG"N$z;["Zjl {$yRV vww0D:퍼 XԏF7 @5]S(#6LTnhe/^ MǔT7X.e#L-BKBoZxsq(Ĉ|%s.eHC`xK!>-X/8vP|V9mR~i&]91i H& Mn@m)ܮ$6H [&ȩcυz,@L6ft)"kh}5pQWDiΎ.qq2a9՜6; R8pNZǥ bG&0ڻ$f[CTasm©<A޲PvbzC J*w%'@~OW?&I2 қY$QYjR}% `zH(~Fb| E~:FVСl 0/Ous}-)ݾ %D)Uدiq gė+R鶧a rC.pآ3Y-ET&0rda}I/$1 ^^֒h5[98l?)yFiMudžzE=mieDQ"Aʿ$n>-p xudCMJs 1CKaJ`f 38O3<oh+z2ia%ǺNsA푟[mi Cy.scSts-1aXp $ w,qyDcaY"ғ6z, !N-!w&q/LFOtxHEQ*9Vs)GXKu>O~mI[WDi篙ә9hBi6r7740,ZC&`htd'O]QNUFF,ΗxBLv 㥖A7RmInTtb0EJ7y*xph{Iinv,iaMZ@}5ww5gF5dτH]:aoMR]Lx~x e7Wui:G Yf}_/ڔ%gy% 3rAA:ɑ~)*髲St[HI+@Q: _n"h%p-p5bZ$8_pJA; &eH﫺#qcSӳ0ĀXBp-^鞆4aQix|=2#јM(VUf,IΈ`%jU0bc7H9'v`#CBF_VoiPN"0U_%W-DŽtnfox`3 8_RB[u^gbtTu(}vIB&+0Ӎ3>;?-e&7c)KP _ #O#YJBBqv%ݏѡ|DV0ջ%f%WuۭT3 u7f-**í.x5Ww" V.rks0.7My!"lV7eq/FZ:;!(-p>nΟD P1\ȯ)zSì]{ώK-:lϮ|.bIY#J" G]8G2lZ.P0 A9Ocm#qs,(z_^aN79fņ`l&Dax_a,l?h@&pk "ʛ'pL.jb"e-x-5kZ"֮ZFZeUܳy]H d!ts*W4y,M3Q2S$ *9A&ij&iؑ-P ecDb%4_TAewP1ty<'7&dkCXӗsQe"=92I>Wgߥ3+袒G Y`X\ &LtPb(bW9 *[:3* Qs  ['" Юn"Js tTCۗ2<5]k?涀>[0&`agzlD\ $\vu֤  `& ?z# " cN /&h%*z_Èf$$. Y }1XeIgYNsb_xi!19!tA}Z5kX[Sl?0 "G(}˲taU|ᴆ{8*U$_J ϚogSg~ow5)cC|By[;,gdDA)H p=zJ@IWmOB @Sh'y#CtddfLW=ӮzznG& ҆.uop2E}t;wPg4x?$8}oWݷD*47F.,t-zݸ䱡|'MA9H=00^ﳏnrIt5N:tl4`mZԋp>$⇓VSãZ q7ƙfЀqM5tZGOw4$tTހbp\܄b!">^SXώmbgDU >gs=}ͷ#˕8~ ɔT $?uOeĈ@եgX Џvꂗ> >5ު`dǠ^d+ЋnZ5xzIݤ#koIGa@ &S!(Q]jLbI41B}ȹx JRR4dԽ3y"cyxxVC7P;^MBABKb ?1T%}q)Ni͘7l_9A'{V ,;F]*k|xJBx7 UkZj} ;N6 ,2XP5wH[6F0gS`#$4 ٓykv(مNo.\(._Kw ǟS;؞?«0(nQ#"Vz?`!PrQS/w6Y6L7VG.`-5 oP)<&r2[;i89I-10*ZQaӿ=.'Zu7R9b$t ce?U*G^"8O ZQ\{se5Hd=U^'>dv3.[{*H5V0VxBo|='hM}kVog %EZ8 a}:v uu#|t޿|qXMPW,.,WQvP;+og@٠աl?iwgOd"F)4FLq v|-䰖9϶q6[P5-Cن < $^;WKvof=(Ǩ$Gؙ&'˫\H:d-B~Ԅ8< eyť_GIݚDu#l(:;@WeuC=͓ m/ D+sRgIQXKi/ەML4_ąQvhiJ hV1024&z,DeG#6X :Eͨʝ&3n=eQ܂'ht&1e{6{1< oN*(*~F쭣kǯRڭ ]yAKu6)bE @h+1=L1sfKB߃cOkZ1| d7ӹ<za80].+ݡȁs-8݀<ɿgKOM뻹qbͩuhi3Us,w&+,eļ0V4;u(ðW aX(43t&ӊo:K傺Z8[~1F|/o)rS_J< l7-ZkL -'~ [CnED^άBul L{N?MRʿpqyt2>,Ls<SB]Opd z#z+G ?nJx%7>ƃ{-u:$ܕ/< :eݸp `%&ċ8BE<ǃ{_=9υ|Evf4=>^q2r[%!}͍UK(5bM?rt`yb̊/A?NH]s։$rc1ˑ҈E7lQѠm$Wϻ-näVĒy5(GOqsͰ~OMYW3FuRs~CAMh̒iIl 0!OyHUZw϶^ql+pȈGqK(\S-l=rg 5-xmMaSw>{z?՜F00kzs@ ^5 K&8ۢ,j]V#Z$bb7q̓5)Eܲ?SN'oA3~BH?-h=I;(@kOKBP4@?cέFQōxԓpM~ƠZV$yMnx?T77U."ܩORC7.7mɥB11PZRy *zøc DGOkw LnCaB/_ŷYgQ;bj/`{rg9!4 W>&;Y6fnnAZF_Xό ֤?E2( G7L-@qrZOhQ!n*8 psY^覎/Xa{}uFՑ5hJq'=`YC?[$s얧$ʜ9c)~aT鶱⧭[ D*XV{.RBm#ն^#7@̠4pg9V<˰oTI^5ۆ 9tXm2wURrA7'6GТyYxL+5G:OVϾPSC(u.EESCݵ53_tꕣbzibr&z7˹ ;$=%R+ NCVZ7:"ib|*&.P?:Ch/yDM2Yұ D=/rgWr~C1!Fϒp-Y޵Xn}H^p}tyl!g@D0y<Τ.] JlG)GW".oe[]j: N㻈y,)3ntݴwM5yA9d%~ⶠ 8BeZ]O_Z^uZKk ^E֥~ZCTmRj^Ѭ_/3:m9(t9Y3\r8"fʪUSχI -N(<<ĺ5G;;.`ƃ}3`>}^L`W2-IQ:vZ{c>217Ryc.;g׼UPEƈ}RԠ\ӷðOK?-MoV1lS/ <$rK+|=ÆH!]YؑdS7{ڟ]y7+ɫѲ$׃SlX}'-#O;l":/$n K)p)3foE? ,p2~O8G$U!#jNZ kh2O<),H =+ELF']ۉ.^[=|Cxeikz7VpǸN;8Ac;{ROWx?3D_30ȃ=i@o^d.8߲j֛QHKJ($њ}Peq|0f:P;pztg9Mp nWPժB+A9L Q/D#Dqi/@ܷYTS8!4 >qHV}8wOYuK+JV^79;ZA{<19{ 'UsP6Hl2g"Y-ŅQ )/\>.IWv] " Ħ7iK/IP|c+ Pgo更 XZ‹秦mɐBkH%ʯ~r`oK{hn޴>`_br [dI1Ӛ5-.1I.aڎf2"h'6r x7$>}6أmLcW݊҃P26}Th,%(+z6eTRXzM;QO NP(6.;P+ ٣ ʟ|ImQ*2Lqͳ<$ik 0Vd-,ay 1hyHzi}VsNzrj뺬+̱tA!?,RxЃLƲQ<ݎIH<)Ix N߸Q!To 1ρeW߫a:.NS3)1,EF_6{?a4g>]GJlՑ;b>A#tQPew}a7˓ M*(q~J"mAt?ptùE^M\4"6pǨƱ1ۘ5t$=6" 3e|P w{PS$f=MmF SlGAuD v?5tuӒZ`/1GHxKK$w0өb 2M~&><{[R/-8e/wlHej4Ҟ b|G \rE 7Ĝ~Ƿ25E bCe-$0\ʃy9[5sr =B`jXgo]uY:}Zlx,lEZEm.a`,pl@ϸRg?V Sq}NvxYyįBeN8?Bj;ER~g\촃'jzSd `Q"0 9gX54PPz5PZD<_g@pa{a/ dTz3!בmR;ѩ5>xh~0eo=èU^(Ij8U^_amGq4r&܅4mhb(Ԯ÷<8\quZΑ" T7g7V9th~ 3Œes(<ɒdw,M‚k`u`M:W0hO:btC:O"aJvׁ,JMal3 ם'גQ}f~Em2m]:?!4nkc7zRt_[?v($7c@}#kz5Jy"lb/IeVroehMiHbX0\gh԰Rk]|/XM@Wj=aۆV75t)rpa{pZ5./)1KHTl $W2xsTXKޑs2.5=BWK?_"rEha}f5(aUhd &) ӔP_vO762aj0E#* ~^RNͬHO1dS pD jT\_n'f~g2ڣ\,׶̒'I0եĐT5^SQ+.%cLǎۛX&|SUʗ~1ND`R ;REwo&ԏD=H'/?+C4ytj8]r]?WC5cc 䘴|Xɘ\XKz |Ρ~kO2LBjL#jO2a35MU*`8 ދmAԍ$;o+aRBn*M߬72_lᑛ^bo }8p`.Igq 栗Bs)$m/`m*cO!s@D~.cy){vxxpښxċx+Y!琀 3)dBlR{j;ƴg I壤#ʉiͳEw$W C;íe;.ihq=ò՜`dΧk'e/EHcߩלAj/cM@hWsla,(UҬ-DabA1~"U1*q<)M3nQ# Xu2g% k+mMl"^@kI;@"揢$ԆZwf@>JX}Dv"@:T%Um4 Ra(e@ã`Y(N¢WP8.%L?̦ČKl`AH ΘbTP -' k3S1V/vj6ujRԆ' @c4㲗V=#@T@=kQLPLX`V `xWX<lO]eq2'ԑZ-$29Yl0FejB Axo2}%A51x.9~xeG(Gɠ$jhJ:#ZGc<;&g&,Zá"la+4lDiQC 3vY>SgZ~>&2n6qhԥmؗ]cNYr | e ]dza+l0bxYK9тd`@1YgFv |a좣BAƳ@yϏ C 2m%("J"㺻ՓOG)bv[@o"Y"AX ɩyi‹?I2q ,ʘ|lF5͙.w+`@m;p$ K f ?ںSm ;^༇3L 1vX;WlsM VR.>i5LۙyDۦ--0N*ͯ_mK- gyrBa4[g>h|d1l}J2d1̇>r艢i`(}d7l ?J[$U!Š2_I_x*ibd9UiAQEB׆"+u_f$X1߈}Rh9;yk{ ;{YqqW|9I_+ 6G(%ufB; q%soiؓ!V2 Ph|Y#כz|%d者0؍& X͠Q/8e-d<.O^寓x0?u|| :94{_OGlYL`€'7ZobtGꐒT? [w8Hї@-ڔqXV~~ 8yŊ) Bg>]s(qmu[^wꐺd۱4:I^4A4IShbQ~r.8o~eB[e`9-mB+BuLU1^6y;DUIL59&^tb:McevrB7M$w}g|mȁ>P CbC{E+T|7"|rN4v\,c}RO˫IjOwoXFÛkDͶ!2Ϻ*xH䚭>+j%/ #(X}v@[aPJ]0}8B68{jQ^qhJrRP 9Wm˘jMs._㕶H 1U#`HlԿ{ g.$n FUXOr M~?҉_T˯hVHҔ4*'so#HK#\NCl]o*ʚT/ F"hL| Lٵ3p޺vg<̳Kunw_|rBT9 p=b'6M] k%O2T|OKJE*,FOܬa6tZ#UJQ lS̫uO-O2[V:BUxwkyC ao B:L ;25< ӣQ^2q5(sjdZpiK糹)7?GXr70 ͙7ƚŌC-3I9F |[(.wSq5r-S (qCF\KD]'MNfL;Yai_v-wi;mk M_5ICxKRf9;{3Łs֘8A26J0mVÎuf$^d _%_ð3<?-Ozqt+T"fO//tdR\x/IQf;oj'0=$^>݇;?[ᢏɵc<.- S:Ɩ̨B}t/]E LNK/+3]THJcٱi>Ri):ʹrrג^TX-M>䶽~'TcN|>)B E (V-4 ۧ#wIMp\]w ЩaxÓL >E>ŀr:-RuOfIk=ckGpSn\Pu,upgmv&2S([Q[5Ö(e?J*Ldqz{;sb()sQD][Oy^CwlHaZ7ڔ1qĕ6N',Hx _M gx`2n"삉rOo$ES,Z0yɘPD |Zj:ιOb ,Yئmw2 1jP&o3Wd0I4\Ɂh_|UvC3ZS.èsrG8hb 2r?K@}PmCd7BkC5_( t&1٢gBb6YWr8EpS.}ӹ͊Ϥvy9)#aMp3.:mY-Li=@R#xunwbcF1 XUO߉8bHQCZy{U1*%w_ښ(!$ (Z 47t^s'ɩ)^ݹì$4xWaIa.ɪ%MMogkW_;OG4:>5t݂?gD=*DYq# k:BnHq S\6XOܨ~T|}w+h/c O)g؄ "*Ȓg׾.HĶ[B/NcRQ}8#H$RMb4hBnEvȄ/&  Bv~&Nz vyXbc`[t>/$xz:> w^{;>*}U[lAQXtJޯ)3Y;K"S9$قM[Ht! hC#w䰷I|+d鄒Sv,APH)&J;Q$ ?0x,SiOk+P ;]sH e(`2h4ߘ@D <+Rv~NSL&Ss,Y YC)_භI;?lW3~CSGxn2RF3?A'-$>ѻ@O:MڥuF̀ϕUVeR!.Lq hE/#JcL00pbjZGu;f#\d *rnvJK2h`.Gc;y5K.[b',yx)wܜKO C= [ ߣ~t>On\([pd=2 |2P 12ujr[~ 7غTh*MIO NdU-,xjd|$, U3aJ²iL|#1a\ H4H[1Q&wz8hSgA^%^5Ctl?/507jm9|ƌ#蝤6GB]YҠJ=aP&M)5P`z'8Zgdayd抺.>GS0#9v\9a}a!Eg23^(]:\$uPχYhX*"<G]UG>,: % J~oÇH.&;#O/\vWR" w߇V L2ִ!8-Gi#OOz;Ώ5kF$L~ΛFNӲ֏J(K3w`<%\H@a q8U+uӣOԧP>JIkz|R0*Jկמ35B[,b kS 219d7?uMj}_^yVl5{y02uZ |=ԉzRh?NKV?w7B-#Ca3'd)iBVcCY̴V  ǰG~kz6i޺{Wt⟤Üc lqN!c)`E޶ ae:N5Ѵh/NwuТ; ;;{)/Bӕ5w窛G>jSѕ};rhwS!wnypǹ:r7c&+gs r~oƻ9ץL )Gҫ:OPi<&]B0-MnTSvsuOc<^[66]x7Vψ`/TazF}#9e r򐪣(JϸfL/\$ oR @`B6_ ?~Sn#T&ܓ(ECgޚoz_~ O$k;oyvqg#b&/Mq 4mϤ'k{$]ė.mB >w~8\"jȒYt1;ߌs@lDlmߏ# D8#)B?5J=X qC.1oUm|B\s ? 2鞨ҀIv;Sr}U+9 tٍ=cדAWBEy v0e?Z*Qw3FQeb|e QSÈ|ﳢ(7Sa?vP.Qk8 >24`KgwEgiRɏE`算C%/ %vEM OEzyQYiF_BE.Qtʛ1 ؍4;Wԏ68.Q6~(v|lݻOTY`M]N";b,4דyB+whJ]UöDqnwiFpy /죆Tp~{dIfL{q/_~] crfq?K이ap "Y$ ]2_ǬsY,NNsZ z$x f$\&`JP*Cn #?k(SJeV,#q4jn!48fH$^ e¿ZBZ|\ncUHG.qʗΡ4ϛ6slDMЖBiX[3]YPcۍD ȟ'燤?ڐd'Nj+2C ;W(XQKB=<&򸂿%“%{=1^WyEN``uEfwx2; *7`-|_TږzM7T`G]u4U(Fϖ|[s^фcRcQ/ID c̓2\$Ps-$dfl7ݖ\'^q&]8@P]YCT8rv]Mx甌EHaFHZ6wˊD2AF]]-f:nPO/v;=*>y%&IJ za#&,K#v|2Gu3ZVh,@/"OS=eVM(*{,;~';f N36l_)oqA:4/{I(4]ĉzMpR Qo׏k0M9ѵmu?-%,3cM^Dq^9Nw1PF]y $8[qmPm:9ȷ5FB>jOPu ˵!n&-N}>#15{<$6cE&|!>i5X2]]M*;r JgT:]@/3aHi|dQ#bء=%6R~©"g,!=QaT}9]e"x4>ᏌI' n֜qb0 UOA׽ӑ?ᠺO>f081x"0đ;6x "X#yT?qB9G>EJ~|+ Jfl\moaG/E#`1L{=U*cJq_[ؑ5_jt&zv ^ q䲛 9yP a؃8Lh 9cgFpvp2r3Gdx{׍ӽ/u8p}&Q|-XyMp4!:쬛%zKezɐeU<,f`65'i&O %ِ 2˛CZa] X遪:M ,2ZA!pm/Z)RdHsf–#g#bmUY:"CpNѱ\d(e~6pav*Bi9ZM2_E{2ia+ϥj3/Ԩd#U@*WpzˏnK&cmg/"0(m%^ڂ1df#{FNHGrhr|y=WC[ !=YTڊZ$a+ !Txj~LS!h8 g,r=mc0b2WRUspJO Gw '}^Z ,MEnlIH6p62xLDȺ[ѺAw!BXF?$Y[ד߬qP%t_lN$L?6P"h-퉼MOVByA1H.uPqďYS+(XfÉ<#59Ir}r, $7vŇ%閲]& =hZj*#CKC"] Qz.ઑF+ Kҗl@uwߘHSgBe8h[/K~i.y!pܟ{o糾44)}/3䐄'T+.mDM8_0!zXk \3 U|t!3yRp |)BD R3)+މ; 5 <8ir0) P,HkJ*5}%&>6)r׼' M(F CKV {!>D $k!"xP7G'b\,[eQxbp֪L@whl0g M`m s VqOği`b)m&EXƯWaW/p=3nIO~jeb/4KjܕϢꏥ9%M'Sy'^ ?dǾ33 TZ).ⴼ^|n7H"UH#[sHΈ༐r0/ W<]*XD8<1Ӈ[6 F=/D@Us){.VVH,KRx V{t= )FٜT6tk~W^ܺfQ Dtٽ{WU  b)}9 }^Zt,'S LNܖumhan: {sus>T۝pI|yh |ΦVٴ'dvPIT`Lxe~E8( TP%]9I'O0R{0v!H 36z-MûY0dZ0H"7DXVY< v2i[&Ldc>3̮Z?J3<o-yTzӑ.%">)%ݘ qbQ! /bn(; vL]{mz؛\0rB"_U"`  BG 6S${9&Z{_,.?K CMUEݗӀ[$%zDT3r2}.KuAP H2$Wݲr 8޽V4吨ϙBPAR֟]\/%(#T>UKpa8\ fX/B&vcG V>wI-BT +ƠtثvNqj"A _ZtJ9WcKAy4v@ c^n iVC9f"}_R磀6OWd])%WBۣTIkƙ^ݠU̪%Tf /u`*ۏ@i)_1mp\'iBЁ,&7}wN?Mqc _6C3K(ۉ<$j5!WQBCAlQOt0uch ۊ ${k=7@Do Z9} *3j(>KWCiKE 2,ʓ'.ɠŒ?IavfL1DMZ3`VJA:4{?E^p3i#D(d tЪQq IA~LǎINF%+C\૲,G L͓ 9y>Ģ“ˮ~>ݰIx <͍?\hn&rƣ?jT5~!Z6иB ֮Q n :ӟ I塒 #Y5Aod\B7Ҝ,fwt1 gގʷW ~*۳H(Ln=!vخ{7 ] @]->]b)NabgD]%FhP G-Ep Bpz!=}۰gF=5E/.K  wj3;Df,Q-Ӏj 4X5U+}nq8&s/<5 ỿ`7p]!2!jEҿk|daf܊wĆ<<[H`5J \ƛ#^ÖZ4q~Di+gQVH9x7pj&^l3ٮ}u{sqNs0i\~;)M`^U,!)cBhrEgy%{LFlh'Kf/nd<^)-9 f\C1bIA-St[&)gh.E+F'>n/ 5mz "tMϹ[|{u~+װ Cdȷӕ;8c=RBsPaO4abHK# 7Ppfly׈<˥梸cC2 /:WڦfrV 2Dߝf+Q,aVm?Dm׏1  2#wH%3 c-Ut@Fn`vù;78#!=өi6QW5zIŧǝX㕙^iV[5qa@xum5ahG*]>? m p0W:h~ѤcD"zʮv\b^G,m;4A͓B<. X&gnqm,oQ{+ 0#KS2=sZgm'|rn)HnDU3(s !OkzDt- }|qv2\C?*qXz6"V8"fMۋQhә18(?la! MV09MMֹuZN{j%6h_c x̟d=rvwb҅!-4 \{3kr}ctO7NwR[d7ӫ Bt:#?^P̿|/,)PU ;9Z%|O(WDd3:sW: guӬ݈3ăw4Q n9ƃbH];IyUV%H]tE~v ؏?ZT4hk,)M8aMA%'~"`n[Ŵ%|.,M9*I챔HpixPȄBFOVc0O^-p5I^Nj k95ϰ4Ӈ*d;b-x4iPfq'Xa?E Ṫ*4? Y},G]/TPv_937eSwM.XSww;[U6urOƅiZt/ W ?d0@xcIuԧZG6ˠ'֣{ZՖu~,piD߹ EY!\ a|+=|N#*r%L.nГWx,ydҪI9[M?B鐓U")؃d^՝VJ{n!EA::qw2$2#.08|hN~McTE=RJv鋴ߎD n*/ / )%I Wu K2~}К`7Nz33y1Ŀ22\`U3E6p^Qa1NveL+S! :|_3h# .UvBvKAd/%PV5L\Go[wgfbR~!sΞYYyK~ћQ]&XZp7z07+zl>[rX@b;*_L;keZSb>^!y2g/Uk*zcEϑM~4尭q*e,jQŠ5舝Xy@CoA.`Y0f\U+.&om==r+}U"GN7* >0!鹩$x|0#zW]w|GSB#A18ݬJfHS[ˋF%ŬW@L"i#8'jG.# 'OiT"?4 !DOQR'5k9T^ADk *Ft HsaEyAc;@߾i6iJbNsn*jQ8[d׏ lʈ)CV@3Q 1g!bE5/1AYR'~EOL% iR };D"eع% Z'H3x4?TuʋH*?,բ_D#YI=&⣪gܬ S iNP aXN6Ox 3ȂvB u$~nZ:h@h7qveo8~8fTkR졝qFt#v@OR tf=6/' ^Ii R:ptCy`.aizr_{Z&hW8}-J2R{(K9ap-eNޘ}lIA0 ^=%]>#au1KBb:GH7kas3EO1TBZpBՙJ\CR}u 6Q:̐K=XABtzoI_g&Ms yQgM]Z"^(_]VnfAaaˤVY1 yIeafy(1{xhQhjQQpeu%*Co]{rQ+g4}t#DE*xB-tǔ$B Y;I'ZQVؒSh<G>倮Tq?Ϩ#-?{k'a_4tQjz>N#6{ƵnoW!y)u;w2doM'k.6w?Wnz ڬ6V=^RF]i!ykU~pQ} ԱЗ1V Q1,hM3K >w]Fk96ݡ $f7]\5=/5W/sdzOH_|7e gɳPƽIǐy#+GDn, 5,(34 3ޥB}=nӇ#^DZ l?J^J{a4S0ݮ!7S!bs9 6!p2BPFVz(Oҿ{U@ ~C˩rv.I 1d/<ٞe#>fцQR>p ؈.ZYL7?jXh}񞜴<6qmc N&OE7LbӶ.(xoAu5%uGaٻ#AFn5)蟖1:R /Ce.;^@$^IȎLvٹ[-d`_O9x}ZnNs`*L# ;~;zܙ `e!C.Q,2oxH8liWg R ^f SRDp{5IL4m,7T1ROj\1o*Xšpha$g92;j[w "_zc VZ {F;Sn-.; NH!rdB@i煨ފOqQQr()2JrC=m;4?Ȕ7ۏ1s4|ĖS2YѲ(0&~61}DoZN0ߡ2.=:WN's_m&)A5pQr^c+˹ ^=5'MOW K%n=U4[oڧYz; ˸QIӗhD)xv'fI;DيC4Еކx'M@{~֨y 5f0ɋH6,+҇)NA+RFU1` 2lHiCAłz`'o%=)l+!Ļ%{f? bdKHQ"(IEe5KݾiL$T.߾lgko. DU8 i &_4}BI΅4O2''$=[h$ѭk|=n.W U(bb[6ݵVWC|t ˅S'qҵ1xcd;& SSt"wIռDIjSVyv4b%eK顋im/R=gVw%Ȯ0FW4(<--})#O_0qEZS->/e G*D7?@1F蒚dkKk-#8^eWWdu?X`!8Vg(VLwJ^)NY1:PhlzvE}}!eͣtr_^ o+!n1ꭓݦ819*k(6C-϶Yp)$16l(י!aL`OkzYw>+Dd&SF)knA/m&[&LQB-5܇oށ:3>ԥ|mQľjV|oEr6*n8 tclּұb}bhX qS[i7H)Q*b =A&ɱI9$^Mt;_7-AW ٛ.#TBJR@,wMi4ȋfdeaf%dJ a!'0nmΑ(sO\*MoA0ޤQb R= I-zF H&E QG1EkzxȺO)gBXTW7~_(8K(qR!Fdu,$Jqp\^ǿ+* ex]zjWX i5If{s͛A#B8ɦRB ·xI^9 vIxp`ZM z.$~eыd*G}af3B%+R(QRF;V/PAPGFcFQxВy:u+ďZVVd5񷕁6Q)+% 6&nu:*7CFL򞿖t0zt?S"j$ڥ 3%ͭخ+l+1@[uE$vh'ƞBjv,?MjlhqnO Ԭ\BH[au1>'޾w=n",ҺkE 'c}(D0@'#.R#ȋ|W1N2:ā Rj TեsnTOʍ(I3Ѓ^) R .* EY,BSց{fyA b3*8:`ҼZp]Ԇ/T\@;s͌M8ANn$z]tVU jb0ֳj9ֽٶj۷:fSb_GyoHY@ g{YSФktܹӞ)<>Yyr3PnqLKJ&KQLʱ;!Z~UA s?ikavyƂl3>/%GFu J;@uZ5^4|H6=BaoӥX ''t5 o]ѺwIW#sN2#"&hAMގW#\`",O?ZEg@5l`uymzt1y+(jܒQ"R>ǥ'xO(yPeB^>`RנGkz$;˟&Xm*ZR48%>Skmgjp=L)ʏq:,`(ȅLNB+"J.ߤ,8B[[mf QqrX$CDp:0y2~pyw_)E^\dvCc !/ 6ب0YY̭iFw8c5Ja6>:/i85*dH:gbR +@]zl$uq4k6R ˀ=Nt+-xj.?p1WփDtq%#Vԣ߲K #,J젥 :{L Rys}%Y;;9㗻8x8I8=PP`dV@ LEWK^Bɥ:dx.~%Z2:h"b n䶧%T'9(Gt|殥f4}i;NƆ| iE筍&3y DMH3|ܪzR}wEX,K?x5i} {IA)sD͡x-݂7se-RscNQDxUDQďrY5Y{OZO/Q&"L#%^Ū0)I"d9RP滳H$ވۦ×z2cVC8<[˱ )^E Ȳ!a3G&Km]ȷPk1zەJ h,.w .ƴy)@[t_dBQM}͸~W4BYj6#0 _ e yPH _X׵2٫׎ҽvЧ4"_MSCC C~ fR8bXOXDQbtW20`'î LbOEK`nY443cm*vPBcwr])s!i3/7 +Bڒ2:1'y6_?ش.2 pR}f%iP_`G#8r?\+0}(P%Paٯ0NYOKqs;97x},wƫƫVH ['BS$X+` gv薜i:-u?+/^ࠆ{)(ٳo4W^mg N7Zחj· !夔vŻ?rﭛL̀HAa7,"S_6ԊHۛIRyCC4)F#S),L!Yb]W` Aʉ#Z)+>qvNj% O¢oڐq'pɕQzD/$C3DC؍i(CjJC_A˭Q!)(J>ws0\`^I Ua붃I'byLY t A3""eHqQ"?Sn)pjbbXϢ_(5--J H1\X-1[V&67M۾?62_"^TF0 쬻vBܖ 8Ӂ> U tߡ|X##Ywx T<o`;M'7%O!3^U~>|M}Ц}X5gŁ(W6_%M%FU-{ ~,I 6?@$܎% ܛyOlfNN!u9N|ʋ=km[ͨrX2lW-xvVeE _ {X9/A3c$J 8FP3!bnZ]ӔхW]I=cuS)BF¥h QeGhsgHLHPű.72QBʱGj93D m2OMT&iDˊA#ݮrGҪvNG^IVczgɅэ/U )=DyBȨV4b4D iLEƢ#8R`i V_)ł'uk-pG]~4\H"6 N:7Cfĸn9eɓ^>-\(&c:iƁf棄8S'ktH7(N]lJWNGN5Yq]^ōUk;jGp # `YM XtI|Q5NxgٔjVcbIwSڟjktdRrn"1s4f|2`'wc)k )96L4!;ǨaXn;fFinjv!/?$h#)[adK3_Nx*5%Al=hYW(z'QP8Hf#dR{Bݔl3;qH]W 9P1F;mg\˞Q  9*ZGe) Fۭ"/۩LE>['y@Uf\u ]CaJ9z*qB٢%~?v B#We钿>!׺`a7f<*W\b9Gb$OP̪2k:(dBr ,cvvm}l[t~c%Y[N[F=DrBL[`e{FOYiFXNuJś~Yt-?yފ EsA`y8_8bL& pp+ y@eO!04+yRjX3f2SXLq 71bՁ:2VAvZuq%!`WiPƿAo}u^\[Ѹ_č5QQm8_}<=ȏ!ۑlR/Arj@ Һ:#DnL/cqmC- _Ї<ˮe\ClN}nI=KSb_LK//R1Hԅ0KΙ.(Uc+ )IGPTkg ?Pi>#)uRp\~̤Kz_?Fmс_mFDPShUl*!'&6"kt}N=ƶX1͚:°#[`oWqAۑ@uO%m"ӛgg ) H Suw8(ƫtN_dXǏge#z@/o39g0&bizLt$5)Т[C:OL8'{juaJ??SDFA D>0 䋷Y-0|J-fH0Z`s.&MX=`Lu7-f%Ì %ME6ãcH43'XR`+57S{T sWpV٘PNԿXTɒ9v1Y8SI7AЈ/`u3?u$]lvr e7q>nn*ۊNCAѲRWZwl2yQFR?cM}K[t{tD¡{\71ݟ>Ȭ> 3Uk#\ y@8VN&"9KzE cי T[[/˨fu&'H[p_<MX%+Q ~* W/zq_?9ɴٙU8$qw벓ɷʄFZ˘8s bմ0 _{D5q:[ՍW-/id<cQbW,yby.'cZ tWa4FK:Hlf>=K'2uCd#ɨo M; mW|!N&לb\:LS0nS!AIZJ>a#KgR!u28J̰kYs]Ah LCgXGko۝\c): gB2d3/˝Tpx_hz? 7@j \D'U]T'U0d sNu !);чnSO#X} JwFg0B|Hnͷ vӜjR蝃y\V>znTt ~WZJoZw6MQvrPXWܡ? qy|8p nsT(Uv)S6_A#EE{"j J < Յ|URylK}3/hd{6J2&i]9[ v|8&d$<'7QN-BN#mNt nhX>7גc`))2K -VW igIb4?h4[O/ed}-^wN;WBP}qɣKjfaơΤЩݷb܏ǘtyqB!>Il2uzM#x /Ǻ<6 .eqI_ QZk osns~ :|1yĎʁ\XPlĤȹ nܧ-sb5]/I߾кd,p<|f%eL++&S[3ِ~;}8P#V$ID걦}A 0+`r~L)pr5>e=+ݹmYemRD㖐Qn/GEjh``@GO_{RV@< ˽Zr=pT ĸ"'5wUG̯Pc G>M>/U8P(:J^!;)C7s-Nq18gӇ]/a.u1|8ʛdb'zdΝqb nA|m}_s :]Oܜl`$+9$gM=/W@?OİH=zmoV "*~N:F*.UFz.nm GgͤwuXi0I+( %zRi?HuBw(a\%$~3U }%~4XQFNg69i@5dB?J2\D"hv:l&&a7֥'OsecM6Bޒhk 9uRj8}ZiDl5O ,4-@K"uh4qAynkأ;UӳH.=u]t_F a5<:{N <c[h:mԮKn+w;ʘ͟-1cDЅ9K =}nĴ^_: pب^`fwj$]u/2,2ӓln-Gs 3V`>ϳuQcs7ڒ %<+ a઀m/״nɢ ]3ȅ[ҟ m5PiĎE"U0Z͋k&aG/N6/KuoՀ3M%P$KG[D{hW(K+җhh3OĤwX%mHvS+..?(L7>wevrп61vrl0O"p?xѱ"׵\v`+h8oˣZ,qE2XGPţ[Ky3wTCyAuwK{tߧ8:'Z)\S_IZ a[H?NZb|]|+EDwA=P!~Rݩ5xRnd2|.*m mBQe9hh\"Zֲ}feO 8b&X2qXrȧ=<,҅*PwkBRU>3L\⤍g1 SDtrwsGӟT+f],3pETȥ2ZlaϣNΜx Z 4ɖ4ݲ6M,ުs.M7Z.3jj1@! OY.> 7^„z-_}/hHDKJ2$z|'AiY~)?pN·#˄=R:^2M:9ɥ=jpi5X9rN`u$~ʯٮIe6LO^ӑ .;MX͟0xGBm'R¡/?By=KQF[͢?cEofUx?\f ƚS_2|?+!ÜL'=иh.*"iqء:,:J~%P4S:C['5O۱IDLCV'w^lkAD5\cĨRM&<˫e!Umκ";>R9v|iH*iAeJT$4nq1f]'9RY{4Z6 _i;)zJ#~3 ҮmMXR!ײ=yi p+f$1, <I$)G+DN( .dS7.g>dž7 n'B+ 8P}mygD}32l %I][8-t  r3;\bK^—o` %YHQmx+Hw.O\.Еޫh! O@t W;HȎ$zNW] \Jn$*,',v 50&<6; blPYrQ3{:n؆q>1Oc) }iRYY$OEZ;9~qgV&4iōU4#}K;?>*TD\U "GCv Uo[k29`v2lWJ"('X!%\ro No+z_ ^qH[<{8x^Lb@` GH,ǡ _CgU]͝/uK]㓒;'#"newdr-~ײ/UQFҝvApdߧ?|>2-J5J‹OwPzZ 8O HzW-0`Rwq#~M5Ё`+O;vőCn"&4gq7b_=OU԰ ҕg5)imT'e&em5{ XmebOhea29k#U0bW-MD`A6% 阽A)?h6=})Asj A @T~M}F*[XDR(3d?L}v?rX97iZU9Q56OC2߬_[GO!\0MHRB.lӴD*1qQ nBP{tAlKVp +HLOXƞ~w7XRek,CPMnKW>Kzfڢ#0bA Ӂ 2ӾtH긅U@gZl1&_xl$Sk[Sͩr0Lƍ2}NgҮ-"ukIO;:ߴ[#*h"ݛ5A šiDsѱKޑDa`jK-?3sd rJ6WJn߳垤-4GO ޶PrgG W~ V `xƼ xYx7s8 yc4?2Vsl{;@i ?҅sa2<4 H.ƶY9QGac+pEQG |V}C`I%pK[  +-wi̛ En2ifi?[Hh?_pYPǹ`ڍV9z='/n7@(xY9+bMO}29vj)*r:YҌ)9=<㹍$9x| |w٭5}*gl9} nsSe4qVYN]gk|am_6vʇP[T)V—ݢ;f]%Pn:刑ƎHe-X4 *(i kk^h,ׂceXV W1^g-eBei"&mgeD[ǭݑڑl@)+"-6 K t]K?j·6si!ˊh8J(0,V))ܥJ_I(4n&qw+R2eXgYPQvo]c$^jIOU^#ȽlVne?vG맸v[:dݭg"`RLg$=%ܤpq67@v[DS9"~¶,%%La%%R% `;ZM.Cd yx5ΧM@Z6o 5iyeFkT!1SvN}r1ىq^/V=:nMˍj,4`a: K'NR\* ýsB)]5LVn/|49-hXFR>UU9k?ϵכLJ@S X9k5GxAO+BrEn7N*:?V5IHM3=ܹ%L)4 |h-\a2BQnUL̲Rb4# EEէ® *_Uyp2xI6D[HNEö<=j+lM EvIgxS0o.;bB9\;etv[)g7GH/%7,d IJ!+|d%J#{ iz+98jfq2ũn!g>k@\m>_;60Ϸ!)AWD8-ؙW97F{|VAG*kZrՕ:Q@"{ܘ:]E!eI(M0>|busP:;#Ɗz8h3ck$J,VEvVXh=Y\/p-ST,2Al4]W ˲!ޒ! /5tKa'gVX*`)e煶egȅ"a?AvvrECoBطBҡKڃ$D2W?M,`:aDJLț;MS մDFHhuJ,h uFrqEZнjBHy_owee:Bإ=KOo HAeܒI7%a;a0 }c΅o4\S i~*g_VoLiO!G7'IYw,j _KM.11lW<&֙>.VPf~3 ;nSxtLƂX3GgyύeTYo d(8D^;ku[JzLdvpM$[]d4!AA+VH5B[)RQ-E_T$X"M9k. ls5H%Cð9f,d_CJv8v I[,NiGXw6m7'{92]D yS2}s)y>rDzUɖl3TtzRb3#2&v\CHbõR)\$",,DC亪k+@--{J`xч37,E,%e](YWZnMȅw@Hx,A*g쁍 je2hхؤ VNvp:XrZV]v:g\G)価"7ӻE%0h:E)j]E5b•8fF/"'C$6Ɋ;7B_}_FY)P쥋)5gZPı6OM7Y;.'عJA4ymuVl1U`֎Og$ Ʊ^" ʅ5N巹Bv#Kjm<7Y=)T`]OxH33C:$vީ_!ʥ_mbl W)y\;\$8ǍѹX5}fJcq}R4 $)G^;:'tVqoK$d98O ߎ<%A2Zx@Ae 'c [ ginwb۵!Cl1Y #9hD7_^zhFV.B{#!I"uzVx递mĥQ_3YhXO(2QlM"1/ʡJwiWlj0!e{ˋ^8kVԿPp.U /Pt3h8owCxZDŽ}f_6Aȓ&LzEOfZPR5ҍ'+M!ӝڢS oLNӟ2 J~^ 0F0hMbfݏz8^C'x D )S WBco8Z36}^/ߏﱁ_v`-{@ܴ7zAVEZظH%\LZ gE=. ߀0>Cƙ+z+Ejp+`gw,v0F?0NDP&v2O`bY;/d㰿R&tMs8 4 ߬),dz&r{wV]կZJqi ]pg]BHCy`ÎuE3IS3ٹp6`RwѐfQD49V]u g(dj[@8 6[Lh\P=1(L oDywEg6cYu8~((Z=4盩11G~ǢݒEU#lj}5ShU5v1o\#'xhǫ *[Ws MJ[@uxz)xovߺ80u:ٍah8U\̬ lӄ&}I~Y2Tfjp[R>[DCÔ%I9G]L(rz!Fq]uC=4!S׉#jKNR9Jo1ONcCaR~|3F=9'±$>n;8aBmaAY|_BA5gN.H0OI2 #+M"#,)/ѭ0X1 ]sn)"\TF,'>va&&AJD+">GϖsQ id,QbǁlD4>3˽IT!3n$gLU<}vV+{)n,՞L2Xk>UB{=vSB4ew (g2p{L/;n}T~ӕDD#s}odhgV Ȑ>Bb> 8Q >r}Nqqeݾdݬƥ_gO**: e BÃڈRU{(Cw*$2G72;ܾECu"<UF+>בJ-zt=h; M) E0>Iݷf_$Sp,/Tbc &kp\I݉(ue]5@Ħ 7:a8G2JU UA#&rNYLN$HK"zuJU17[V>%3U(gٸv0R\n$-׵jK=#'PTkᱭ̆NZQ#^'8ڃ:kMi.vBrƎ0J`W9΢=gf* CF )r71k'v OϿ߃EL ]~y"ZІt;ڋ籨%b< afgޞ2ӈՙ@u7m&m\.@]y*,J1#}~xP 䫍~3m]-{p(K\EE \q 9YyM⡣?XQ~h cGO h'OrswL 3&.e~E} Ϻ?@t39}7\\?_R{zh"@BK9КÖ21.On[3习NJ<>-`ފhѳ61 cM{pC揿 6fz;Ɋb,:eeXB/eA~a$?"{QWgf6k\K.\袡mak_@;~Bt1tvf!bM`ATu3жz~[r$[C"Ob1hTmPlnjNOnkn<Mj݂]4Ѐ 5b?El%l!pRۧA}5 *FjGkHA:S؆a 泋u~ ݅Byu߅ +R[d0U{an:hdcN頋Zа6 ՒJYc,x8whFa*.z}lHi0hGԉ@9$7磸XP(H#YHs>|sK)gVX&Lw]S'zҏW[nmeemL!/ڬOAq[}p׬>?IP{̋#Bv?͑÷@R2*Tpμ1cꉖ`)n*Sn8cHYFRHl ,#N!B5p0a4j1`LbzU&43`tj@YV٧XwrG~Ø0S;gη"XK7 bE能\k;>HϪtP?@`]X}8:0kd˴mИe)Tg%<ӷtAQ4IŇgDZ O30F%]j꒯i0ЁD1r!w69ĉR 1.Y9˃J 3M{Dv`߯X(JB*kJh,GwNZeE11zδL(g-r@iF"ս1L7oU͠~Le!%灖-.MOikM/M;UW/=䱜+h6k +?  |O/JR~\~'3.Ï5ޖ#npx*o7zoTc6?{ bvsK$7aӍJ|YaFJ:V^ؤOBm͋W<A᧼+  N>c,PO4_(ƃ<3F<*ǛnL=+qku(蔐땯*e3t:A2#xiPdBN݄§@CԚX?h͈$ƣ ze&gg`16<[IJq-uh[2ǡ 1O)[/30 { zDs>sºiez(SG~'/Yw0Qv!16V.Ic =}GM!U;|ZLӕDτLli=ICUN+,2qea2!P£$Kh9E? t'~oe}ny_ky/OjTS4Fw"OStd˟vLkڠ\3[`NWd @ Y؍dGϦƑܑ)[:#9VĮyH>Qy/4SȬDR{!}bH{Zـ\MH-j0P{dEtn@z9WmحP4 ȟysGG1uF:C꟒bSWΎKk$0Δ[G{ Q+c%o<݊1*͏Jf(AgHoEyE#JLΟȥj< wܴY0̉|Jȟ 5ڝ#b23}~P/)YϢ߄M( "P^uhrޯ pnp7ow7%~^ߊ5<}6"^|Or9LZ]?ẖcx)̓Pjs~{[!pAnOe!S/H| YU}zBa<^1M,8)9 wXPM2䫏PaD?AѼ4"Hm*ozIHVw ;4N.Na w*lkq2$h L\zb#/ѠO92\7U`~Y#,?u.} M4x QdtS wD}l ްcD3-~|&($Ac3ȀPv:$oT,0ż|J,5@w'ib""Xu?}H5ܝkFkD "0m@=HXޤygc,a&Yh>˛S?VM1|f;TɨkdPF $f=ZO+bRĨ эطw{WPƑAH(1L=F+T. ڬaq{LO?҄ nDdaq?B܏&-B8g5!]{ӡK_"Q+SZpGQS]9H"4rbq89X\faRV[ƮGgUk qeM6hw^d(BtiGr`ws{ EKE'VJXP8׉/ )A;92>b$7(Nb̢4F[8WԎD s "K(coitZX n o-F~u e m/Ѧ t<8h?_/6t jxFZۡcKmLڃ$ ManJ*N`!"@1T mQ6vJ(WχFt>ޙ ʴfk\Xmp3uk#]O =~M.Mx<.{ tBV5٬9QՅ`B?늜D6A==\WOsJ=$y<_&F/yw%Qjmc^X.{YM}(cҐ$;G-ݏdm?i/ĆDN^K<7fs%N(J0LVsEd Cԝ߹=jZOHJr*=Vtv-ivء.dOb%YD虭`^fpwP+^ :F" BSeyh\׾p<ѶZQnηp "lw(hAPXB21)sp;e-`Ç bxor\޶ECkA}ǺK0J_hb_f#Fn;.aKt?=Ǟ[ t,xg:S%r{;6W׆#V]2H Ϊ(am$>gX0, lgbY(S1O^wKC]fLANW[#KL!SRCaVj9-*jS/tԓz<xyɘ ,zK k:nNY@vV(Tv>TcX.mm0 M 2r4Vܠ5yb_l@5WJlI9#!ldꤦBjV NW[t;_q<쐐u_+ ^+ǽ9\NZqLĊۚP!A;G%ډz;4?=vk[' Sh#P(w|l'>L,8#ƿ_u]@^I<"X2@3C7G)> 3W}M36T#.م6_rQv k1/Hb.|w[m!h:~.TK 6*R |L ^obfzKG@8 0HHl"h4ݝ>ia撯Qt\euŽz^W?~ Ѹm]?f n$LHM1!{N."/vb`h8}9-lO es!3=ge"s?O;0TAe >S"\Gh #ݸ G -@AC;}u5^i܊5Oev'Խt 9Z-(Ud˜0ӄ*Љ߁`ݮHړĀꖳ#~aۿTkŗgԃ^3+o)whе7>rN ~[ݵ877U%]$V ̤Qp$P[0]npď̚W\(j`)r4hY-XT$2Gcx9Z\rHJ]=B(2f 2ΞKP߻G Rc﯇=>K[ȩAhx6oR4X