* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ /** * @ignore */ define('IN_PHPBB', true); $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); include($phpbb_root_path . 'includes/functions_display.' . $phpEx); include($phpbb_root_path . 'includes/bbcode.' . $phpEx); include($phpbb_root_path . 'includes/functions_user.' . $phpEx); // Start session management $user->session_begin(); $auth->acl($user->data); // Initial var setup $forum_id = $request->variable('f', 0); $topic_id = $request->variable('t', 0); $post_id = $request->variable('p', 0); $voted_id = $request->variable('vote_id', array('' => 0)); $voted_id = (sizeof($voted_id) > 1) ? array_unique($voted_id) : $voted_id; $start = $request->variable('start', 0); $view = $request->variable('view', ''); $default_sort_days = (!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0; $default_sort_key = (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'; $default_sort_dir = (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'; $sort_days = $request->variable('st', $default_sort_days); $sort_key = $request->variable('sk', $default_sort_key); $sort_dir = $request->variable('sd', $default_sort_dir); $update = $request->variable('update', false); /* @var $pagination \phpbb\pagination */ $pagination = $phpbb_container->get('pagination'); $s_can_vote = false; /** * @todo normalize? */ $hilit_words = $request->variable('hilit', '', true); // Do we have a topic or post id? if (!$topic_id && !$post_id) { trigger_error('NO_TOPIC'); } /* @var $phpbb_content_visibility \phpbb\content_visibility */ $phpbb_content_visibility = $phpbb_container->get('content.visibility'); // Find topic id if user requested a newer or older topic if ($view && !$post_id) { if (!$forum_id) { $sql = 'SELECT forum_id FROM ' . TOPICS_TABLE . " WHERE topic_id = $topic_id"; $result = $db->sql_query($sql); $forum_id = (int) $db->sql_fetchfield('forum_id'); $db->sql_freeresult($result); if (!$forum_id) { trigger_error('NO_TOPIC'); } } if ($view == 'unread') { // Get topic tracking info $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id); $topic_last_read = (isset($topic_tracking_info[$topic_id])) ? $topic_tracking_info[$topic_id] : 0; $sql = 'SELECT post_id, topic_id, forum_id FROM ' . POSTS_TABLE . " WHERE topic_id = $topic_id AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id) . " AND post_time > $topic_last_read AND forum_id = $forum_id ORDER BY post_time ASC, post_id ASC"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!$row) { $sql = 'SELECT topic_last_post_id as post_id, topic_id, forum_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . $topic_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); } if (!$row) { // Setup user environment so we can process lang string $user->setup('viewtopic'); trigger_error('NO_TOPIC'); } $post_id = $row['post_id']; $topic_id = $row['topic_id']; } else if ($view == 'next' || $view == 'previous') { $sql_condition = ($view == 'next') ? '>' : '<'; $sql_ordering = ($view == 'next') ? 'ASC' : 'DESC'; $sql = 'SELECT forum_id, topic_last_post_time FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . $topic_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!$row) { $user->setup('viewtopic'); // OK, the topic doesn't exist. This error message is not helpful, but technically correct. trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS'); } else { $sql = 'SELECT topic_id, forum_id FROM ' . TOPICS_TABLE . ' WHERE forum_id = ' . $row['forum_id'] . " AND topic_moved_id = 0 AND topic_last_post_time $sql_condition {$row['topic_last_post_time']} AND " . $phpbb_content_visibility->get_visibility_sql('topic', $row['forum_id']) . " ORDER BY topic_last_post_time $sql_ordering, topic_last_post_id $sql_ordering"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!$row) { $sql = 'SELECT forum_style FROM ' . FORUMS_TABLE . " WHERE forum_id = $forum_id"; $result = $db->sql_query($sql); $forum_style = (int) $db->sql_fetchfield('forum_style'); $db->sql_freeresult($result); $user->setup('viewtopic', $forum_style); trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS'); } else { $topic_id = $row['topic_id']; $forum_id = $row['forum_id']; } } } if (isset($row) && $row['forum_id']) { $forum_id = $row['forum_id']; } } // This rather complex gaggle of code handles querying for topics but // also allows for direct linking to a post (and the calculation of which // page the post is on and the correct display of viewtopic) $sql_array = array( 'SELECT' => 't.*, f.*', 'FROM' => array(FORUMS_TABLE => 'f'), ); // The FROM-Order is quite important here, else t.* columns can not be correctly bound. if ($post_id) { $sql_array['SELECT'] .= ', p.post_visibility, p.post_time, p.post_id'; $sql_array['FROM'][POSTS_TABLE] = 'p'; } // Topics table need to be the last in the chain $sql_array['FROM'][TOPICS_TABLE] = 't'; if ($user->data['is_registered']) { $sql_array['SELECT'] .= ', tw.notify_status'; $sql_array['LEFT_JOIN'] = array(); $sql_array['LEFT_JOIN'][] = array( 'FROM' => array(TOPICS_WATCH_TABLE => 'tw'), 'ON' => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id' ); if ($config['allow_bookmarks']) { $sql_array['SELECT'] .= ', bm.topic_id as bookmarked'; $sql_array['LEFT_JOIN'][] = array( 'FROM' => array(BOOKMARKS_TABLE => 'bm'), 'ON' => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id' ); } if ($config['load_db_lastread']) { $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time'; $sql_array['LEFT_JOIN'][] = array( 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id' ); $sql_array['LEFT_JOIN'][] = array( 'FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id' ); } } if (!$post_id) { $sql_array['WHERE'] = "t.topic_id = $topic_id"; } else { $sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id"; } $sql_array['WHERE'] .= ' AND f.forum_id = t.forum_id'; $sql = $db->sql_build_query('SELECT', $sql_array); $result = $db->sql_query($sql); $topic_data = $db->sql_fetchrow($result); $db->sql_freeresult($result); // link to unapproved post or incorrect link if (!$topic_data) { // If post_id was submitted, we try at least to display the topic as a last resort... if ($post_id && $topic_id) { redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&f=$forum_id" : ''))); } trigger_error('NO_TOPIC'); } $forum_id = (int) $topic_data['forum_id']; // If the request is missing the f parameter, the forum id in the user session data is 0 at the moment. // Let's fix that now so that the user can't hide from the forum's Who Is Online list. $user->page['forum'] = $forum_id; // Now we know the forum_id and can check the permissions if ($topic_data['topic_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $forum_id)) { trigger_error('NO_TOPIC'); } // This is for determining where we are (page) if ($post_id) { // are we where we are supposed to be? if (($topic_data['post_visibility'] == ITEM_UNAPPROVED || $topic_data['post_visibility'] == ITEM_REAPPROVE) && !$auth->acl_get('m_approve', $topic_data['forum_id'])) { // If post_id was submitted, we try at least to display the topic as a last resort... if ($topic_id) { redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&f=$forum_id" : ''))); } trigger_error('NO_TOPIC'); } if ($post_id == $topic_data['topic_first_post_id'] || $post_id == $topic_data['topic_last_post_id']) { $check_sort = ($post_id == $topic_data['topic_first_post_id']) ? 'd' : 'a'; if ($sort_dir == $check_sort) { $topic_data['prev_posts'] = $phpbb_content_visibility->get_count('topic_posts', $topic_data, $forum_id) - 1; } else { $topic_data['prev_posts'] = 0; } } else { $sql = 'SELECT COUNT(p.post_id) AS prev_posts FROM ' . POSTS_TABLE . " p WHERE p.topic_id = {$topic_data['topic_id']} AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id, 'p.'); if ($sort_dir == 'd') { $sql .= " AND (p.post_time > {$topic_data['post_time']} OR (p.post_time = {$topic_data['post_time']} AND p.post_id >= {$topic_data['post_id']}))"; } else { $sql .= " AND (p.post_time < {$topic_data['post_time']} OR (p.post_time = {$topic_data['post_time']} AND p.post_id <= {$topic_data['post_id']}))"; } $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $topic_data['prev_posts'] = $row['prev_posts'] - 1; } } $topic_id = (int) $topic_data['topic_id']; $topic_replies = $phpbb_content_visibility->get_count('topic_posts', $topic_data, $forum_id) - 1; // Check sticky/announcement/global time limit if (($topic_data['topic_type'] != POST_NORMAL) && $topic_data['topic_time_limit'] && ($topic_data['topic_time'] + $topic_data['topic_time_limit']) < time()) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_type = ' . POST_NORMAL . ', topic_time_limit = 0 WHERE topic_id = ' . $topic_id; $db->sql_query($sql); $topic_data['topic_type'] = POST_NORMAL; $topic_data['topic_time_limit'] = 0; } // Setup look and feel $user->setup('viewtopic', $topic_data['forum_style']); $overrides_f_read_check = false; $overrides_forum_password_check = false; $topic_tracking_info = isset($topic_tracking_info) ? $topic_tracking_info : null; /** * Event to apply extra permissions and to override original phpBB's f_read permission and forum password check * on viewtopic access * * @event core.viewtopic_before_f_read_check * @var int forum_id The forum id from where the topic belongs * @var int topic_id The id of the topic the user tries to access * @var int post_id The id of the post the user tries to start viewing at. * It may be 0 for none given. * @var array topic_data All the information from the topic and forum tables for this topic * It includes posts information if post_id is not 0 * @var bool overrides_f_read_check Set true to remove f_read check afterwards * @var bool overrides_forum_password_check Set true to remove forum_password check afterwards * @var array topic_tracking_info Information upon calling get_topic_tracking() * Set it to NULL to allow auto-filling later. * Set it to an array to override original data. * @since 3.1.3-RC1 */ $vars = array( 'forum_id', 'topic_id', 'post_id', 'topic_data', 'overrides_f_read_check', 'overrides_forum_password_check', 'topic_tracking_info', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_before_f_read_check', compact($vars))); // Start auth check if (!$overrides_f_read_check && !$auth->acl_get('f_read', $forum_id)) { if ($user->data['user_id'] != ANONYMOUS) { send_status_line(403, 'Forbidden'); trigger_error('SORRY_AUTH_READ'); } login_box('', $user->lang['LOGIN_VIEWFORUM']); } // Forum is passworded ... check whether access has been granted to this // user this session, if not show login box if (!$overrides_forum_password_check && $topic_data['forum_password']) { login_forum_box($topic_data); } // Redirect to login upon emailed notification links if user is not logged in. if (isset($_GET['e']) && $user->data['user_id'] == ANONYMOUS) { login_box(build_url('e') . '#unread', $user->lang['LOGIN_NOTIFY_TOPIC']); } // What is start equal to? if ($post_id) { $start = floor(($topic_data['prev_posts']) / $config['posts_per_page']) * $config['posts_per_page']; } // Get topic tracking info if (!isset($topic_tracking_info)) { $topic_tracking_info = array(); // Get topic tracking info if ($config['load_db_lastread'] && $user->data['is_registered']) { $tmp_topic_data = array($topic_id => $topic_data); $topic_tracking_info = get_topic_tracking($forum_id, $topic_id, $tmp_topic_data, array($forum_id => $topic_data['forum_mark_time'])); unset($tmp_topic_data); } else if ($config['load_anon_lastread'] || $user->data['is_registered']) { $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id); } } // Post ordering options $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']); $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']); $sort_by_sql = array('a' => array('u.username_clean', 'p.post_id'), 't' => array('p.post_time', 'p.post_id'), 's' => array('p.post_subject', 'p.post_id')); $join_user_sql = array('a' => true, 't' => false, 's' => false); $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir); // Obtain correct post count and ordering SQL if user has // requested anything different if ($sort_days) { $min_post_time = time() - ($sort_days * 86400); $sql = 'SELECT COUNT(post_id) AS num_posts FROM ' . POSTS_TABLE . " WHERE topic_id = $topic_id AND post_time >= $min_post_time AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id); $result = $db->sql_query($sql); $total_posts = (int) $db->sql_fetchfield('num_posts'); $db->sql_freeresult($result); $limit_posts_time = "AND p.post_time >= $min_post_time "; if (isset($_POST['sort'])) { $start = 0; } } else { $total_posts = $topic_replies + 1; $limit_posts_time = ''; } // Was a highlight request part of the URI? $highlight_match = $highlight = ''; if ($hilit_words) { $highlight_match = phpbb_clean_search_string($hilit_words); $highlight = urlencode($highlight_match); $highlight_match = str_replace('\*', '\w+?', preg_quote($highlight_match, '#')); $highlight_match = preg_replace('#(?<=^|\s)\\\\w\*\?(?=\s|$)#', '\w+?', $highlight_match); $highlight_match = str_replace(' ', '|', $highlight_match); } // Make sure $start is set to the last page if it exceeds the amount $start = $pagination->validate_start($start, $config['posts_per_page'], $total_posts); // General Viewtopic URL for return links $viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($highlight_match) ? "&hilit=$highlight" : '')); // Are we watching this topic? $s_watching_topic = array( 'link' => '', 'link_toggle' => '', 'title' => '', 'title_toggle' => '', 'is_watching' => false, ); if ($config['allow_topic_notify']) { $notify_status = (isset($topic_data['notify_status'])) ? $topic_data['notify_status'] : null; watch_topic_forum('topic', $s_watching_topic, $user->data['user_id'], $forum_id, $topic_id, $notify_status, $start, $topic_data['topic_title']); // Reset forum notification if forum notify is set if ($config['allow_forum_notify'] && $auth->acl_get('f_subscribe', $forum_id)) { $s_watching_forum = $s_watching_topic; watch_topic_forum('forum', $s_watching_forum, $user->data['user_id'], $forum_id, 0); } } /** * Event to modify highlight. * * @event core.viewtopic_highlight_modify * @var string highlight String to be highlighted * @var string highlight_match Highlight string to be used in preg_replace * @var array topic_data Topic data * @var int start Pagination start * @var int total_posts Number of posts * @var string viewtopic_url Current viewtopic URL * @since 3.1.11-RC1 */ $vars = array( 'highlight', 'highlight_match', 'topic_data', 'start', 'total_posts', 'viewtopic_url', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_highlight_modify', compact($vars))); // Bookmarks if ($config['allow_bookmarks'] && $user->data['is_registered'] && $request->variable('bookmark', 0)) { if (check_link_hash($request->variable('hash', ''), "topic_$topic_id")) { if (!$topic_data['bookmarked']) { $sql = 'INSERT INTO ' . BOOKMARKS_TABLE . ' ' . $db->sql_build_array('INSERT', array( 'user_id' => $user->data['user_id'], 'topic_id' => $topic_id, )); $db->sql_query($sql); } else { $sql = 'DELETE FROM ' . BOOKMARKS_TABLE . " WHERE user_id = {$user->data['user_id']} AND topic_id = $topic_id"; $db->sql_query($sql); } $message = (($topic_data['bookmarked']) ? $user->lang['BOOKMARK_REMOVED'] : $user->lang['BOOKMARK_ADDED']); if (!$request->is_ajax()) { $message .= '

' . $user->lang('RETURN_TOPIC', '', ''); } } else { $message = $user->lang['BOOKMARK_ERR']; if (!$request->is_ajax()) { $message .= '

' . $user->lang('RETURN_TOPIC', '', ''); } } meta_refresh(3, $viewtopic_url); trigger_error($message); } // Grab ranks $ranks = $cache->obtain_ranks(); // Grab icons $icons = $cache->obtain_icons(); // Grab extensions $extensions = array(); if ($topic_data['topic_attachment']) { $extensions = $cache->obtain_attach_extensions($forum_id); } // Forum rules listing $s_forum_rules = ''; gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']); // Quick mod tools $allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false; $s_quickmod_action = append_sid( "{$phpbb_root_path}mcp.$phpEx", array( 'f' => $forum_id, 't' => $topic_id, 'start' => $start, 'quickmod' => 1, 'redirect' => urlencode(str_replace('&', '&', $viewtopic_url)), ), true, $user->session_id ); $quickmod_array = array( // 'key' => array('LANG_KEY', $userHasPermissions), 'lock' => array('LOCK_TOPIC', ($topic_data['topic_status'] == ITEM_UNLOCKED) && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster']))), 'unlock' => array('UNLOCK_TOPIC', ($topic_data['topic_status'] != ITEM_UNLOCKED) && ($auth->acl_get('m_lock', $forum_id))), 'delete_topic' => array('DELETE_TOPIC', ($auth->acl_get('m_delete', $forum_id) || (($topic_data['topic_visibility'] != ITEM_DELETED) && $auth->acl_get('m_softdelete', $forum_id)))), 'restore_topic' => array('RESTORE_TOPIC', (($topic_data['topic_visibility'] == ITEM_DELETED) && $auth->acl_get('m_approve', $forum_id))), 'move' => array('MOVE_TOPIC', $auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED), 'split' => array('SPLIT_TOPIC', $auth->acl_get('m_split', $forum_id)), 'merge' => array('MERGE_POSTS', $auth->acl_get('m_merge', $forum_id)), 'merge_topic' => array('MERGE_TOPIC', $auth->acl_get('m_merge', $forum_id)), 'fork' => array('FORK_TOPIC', $auth->acl_get('m_move', $forum_id)), 'make_normal' => array('MAKE_NORMAL', ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', 'f_announce_global', $forum_id) && $topic_data['topic_type'] != POST_NORMAL)), 'make_sticky' => array('MAKE_STICKY', ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY)), 'make_announce' => array('MAKE_ANNOUNCE', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE)), 'make_global' => array('MAKE_GLOBAL', ($allow_change_type && $auth->acl_get('f_announce_global', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL)), 'topic_logs' => array('VIEW_TOPIC_LOGS', $auth->acl_get('m_', $forum_id)), ); /** * Event to modify data in the quickmod_array before it gets sent to the * phpbb_add_quickmod_option function. * * @event core.viewtopic_add_quickmod_option_before * @var int forum_id Forum ID * @var int post_id Post ID * @var array quickmod_array Array with quick moderation options data * @var array topic_data Array with topic data * @var int topic_id Topic ID * @var array topic_tracking_info Array with topic tracking data * @var string viewtopic_url URL to the topic page * @var bool allow_change_type Topic change permissions check * @since 3.1.9-RC1 */ $vars = array( 'forum_id', 'post_id', 'quickmod_array', 'topic_data', 'topic_id', 'topic_tracking_info', 'viewtopic_url', 'allow_change_type', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_add_quickmod_option_before', compact($vars))); foreach ($quickmod_array as $option => $qm_ary) { if (!empty($qm_ary[1])) { phpbb_add_quickmod_option($s_quickmod_action, $option, $qm_ary[0]); } } // Navigation links generate_forum_nav($topic_data); // Forum Rules generate_forum_rules($topic_data); // Moderators $forum_moderators = array(); if ($config['load_moderators']) { get_moderators($forum_moderators, $forum_id); } // This is only used for print view so ... $server_path = (!$view) ? $phpbb_root_path : generate_board_url() . '/'; // Replace naughty words in title $topic_data['topic_title'] = censor_text($topic_data['topic_title']); $s_search_hidden_fields = array( 't' => $topic_id, 'sf' => 'msgonly', ); if ($_SID) { $s_search_hidden_fields['sid'] = $_SID; } if (!empty($_EXTRA_URL)) { foreach ($_EXTRA_URL as $url_param) { $url_param = explode('=', $url_param, 2); $s_search_hidden_fields[$url_param[0]] = $url_param[1]; } } // If we've got a hightlight set pass it on to pagination. $base_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($highlight_match) ? "&hilit=$highlight" : '')); /** * Event to modify data before template variables are being assigned * * @event core.viewtopic_assign_template_vars_before * @var string base_url URL to be passed to generate pagination * @var int forum_id Forum ID * @var int post_id Post ID * @var array quickmod_array Array with quick moderation options data * @var int start Pagination information * @var array topic_data Array with topic data * @var int topic_id Topic ID * @var array topic_tracking_info Array with topic tracking data * @var int total_posts Topic total posts count * @var string viewtopic_url URL to the topic page * @since 3.1.0-RC4 * @changed 3.1.2-RC1 Added viewtopic_url */ $vars = array( 'base_url', 'forum_id', 'post_id', 'quickmod_array', 'start', 'topic_data', 'topic_id', 'topic_tracking_info', 'total_posts', 'viewtopic_url', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_assign_template_vars_before', compact($vars))); $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total_posts, $config['posts_per_page'], $start); // Send vars to template $template->assign_vars(array( 'FORUM_ID' => $forum_id, 'FORUM_NAME' => $topic_data['forum_name'], 'FORUM_DESC' => generate_text_for_display($topic_data['forum_desc'], $topic_data['forum_desc_uid'], $topic_data['forum_desc_bitfield'], $topic_data['forum_desc_options']), 'TOPIC_ID' => $topic_id, 'TOPIC_TITLE' => $topic_data['topic_title'], 'TOPIC_POSTER' => $topic_data['topic_poster'], 'TOPIC_AUTHOR_FULL' => get_username_string('full', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']), 'TOPIC_AUTHOR_COLOUR' => get_username_string('colour', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']), 'TOPIC_AUTHOR' => get_username_string('username', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']), 'TOTAL_POSTS' => $user->lang('VIEW_TOPIC_POSTS', (int) $total_posts), 'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=topic_view&f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . ((strlen($u_sort_param)) ? "&$u_sort_param" : ''), true, $user->session_id) : '', 'MODERATORS' => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]) : '', 'POST_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'), 'QUOTE_IMG' => $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'), 'REPLY_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED || $topic_data['topic_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'TOPIC_LOCKED') : $user->img('button_topic_reply', 'REPLY_TO_TOPIC'), 'EDIT_IMG' => $user->img('icon_post_edit', 'EDIT_POST'), 'DELETE_IMG' => $user->img('icon_post_delete', 'DELETE_POST'), 'DELETED_IMG' => $user->img('icon_topic_deleted', 'POST_DELETED_RESTORE'), 'INFO_IMG' => $user->img('icon_post_info', 'VIEW_INFO'), 'PROFILE_IMG' => $user->img('icon_user_profile', 'READ_PROFILE'), 'SEARCH_IMG' => $user->img('icon_user_search', 'SEARCH_USER_POSTS'), 'PM_IMG' => $user->img('icon_contact_pm', 'SEND_PRIVATE_MESSAGE'), 'EMAIL_IMG' => $user->img('icon_contact_email', 'SEND_EMAIL'), 'JABBER_IMG' => $user->img('icon_contact_jabber', 'JABBER') , 'REPORT_IMG' => $user->img('icon_post_report', 'REPORT_POST'), 'REPORTED_IMG' => $user->img('icon_topic_reported', 'POST_REPORTED'), 'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'), 'WARN_IMG' => $user->img('icon_user_warn', 'WARN_USER'), 'S_IS_LOCKED' => ($topic_data['topic_status'] == ITEM_UNLOCKED && $topic_data['forum_status'] == ITEM_UNLOCKED) ? false : true, 'S_SELECT_SORT_DIR' => $s_sort_dir, 'S_SELECT_SORT_KEY' => $s_sort_key, 'S_SELECT_SORT_DAYS' => $s_limit_days, 'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true, 'S_TOPIC_ACTION' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start")), 'S_MOD_ACTION' => $s_quickmod_action, 'L_RETURN_TO_FORUM' => $user->lang('RETURN_TO', $topic_data['forum_name']), 'S_VIEWTOPIC' => true, 'S_UNREAD_VIEW' => $view == 'unread', 'S_DISPLAY_SEARCHBOX' => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false, 'S_SEARCHBOX_ACTION' => append_sid("{$phpbb_root_path}search.$phpEx"), 'S_SEARCH_LOCAL_HIDDEN_FIELDS' => build_hidden_fields($s_search_hidden_fields), 'S_DISPLAY_POST_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false, 'S_DISPLAY_REPLY_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false, 'S_ENABLE_FEEDS_TOPIC' => ($config['feed_topic'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $topic_data['forum_options'])) ? true : false, 'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&t=$topic_id", 'U_FORUM' => $server_path, 'U_VIEW_TOPIC' => $viewtopic_url, 'U_CANONICAL' => generate_board_url() . '/' . append_sid("viewtopic.$phpEx", "t=$topic_id" . (($start) ? "&start=$start" : ''), true, ''), 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id), 'U_VIEW_OLDER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=previous"), 'U_VIEW_NEWER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=next"), 'U_PRINT_TOPIC' => ($auth->acl_get('f_print', $forum_id)) ? $viewtopic_url . '&view=print' : '', 'U_EMAIL_TOPIC' => ($auth->acl_get('f_email', $forum_id) && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&t=$topic_id") : '', 'U_WATCH_TOPIC' => $s_watching_topic['link'], 'U_WATCH_TOPIC_TOGGLE' => $s_watching_topic['link_toggle'], 'S_WATCH_TOPIC_TITLE' => $s_watching_topic['title'], 'S_WATCH_TOPIC_TOGGLE' => $s_watching_topic['title_toggle'], 'S_WATCHING_TOPIC' => $s_watching_topic['is_watching'], 'U_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&bookmark=1&hash=' . generate_link_hash("topic_$topic_id") : '', 'S_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'], 'S_BOOKMARK_TOGGLE' => (!$user->data['is_registered'] || !$config['allow_bookmarks'] || !$topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'], 'S_BOOKMARKED_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? true : false, 'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&f=$forum_id") : '', 'U_POST_REPLY_TOPIC' => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id") : '', 'U_BUMP_TOPIC' => (bump_topic_allowed($forum_id, $topic_data['topic_bumped'], $topic_data['topic_last_post_time'], $topic_data['topic_poster'], $topic_data['topic_last_poster_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=bump&f=$forum_id&t=$topic_id&hash=" . generate_link_hash("topic_$topic_id")) : '') ); // Does this topic contain a poll? if (!empty($topic_data['poll_start'])) { $sql = 'SELECT o.*, p.bbcode_bitfield, p.bbcode_uid FROM ' . POLL_OPTIONS_TABLE . ' o, ' . POSTS_TABLE . " p WHERE o.topic_id = $topic_id AND p.post_id = {$topic_data['topic_first_post_id']} AND p.topic_id = o.topic_id ORDER BY o.poll_option_id"; $result = $db->sql_query($sql); $poll_info = $vote_counts = array(); while ($row = $db->sql_fetchrow($result)) { $poll_info[] = $row; $option_id = (int) $row['poll_option_id']; $vote_counts[$option_id] = (int) $row['poll_option_total']; } $db->sql_freeresult($result); $cur_voted_id = array(); if ($user->data['is_registered']) { $sql = 'SELECT poll_option_id FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $topic_id . ' AND vote_user_id = ' . $user->data['user_id']; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $cur_voted_id[] = $row['poll_option_id']; } $db->sql_freeresult($result); } else { // Cookie based guest tracking ... I don't like this but hum ho // it's oft requested. This relies on "nice" users who don't feel // the need to delete cookies to mess with results. if ($request->is_set($config['cookie_name'] . '_poll_' . $topic_id, \phpbb\request\request_interface::COOKIE)) { $cur_voted_id = explode(',', $request->variable($config['cookie_name'] . '_poll_' . $topic_id, '', true, \phpbb\request\request_interface::COOKIE)); $cur_voted_id = array_map('intval', $cur_voted_id); } } // Can not vote at all if no vote permission $s_can_vote = ($auth->acl_get('f_vote', $forum_id) && (($topic_data['poll_length'] != 0 && $topic_data['poll_start'] + $topic_data['poll_length'] > time()) || $topic_data['poll_length'] == 0) && $topic_data['topic_status'] != ITEM_LOCKED && $topic_data['forum_status'] != ITEM_LOCKED && (!sizeof($cur_voted_id) || ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']))) ? true : false; $s_display_results = (!$s_can_vote || ($s_can_vote && sizeof($cur_voted_id)) || $view == 'viewpoll') ? true : false; /** * Event to manipulate the poll data * * @event core.viewtopic_modify_poll_data * @var array cur_voted_id Array with options' IDs current user has voted for * @var int forum_id The topic's forum id * @var array poll_info Array with the poll information * @var bool s_can_vote Flag indicating if a user can vote * @var bool s_display_results Flag indicating if results or poll options should be displayed * @var int topic_id The id of the topic the user tries to access * @var array topic_data All the information from the topic and forum tables for this topic * @var string viewtopic_url URL to the topic page * @var array vote_counts Array with the vote counts for every poll option * @var array voted_id Array with updated options' IDs current user is voting for * @since 3.1.5-RC1 */ $vars = array( 'cur_voted_id', 'forum_id', 'poll_info', 's_can_vote', 's_display_results', 'topic_id', 'topic_data', 'viewtopic_url', 'vote_counts', 'voted_id', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_poll_data', compact($vars))); if ($update && $s_can_vote) { if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting')) { $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start")); meta_refresh(5, $redirect_url); if (!sizeof($voted_id)) { $message = 'NO_VOTE_OPTION'; } else if (sizeof($voted_id) > $topic_data['poll_max_options']) { $message = 'TOO_MANY_VOTE_OPTIONS'; } else if (in_array(VOTE_CONVERTED, $cur_voted_id)) { $message = 'VOTE_CONVERTED'; } else { $message = 'FORM_INVALID'; } $message = $user->lang[$message] . '

' . sprintf($user->lang['RETURN_TOPIC'], '', ''); trigger_error($message); } foreach ($voted_id as $option) { if (in_array($option, $cur_voted_id)) { continue; } $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = poll_option_total + 1 WHERE poll_option_id = ' . (int) $option . ' AND topic_id = ' . (int) $topic_id; $db->sql_query($sql); $vote_counts[$option]++; if ($user->data['is_registered']) { $sql_ary = array( 'topic_id' => (int) $topic_id, 'poll_option_id' => (int) $option, 'vote_user_id' => (int) $user->data['user_id'], 'vote_user_ip' => (string) $user->ip, ); $sql = 'INSERT INTO ' . POLL_VOTES_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); } } foreach ($cur_voted_id as $option) { if (!in_array($option, $voted_id)) { $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = poll_option_total - 1 WHERE poll_option_id = ' . (int) $option . ' AND topic_id = ' . (int) $topic_id; $db->sql_query($sql); $vote_counts[$option]--; if ($user->data['is_registered']) { $sql = 'DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . (int) $topic_id . ' AND poll_option_id = ' . (int) $option . ' AND vote_user_id = ' . (int) $user->data['user_id']; $db->sql_query($sql); } } } if ($user->data['user_id'] == ANONYMOUS && !$user->data['is_bot']) { $user->set_cookie('poll_' . $topic_id, implode(',', $voted_id), time() + 31536000); } $sql = 'UPDATE ' . TOPICS_TABLE . ' SET poll_last_vote = ' . time() . " WHERE topic_id = $topic_id"; //, topic_last_post_time = ' . time() . " -- for bumping topics with new votes, ignore for now $db->sql_query($sql); $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start")); $message = $user->lang['VOTE_SUBMITTED'] . '

' . sprintf($user->lang['RETURN_TOPIC'], '', ''); if ($request->is_ajax()) { // Filter out invalid options $valid_user_votes = array_intersect(array_keys($vote_counts), $voted_id); $data = array( 'NO_VOTES' => $user->lang['NO_VOTES'], 'success' => true, 'user_votes' => array_flip($valid_user_votes), 'vote_counts' => $vote_counts, 'total_votes' => array_sum($vote_counts), 'can_vote' => !sizeof($valid_user_votes) || ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']), ); $json_response = new \phpbb\json_response(); $json_response->send($data); } meta_refresh(5, $redirect_url); trigger_error($message); } $poll_total = 0; $poll_most = 0; foreach ($poll_info as $poll_option) { $poll_total += $poll_option['poll_option_total']; $poll_most = ($poll_option['poll_option_total'] >= $poll_most) ? $poll_option['poll_option_total'] : $poll_most; } $parse_flags = ($poll_info[0]['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES; for ($i = 0, $size = sizeof($poll_info); $i < $size; $i++) { $poll_info[$i]['poll_option_text'] = generate_text_for_display($poll_info[$i]['poll_option_text'], $poll_info[$i]['bbcode_uid'], $poll_option['bbcode_bitfield'], $parse_flags, true); } $topic_data['poll_title'] = generate_text_for_display($topic_data['poll_title'], $poll_info[0]['bbcode_uid'], $poll_info[0]['bbcode_bitfield'], $parse_flags, true); $poll_template_data = $poll_options_template_data = array(); foreach ($poll_info as $poll_option) { $option_pct = ($poll_total > 0) ? $poll_option['poll_option_total'] / $poll_total : 0; $option_pct_txt = sprintf("%.1d%%", round($option_pct * 100)); $option_pct_rel = ($poll_most > 0) ? $poll_option['poll_option_total'] / $poll_most : 0; $option_pct_rel_txt = sprintf("%.1d%%", round($option_pct_rel * 100)); $option_most_votes = ($poll_option['poll_option_total'] > 0 && $poll_option['poll_option_total'] == $poll_most) ? true : false; $poll_options_template_data[] = array( 'POLL_OPTION_ID' => $poll_option['poll_option_id'], 'POLL_OPTION_CAPTION' => $poll_option['poll_option_text'], 'POLL_OPTION_RESULT' => $poll_option['poll_option_total'], 'POLL_OPTION_PERCENT' => $option_pct_txt, 'POLL_OPTION_PERCENT_REL' => $option_pct_rel_txt, 'POLL_OPTION_PCT' => round($option_pct * 100), 'POLL_OPTION_WIDTH' => round($option_pct * 250), 'POLL_OPTION_VOTED' => (in_array($poll_option['poll_option_id'], $cur_voted_id)) ? true : false, 'POLL_OPTION_MOST_VOTES' => $option_most_votes, ); } $poll_end = $topic_data['poll_length'] + $topic_data['poll_start']; $poll_template_data = array( 'POLL_QUESTION' => $topic_data['poll_title'], 'TOTAL_VOTES' => $poll_total, 'POLL_LEFT_CAP_IMG' => $user->img('poll_left'), 'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'), 'L_MAX_VOTES' => $user->lang('MAX_OPTIONS_SELECT', (int) $topic_data['poll_max_options']), 'L_POLL_LENGTH' => ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : '', 'S_HAS_POLL' => true, 'S_CAN_VOTE' => $s_can_vote, 'S_DISPLAY_RESULTS' => $s_display_results, 'S_IS_MULTI_CHOICE' => ($topic_data['poll_max_options'] > 1) ? true : false, 'S_POLL_ACTION' => $viewtopic_url, 'U_VIEW_RESULTS' => $viewtopic_url . '&view=viewpoll', ); /** * Event to add/modify poll template data * * @event core.viewtopic_modify_poll_template_data * @var array cur_voted_id Array with options' IDs current user has voted for * @var int poll_end The poll end time * @var array poll_info Array with the poll information * @var array poll_options_template_data Array with the poll options template data * @var array poll_template_data Array with the common poll template data * @var int poll_total Total poll votes count * @var int poll_most Mostly voted option votes count * @var array topic_data All the information from the topic and forum tables for this topic * @var string viewtopic_url URL to the topic page * @var array vote_counts Array with the vote counts for every poll option * @var array voted_id Array with updated options' IDs current user is voting for * @since 3.1.5-RC1 */ $vars = array( 'cur_voted_id', 'poll_end', 'poll_info', 'poll_options_template_data', 'poll_template_data', 'poll_total', 'poll_most', 'topic_data', 'viewtopic_url', 'vote_counts', 'voted_id', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_poll_template_data', compact($vars))); $template->assign_block_vars_array('poll_option', $poll_options_template_data); $template->assign_vars($poll_template_data); unset($poll_end, $poll_info, $poll_options_template_data, $poll_template_data, $voted_id); } // If the user is trying to reach the second half of the topic, fetch it starting from the end $store_reverse = false; $sql_limit = $config['posts_per_page']; $sql_sort_order = $direction = ''; if ($start > $total_posts / 2) { $store_reverse = true; // Select the sort order $direction = (($sort_dir == 'd') ? 'ASC' : 'DESC'); $sql_limit = $pagination->reverse_limit($start, $sql_limit, $total_posts); $sql_start = $pagination->reverse_start($start, $sql_limit, $total_posts); } else { // Select the sort order $direction = (($sort_dir == 'd') ? 'DESC' : 'ASC'); $sql_start = $start; } if (is_array($sort_by_sql[$sort_key])) { $sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction; } else { $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction; } // Container for user details, only process once $post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = $post_delete_list = array(); $has_unapproved_attachments = $has_approved_attachments = $display_notice = false; $i = $i_total = 0; // Go ahead and pull all data for this topic $sql = 'SELECT p.post_id FROM ' . POSTS_TABLE . ' p' . (($join_user_sql[$sort_key]) ? ', ' . USERS_TABLE . ' u': '') . " WHERE p.topic_id = $topic_id AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id, 'p.') . " " . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . " $limit_posts_time ORDER BY $sql_sort_order"; $result = $db->sql_query_limit($sql, $sql_limit, $sql_start); $i = ($store_reverse) ? $sql_limit - 1 : 0; while ($row = $db->sql_fetchrow($result)) { $post_list[$i] = (int) $row['post_id']; ($store_reverse) ? $i-- : $i++; } $db->sql_freeresult($result); if (!sizeof($post_list)) { if ($sort_days) { trigger_error('NO_POSTS_TIME_FRAME'); } else { trigger_error('NO_TOPIC'); } } // Holding maximum post time for marking topic read // We need to grab it because we do reverse ordering sometimes $max_post_time = 0; $sql_ary = array( 'SELECT' => 'u.*, z.friend, z.foe, p.*', 'FROM' => array( USERS_TABLE => 'u', POSTS_TABLE => 'p', ), 'LEFT_JOIN' => array( array( 'FROM' => array(ZEBRA_TABLE => 'z'), 'ON' => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id', ), ), 'WHERE' => $db->sql_in_set('p.post_id', $post_list) . ' AND u.user_id = p.poster_id', ); /** * Event to modify the SQL query before the post and poster data is retrieved * * @event core.viewtopic_get_post_data * @var int forum_id Forum ID * @var int topic_id Topic ID * @var array topic_data Array with topic data * @var array post_list Array with post_ids we are going to retrieve * @var int sort_days Display posts of previous x days * @var string sort_key Key the posts are sorted by * @var string sort_dir Direction the posts are sorted by * @var int start Pagination information * @var array sql_ary The SQL array to get the data of posts and posters * @since 3.1.0-a1 * @changed 3.1.0-a2 Added vars forum_id, topic_id, topic_data, post_list, sort_days, sort_key, sort_dir, start */ $vars = array( 'forum_id', 'topic_id', 'topic_data', 'post_list', 'sort_days', 'sort_key', 'sort_dir', 'start', 'sql_ary', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_get_post_data', compact($vars))); $sql = $db->sql_build_query('SELECT', $sql_ary); $result = $db->sql_query($sql); $now = $user->create_datetime(); $now = phpbb_gmgetdate($now->getTimestamp() + $now->getOffset()); // Posts are stored in the $rowset array while $attach_list, $user_cache // and the global bbcode_bitfield are built while ($row = $db->sql_fetchrow($result)) { // Set max_post_time if ($row['post_time'] > $max_post_time) { $max_post_time = $row['post_time']; } $poster_id = (int) $row['poster_id']; // Does post have an attachment? If so, add it to the list if ($row['post_attachment'] && $config['allow_attachments']) { $attach_list[] = (int) $row['post_id']; if ($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) { $has_unapproved_attachments = true; } else if ($row['post_visibility'] == ITEM_APPROVED) { $has_approved_attachments = true; } } $rowset_data = array( 'hide_post' => (($row['foe'] || $row['post_visibility'] == ITEM_DELETED) && ($view != 'show' || $post_id != $row['post_id'])) ? true : false, 'post_id' => $row['post_id'], 'post_time' => $row['post_time'], 'user_id' => $row['user_id'], 'username' => $row['username'], 'user_colour' => $row['user_colour'], 'topic_id' => $row['topic_id'], 'forum_id' => $row['forum_id'], 'post_subject' => $row['post_subject'], 'post_edit_count' => $row['post_edit_count'], 'post_edit_time' => $row['post_edit_time'], 'post_edit_reason' => $row['post_edit_reason'], 'post_edit_user' => $row['post_edit_user'], 'post_edit_locked' => $row['post_edit_locked'], 'post_delete_time' => $row['post_delete_time'], 'post_delete_reason'=> $row['post_delete_reason'], 'post_delete_user' => $row['post_delete_user'], // Make sure the icon actually exists 'icon_id' => (isset($icons[$row['icon_id']]['img'], $icons[$row['icon_id']]['height'], $icons[$row['icon_id']]['width'])) ? $row['icon_id'] : 0, 'post_attachment' => $row['post_attachment'], 'post_visibility' => $row['post_visibility'], 'post_reported' => $row['post_reported'], 'post_username' => $row['post_username'], 'post_text' => $row['post_text'], 'bbcode_uid' => $row['bbcode_uid'], 'bbcode_bitfield' => $row['bbcode_bitfield'], 'enable_smilies' => $row['enable_smilies'], 'enable_sig' => $row['enable_sig'], 'friend' => $row['friend'], 'foe' => $row['foe'], ); /** * Modify the post rowset containing data to be displayed with posts * * @event core.viewtopic_post_rowset_data * @var array rowset_data Array with the rowset data for this post * @var array row Array with original user and post data * @since 3.1.0-a1 */ $vars = array('rowset_data', 'row'); extract($phpbb_dispatcher->trigger_event('core.viewtopic_post_rowset_data', compact($vars))); $rowset[$row['post_id']] = $rowset_data; // Cache various user specific data ... so we don't have to recompute // this each time the same user appears on this page if (!isset($user_cache[$poster_id])) { if ($poster_id == ANONYMOUS) { $user_cache_data = array( 'user_type' => USER_IGNORE, 'joined' => '', 'posts' => '', 'sig' => '', 'sig_bbcode_uid' => '', 'sig_bbcode_bitfield' => '', 'online' => false, 'avatar' => ($user->optionget('viewavatars')) ? phpbb_get_user_avatar($row) : '', 'rank_title' => '', 'rank_image' => '', 'rank_image_src' => '', 'pm' => '', 'email' => '', 'jabber' => '', 'search' => '', 'age' => '', 'username' => $row['username'], 'user_colour' => $row['user_colour'], 'contact_user' => '', 'warnings' => 0, 'allow_pm' => 0, ); /** * Modify the guest user's data displayed with the posts * * @event core.viewtopic_cache_guest_data * @var array user_cache_data Array with the user's data * @var int poster_id Poster's user id * @var array row Array with original user and post data * @since 3.1.0-a1 */ $vars = array('user_cache_data', 'poster_id', 'row'); extract($phpbb_dispatcher->trigger_event('core.viewtopic_cache_guest_data', compact($vars))); $user_cache[$poster_id] = $user_cache_data; $user_rank_data = phpbb_get_user_rank($row, false); $user_cache[$poster_id]['rank_title'] = $user_rank_data['title']; $user_cache[$poster_id]['rank_image'] = $user_rank_data['img']; $user_cache[$poster_id]['rank_image_src'] = $user_rank_data['img_src']; } else { $user_sig = ''; // We add the signature to every posters entry because enable_sig is post dependent if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs')) { $user_sig = $row['user_sig']; } $id_cache[] = $poster_id; $user_cache_data = array( 'user_type' => $row['user_type'], 'user_inactive_reason' => $row['user_inactive_reason'], 'joined' => $user->format_date($row['user_regdate']), 'posts' => $row['user_posts'], 'warnings' => (isset($row['user_warnings'])) ? $row['user_warnings'] : 0, 'sig' => $user_sig, 'sig_bbcode_uid' => (!empty($row['user_sig_bbcode_uid'])) ? $row['user_sig_bbcode_uid'] : '', 'sig_bbcode_bitfield' => (!empty($row['user_sig_bbcode_bitfield'])) ? $row['user_sig_bbcode_bitfield'] : '', 'viewonline' => $row['user_allow_viewonline'], 'allow_pm' => $row['user_allow_pm'], 'avatar' => ($user->optionget('viewavatars')) ? phpbb_get_user_avatar($row) : '', 'age' => '', 'rank_title' => '', 'rank_image' => '', 'rank_image_src' => '', 'username' => $row['username'], 'user_colour' => $row['user_colour'], 'contact_user' => $user->lang('CONTACT_USER', get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['username'])), 'online' => false, 'jabber' => ($config['jab_enable'] && $row['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=jabber&u=$poster_id") : '', 'search' => ($config['load_search'] && $auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$poster_id&sr=posts") : '', 'author_full' => get_username_string('full', $poster_id, $row['username'], $row['user_colour']), 'author_colour' => get_username_string('colour', $poster_id, $row['username'], $row['user_colour']), 'author_username' => get_username_string('username', $poster_id, $row['username'], $row['user_colour']), 'author_profile' => get_username_string('profile', $poster_id, $row['username'], $row['user_colour']), ); /** * Modify the users' data displayed with their posts * * @event core.viewtopic_cache_user_data * @var array user_cache_data Array with the user's data * @var int poster_id Poster's user id * @var array row Array with original user and post data * @since 3.1.0-a1 */ $vars = array('user_cache_data', 'poster_id', 'row'); extract($phpbb_dispatcher->trigger_event('core.viewtopic_cache_user_data', compact($vars))); $user_cache[$poster_id] = $user_cache_data; $user_rank_data = phpbb_get_user_rank($row, $row['user_posts']); $user_cache[$poster_id]['rank_title'] = $user_rank_data['title']; $user_cache[$poster_id]['rank_image'] = $user_rank_data['img']; $user_cache[$poster_id]['rank_image_src'] = $user_rank_data['img_src']; if ((!empty($row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email')) { $user_cache[$poster_id]['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&u=$poster_id") : (($config['board_hide_emails'] && !$auth->acl_get('a_email')) ? '' : 'mailto:' . $row['user_email']); } else { $user_cache[$poster_id]['email'] = ''; } if ($config['allow_birthdays'] && !empty($row['user_birthday'])) { list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $row['user_birthday'])); if ($bday_year) { $diff = $now['mon'] - $bday_month; if ($diff == 0) { $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0; } else { $diff = ($diff < 0) ? 1 : 0; } $user_cache[$poster_id]['age'] = (int) ($now['year'] - $bday_year - $diff); } } } } } $db->sql_freeresult($result); // Load custom profile fields if ($config['load_cpf_viewtopic']) { /* @var $cp \phpbb\profilefields\manager */ $cp = $phpbb_container->get('profilefields.manager'); // Grab all profile fields from users in id cache for later use - similar to the poster cache $profile_fields_tmp = $cp->grab_profile_fields_data($id_cache); // filter out fields not to be displayed on viewtopic. Yes, it's a hack, but this shouldn't break any MODs. $profile_fields_cache = array(); foreach ($profile_fields_tmp as $profile_user_id => $profile_fields) { $profile_fields_cache[$profile_user_id] = array(); foreach ($profile_fields as $used_ident => $profile_field) { if ($profile_field['data']['field_show_on_vt']) { $profile_fields_cache[$profile_user_id][$used_ident] = $profile_field; } } } unset($profile_fields_tmp); } // Generate online information for user if ($config['load_onlinetrack'] && sizeof($id_cache)) { $sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_viewonline) AS viewonline FROM ' . SESSIONS_TABLE . ' WHERE ' . $db->sql_in_set('session_user_id', $id_cache) . ' GROUP BY session_user_id'; $result = $db->sql_query($sql); $update_time = $config['load_online_time'] * 60; while ($row = $db->sql_fetchrow($result)) { $user_cache[$row['session_user_id']]['online'] = (time() - $update_time < $row['online_time'] && (($row['viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false; } $db->sql_freeresult($result); } unset($id_cache); // Pull attachment data if (sizeof($attach_list)) { if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id)) { $sql = 'SELECT * FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . ' AND in_message = 0 ORDER BY attach_id DESC, post_msg_id ASC'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $attachments[$row['post_msg_id']][] = $row; } $db->sql_freeresult($result); // No attachments exist, but post table thinks they do so go ahead and reset post_attach flags if (!sizeof($attachments)) { $sql = 'UPDATE ' . POSTS_TABLE . ' SET post_attachment = 0 WHERE ' . $db->sql_in_set('post_id', $attach_list); $db->sql_query($sql); // We need to update the topic indicator too if the complete topic is now without an attachment if (sizeof($rowset) != $total_posts) { // Not all posts are displayed so we query the db to find if there's any attachment for this topic $sql = 'SELECT a.post_msg_id as post_id FROM ' . ATTACHMENTS_TABLE . ' a, ' . POSTS_TABLE . " p WHERE p.topic_id = $topic_id AND p.post_visibility = " . ITEM_APPROVED . ' AND p.topic_id = a.topic_id'; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!$row) { $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_attachment = 0 WHERE topic_id = $topic_id"; $db->sql_query($sql); } } else { $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_attachment = 0 WHERE topic_id = $topic_id"; $db->sql_query($sql); } } else if ($has_approved_attachments && !$topic_data['topic_attachment']) { // Topic has approved attachments but its flag is wrong $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_attachment = 1 WHERE topic_id = $topic_id"; $db->sql_query($sql); $topic_data['topic_attachment'] = 1; } else if ($has_unapproved_attachments && !$topic_data['topic_attachment']) { // Topic has only unapproved attachments but we have the right to see and download them $topic_data['topic_attachment'] = 1; } } else { $display_notice = true; } } // Get the list of users who can receive private messages $can_receive_pm_list = $auth->acl_get_list(array_keys($user_cache), 'u_readpm'); $can_receive_pm_list = (empty($can_receive_pm_list) || !isset($can_receive_pm_list[0]['u_readpm'])) ? array() : $can_receive_pm_list[0]['u_readpm']; // Get the list of permanently banned users $permanently_banned_users = phpbb_get_banned_user_ids(array_keys($user_cache), false); $i_total = sizeof($rowset) - 1; $prev_post_id = ''; $template->assign_vars(array( 'S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'], 'S_NUM_POSTS' => sizeof($post_list)) ); /** * Event to modify the post, poster and attachment data before assigning the posts * * @event core.viewtopic_modify_post_data * @var int forum_id Forum ID * @var int topic_id Topic ID * @var array topic_data Array with topic data * @var array post_list Array with post_ids we are going to display * @var array rowset Array with post_id => post data * @var array user_cache Array with prepared user data * @var int start Pagination information * @var int sort_days Display posts of previous x days * @var string sort_key Key the posts are sorted by * @var string sort_dir Direction the posts are sorted by * @var bool display_notice Shall we display a notice instead of attachments * @var bool has_approved_attachments Does the topic have approved attachments * @var array attachments List of attachments post_id => array of attachments * @var array permanently_banned_users List of permanently banned users * @var array can_receive_pm_list Array with posters that can receive pms * @since 3.1.0-RC3 */ $vars = array( 'forum_id', 'topic_id', 'topic_data', 'post_list', 'rowset', 'user_cache', 'sort_days', 'sort_key', 'sort_dir', 'start', 'permanently_banned_users', 'can_receive_pm_list', 'display_notice', 'has_approved_attachments', 'attachments', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_data', compact($vars))); // Output the posts $first_unread = $post_unread = false; for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i) { // A non-existing rowset only happens if there was no user present for the entered poster_id // This could be a broken posts table. if (!isset($rowset[$post_list[$i]])) { continue; } $row = $rowset[$post_list[$i]]; $poster_id = $row['user_id']; // End signature parsing, only if needed if ($user_cache[$poster_id]['sig'] && $row['enable_sig'] && empty($user_cache[$poster_id]['sig_parsed'])) { $parse_flags = ($user_cache[$poster_id]['sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES; $user_cache[$poster_id]['sig'] = generate_text_for_display($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield'], $parse_flags, true); $user_cache[$poster_id]['sig_parsed'] = true; } // Parse the message and subject $parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES; $message = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, true); if (!empty($attachments[$row['post_id']])) { parse_attachments($forum_id, $message, $attachments[$row['post_id']], $update_count); } // Replace naughty words such as farty pants $row['post_subject'] = censor_text($row['post_subject']); // Highlight active words (primarily for search) if ($highlight_match) { $message = preg_replace('#(?!<.*)(?]*(?:)#is', '\1', $message); $row['post_subject'] = preg_replace('#(?!<.*)(?]*(?:)#is', '\1', $row['post_subject']); } // Editing information if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason']) { // Get usernames for all following posts if not already stored if (!sizeof($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']])))) { // Remove all post_ids already parsed (we do not have to check them) $post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i); $sql = 'SELECT DISTINCT u.user_id, u.username, u.user_colour FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u WHERE ' . $db->sql_in_set('p.post_id', $post_storage_list) . ' AND p.post_edit_count <> 0 AND p.post_edit_user <> 0 AND p.post_edit_user = u.user_id'; $result2 = $db->sql_query($sql); while ($user_edit_row = $db->sql_fetchrow($result2)) { $post_edit_list[$user_edit_row['user_id']] = $user_edit_row; } $db->sql_freeresult($result2); unset($post_storage_list); } if ($row['post_edit_reason']) { // User having edited the post also being the post author? if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id) { $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']); } else { $display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']); } $l_edited_by = $user->lang('EDITED_TIMES_TOTAL', (int) $row['post_edit_count'], $display_username, $user->format_date($row['post_edit_time'], false, true)); } else { if ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']])) { $user_cache[$row['post_edit_user']] = $post_edit_list[$row['post_edit_user']]; } // User having edited the post also being the post author? if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id) { $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']); } else { $display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']); } $l_edited_by = $user->lang('EDITED_TIMES_TOTAL', (int) $row['post_edit_count'], $display_username, $user->format_date($row['post_edit_time'], false, true)); } } else { $l_edited_by = ''; } // Deleting information if ($row['post_visibility'] == ITEM_DELETED && $row['post_delete_user']) { // Get usernames for all following posts if not already stored if (!sizeof($post_delete_list) && ($row['post_delete_reason'] || ($row['post_delete_user'] && !isset($user_cache[$row['post_delete_user']])))) { // Remove all post_ids already parsed (we do not have to check them) $post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i); $sql = 'SELECT DISTINCT u.user_id, u.username, u.user_colour FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u WHERE ' . $db->sql_in_set('p.post_id', $post_storage_list) . ' AND p.post_delete_user <> 0 AND p.post_delete_user = u.user_id'; $result2 = $db->sql_query($sql); while ($user_delete_row = $db->sql_fetchrow($result2)) { $post_delete_list[$user_delete_row['user_id']] = $user_delete_row; } $db->sql_freeresult($result2); unset($post_storage_list); } if ($row['post_delete_user'] && !isset($user_cache[$row['post_delete_user']])) { $user_cache[$row['post_delete_user']] = $post_delete_list[$row['post_delete_user']]; } $display_postername = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']); // User having deleted the post also being the post author? if (!$row['post_delete_user'] || $row['post_delete_user'] == $poster_id) { $display_username = $display_postername; } else { $display_username = get_username_string('full', $row['post_delete_user'], $user_cache[$row['post_delete_user']]['username'], $user_cache[$row['post_delete_user']]['user_colour']); } if ($row['post_delete_reason']) { $l_deleted_message = $user->lang('POST_DELETED_BY_REASON', $display_postername, $display_username, $user->format_date($row['post_delete_time'], false, true), $row['post_delete_reason']); } else { $l_deleted_message = $user->lang('POST_DELETED_BY', $display_postername, $display_username, $user->format_date($row['post_delete_time'], false, true)); } $l_deleted_by = $user->lang('DELETED_INFORMATION', $display_username, $user->format_date($row['post_delete_time'], false, true)); } else { $l_deleted_by = $l_deleted_message = ''; } // Bump information if ($topic_data['topic_bumped'] && $row['post_id'] == $topic_data['topic_last_post_id'] && isset($user_cache[$topic_data['topic_bumper']]) ) { // It is safe to grab the username from the user cache array, we are at the last // post and only the topic poster and last poster are allowed to bump. // Admins and mods are bound to the above rules too... $l_bumped_by = sprintf($user->lang['BUMPED_BY'], $user_cache[$topic_data['topic_bumper']]['username'], $user->format_date($topic_data['topic_last_post_time'], false, true)); } else { $l_bumped_by = ''; } $cp_row = array(); // if ($config['load_cpf_viewtopic']) { $cp_row = (isset($profile_fields_cache[$poster_id])) ? $cp->generate_profile_fields_template_data($profile_fields_cache[$poster_id]) : array(); } $post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false; $s_first_unread = false; if (!$first_unread && $post_unread) { $s_first_unread = $first_unread = true; } $force_edit_allowed = $force_delete_allowed = $force_softdelete_allowed = false; $s_cannot_edit = !$auth->acl_get('f_edit', $forum_id) || $user->data['user_id'] != $poster_id; $s_cannot_edit_time = $config['edit_time'] && $row['post_time'] <= time() - ($config['edit_time'] * 60); $s_cannot_edit_locked = $topic_data['topic_status'] == ITEM_LOCKED || $row['post_edit_locked']; $s_cannot_delete = $user->data['user_id'] != $poster_id || ( !$auth->acl_get('f_delete', $forum_id) && (!$auth->acl_get('f_softdelete', $forum_id) || $row['post_visibility'] == ITEM_DELETED) ); $s_cannot_delete_lastpost = $topic_data['topic_last_post_id'] != $row['post_id']; $s_cannot_delete_time = $config['delete_time'] && $row['post_time'] <= time() - ($config['delete_time'] * 60); // we do not want to allow removal of the last post if a moderator locked it! $s_cannot_delete_locked = $topic_data['topic_status'] == ITEM_LOCKED || $row['post_edit_locked']; /** * This event allows you to modify the conditions for the "can edit post" and "can delete post" checks * * @event core.viewtopic_modify_post_action_conditions * @var array row Array with post data * @var array topic_data Array with topic data * @var bool force_edit_allowed Allow the user to edit the post (all permissions and conditions are ignored) * @var bool s_cannot_edit User can not edit the post because it's not his * @var bool s_cannot_edit_locked User can not edit the post because it's locked * @var bool s_cannot_edit_time User can not edit the post because edit_time has passed * @var bool force_delete_allowed Allow the user to delete the post (all permissions and conditions are ignored) * @var bool s_cannot_delete User can not delete the post because it's not his * @var bool s_cannot_delete_lastpost User can not delete the post because it's not the last post of the topic * @var bool s_cannot_delete_locked User can not delete the post because it's locked * @var bool s_cannot_delete_time User can not delete the post because edit_time has passed * @var bool force_softdelete_allowed Allow the user to ыoftdelete the post (all permissions and conditions are ignored) * @since 3.1.0-b4 * @changed 3.1.11-RC1 Added force_softdelete_allowed var */ $vars = array( 'row', 'topic_data', 'force_edit_allowed', 's_cannot_edit', 's_cannot_edit_locked', 's_cannot_edit_time', 'force_delete_allowed', 's_cannot_delete', 's_cannot_delete_lastpost', 's_cannot_delete_locked', 's_cannot_delete_time', 'force_softdelete_allowed', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_action_conditions', compact($vars))); $edit_allowed = $force_edit_allowed || ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || ( !$s_cannot_edit && !$s_cannot_edit_time && !$s_cannot_edit_locked ))); $quote_allowed = $auth->acl_get('m_edit', $forum_id) || ($topic_data['topic_status'] != ITEM_LOCKED && ($user->data['user_id'] == ANONYMOUS || $auth->acl_get('f_reply', $forum_id)) ); // Only display the quote button if the post is quotable. Posts not approved are not quotable. $quote_allowed = ($quote_allowed && $row['post_visibility'] == ITEM_APPROVED) ? true : false; $delete_allowed = $force_delete_allowed || ($user->data['is_registered'] && ( ($auth->acl_get('m_delete', $forum_id) || ($auth->acl_get('m_softdelete', $forum_id) && $row['post_visibility'] != ITEM_DELETED)) || (!$s_cannot_delete && !$s_cannot_delete_lastpost && !$s_cannot_delete_time && !$s_cannot_delete_locked) )); $softdelete_allowed = $force_softdelete_allowed || (($auth->acl_get('m_softdelete', $forum_id) || ($auth->acl_get('f_softdelete', $forum_id) && $user->data['user_id'] == $poster_id)) && ($row['post_visibility'] != ITEM_DELETED)); $permanent_delete_allowed = $force_delete_allowed || ($auth->acl_get('m_delete', $forum_id) || ($auth->acl_get('f_delete', $forum_id) && $user->data['user_id'] == $poster_id)); // Can this user receive a Private Message? $can_receive_pm = ( // They must be a "normal" user $user_cache[$poster_id]['user_type'] != USER_IGNORE && // They must not be deactivated by the administrator ($user_cache[$poster_id]['user_type'] != USER_INACTIVE || $user_cache[$poster_id]['user_inactive_reason'] != INACTIVE_MANUAL) && // They must be able to read PMs in_array($poster_id, $can_receive_pm_list) && // They must not be permanently banned !in_array($poster_id, $permanently_banned_users) && // They must allow users to contact via PM (($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $user_cache[$poster_id]['allow_pm']) ); $u_pm = ''; if ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && $can_receive_pm) { $u_pm = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&mode=compose&action=quotepost&p=' . $row['post_id']); } // $post_row = array( 'POST_AUTHOR_FULL' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_full'] : get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'POST_AUTHOR_COLOUR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_colour'] : get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'POST_AUTHOR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_username'] : get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'U_POST_AUTHOR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_profile'] : get_username_string('profile', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'RANK_TITLE' => $user_cache[$poster_id]['rank_title'], 'RANK_IMG' => $user_cache[$poster_id]['rank_image'], 'RANK_IMG_SRC' => $user_cache[$poster_id]['rank_image_src'], 'POSTER_JOINED' => $user_cache[$poster_id]['joined'], 'POSTER_POSTS' => $user_cache[$poster_id]['posts'], 'POSTER_AVATAR' => $user_cache[$poster_id]['avatar'], 'POSTER_WARNINGS' => $auth->acl_get('m_warn') ? $user_cache[$poster_id]['warnings'] : '', 'POSTER_AGE' => $user_cache[$poster_id]['age'], 'CONTACT_USER' => $user_cache[$poster_id]['contact_user'], 'POST_DATE' => $user->format_date($row['post_time'], false, ($view == 'print') ? true : false), 'POST_SUBJECT' => $row['post_subject'], 'MESSAGE' => $message, 'SIGNATURE' => ($row['enable_sig']) ? $user_cache[$poster_id]['sig'] : '', 'EDITED_MESSAGE' => $l_edited_by, 'EDIT_REASON' => $row['post_edit_reason'], 'DELETED_MESSAGE' => $l_deleted_by, 'DELETE_REASON' => $row['post_delete_reason'], 'BUMPED_MESSAGE' => $l_bumped_by, 'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'), 'POST_ICON_IMG' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : '', 'POST_ICON_IMG_WIDTH' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : '', 'POST_ICON_IMG_HEIGHT' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : '', 'POST_ICON_IMG_ALT' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['alt'] : '', 'ONLINE_IMG' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? '' : (($user_cache[$poster_id]['online']) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')), 'S_ONLINE' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false), 'U_EDIT' => ($edit_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&f=$forum_id&p={$row['post_id']}") : '', 'U_QUOTE' => ($quote_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&f=$forum_id&p={$row['post_id']}") : '', 'U_INFO' => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=post_details&f=$forum_id&p=" . $row['post_id'], true, $user->session_id) : '', 'U_DELETE' => ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=' . (($softdelete_allowed) ? 'soft_delete' : 'delete') . "&f=$forum_id&p={$row['post_id']}") : '', 'U_SEARCH' => $user_cache[$poster_id]['search'], 'U_PM' => $u_pm, 'U_EMAIL' => $user_cache[$poster_id]['email'], 'U_JABBER' => $user_cache[$poster_id]['jabber'], 'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&p={$row['post_id']}&f=$forum_id&redirect=" . urlencode(str_replace('&', '&', $viewtopic_url . '&p=' . $row['post_id'] . '#p' . $row['post_id']))), 'U_REPORT' => ($auth->acl_get('f_report', $forum_id)) ? $phpbb_container->get('controller.helper')->route('phpbb_report_post_controller', array('id' => $row['post_id'])) : '', 'U_MCP_REPORT' => ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '', 'U_MCP_APPROVE' => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=approve_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '', 'U_MCP_RESTORE' => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=' . (($topic_data['topic_visibility'] != ITEM_DELETED) ? 'deleted_posts' : 'deleted_topics') . '&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '', 'U_MINI_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'], 'U_NEXT_POST_ID' => ($i < $i_total && isset($rowset[$post_list[$i + 1]])) ? $rowset[$post_list[$i + 1]]['post_id'] : '', 'U_PREV_POST_ID' => $prev_post_id, 'U_NOTES' => ($auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&mode=user_notes&u=' . $poster_id, true, $user->session_id) : '', 'U_WARN' => ($auth->acl_get('m_warn') && $poster_id != $user->data['user_id'] && $poster_id != ANONYMOUS) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&mode=warn_post&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '', 'POST_ID' => $row['post_id'], 'POST_NUMBER' => $i + $start + 1, 'POSTER_ID' => $poster_id, 'MINI_POST' => ($post_unread) ? $user->lang['UNREAD_POST'] : $user->lang['POST'], 'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false, 'S_MULTIPLE_ATTACHMENTS' => !empty($attachments[$row['post_id']]) && sizeof($attachments[$row['post_id']]) > 1, 'S_POST_UNAPPROVED' => ($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) ? true : false, 'S_POST_DELETED' => ($row['post_visibility'] == ITEM_DELETED) ? true : false, 'L_POST_DELETED_MESSAGE' => $l_deleted_message, 'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false, 'S_DISPLAY_NOTICE' => $display_notice && $row['post_attachment'], 'S_FRIEND' => ($row['friend']) ? true : false, 'S_UNREAD_POST' => $post_unread, 'S_FIRST_UNREAD' => $s_first_unread, 'S_CUSTOM_FIELDS' => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false, 'S_TOPIC_POSTER' => ($topic_data['topic_poster'] == $poster_id) ? true : false, 'S_IGNORE_POST' => ($row['foe']) ? true : false, 'L_IGNORE_POST' => ($row['foe']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '', 'S_POST_HIDDEN' => $row['hide_post'], 'L_POST_DISPLAY' => ($row['hide_post']) ? $user->lang('POST_DISPLAY', '', '') : '', 'S_DELETE_PERMANENT' => $permanent_delete_allowed, ); $user_poster_data = $user_cache[$poster_id]; $current_row_number = $i; /** * Modify the posts template block * * @event core.viewtopic_modify_post_row * @var int start Start item of this page * @var int current_row_number Number of the post on this page * @var int end Number of posts on this page * @var int total_posts Total posts count * @var int poster_id Post author id * @var array row Array with original post and user data * @var array cp_row Custom profile field data of the poster * @var array attachments List of attachments * @var array user_poster_data Poster's data from user cache * @var array post_row Template block array of the post * @var array topic_data Array with topic data * @var array user_cache Array with cached user data * @var array post_edit_list Array with post edited list * @since 3.1.0-a1 * @changed 3.1.0-a3 Added vars start, current_row_number, end, attachments * @changed 3.1.0-b3 Added topic_data array, total_posts * @changed 3.1.0-RC3 Added poster_id * @changed 3.2.2-RC1 Added user_cache and post_edit_list */ $vars = array( 'start', 'current_row_number', 'end', 'total_posts', 'poster_id', 'row', 'cp_row', 'attachments', 'user_poster_data', 'post_row', 'topic_data', 'user_cache', 'post_edit_list', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_row', compact($vars))); $i = $current_row_number; if (isset($cp_row['row']) && sizeof($cp_row['row'])) { $post_row = array_merge($post_row, $cp_row['row']); } // Dump vars into template $template->assign_block_vars('postrow', $post_row); $contact_fields = array( array( 'ID' => 'pm', 'NAME' => $user->lang['SEND_PRIVATE_MESSAGE'], 'U_CONTACT' => $u_pm, ), array( 'ID' => 'email', 'NAME' => $user->lang['SEND_EMAIL'], 'U_CONTACT' => $user_cache[$poster_id]['email'], ), array( 'ID' => 'jabber', 'NAME' => $user->lang['JABBER'], 'U_CONTACT' => $user_cache[$poster_id]['jabber'], ), ); foreach ($contact_fields as $field) { if ($field['U_CONTACT']) { $template->assign_block_vars('postrow.contact', $field); } } if (!empty($cp_row['blockrow'])) { foreach ($cp_row['blockrow'] as $field_data) { $template->assign_block_vars('postrow.custom_fields', $field_data); if ($field_data['S_PROFILE_CONTACT']) { $template->assign_block_vars('postrow.contact', array( 'ID' => $field_data['PROFILE_FIELD_IDENT'], 'NAME' => $field_data['PROFILE_FIELD_NAME'], 'U_CONTACT' => $field_data['PROFILE_FIELD_CONTACT'], )); } } } // Display not already displayed Attachments for this post, we already parsed them. ;) if (!empty($attachments[$row['post_id']])) { foreach ($attachments[$row['post_id']] as $attachment) { $template->assign_block_vars('postrow.attachment', array( 'DISPLAY_ATTACHMENT' => $attachment) ); } } $current_row_number = $i; /** * Event after the post data has been assigned to the template * * @event core.viewtopic_post_row_after * @var int start Start item of this page * @var int current_row_number Number of the post on this page * @var int end Number of posts on this page * @var int total_posts Total posts count * @var array row Array with original post and user data * @var array cp_row Custom profile field data of the poster * @var array attachments List of attachments * @var array user_poster_data Poster's data from user cache * @var array post_row Template block array of the post * @var array topic_data Array with topic data * @since 3.1.0-a3 * @changed 3.1.0-b3 Added topic_data array, total_posts */ $vars = array( 'start', 'current_row_number', 'end', 'total_posts', 'row', 'cp_row', 'attachments', 'user_poster_data', 'post_row', 'topic_data', ); extract($phpbb_dispatcher->trigger_event('core.viewtopic_post_row_after', compact($vars))); $i = $current_row_number; $prev_post_id = $row['post_id']; unset($rowset[$post_list[$i]]); unset($attachments[$row['post_id']]); } unset($rowset, $user_cache); // Update topic view and if necessary attachment view counters ... but only for humans and if this is the first 'page view' if (isset($user->data['session_page']) && !$user->data['is_bot'] && (strpos($user->data['session_page'], '&t=' . $topic_id) === false || isset($user->data['session_created']))) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_views = topic_views + 1, topic_last_view_time = ' . time() . " WHERE topic_id = $topic_id"; $db->sql_query($sql); // Update the attachment download counts if (sizeof($update_count)) { $sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' SET download_count = download_count + 1 WHERE ' . $db->sql_in_set('attach_id', array_unique($update_count)); $db->sql_query($sql); } } // Only mark topic if it's currently unread. Also make sure we do not set topic tracking back if earlier pages are viewed. if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id] && $max_post_time > $topic_tracking_info[$topic_id]) { markread('topic', $forum_id, $topic_id, $max_post_time); // Update forum info $all_marked_read = update_forum_tracking_info($forum_id, $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false); } else { $all_marked_read = true; } // If there are absolutely no more unread posts in this forum // and unread posts shown, we can safely show the #unread link if ($all_marked_read) { if ($post_unread) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => '#unread', )); } else if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id]) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread', )); } } else if (!$all_marked_read) { $last_page = ((floor($start / $config['posts_per_page']) + 1) == max(ceil($total_posts / $config['posts_per_page']), 1)) ? true : false; // What can happen is that we are at the last displayed page. If so, we also display the #unread link based in $post_unread if ($last_page && $post_unread) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => '#unread', )); } else if (!$last_page) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread', )); } } // let's set up quick_reply $s_quick_reply = false; if ($user->data['is_registered'] && $config['allow_quick_reply'] && ($topic_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) && $auth->acl_get('f_reply', $forum_id)) { // Quick reply enabled forum $s_quick_reply = (($topic_data['forum_status'] == ITEM_UNLOCKED && $topic_data['topic_status'] == ITEM_UNLOCKED) || $auth->acl_get('m_edit', $forum_id)) ? true : false; } if ($s_can_vote || $s_quick_reply) { add_form_key('posting'); if ($s_quick_reply) { $s_attach_sig = $config['allow_sig'] && $user->optionget('attachsig') && $auth->acl_get('f_sigs', $forum_id) && $auth->acl_get('u_sig'); $s_smilies = $config['allow_smilies'] && $user->optionget('smilies') && $auth->acl_get('f_smilies', $forum_id); $s_bbcode = $config['allow_bbcode'] && $user->optionget('bbcode') && $auth->acl_get('f_bbcode', $forum_id); $s_notify = $config['allow_topic_notify'] && ($user->data['user_notify'] || $s_watching_topic['is_watching']); $qr_hidden_fields = array( 'topic_cur_post_id' => (int) $topic_data['topic_last_post_id'], 'lastclick' => (int) time(), 'topic_id' => (int) $topic_data['topic_id'], 'forum_id' => (int) $forum_id, ); // Originally we use checkboxes and check with isset(), so we only provide them if they would be checked (!$s_bbcode) ? $qr_hidden_fields['disable_bbcode'] = 1 : true; (!$s_smilies) ? $qr_hidden_fields['disable_smilies'] = 1 : true; (!$config['allow_post_links']) ? $qr_hidden_fields['disable_magic_url'] = 1 : true; ($s_attach_sig) ? $qr_hidden_fields['attach_sig'] = 1 : true; ($s_notify) ? $qr_hidden_fields['notify'] = 1 : true; ($topic_data['topic_status'] == ITEM_LOCKED) ? $qr_hidden_fields['lock_topic'] = 1 : true; $template->assign_vars(array( 'S_QUICK_REPLY' => true, 'U_QR_ACTION' => append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id"), 'QR_HIDDEN_FIELDS' => build_hidden_fields($qr_hidden_fields), 'SUBJECT' => 'Re: ' . censor_text($topic_data['topic_title']), )); } } // now I have the urge to wash my hands :( // We overwrite $_REQUEST['f'] if there is no forum specified // to be able to display the correct online list. // One downside is that the user currently viewing this topic/post is not taken into account. if (!$request->variable('f', 0)) { $request->overwrite('f', $forum_id); } // We need to do the same with the topic_id. See #53025. if (!$request->variable('t', 0) && !empty($topic_id)) { $request->overwrite('t', $topic_id); } $page_title = $topic_data['topic_title'] . ($start ? ' - ' . sprintf($user->lang['PAGE_TITLE_NUMBER'], $pagination->get_on_page($config['posts_per_page'], $start)) : ''); /** * You can use this event to modify the page title of the viewtopic page * * @event core.viewtopic_modify_page_title * @var string page_title Title of the viewtopic page * @var array topic_data Array with topic data * @var int forum_id Forum ID of the topic * @var int start Start offset used to calculate the page * @var array post_list Array with post_ids we are going to display * @since 3.1.0-a1 * @changed 3.1.0-RC4 Added post_list var */ $vars = array('page_title', 'topic_data', 'forum_id', 'start', 'post_list'); extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_page_title', compact($vars))); // Output the page page_header($page_title, true, $forum_id); $template->set_filenames(array( 'body' => ($view == 'print') ? 'viewtopic_print.html' : 'viewtopic_body.html') ); make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id); page_footer(); p6{]b•H$;{~'xHV]GE 6 0r4095R֖8@fZcZ޳Z{ ^l3 e$b"_{;ҿʤbYq\M o]d]sr=@uZ[OQh)\gRLG0hr{ ¢e0I2JIFghg-` DwօLX|$e*i'9^X 9<p+-N:N2";:??2plnv_plefY|F]:;L}!BXP*>\o!/z( ]wW|RNy6 ^mռL$'vrSۙT`m܋/6?N]ve[k2P9h6ˀ_Z@/Udtfb 8[Qc:`=u `txC'}li{Ii<1 C ߗtTt:k 5Ԡ]~=0dK(.hځ~++@F6m `[lҘ17:}K!{=~}{sƱȷgi@Tn,S၎K) JЏ_YPx?/W'md.ҌtňHXѮ%q&e#Z5y p6ap$m᫵q3lɹ.}U ܅)dĬԹ+]۠W,N:jȡt fƪ*Py  p@"j8L*K V(%7p n '=CaoA8T!ejߢH^]՗hǣMǕ`ߗܵn/⾔G x"$"OZMݗuˬM#Dk}k3_+ه?΄])(Lq#X^{he7U.u^K;Vja Xa&E)%yNG62`]ZB[Bҝ8q==~U z@aq?c XzsBx%D5ǯ ?L ޶|]~d8 ^&Q {{z$KR)v>`0p@(v`gڠAΜSo0}CLJԗ .#mO/?  w;'^ykQ?BEL- YJ}&5Ғ~8$-PH >X̍ѯeWW%kH\ }f|Z>9=$vc"6H1~_$5Xք}Zjk{cDfDEAHkՄEv||[ 8z\@'ĹB-BQڮTZ3EL1Tѡ6fX g1) ˗bڽ;҈ ڌ:SÇȩaF> COW$KF>@ݎxUdC_G+7.u(R/>ܓ7.a 46TD~$)_[z;Dw!S3,iĞKC(԰3(dMXsw#Vs"eAN,xtܦ*ðV*5J n84J('̥կjdcIswo٭x1T?^)*79#gSn69C(ci~06"^:Icq~xx\1a%p#\"R]_3MewTm턡%9=>Q˜/]<]v݂w>G!ذqw}M1U^:Ja#_4%'t- ` `^.Viqu5q@Z]g>hf 3pc ;rNśQKv!عl*-:m`1h}sD}7WҥtJ.mIjȹiEvtXr5؎&=cE'#q$UjpʹtzU>~nƨ{Xtn/S`:.1ըP U4 [چB^Ü9M% {@1A Lc^LVw3¥_jU}Ij=" > K C]eL~m +oħ?i1. @(ߝBFP; p6$BqiЦ]YFRs'/ͩ".7Ue9=d{Ԏzba(僮>5=Mq~of,YB$( E;W=s zç:-Μ.?@zvE9&z&`6G$eZ ZW3R} /xr8p/x*Tv9_r$-' 47ZYOB # 8VhLŸ٤(#8w8D击ڗDxC*uR+H`6%$@Aؓo,RP3zC+,DJXl rs i0*ds'p$*U)m=~A ˲(2oۥM8yAYd$ZSKήھ}ޙQlB-c5q ~hKP;Uze,J/Ğ0f@&̸I2W.d_Yh`m1w36.邇I?=>y5@̛KRf|+gr(C[Exi%[4L j2r1rZO0x3KW;JF`?샷81ZNTu_Lĥ%ia !s#ysd37YzHzOX%ʝȣYz't$#$/M8ft A`i:&YMt,h9s<חg\'5^ mH/b#i]Pr%Q2yiO$Oʎʞ8 秤OG0&>t//&;"uO$Kc~ ?/,=JVc&Ռ&dSIbѹ)TJNz=nGe%ѡ UbdQW!,mQH؀? 3 w_=R9|Jj4dfv?#dSbE{м xiqc7:jXy$@Qύ,ɦz M) `^AJ}{s.2ftPkt@R|J:ĵsr5,@ȃPGZHҶHw񐘄OE)`F:xC|VIu)ҞȈfKOӑ=)<h[ B2#۴3h?iA/x[( TwaYf,48|gaenɆsEP*B3a#vK?Y= IQHKu:1mO.)s$Ȣe]zH <&bU;]#ӯTRq5oix zIuhf#^nJs1[>-jL2m`OzHGG/BAҚsFubyxa2q6IV "B`5hItsS$`9%@ܔPG0LD(ݍu&QjB hGSC7]F0[d}JWq}_ŝ3z+M'e,g%;>Z`:NHX),jv*W8w1E<3?z~VosX.AM_RZLF mzl4=dGީm0PPsZtg!Jj%p.'tKTSDa`z?Ь:cPрtHJr6 \*Omq Mp;}PRlaS,|=\-^/N,8ZENKkf4ɴpWoL'D Ms!$$V zDЊC8|aT+7>*TsV+{+/[[!y7АrbSgz"BRaq|߉GlDX~wSℿS H寔5w~qpV-CKXd3B* S]>eM¹p8^%[C'*߆{39g+] ĀRnqv "cN)CځkMKT94&ϧoƪԔЯD(FRAͩ^a2LS/|H#/9sߝOESZ)=Ka.jA`ryQ U4 bMCr,ZdhnSϑ%| "r#YƹmbIJS>ǭ/a$Vx:XuLQ dC:D{'=8EۅWfvSr,\Hqw^3JeL\ -,sȈ&{]D` | ߳4U(EV'J.sU;.2UO9ߞqCTk|:*H/=pIG`emUiETʳڅRh-AjeǶ<4gU#ΟB#. +0[VC3 fnBs; `ShH uіZm7"VWcxrf[O*)["pJJG=5,FQ*GE=•ǏRd5&S NӽJHP15-2Lc~FI!|Ŷuɟ9m]M}Pe!2`co$]5mC&ro/ fGbB3ph.'k & QyY4vvY7 VEk ҽI8^`q [ *pr\@\oX't^$z鮛sWf1 V+kk2JDFg1jHcbA:2 ˻jQz2 t\c$Y2jz0ND74ȈR؟7F ϵJ[)EtL@ޠ r#IaO|Cb!G3g5 q7* F1<*r:n cAg`sdv-^]zme}t 2 4I}'֥H;ɼ' @Xgѫ X)-ar?ro{D<c(e2'X|O$rϕ|=X*!g4w ‘U}06ZEl"d3x46HH|~,Mı2Bv# (껄cS>f6~L1U!2&$})cEwxO~9 orsHJ].$HYÍɣ}Qy4էTI ̬gXC1lt_ߜr,ŭ*<(G_s܌ǁ\/X_ﵪhA+2COY砑GqM6=k8]"8i;l d4]*aWWXPQQW^ZfiJ7=9ZzQpJxzgl"Wűda|pX a3Wd_%)D.wdChhТtUj~,"^O7a~}B.DR'"kOF7wphWb|1VB((m<0s-4c9,:T/F-fE(-EbMH>%4cn[FPAh46{)D>;|4Td E5U!m+I9T;YOKu~io&F>z^rosbOw ̒^zHFJsU kZ=aWd)+iS66 5#sopF{]C ! boV[nQ9"G2BʰeNc`!&;N𡜷n[eU~5 gg X"kAqحȹ, |̀ ^dYuݯ]>G |;`αn,$SMwȓG&$ 3@{k%I4riu{ۤ vz\1n 娅\q)3iB+h/+14h}ԮMnݹ"*B\I:+xEhtʤ m.At NdyJa .NpOYBˈv81D42e BɃyG6{MP i#$ͼe>zZgkҩ lEb\u+{r@ ÏX΋$m).O?=.^#O:O["L"yנ\?l| +ێ!/PMQ^HX!rE,#QƩ ";g|\,3;~i<1IX@2J[XK$)=}գWS׷N#`°0ƂXyxf_4LА[a!,^q.eH Gem,5 ύ ,J #ͦZqևF:șcG^<ԫ>T`l \C u镗+ X k\Nҧܰl¹rT?PDՍɜ؏kA^/eJ%;ĀA:?a qh޷g):~X Z:] P9ܣqZ~E4B%s9 C Ĭ~#4ܘH“2Nk~+覲Sm6tnWe!Bpٌ+&NjY?M0?o0f+΋%E~[ C ;wbH8?59dBe%iBfr {p 4Zy'|A5u)&4HT@ rToiܕ \KW"I˖:u73jomJL!$_K qEgZT?T7EpXŢHW$VufxengNǂSwLw ĩ} ,u+Ҭ蜉n}2/y&JC tuS+=nnasxWՎ~}Vgw C73b礪̏Q%\a 9BYV@'NZ8 xGE4P]˻@оN6t ~j5pJ9;QD9us_b#HA.R&DI`C!V"k7 D0\#Naj bdEKzH!(Wɵ@;>r<瘎wjD/ +kZk`JQcZ%;j4hPxzG%RI_lLj>sڇg~wqIO4 @eoFzd_vhFx`]b!oF,=%S޹ J24+v-ͷ3zvw1 c-]䍄9i&3Rc^D4SVLh{& ąatIIj|Ĥ&uQ_Q:Xr/MX uI'&zY~E&ۢ>$Pn;TD@VKp`{]|ԑqR׌fui3jy,{{k1+?Wkc%&e,/2Bpz(JA6@%CȪگ2w`mQ.df2|靀3Ѽln+P0ʂaf|e/v>o"=åXa]Yjg}w='hLߣnio=7Y|2o 8"lPXc:PψS)Q~ cQZ>"b>ɻ&$wR# $`f&wMr 1!ah|?.C%]Z Ō[B~Hsx^@$kvk) = 2X.4A׋-c蘂V{+*"RN I$ Hp&R}3ɡ, {t)ì:u#ǻ*Q9C k#Osqqh91uFWԐy2x/lJ&].1W|Ljg1 !Q*7wwZ F]D9˚N c4#/?Xw:(_ #s6:Jp&qϟB#]?nܸ۴.tRh=aD!p+f;3tiT>_%)/2܋74_|-}دsew$Yg30svAڬ"FZ!iү֌)ٻh9Z\ok`Aߓ#_^g,Čjn l DZw1=*> ǓFIM~:rpS1rݠ-P Ţ3&c1zMl?//ȿ.ٶRDT+G =0ӸFLʕ4li簗{( hU8CahGv7NM6^hд G" mm'} u?ujcZmWĖ r>oHvOa|E|-g(d3p+ acS !{MC*P8*\Am4*>SDLl_FJu]9xZ!dEhRG|h,Ԯ!Q\IT^ 0P2Aj_;APڐ#4s|XZ b_qBؙh|Bm9C=vC&~6yh8W96сkGUL3aNT_:ȃ[Nd5Q聘7"ęz, T9HO pAee4'f|-OYW'B[qtm^;kFuA2Pg~L_-.=6 7 RxmFcK- ԸK|SsgaH 1NG+.)*m =|Y6Z&}'aE Fcm*'U׾  *KP~~gx֬q`jЌ@.}r *Ќ١5p+Ō}iE+ȢHpN)G">ͫ4<_R"+R/1w ݨ'b[d5 e2Z'0Q#gV{ǟ\H' kBlG./hwn~.?EQzCEIZGE̍N$d7-xװ'2&u܈sӢ1Y7-Q'>ˤuaL B`)֎d˷SwߒMw<߼x_9iQVak\`mDpaP?3%aCA#FvL_W|׃Xm?n;|MR:nvVx=:?flualO\?/a/ukW`E"G2wkXQKyoF}VŸM"̝YgNXU"ּރlu  agL7xK~W6oؤ[yQxΉ@nD|;Xtp3J|`hZSGm,f:"R6u Fk\2ɽ(b@_aaVMN.6WAT[jE1/OTox.z,UϚ,NUdR;zeYOkE)#&J8D A0>}4>tv1gr{3{Uk"OK7% [f|𰮢(~[%ܠA1%m^xى{?ࠝ5٬|AB_>+EV0bV NKEhx>,=42׵~#i1CL'w%HnV?7\-*,׃sRNC Sw͞-I.Mѐ]gq}5,3)ډMe˘ q/ǮaSL +]&"褟O$_e^Wm^?,Q7P 0&t.BP")<Vg$B49No݋*b4]79r?vF*Z&t[exΞ^eֱv3zU#A-x $"|ӝ[lcv癿akq&Gա{ѤnUaIr3fsj>?bOŨ(rNj ŜD K[4 WZT`0rJuw>GDeJجXӏZG VtaTB4uYk#0Y=O/U2 }`z sɻ/S;(dWdW(܃oGȠPvIfE'2 R|@E Twff9t80@i 8O tD#τZ &nX #Y==欠;b|{Aq:d)^'iKM͡2QQE#EŒY6PaYRϴkxO;ȡ&(ű]m&d@!1ɛcjoɰ784lzȫuw ,3|7~ϊ{߼U9 U*FgcPh'wREuN; esxa $sY2WPoln{jh!Nt@( \zO2Hb/Ve] Sig:J,gt {(\c-# [napƾl5/m 6=nzg/=|h/70zTz 3`S#>yV5m<{]a,*nu$D%TmxpBM ˏl/TVYzTqYmcvb kJ$m{b%YwEvښR?gu1on~as3b`B fLEUsf-c <~Ah `]èis_sK);r|whYQyEF"qlN ]TF簝=anKʵՐsY`D-倢҆hJ#;V^ɖT"xw D^Vq\5m\C_lD9WZqՊw a2-M'e;Y; e|?4Td'W+Q k+׊(k柈@3`#Gm eڻM)"͈5eO+KŒÙ +,b,=`Any[ Dӡ~% w$48 ["]C'g Rr%z%Q+{#Wqjnc wU n<LZ'F.6c߀0n7oL䮿ȮA|hʟPKSbTS|=,ck?#JS1)>wv)W[ K9N55cnL3RU֠ZqOB[]vۊ8̷T/XhCS}PEd5~D&ʅ"Gax޾DsHN෬kLPԡC-f|=U1ٚMA@Gɘ`RZ R =c6O}T3xL+A0R).0~2/Zˏ!_g*: |2dܠ7/4䌀&Z=ZI\],N̗b 3)%=t(% BuXyA0K 0'CKsU;*g\Ukby֝rrI#4%`T< SU'TL K(3K GmJ>حoߠ .SszmQ͡;ߥ UlD~:F*W0֙=s tI ֌=ea;g!> R j?v:/U`͜HbԚp\>(Gny.0̵~(/LE[";;3*<{n#-֊ÊNFRm\XEtwQ3hVw$gIPܷKR➽c*/Ɖm{.|rCdǭ.@pqB~1y5)rDjKm)'W Ã+S 9B}Hra39 .:o5 >㨽M7tZx'r+ooM QUb<) TAgy7챎/ ~']rP9 w8'';$XZ(&`J f s(|ʝ iENަI Y*߄%u33ka"<,Vm\T*uH,v5%/F&O*CN-%zt}ہ[@3C]ԝNшfX1ϑSًVT 'WwZ_jXKIY)ª-^\C,9u D#1vlzA%[znK'+вj|MN{mmYP1a"Ycr2ZLI:T4esvޗ?I:( "څ^]0d1aJ]GYYR>i?xO 8\+Lʕ{V$eT^guV qV;<}d e2/S1~G Oբt/K2[r#Dr)aT?u2=*/1~m3 /t #*BOFަՈ;*coe慿nZHHQ[>Jgp<:CT;lHi&8y!Q ͮfD)To{fIJ~t x1a?Oa%[=Du̐ZI.g,t@BG]ɿȑf&v fbYQ K뗦`g0쨞|RkoU52>Kc\n _Cs<vH!Cz،=>WKK\+PbDxhQVtg TNgi:2W1mmBz? ɺ8_y hSK'Y Mi k$ԸnօΆ(ay-kj[?LK9! RJ9p&s7"BƔ }!RWG"<~ ܥ7>њνb}4Cj nNpHuʆ d;٩vcX :h%;. '*KEPy#xFwL_IFmh많F%aq3QٯH@pEXUMRvte/emC\.&-9w@6.M5pÈa7VKOSb NrY;alpۀ(GG (vzDհ#(gl.$ś|^yDο=%Łap?=$)CY#?nZkG~AD4* 9iG']w '92NS ֧dNgj4ا?I^o&(YA4Nu˦b;QԢ␿ _Ƥňh)&w/$vQ8y Og0qbߛ',W N~UPJ%,:2I/]|w3ǃr]R ז!v?8X"~0#׌;APQ{Ĵ % 6PAk6-zhЀ/#5E~~H84C&o]ޑG5vcv3ez Z_Lz&RrH/ŲEK<{E`ډ€&`B-QTܫ͗*m2L sFtb(|,+jc]R†a#rҫJmJK1AĢeWҿkڶ&.i:=}_wUE"‡)z^YnUP '^&42N{\]y@3Pہ|,SkQMƁwJ$bsR=L狞n:G }Wy8 }P~V\$e@<Gm1+烈Q h'oĦ-7FmSOS2NA1iϢb4ST^ ߼RC>ߤ+c=@J/5L }JR3;_^n㓱INJK0vd{/?4>#i4st3#gl&fEFe_V-]W:.8kPZ1D"x&djŤw%VHcyB0}2NVi0nvWQt@' ئ搐A/ʇGۯw>Xd= h?hjfH3/`\C&(F"M ̿=Î @̉êUzΌplmvuq9]{&p>c((V]Z?}Vd:ޣw&0zenBBHKa)"pi4_~s8-Ɠԑڜf},Nu0ܳQ d- a% :,]W7> S^I,ok5Sns̩WmP3n5=]YML/RY 4njhY~(.hV[G}d!J:BW![&: WE0=Nj2l=:. ŹBǾO c}THQ@ 8ɐ`{{7ٞ' I~2-;=khWE_C?QE[`$L+}35]Zȼ:ނ9e,iLUX[:{q8;e_}k]Da3ZoPf͈RRM~pRo=܂ԥp x>E0ɱƇK:yrۇ&m3_+krqܷ 5Yl&)X{fzR7r4y,VK%5ߺIYqx}% iBrƏʁ.Qݙ!/){{dD!%r%o07|۪ɗncRzX 7JNb4Yr* \A3NZ@{/gOS;1nw\CͿx/iv'h2C02|m*߲Y($Μ? s<9rHԵOfx JDǫGkVbbS9 W& V,3ߒHiZ_@ @+ZTN Ng ?WKDxlp<ȫXC;~{Ή$%QhJ/trH{9dn'F$tuBز3ss'נA\8o*EE,LDXZ+"Gk崑5Q4`m:MRI7Ч{`(P\vB;Zpa) 8fd XzAX!K%/s~d>3qLSHa@|.)N@Nێj9,iBS f=PPLF| d]<Եb{HCT@쟨:>IlҢ@:6P,f)Ĵ-Y4KP.isd#a]BŴr# A47Y *![Wl,T<\'~ǩl ~ȎOg66FQiVᾌL>A6,XfzݼiSqēdx60L&/V%Fu \TE6rqB_ؑYoAW3^L!H5]oW߾X룠˾yHK"Wj ;>=_u$[_zH?& vJ{bl=nTVIiPؑZUm;پ,2?=p͇W؈Rͽ;xrM zW*ҕXhP.y,{Lϕ7,sj/~ɠ6u6(J^o@/-D!^[v0PLo/H-n`*wSFgwi:TBwZamšFFd?~_ K+we z_jM7a DR,o i6a[?xbFR ;uA& k+].7\~LPRqOd63{=XJOOQevAJWxK'$=!|h.SQhLH4#z1StAD&ab[9}}k컐Y'W}~K[۬ϩ@M3]ByEAo>U-!4.™N`E#bjpz ?\2,lCϖJ4W8s,¬A/ jRV4#'RE6;u]=ȤB [~ Z.rxTг0!p~I3p5G}OҬ[>O†FZSm{;c?jU-ᩧ6zؐٿv`LH?D')ql7e6I/JiDl)eR=ƱUGֻ~Nڏ-SyBjPaaa_F k{kJr-뙺`z4adP7& 7@9mJq$X\Gޮ/k_z, :oQǹI+GJ"ywIÉg0M=p#.H2cMU;mu1Ou̵B:cOߝ7Iiϭj[FB ΀"E4(p?uyO(IW p#ڵn`בκ墚9`jL%E"!duM"NOԶzZ2:36 C875EݷJ2qOh'_: B u}=$1Z0"|pA.,7acM R> 4/HI E^$x+$Ç)tu͏1:/~n 4vf)bU,z?(x2?DS~i% VU|ְֱGx%Q?#EEr4J!-}̳ V\3U7Jw+cqdyy/L;[exir3>bj_X.OU}mӆۊ^"tur 7l"/um<}71x mŁ ԠJӴRWs*mh$g]@)d胾UyO\rWMrs5l8EM[!xd>,` bV\cOLvɋԳ.s)^>׏^ dZ}hiVÄ-L+h6Υ&<'avÆ[+ͪA=]g??|Ԕa-v UtزN? 3m:nNw=N>>f,r`wQBͺ~277`.M_UFdY(ErKt*;%k?]> TTo#$㠉]=Xyz\IT{b٢gaΏ[SJ[Of<q`=1淪l{I"Z'OP tt)1c|,2hUg3j 9lڳD~&<ʅJZΒk]D+ `OTy-K5a BEҋ`>~BNsOᥞ IW8*%_B&*jmT8O^U(g tswڇyču%={nv>+IU(- Ŵ&>\u%vc-?y^*K׵94T _?4#$IG;yEYL IYY<E6n&LMi^k& +'3]\Nmi~0ߺ2ew5F]~eϽ fdzI}B2Fc"T~ɸ~9mAuξ+Ǒ&7Mumɼd9R^uH])@ Ƹ'SUa" o`;xsk__S%\Jjl-uR,bWK*)rٸ_-y [jeH<3i 7*̳,yhpG(nп?.tVZ$?TIAH /IABzUT󏅹*}0J=R|Pls)VzتtUa'b1,Lt! |^=)w ./-H=A:d dOY`3`;Fqop%mn9磍lǂ- dE^(pIs9b4(1 g n%]$A 8&0UB1G` ەJ-dvv4_rwv1UO!7Pv "|Lɽ~{ZҝtCo8 \2Lt6/,rWKtJ4a>< ,RsJQm|_gRE"0Bj&zI/Sʲb8Yo}e(|\ZL~eSP0 *R&͆i#cݛ8>>e3]RX_?J8ś/8`DlT>j<4tWHu0*:hjCKp~Lj OVxQwɰ#ih|HC`aF@42oziR\m]P9Og3ާ[ 1Qlez2S-zc&oդ>}sW;$5i<[J >ݱ 74 _q²p^¿7c<,SCѿ|Q0,zF({I?1#0f`Elr*Kn^zKXyUG39N I4,6N: 6?X#K}3{$uqGiyU,HifֵJH[6AoWn~S}`n::C|tۼS-iTM_̑ W lW{֏8c.FcRO=.J·Ϳo+t3.+`͡ƍ| sBSr(+]H+cGR, f `iVm#!=V9爈RIoqe0FZu3 6حb8 /JK'<J?7-B\7Jj4Uf)@{5N 1n|ܙJe6,&5#`?%΢U@ :WG;;YvWذF8> #lp8KVnfoæ(fa5TB @͍ziWBr;gax w7yoFd xgtF8yHK%6/իi jJmNe>g ғ`XN1s)01l>3 `0"a&~S)42Xj]9 ӌ1ɳky.eTbxAc@o9\ D~Z 3q|>38#[7\(at\G#>I[#Q? \Dgv2@e3zRH(Wc _@ K i$ ʜ'mKM*oCC~pRVɇB^͠||= y}qyߗOe&!cIRhZ* ط^#cxԑ5}ie<t8$H4%C.F|? 7U{ Bodd1boGl0" 2R\}^+}a"u:!2Ѯa-zצӋ%oMjfI3࿰f4cRӨ.-Xmnp$ ,y'}j bߜq檍bɟ'IdPNbXı=-Ty\C`6rj{lەU)f!2_P]~T&+؆ lvL }crkߚuPTۥw)Sbu$% ZDzaGeM"!x &1vV@HK6l*} SOc[X >u1+;<0dVd򢀽֡gg OٰY.;Vaа0hx]q7{\rơ:iPLeL+9_߸T:jn0 wX b)k¡<6.]|s㩶^ve$_v>AO=&ʯUt)l.9.ҢI|i! ֿ&q s-.9L{"`44S>zj?XtZ֫7q|4Gy j%E(&ʣ>kUC|&WrlTM$q(4pdjzo՚UAvi}|誵2T" 'n'LhJ!rL&hAث~``[T?9m?HiFr>>7k-g2xܩ֢f2L.'N`!Y:g'^N }|$y,pER#7F)_f9{Ġt[;vs\KD WB5{moF7>!C>m!.\o^Fx DD{1vkN8"oy~K7x0W:XSB$eȆe%{?ok&*8~Ae&q<wNd{`1:LLЙY%j|i@1 +pˆ<{w+Cz IGXFphVCʼ W̊^g4TRc,ErrA_ڰ=뜲593a̧Zz2$BqU&!p{*O|!~~YOJl 5NОb^d\;}SW8cyBQӔ resCniZ̀As_s nBY5ӌYa ג?tI)_{o\ s6'}7uFa[X]Mǹ#*qAXӃ`'3(o_aT7.LA}G0B]e b}v@(+δRh@|JWTſa`3!2D 0趩f"mvqDBHD= H%loPʈbۺV")+*= Y.r`VKbBJָܞbn')_tRw)_i0XN$ ^K?|h\ C e?tV=eodoSOۡ0a [#7}8+{XCWY:c Q͐bU TfgbwVq GVJ%N)ݐ{ քs zuX+ |ba$yP#wXٞAI}$P">} mLۓ*Ш6A^h\p^lMkw IABgm,D;W.?J n{qHOz3;6J-Y ̙D\4,V|e.XnTo+]iߡ#>MzeKA<ߨ7HcOc:P#訰gP O^m2&趝0:UtZCi9ӕ] `|e$6r(1m͹HER#ߺ wY`:hmp"#4PvhP{{N$ ~"FjYԛ{9anDF Y0HȳY l3Lh~̡eϩ]@b◠B*芤-[n>j7RP)) ^Ўʜ>W^B S)x\VHuKKK k>d%偅1.G %_2):֭l0mrpQBiO/8=_A/}>8(.)|{ThyTB=C\Poj*u;VC/O @IEZ-56ae:$P € 6/AܷNq ny)FNR|e/A `АHQN~XEHc&1iA#6k[|U/rwvk`7#SNnM7-dH/0,e6._C/{]%Ugmϥdthb2& M2O>xȺL7\ɱ~.% :<% 14 \iQfqn 5B͗Vh.:["B 9XЀ"Qz"Sm9ȃ\-IeNP)&9&:sOƆ#mr4ť}5nUF\is%]@ﬥ-&gM0$&ë0p9)\F9~7 ݌ m :ZrF\QG6b%+v)v/6(q>nR]r2OI4*lP&6ģ1ӂC3kASм 'c=M^(S:_Ud̥bbGgVg@#Hp7D_.vRLBb][G~(L!e-^]ni4w”@T:w~=]rC{ Yx k *&"޿B03촜"I]?:w\ w^W4>],~Ft]#iݫIUY2/k*P =[|A_nw~ 휑 QX q,O~i3DdӝrlnRp@Q7 AY_0&L/{]o#NHJl 0@l!e&BA\ʥv a%^A+v97s*n^ȵPk1 p1Lt8f(u&<W,ȑTpf`!VA_J~ߢxct)]8!V{(Ϣ鹲ojXԸ*ѣy/;~y;?fN 4]{, m<0| je8VJTf4dn4k%{:cB v#;YON \pX[3;jz׿F(s$;KzEZQiG!+B #8!NGD68&m;. -1iq!EgbXf 9"cZl^T,Z<[~,ݭ (sI^E Hy٠mӭYWE;S,3朔go#m~n7 S_` 1=)XetO8B-N0\|'#t\ӧœKFXfQtwG>ƢpA.C(;7cvsDCśzbiIzW*7t׹20JŠ_b̺9+F۵ [z"sKsɟSuPJ3zAY*p#N2)D"OmMM&ۅ@\"P6 E`чSR֠DZ),h-o&򛑣I t\+%ѾaBl-, *pw\%'~4o&mܰZꬩ^%3@k5+lw5i])7p;_uD&•plo  8V&pdXj  J ܟ ¸qSW$85oL2@DDYՉN$"DILY18 "?3kӥ_/dH+=DKx駖#*$Ε sx\=eBk#9nMIr GGw8;d,\OXG TW& :9% uLaz<0gӃ)J?p{5 ?$m`} |܎Q̨&2B_Dr^ǀ'ye?`OK4֗DVU +/ Qe%D 5ND$]d).K]^}liwy0U 9)ZAieY58 }$PF5FMGg&9ʴ'W Q#P -ebxb@o|G6eZ5|QmM!sbWu=gЋv9~ֆ;c9£ Li/&=;[@ E`r쥗TDܬ{Hc9֌q&TSTOeh( :| ߤx ]j9< kb"d%/JJ7޽²&wΜ=z #{Hr8 hoYJbʩ Z6|Ѝ}GNr+4vwtWQ ّ 8% P'뱎sU8dJP.9[؇V+@u0 g`]&p%L״tIN6GZU7s51O-wacH4˔ȕYZZNjQI.ʖ+kB _dg'Pz׾iC 5og(q4ب\e@50fEyz˧_ a6~TWb=UJ@b1fZxhQ+à]͡*gmĴOPiC@k5^;͕Geʝď4 {Q?=5{LdƹI(={ Nj+7q`hPYLY\=oP ֦2灱`T:pS [I1JE',_{J?Z*kɚN~ = "(>R!a,r{twSC »E^_1S5H!Qu0ScbzL̜%Q YB45?w~hƷ{3=_Ár5ac\i#jYżJX3Q TbYs35ڡffR}KQ Jw_+g#-$W'MH{F-dR u$ 7{GKpo$Z A#Íd݅!u!(?KCkhX LYA`ZQ0 h=ӃDZ*y YXhp^e=Vrz)51y. ȥrzrf%@vEgf{0|+/ͦ5&L<:AWE_V=/vȕ{@;%?\qᯰX$=L+t :s!Ȯ*xWsԶyD#TG 9͞0L>-+ʄ5dQs固\lv}&'C +a+.2 $!ҁH*k46-*J'1d߈nEBݸ+8c;A {~u!n`Os6CLV`|SSAabPpn{x삟6zIQ $ن9Wb+OA 6OlcHMNyWI!wY~-̗G  tpT y Kf n" L4m儶D[zT]_Ẃw5T>@]Qg=l0q*e( r\rSWn-֖{3tz}SMEն~1&ſhx o4:hTcK+x3P1,dP?pk:=D^&_BAM\oձsgҁ"_'HQЇtY?Xjl:qz\$lc'is7ӎ-#` b/Ɏ "Ȇ~׷:Wb&0 46`WqUXҀ24%ʦaBDZ4 >+.՝151lT}OỦk%/.7ܢWys[ %Kǹ3:G$lj{2IsuGH+Cc#Jp?E p:rsj],ʵZ<:s gpzZpc*Ҵ#NwKr fi\+ʿ$߮YT~Mj O𹰮~iK $ANu`!! j'hYs/U-q_9k$&ZhUr"sJjFgԶo6{HtoFNɞ۬pgW>C~ :s˂x=.0lϺm8JO[ٯ1,<~Ð<ՖTwԞ~7Ws4M>fI8p >j V'EߐnWp# 6)RagQrײLK-CV@u|i} \4b j=@Z/w{vБa2zn$!dgdIvL_Kq/Ʊ82>ͱ xS5ewZih뼽VٌE4ƾ釮 '1"gɼ^ LCD0Ôp_m<8Ӗ [dMԓ}MRv< =+s 'Hw70 :fjk2DU:A%HVpgL+E%Y'M\?v)&r&D6sP_RM=+N?wTrG<; nqAyݻlwClS׳n=9\;i\[ ElW9L}3MU8ܥ 2UH@ܔyx`8G<{KQ(=ן{L>ASX[HCAqH +h|[ *YƈPnH'%٨ 6\>b=@L*3q_!Ix@qO;6ni|Eܵɧ6foy\4X9 bC8)lZ&QƦˣ!>j,uqOVʞ\VQS\bS$:U(rb'(_PX"M!2vXҁL;_u)n"@|ƍڠo*Rr7Y~N M;BFw}2dmLDs2ied !4P5lKl(VVݥ&IS7S3Ӕi+4ao#[Iv 6}+J|gI)eȫ%So%[Euq 2,ۭ&8J>#yEdOU7kԞ0 /84ֱFڽm.Ö[jb~(QN(yv[zٕ/`ZɈެ6{;W(PoÙ%ŷd<߾u雲h{io$贘?PKmIFهZ Co"dnԡ+rNOl-e7Y$ePEf{k{:b7 0v&lPi29n$˂dv)1sx'KR]׶F}AK >O:oUӼgi] G~Avcֵy,4cYiA:FTb7b?hә$>qe+ dĚq_ܗw5X)pb~"K: ,Ƶތ(6"<H+,1A®q>[G~J LPJygj$ac WbEK, Ć;U1a,nY#j==DgKmݢMdJ T#bf5~ ϶419-VrtCe´HM_dQTB,5xި ?Bzs;?ģ  QFPDob|qqqcFfz}._eIڄUچۊ5ݖ+,S)F(Χf nk0h?+f~ dINuٻY:fXF%LkUIfRoϡXgwZ^O\z+'*sq˸4Mh4`nruAL>b[Yl2+e.(,pU7bj_H+ zWkDwOdb*Elɫғ 1-e/6SKTjD r3:J5쯺  q+ًQ|ׯ ϕ^.gD&g1VO2P#E'm::mqz6G"rnԭUg׈KYL }8[(|!EC 3onFke6TbD`3m3rCp*m! M5+m$ٍmJ"R<\IJ>a*z­+p ?`*!b|-:f|3%.F)~wfN2 `CջS?~k!UfXPAI=g?J"g#=q$ɉ԰F̘e? c]QY<LJ딼Vݹ&#{X7Humy"GaȪ(=N%5\@JD48Vj6+hZO~[o<ܬ0:bIhH E]$W 6G`IfK_KfPt"ix8qto䫵 ~O$ Q/+rg(7 qU= kd2`hh4[-]HOZՙV7O!jO8%_;0\qNph[5_nt Ie^dūcXݠsdKtRd=&6$._!L\7'ʒe#(k$5AE ly]87vm"`h[)2 Ŝ*+s.vؐYvyޭ׵xj^sHUa|QZMϪ)][p\T+]Qtt RɌ 3YxRVh7rZU-<x$_diJY/()hF5PipEXJfV}RoYڋR5cR.˕(s8)ڔ"mK>:uYU:Q|m>s X !XJ0ĸ ,WYk _Pd$BrHouvȚ.T)XYgl~#ڡ9 O3lOOEN4x-Fo\$ȁ/4{A[p>*3 =chX6?cf_k- cp`TT`D(n I;]);/% (5-șE؎F.]3-SCV%&\1!"[R/ 8x2"8Y/A e nڀqJիɋc_~&k'$@?Q#hx=p~dSI%qcZTCOF HG1Ev3Nh7_\c_m}2c`U>t}<_ be`dD6&t6#Kj6ooAƎi.H$#/fx)DhOgU@P;43l_hUZ?+ }0EB|2ny2Q6@S}.Gum`SG}BDg(WQ$jGUQs|)9nTV|F}er s=f6B(zg^ iJ P"AMrh>˅bϽ4vïb/.a枤p@ah.?K4WkZtoD,$fJ 6ˊ A]jg#H쀾b!Q!H3 RVENxmm!1U10TV.HO/^[ {a*. ugħo#Jb\D1s2CHJ5=O˚ZEa]D֪۽±-9+(o\nZ[ݎ@;FP%`Dz ѲдB\?Ye F%J6"#|uVߕX= ى]V(;aPV1VUЇq:ei}J*×R/_ bkMq񷇙(Y-H_XRu'nxRְ()!n& !&f:s)C"!>$#A3% Nن6c~6,C9>`-{<қ#4f/:ox#e, eLœM\;%0Ս΢DgDyܒYQj m#7Ȃo53#Y0ifCz T]x 1nXe@ECr_+]%JTk6$ qHĭ&KrȏZ.{i.#Rrr=^.gzj,L,ǝWYKFB|"MB>"e:VSlRױ6bnfZ!@V5 &/dPA(>A> X I{qU뢎]$7/G-4"8F{gtS[~+@mY6_(fL$vɻbs༟UËݏ֙*(x d6,elYn"8*?Dd$+aD,$3]yvQ㐾jzYhtJzT=g9was^19ɘ}1;8]JoqE)OEh,_P*Kwꩨ%6=L Ep(scytItאr$-sO#(.yb֜mm䪠 _k+̌|c++663:W`1~Q_H- mؽTFI1$ϥ-9 =?>l@X_W@Ĩwud!8?>y,JB~kܚ_+1ቡ/)T1\N ,(['qX)%r>`.:I8{h:7n':qG1F1 YU$0e78~!<Мggd e#>Cr5qʴf_VW&}61欐}f"Olcٺ)Y]DDŽHNrJD%#?p-X_+(5hn"5ܶPa3HG<]aug->W]83çڮе :f$&4ЭijoP 5uo fvrބKiB4qi`@װh8/jB0e2cB=zhVAH d"r7˻Duli0YxK$lٷk1}PNLA/Ƨjh-p"="&zj-Zce3u@\_’aY3(FC}fnUpuGпs1|;aMPҜM쿨k)`oSPҗm\x57NJ K41 pwsx4 (ݢ)&| ^/}x}>M,UD9 :V9[)> )k} pFfe~ cDS[5|\φL7!-5u{g̈́\ui2N~=P>ۣy{J/!Y(;̴e HDV8KDEÃ*7VwȮf" u?3PXIHuxD"8qwk;8EDs{/x妨ɐ$G6g ,ñ*fwjdZtA v7>`xs]Sd漢: Dȭi T#Kg~,}[#ߩo^J,I17stIޤnxBQYĺ_9UĪdXbY$SUڮ7KS_og[t ,ofȼ}]ך A3r>hڄ6aş| -6Xx-r4y'<-Bo\%<7\|aSj3J{eaLjDzި5pLt dɈq=?p1E. )h&b=)q?mF<Ȍu-tdTRw *R>|mG!YKx_`KA >]MT]v-V+عky*z<8yϋ5G\"9;P)#Fh¹J3Q̂-2_fv-Ä5*,z&5;X '7 (+׈ ~U Z?P9 h'Nή+}SܵpN*LQpDHDї lXh텨 HrCQPTZ[CIGV)ݘ&%m[ҩ?J;vZwĆV_RQ֥ N\,UQ ('qQ'sv#:Q#7Pws4DA<znӣ .a\Q-,/H*RčM>wYAx t6R= BuYt+hp,^D])3b^GʓV@n:%>=N*d"2ZWu 3$Dzqљfy˞y[uPA;XMȱQ7nC8fݮhrufFc"⥆pjGca%NE0< lԄt&7>Z;iY^K`2.G$+_So۫؋nm 8(fo+.m>wqW;R N2(8i2Sz.ѭgux Ju97XKaYL6+/ yܰ lۢ`U7sfGu2}G;Tg2TQ=ty9MH/ \]r F\ʽB8A-d,@zf<ӝ"5#%HE_9ҥH58 i nF]eóH5x)2fmV?;oqǬ]UQ:7O/ЯM4ƤysN[^ueXAbݶJegZFμ^>":gf)z?Pmא`X꤆s!(LER;H)VS>!VJ6y N2+cn!Qق( ȸ\Nф޻y/sAң̀ĨE~xlZEl7HQs >IHٳ)n *[sW%Fe:y 1b`im!NUr `A UW[O B0Pclx.T i] ȓX ucISީ4 48m u$^غ.J`;t~ z,:vC"v J[!-3{ڔn =$5`ǏlRqNG8g77Fu|H8Z`j-$}9- `AA 49DLKYBK.ۆ?HP)`̧k|p4-=yoNSl{;0VzaN9&z91:|K_e#!,EZ=u>!T ¦))]\kbU*BiU-uA]D.AD ~!`^$Q;1?l1姹'ȯLܑ'#CVGgnĴ J^؛Xv^)AT#̽Q&x&5={LJuݧBћgClI~YJg$_JV+l!؉2@$h!r4HGhi*ׯҦ=佨aЭ)EhP=C“$Ӿ܊^ʢڏ?ewF6{CpJ/s\jA~H#i«H̭ `YA!!2)#QT-9lxsn M2pc vZ4b98KjBKZrDcC735ݪ:L5=dqZL4o|6!ee0CPKgRW|XF*֒7׽5WA^QGf@$x ?U8p+,\%sI^7Á{nx :U""Z7 1wB - /"tyj{r4zZϞ➛_ҝA7-r_אy97n] wx7AE~ ˓; Z0Qp4$k'bguubq.y|)F@:^GWC/&CU7鐚Z S6ekd寯`걐&Q|'H;na[GdCnuښՠž?7Df&e ^!'O>"} u|߀V V.8hB_&jV3v ?i)yS8mC3a\J]%R㒎<젰 )n=EraY_;g̖dL9n3`!S8_eF$ŀљ󤿼73}S>q2l7O6x{qu$\:>'*;E\ nK0>1I:ئлbPX.ltA*5ҙ 8z¸!|i-yScMb? }6G(y)$װX1jrI"%!pź{ErH \Lqd;,s-X@TFY[J䰆#5S}%2"YY57B۴@Ld7+fej=95c;xv,c?܊:4MsUH$1`G.@8gՖpY& h*t.'T?1_i!??9u"ϻxK|yxUbCzB$WA^EN&=ELs\?sͲ̘3dtjC2#tZ8ۡ0Y7S;n2dюja\NLj!Jta ` ;iv9>Da%zQP e~:9}jVe@}Xh 1Qz98"Fn&c\_A @pY*98|HSJW?w"V[#D Rx9<fԞ'T7UbgZR$TqQ#]e76}: 1 S0ڌ]8j!!ARsGY-2)^IͿMْ浮H/G9RKHMG3 V'X ]<:$hk/$Pa1i*q\)r* E6>@IJ;8os,{\8)zI;#َfut9,|0i\A˹:MC,H6Yu7m}X l[Rsvmg7ZFx.tqRΜ4acڊfk{Ww.9g,X5L,QgNjrZKff`lmFd&lX D=M HW k*ͥ48k-p?.g&\m QDSƳ Ke=xy8cMWBbo)`]:@;觗IIq2+ahn 6UD#@~PL&Ǯ^4^T(i! |ՖwPBuo.}2`?ohO=XSx/8:;Kc{5Ois| 6Pv9 \܉btXK?<%0ԃAI4KE=c:zLۇ^nD+[( u)4W7ٚzpFf ie?vDG5!ϮǚPo^qR8Ozƚ< Ѿ|wv'l.ѴMa@av7C{+Db [:ĵgtmS#xXdH ?}rf7^xHMe-|aG7lBV%8<~.G~縞qd IT=qΉ a__`UM3/Tli 2?{GH'3MFfqOLa }~frn-p J єȁW/%za)"|0cskYpϘxIcܥ#H T+[33Ğ6es>CF="˞\ȱ_ RP|kq*{!y/G|xP _[v7UJ PAYx+MN ZS)Yeܟ)v+yݓ[?_؟C#Fމxe^ut3OڋE#4B }d|p?;֧ڨVB~dJ*M={S#ܖn\aۗ~I>&y_15|S5z|Hr6AdR󏉽?"]'_ anq(B,QpbSQD鷐({Uuf{*zio 'AlbH[:^\;94RDrCp4n[Vrɂ8 {ETl?UR$SOԜW'x <;v) ch P,ܲ8dN(G?)'i"ڹ5ML7ANc`e 9~r^){֟mDpD 68āp3 #)" U`j[C9tFl4<ȻZyL2ϓGNܪZZRٯx7 jL˥_{$W!G:%=Jt99?6} * PE@>zFͮ M#*j5\ĚShaيzAܞ3%nKZM-.^0>ߒ^p n3bx=??rFma5!"e)t˩"r%A! |Ea~^, I۫~1,LM:do)A Yӟ=XXhz̓@zt"S_*q@Cљ]TnRzPܧSzƿӥxThVqU6mCm%W)d I#ƳΙSq`se*fR]jr6pL"r)+ 'D5-l /LaX&zc[FB[9,Z;#+7{df&ACJ8@=쇊֠-Ш\N%UĚ&c=]ÂvFRԕ9Vhz6͝١+H4^Qp-+hzZtlsaIRDVaΩ2$9e("ȝPGcȸ ?zLHܯiɗ vҒmZ%^-8ժL,- T`&~lU`fiD 90;Z- \S<tɘskؕ}7lv]$p1Az-48*4Paamg(#Hc}%}, u ;tva.huy{_J |GucAM߂b'0o66{ɗ@{BܳFe]=5V.)ϪI"?“ڣ_.+O)@$+*;*s'`}]7rT7=E3b'C8k^ ixAU0 F \ `\2%oXk7+(Ҍ}ABIܥ_e([tڣrilpQ•E6#y҅/lNh|8խ9A69;d~ƬLꌒd.\5޼r樎IwTS.Mx:pFV g1cat Ju6Z'H 0o^_q2 \㣱X󄧱,دT)Qe}eQ:6&W8$o*MS ayLD%',LA~ >S3^oVz|zwzK+D|̰Ay֑#@FɲzN]Q3ب3yD ;zma$l< 9b-IإL-Aȫg߲eD325j1dɻeA>0O ޴^]6V; x9#DeOi'mQV*ݝE>gZhp%aUi~`#1V(~qjW=UEٸ _>JD"P+]+@0eӀαȘ]4[6 5 s)/Q}Ķ &Ў uLl] 55dE@xc :&{ K0`hkmfV|bB.J63c=Oô$Yk'?zw#B,9~.{UA@\O+1c7QI*l2O3q)^nZ%b[<>/E%/=1ehz[-[)BBtD07kJfFO# k!-kp+fk=7>f҈en^Mw.g竞$4adqEF> t=TY_X+wCC5 B~2aTIQn޵DXjn%ؿénD54/KAɌ~ߙ$x ' bn\,ž4l uΠ1:Eym$0u{ֻ2a$TIRx03-U0l}--DW'䑤?!zhUpVSwgv;2!.5~A"ɗ,p_nM kE۷,;=hۆoRbz+O;[ ܹеZ= (DxBaQ#;h@l#Nѵ#k rS! 8Gl`R#E#j6bl|^)g$#Bɡ@PwZ&ᡎр>UAWJK .` ׌EWmOnj/e" 9C=u\%I(Q:P,P˒؅l/>A>% ]\>+"Mʎ/hLwXj|8+(IbP DN;_Xϊ/$sl3ؽm&6cF1z`06pqI+]klyudo#!H9.JȮ/?^N&+4n `UkJh-x8##/;kJ&BN;izZ-;0f:F |h{TT.A4L4_vDx,R;~:6t( /q{];2A B4Ę^5KD_dj#!5 X,I҄tq%WXzz #0a?,E0큠]TY<.;-2sc]}Ψ QnU+zqs)p@JȦΣ2<6Tw^;H5LܹA'lSP6\ZB%7L||>c=ST a#.*vT!ڗ TK uzO}b>eoj:hTfTbAok(').l n|!)LgUmAka{βcX|"e\P3i*Kh)բJ\n 񖙦c$7B(/rlr@+)َ L6*If–E@("|äTJkoO0)7WCU!XXrW4 4gT|OL̥oDsv[Ob777:Xltݔr+O""ln=xtb/_T-(F=ѻ],S([=ȕ0SHn0SM"OdK(C4-:Ԍ4b[4ɠCk#׶(mG,.\U"l%;8A3!Һ?FnA+i)=Am8 DC-)4nN3M61;bRCϼ:[p~ZYƿJv"G!Ceh:ieV Hy(/$J{{1$Ȩj d [ r$376'&.V/:pC9|#ҺHZyy}>K2]1Bk$%^( 3,0b d3⌌k'~Za[Ys#p+.d-յ֚C~![MB %+S`u|:NViSrBuLHfYš@V_HDN?Fnfi`P*erF)H1^1To6c)0$ +rG3 'lQYsskCZ rТ"'BCWե~CY_SS "w;Ĵ_0hHaƃFBˆY=4J0 }ܟ)4$ ^Җκdz(U[Za7J5?䷃ >kl΢ ҉c=݀VCU2tFҧ83A&M j$w[)\C[+Y]F^4\qKwG&in1{+Rdu8ms#R%ĩoϘY6Hr?DVgt 1ᩇ=QzG 9Q hi# 8"hz<ʏ ןNb=Y=ϩb%_XaK롷 V=DǠbu ؔ Yn+^2ui*̠̉t;E{oR|239OťW{6x~ɮ:O* ؅FuA^}RV3zTvz78Rmnǡu^mEq$t<tIDDd=#=B o,\aBr3zy"Z*)` & n X+SֆaV/\ɑz(-J/IRǭuiRNwL׾cS|$#xZ|J%G9ĭnJt9*;XAږmΥ"v]l޲$4 . qc߷mOelVMQpS=(w'\<&iv\5fb |K 3 XQ n'VZ2 zJ"3O#2?kT6F1Q%+qNnX3p yVB>&,Tiwc^_Wx,.?K7eNtM<+vkr+Ae6eoul%lDCg% #9A \U>DJHn0_o`-4t[lD:!Bym~M9Ax4"֙# |MBd2_X%|΃))jƂM: 5o\*O c:޸:]JEQu9/K[]wZYW̥* ?2ﭞ8>ܢ@) /1@$Mczzs?qb7+ͣfVS}IVP'd 7/(䡭\؀'s+8j.^q'sW#T7퀢+FKg:("C')ȉd4U[z[bR~LfEV-b"^=:Ea:!Hn$`|FEPL2Rj̘j`-`{# Os~w-A3)X3"|6ZC.BCfk4 ?S֛`yW-iMBcS Nk "pőoWkt TӨR%^ ?0?갿\k2!A(\vB3U9\l\{<ĎEݽ-uŖU€f-~*8w@d MLrY> ]M坐?&ޠeL)ɣ"㭈UѼժϬֳ4SaaPܵ`핤,Tyn?x0yGJ?MՄ'BɘqC>tҷ 9izYEBpWJY; q F L\ƥf'ӑ#вrQ, =,a HKO^8b ؜A0O RL?ݾ| 2CR>ɔpq"p'C<=Mnl4xw5Oh\]Y+ tqz4ۦlRLŕGvjB4=y&Qꘘ 4Yg/an"t\"PzcNT*Ǥe'ܽM)RUt, @nl7o0ӝ6IEDs)1 М|H>QXu"IQ__ u`ir3*Ğ)ZTr2Jv|l?滺t{CS(k 4\hKLΥYU%@\v=1RrF_շF*gqs?Lm9hZ(XW`W)Pk hi) 2UUYȿuv#V$mx>:R@RY3~d̩(L7o??vVs#M-i#i,dj ?MbRSݯsPr 寗&zzs<`OUa'Km=lE+1+`;ӹb=AqNc59d{s^M2CK̿E:Όj_o0=uPġa0 =sF ~`O֋L' yw@!j*ckBG/cׇ W&}Â(ӝNl$-Y;Y0C£bW/hĐ.Rr0 (E רхKr cYC|^ͿK:' O<1]yo6Q2#mҲnnt1"O@NH= =LwGdM#>mǩuA" /tsC}DvGO=mT_m*} ,U?s/2U ވr?CN`cݨt896z紓LU]Om K qrv&<#k|F=0yPr(sCD,zКqMQ3 EUWtsM]+Ȧ> Ȩ{,܏@jvfop^vxg;aUMrAkqfHT بy2BFYDA.kq8M+ \vHWLz{]2dv9bإ(@~[e8P~z.~˭etb2j_swvۥdX L"WF09V2zW(n()AIW$= AYx7d!Fj{ +s¿Wd՝Y8O1ŔЊX*ʼx{RL9M򖙹TDR \bk?qqܥ «koe5ڶ64q>BKt6]lsɅwvjhלZ:rs!͸HMb%ٍކ)Fl~҃){iHlqGgNF+'.d8N>7{]kKRü*FFߛj a-ֱUgwH# D0_)Xwkb*SL* % p*{4]Vflυ2^qyI;zN,}z3@.稱M0ſ,ed<|u|z<8"Q'4SaؗUL7!epKV_ԧDE;3j;6DDFg89 Yϝ+dGyw:%g]Ya^0=m#;6φ-'Sshq\J<`b#H礄xj}3X`ZsV q+iZ3jb<-9Rࣸ0ogإ]:[ %fx+=Ԛ'70`~$f3^/em=ޔXRl DTw˜30L]kO99uW,6SKCmJ%GOmCgb\)JF}Du}j[> n$f&<11G%CmX!HArP'7VT[No󑂇K۴nbƆ6R+|8W++6X}NW ,h͆*~j/UJמ"h5 '^É->^U T|ж0+IEk}i:҂XVUQ4f=-,zS)'Gce*N ߇C¶=KbM˖4tp5@Kl(1cjiUWY6=Ifxڠ3Ny1_zvMTpCRဈ}yZ_lL( }oShֲi;l*uM#&{$;7O6Ŧ?pGGMN-<&T޻T{gml6h[>ps)+tt#nĂ5ՙtP0bkݻ^a泒AcF' @殠J@M`b(6 `U;m0MI/lqOt] e+ǏDT |"Fз\n/~0h,u/ ufe,A.i/dw;M}Kc8)gL M3~3 mx)D/nFԉi'S:@cNMUP~l9rv :Jqx(1NP\/B}TLf)L [Gl68h\-O Ͳ7$s|[ 3u ^,(EQ"K}*=ѷArNS,B7w#U2:a@0=CSca!''3VXYFpʣMQ1{IywU\႙A9Q "m|[7 ,g1I&(>>ۆ`u"ɗbK[BO"v vt KQnrx82PWX8,qۂ~? T4K'|tX!hޑ6EBD쫋'?F|r\udjkcC=Gʫj6L(MW蕣:F Q0JdJ%JE}e⹷_Ze=n¿6u0|MH^7/ˋGd@o!* 6I,:C@l='7cU*Hzx qa9Uo9d˄;(+muxəU-ܨC4ɴx =X?`BB@`a, P= `5B00 )~jU$9ď5% )sB$ܦ|MC̬{BxH jp^CViEWv~XQuyT{%\t9.|MsbH3:|&ݲ$N/sSer[2,_%sLs`DVei R5\602X!Ơ]tzɢ ~,|ӷZ >0s)EّDT A 53Qʼn̏й qqQT5A gm&f z{JS 1$Ĉ Fq/8ȹ@^ꅥ6BwC!vܞNxEnLxYuSޮһWM|Nn L8,q}ou(Mݘ7|E 7/bxiB97 U ^^!iIe.y z BGJg Wc#Sza5Bw ӡO@ɼ8UVJ hVgi.zCV_&܁/d{j^ӷU~K 6f]X. w򈒑wOEt|kd_xg h֙& @Ƹ$+1_<'7eyCR )";X>hc#@= }/;`(&s=A}$K'^,!FnU4ᆘШJlAR `v!'4/kEMk4 b*xBCg,(#a0=T0*~p]VR! g3$=Rtjp?FCy ?=Qްl v -ި羈{]boJi@SY g=yyD-tr$F盫lQ PJD*X_.4x<YsQX޿ 3ޡ3b0 ,~K{Uuc,nS [OYHp pXJ+R hŀjv=WX9m&OO'?p<rD%zy 0qhTM.lNCnc[SJT* 'lM0A hX6%0.!7\_hwݰ/w^ ϛgwv> uoE<""G|PLko(Y&5D LV9?sVBL5m"{D*]MtO/!eRR̫3YDAahD+Ql~uш?0 6h (O,[.u6YA YUEoG&Y#N컜 R%Rhi$-)U# E/?Ís늂*>"Ѧ|7G#cB 49~%QUa5fOISD4B%dXm٤=mGtI}͜<"UIFtY}БFfI>nN|Wb)ȗʬY+3'ji>>eۭzù\28+8]NGBB սQCJRN){ R(MRRTN0 sc>&w'!]Vd+v(VhUh1\Dݯ']\ Vj,0/ GW4*"1'hFඔY|S,"łpEҼ ZYyPjȘVY' CٽP>[{Ux>hs {kΧW/$-(=]<9ă#KfԈ0'C"mcK#6lT//YPT}4^%fw)ZO Z]j/5/ ԡ2+/h[,t*"/kJ-6Qv^c̦1{[hsĴD>jG`ݾKA%|iCYK9 U+qPړ3rDب"&:Z*1m 3Flu NŁ_lOE#IQu0Xsk~2եaL$\ D&o ٝKMX4Em7)jX !rZđc4_8t.b'Gdw:'$ #/_D0ED|+mc0w5UŰdtY3Gksu+u23Sh+^i!W(@QTC{Wm40^˧P8|v7h"/E~hY ,Ǻi/xpò+2Aq Ū}MX`%F7E\uuk;?LӘ,N=['M4w^APGhs{UJ,欬;5NBiw IR2;bmήoˌq?54X {LX 6 zC*TU,;Ew7zgA}jV9J~ .)ɱ`̬C<Әl&,L\e#)MB`(⠯ q>!%{)&^OC=nbsg^.O[Å#OXv̚#mU0'tk>T .'()! FUwô$]3£7V5W'Ÿl1k:qRb|J/ 5V{=Ea&/[ldz& G (HDjeqy.ȹwB^7x O!8tt-{ їK_DʉwLΆ@ho.?2T.l"Dlpv ``%<6(Ni*]y9ĕcVM >q4rƔ wU:?|l#Dj;Z'(?+&DPI6̀3_ j$!A&{#GM3>y,wa3#ӊ>.Y" pwNE x!<J+ҠI\F}22 )h5 eqto%sq&Z{rOr QiS#iͩxrRj(`Өam%oD\qQ>bf%(G%&pl~y? F`&7Gc3] '/1 SŝbxBdC o z&s> 'sxO8 1]a|[[gs{Y dPkz52hU"jaOfkǁ'N2l9.(w`(ެOER]AyMkpަ%eO\ӟ*րn13\BnB6yuEĤ,];^(%8$BзVl^<2gh{H ˜FV+Ow.`tPP ';ķjDiPI Zw)=XPhJ`xEs IN~?u&ĩYT;$|iM?l)tz < ^8'[fIA`;.y-u2|{󚃙24QYx{Zf8Gu .8ZI)JYB| #x862Co<OhW09d+'iy~m2$5xkc'|b{$AX=VW[8|4;P2[yWlJ1Fg~*J|jO%9 pRY"R_~h!H S\gxv)K%E &-+ Afش2nm+gJM*Ľ:ߛcS:D$`)>=dOʜTnրI8Y(h㬰I!Q껬וnVdM"RC삈PG-hwozg{#)hI2INU[BE?fu* iY ;޼aR尩},ipshU/ ouI -r)m,DŒP]dR_&l^;6[ҌrLxKDT6oVx0Z.|]$ b>ܸ*2tm;HEsNw榬2v:\u}\%j-WO1ovmrpz{I &}ER ɲ)R~ ?p85hߊ>>6Y1bQmZNe0 RHlݦS1yEXHY;]\F\\4KהDl\~H.D@+1˄`[VA}  k>I$q+!/n~dZ?m]c"&"PR]HR-Lou>v5R0w6GZ%0Wq&r-,År?1<GwtSnjc ;HdGpP_wBȶamVk[g߽~a ;*`sa'J_8T0Um_f$lcLͧ!,#ƥpS"j+$z=EjYfmKZai GܺY5[`i0֢Ρ^k->8c)[\ѿvQnNF1ͮ&f_XT'sYnr fQAR6ZWחa N2Hݍ7bKijePJԩM;[c%^љypS&eCdl^.{n@)Hn\1jkn# X" SƎydq~I[(CI\Zu}2]Ǝϩ `&zoϚ 9\24\,͞HP$xؽsF@Sרd#*mY魽2DXAz3O~*= {1#!/+d]hp%#CfVx.mmW]fpy$(X-3r-j%~BLf3]k]R.=wKή\e9NsnOVI2;b0G^DfjNѺ\NI, _YpE3(Ɋݝ8zM$ؼg/x3&2>`Vc544NTZQGeAs\9>&Cp#3+%{[u]v-X|kVv[el،>0R |L0UWZi}/ўݔ!D!!g`_[ DzWN QD߱97M-T|d\W[=ޮPGZ2ASj=E:km'Fu Gs/>(g,v[›)欢f7Q]-C5UlpVxssR 99' T:uSMTÅ|MCPwaL'7Rb>-L GVdZ[2Np3fFw5&oU+w8d8ŨO\*Ƚo>wܐ{`ݏu#UdZCT$e;]̆BpVGc-q^_BMwuk'"$\ft- *YGƳ- WW8Ns8S#D=r[[Oqggqd.hCHbq7[i)oUyzQ;\<4ޑ[^"/fӢ,/%BLgdRSp"Pqxo GԶ]st?3>ߎPQ uj|Zl3Zs3j`]fg)?b zhn_rϝ[VQgE)HIz%$!Y8$]<YθBrEf3N8;+ " Ov\aw.n3ub\*CS*E<9ugfk/ZXT6:Wv/4+n7b-LM*-:I",ϭMoaw@X`>⿵ mx1-{ChB]^d0MܹbpL")SQ0IBJ[GnEB:D @p9Rߝ$a\.7Tљڔ@#x]c$j-j4o T k@߀q#Z{ؠU Ub_wU'Cs nj>1FJ &y{ImTeEd1tu35# +,/m 櫳zꓝVr2 A?dA¸b$Fn~h_!jcr@wL)L gG AviBXuevj&w)DUoD62WnD;iɹ<ϙy|U)N:Lc Q++TWe,>~(ކ}*\۝Bju)P?aC5 䆁"C_9\VxPɝjB=gP4nnP`w!JOj/!Ta;eʱh$NC@O 7$[T:`[t€I"\qy5B,z,$Mqeb^9xҡݤI Rͧb* byK؊F j⾰P zh9?最0@ѵ}qkLR'}2uضc['pIwԑ篆rw%7S⋀RIcstG:! ᆛ|Ԕ8'aK-[?K`4)fꔴ%{ Y! [l/"΄ƭ*sz^wR\!rqu֭~" dJb7AbpDD&aF+ KE/ObO\l؜Zѡ1| %Rx .WY~:u P;sTEm~h 99\ߑ@5I3^,4u(#ekb s 4kv{hC#nd]&4"ZbfhvO`^a<'>Hp5 ZO I8.&L('{lLn-z6X-sZTG8[[p!*c 8u"Ɛ nnU>J+[WZ#WH„md 鍕z6ټ!M ,Xn[F,1c`=w> >ٶ1)i҂6ا)-^=?O)u3zM<79|'~B ewc ¯Oc[; ;2A[r8/ߞ?NJ4"AfP@m{ga Zʛ^6+Yah^P}Pb);lNb*pg09OnŔX;TOoFA ӒqH3#yb)}ZۘqtRLaiӜ{d[Yb􃳘1?0xDehD骟_s[W[}z%ˤ<|~u"h[ $=V#/{{⿏Kh|>8 l\vœx` 60iTGNAHW-8.-VpIln" v$7~_ UN\Ŋܘc!5¡[qΉfjˁڝjfO͋y U$XdE ;ExԑK"Ȥ]T{Tt`:;I(4S_%Z`rYKuw1o3Tb2S)lX=G*=xMrQzJTym[%SDB&:F _z+=");pF3R'kE3%e:h6Fr04!Ynn ce0@DQȖQݾ(ޚh ]I ,:'#E4#S>i,˴S gy+.F6N[RP+hf#&š6*463L>3+wFYOb2qfƃ#bvA|\>V{tw2&t|N}`1l| ᙧՐguw&Iae=Q2C!ܠx֛D\E2 bjK0i:3 FU)~}X:F` Ҿ26l]<cO{w> ZJD]+nFRv{0WOlE2]Fbm K:J$K\Nj*:ctˉN|@  E)lSf3;MJg,YÛSpFuH)QJEw<\'S7V"WD4jW:XDMoHSRv Ye> x04~@o`Ox!\ږ2jO&t辭׀%=K,ʹ5Q_]D'MvY\N-|!qFW)٦L|KNѸ+;=Û{A6R$B(AyS}R%mN_|ݮ!nN@ S }ئ}zfmb$k^vx![#|=Dc?L@6f=049 &YjsE6ܳ; gK`6r\)r YuqӘqSK%@ˎpMG &Z"R(Gz/ kZo>}{:O7Nb'Drj[tL$uO%8!Uie1\6+qu.FVSz5![ q V.LKXT7_gg}u:vR( {њ!/ 8+0y=˯U;΄DÆvʸI6&rkoYqELK]IMCSn+.{Wr@MN }y,o3[1L_SM1Wkc9aGVX 0ĕqp:"?J jlħ SPqc̀Gq=b9@i1[D@_fK+at4_ f fq,H&%!Mj Bצw%^+{I>ð# TW"u&.vzv BDBHu32Զ3')pc9R{dmIJ?i1]RأɁ>ţǔ}HE1|=mT5#kdmsW'&CD׀x:<$'Xҫ[&^%__Wc+8 cVxIq+#$q#\+*!owZ+,i)Ü ɟփ.g{dP@F9I"zR-uku(\T^t*,8*`%K~W!;0a26<.1ݏIA$)_-XMOA@)㣯]4rTq$ߪ!Oh2_.}*G^DyZa$|5rJ 1M\`=92P'nҰ[J'\vke1 ЋXg홴Lu}B,FB&3ziOlψyY{mr0;HYP*=$0]96R|i 6T2 N;|X#־̼Ts_taAFEu^ =!wzk "榾Eτ4I@|6^lWq}Bd:9)"ƱՍʵIPgҾu(\þc)w>u[P冷q&L]z$/bbd@2rP1$`U{DBwE祄oVl,/dae$٬Z)י#$QڢCҗq&)0`ƉpWؘ n-ߣmUA@jZBGk>[x~JAe o d j*r.rW%+ש,HK.*`(:B>I;inkOR4-P;̦m˄C&,Oۯ[ҨJom*|czDIb/ T7>ay-$VO9Xs]+i~0tDzR w^r%y!6YxhVi]Tr߰ .6=ű4oULy C(!y7H߭W \& XȘ.br~.2x|vNlk+t@S\TK3a=lg,JB)՚LtydUU,mxWOwG g[f^IL=ɔ' CMjG;&?WeUi*&PX'QC=}Iz,ËҾ?&QH|DZ"רe":q%jնHs ٞn fo@^W²pl?}t꫔È'a!+'1Ӷ |%Qsқ ѱئ癝Fn ;zOoa$RWu.pRn(@X(OP#زqEL5ijl ! ѥS%Ofpe=I~fY{-1i),셇7vЯi,@/@54ED̛U '7C( >sҜ, !R A c{dUbR6_}g<(OA}Fް~e9@j:'AjңDϏۀ9{f 8"pV *$&K+ob2V#Thɓ7G;zOq8SG[+Os~0KB0OݸXJscnOShw""&yc=pu% =Nkg2ь0%LQ-ɊU~k[7n8K+pv司7'R<>1JtPu69=JUJDs.AiDDi@+|%YHWYJ_O]|G} $S嫄ht⾲ޚ="u=(bW"۴`sȈI h3euDZsh#xo{hn,s CszFdYy~/u3ΰ 67eu6trA"q8G1 pSU+i8+,||j }$ 1vYY8$\yzU+%1}m۾{]& Ղ]C¡?<^eiKMq$}9qiѰ((WjĺzWr\Y5a9j{p=MB_m$K@[@ q;o{LP͟\_,E$ݜ[`jO_7xT43bR ,ݗvU!Qz8FFEiM}lZE[IAVjtmpF( U؃ɉz/F=~Q0O+vj`H-vE?YQ?{GP˖he, 7{tҥͳ~:` D ` ԑqmpϖꐔoe-Lp[Gy ccfv7yUdy+vg9g2Xo]dG1(cv||lM 8S3tTeUj6pSo#ȉ\ Q,)TP(i7Vf:304D밖m͍|[ߒҮJ̱֩|mU)`Wf\nCZ "'t$pi)LH|Fd Ŋ_45.:;3t}da/G.n/|\'^OkGGV(ܥX,4:u*r߶p hC0xQ7&<}@Glʨβo8DRa_k8QRv-zEmfOo _J1z*%ǜㄬۓ \y<%sGmؗ0,6[-si݄rqW}iC#ӅFĠ@iPNgvE=ݷ&(ROzJ#a^6ʚ^Ш_^_y^#爊v=x_4NBDC﷘8#=&?N#/^R2ƫE_EKKo~2|,Iʀ.F L]O?/$M")_}U?݉DdMX0"l5^4 BZ(qYQIy6,`E[-79FR*TV6Gc]1 wt m-hŚIEyiOX H5g#0P ]b~s֯|V7۴T 8rToHL.ˆ*8O\fݙ3($HgAGBpgZqX+%kNqYޠJcVK{m0}!P,Bx(%=&Û@l 鷸еqNwqλrvu n˶ŢŒpWh/4'f3`g Ȭ5DzXP@G9 zH$ ?&Ǜ< S}UHK@Q*mf]S⇝, L؍|zw@t޼Z|ۡƾ0O>ǩ!"X@`,zYa< Or3ƯƧլD]4-2,|Ts^uV d輩GRvww`8%W-mg+#'5smxzM2È٫,p1*㶻^5-s4DlQWp-iBr ϊ-ӑ\4ñ,o魉"ʝ !%S;3|lݫY:r s dPx= ɱ[H]'XMk(}+R ֺ-0(YŦA,6;Qܒ]Ldwe "^Hۗ䛩D!uvSԃ =r+<ՆjI7Q 5Nr D_dɍ&F}THem+=3[n 8~CoM{׫Xf*5[,gxF렖эSAKr1Uˏ+M"RD '*2\PKÒ!u; wg!]O7n)h'~&ET Db >=F-J%m#ܑ"_o hT*'~r aw2xnrlCNh"f~V}Kbt?sߪz8Z6a'G| ; Ea}ФKU?ե,>ad̹lS)K۱3SoP<=&{upyo9d4N{YP..ɂ!dh: J5QH jځZRhU1{l;>c,&}ηw銊斚ϰ'T?#|2maoȾlY'$C!DlLQV+ 1ⓥ=$S8 rd+jlPoƍXaski7]b^n[mtgwx\DžWh"u:$JcT_Tl,OE5Ayw5Vb%[]v`i)QVBly[yp9+oq|DƯʟR_V⪡5lvx~0-Qp\f8MQ$x=a![5U=ƚR՘;ؾ(ٯT(&_k!Ӱsr)Ybt C ^+yy {!BYd݈DN3#'3WmnX'W\ՁW{,doa$#Pi4F^#XksR0o3.9ga_} $KNmF;K= | cGLx`Luo pw[ȿ((gSx}j Q?D %m$...; i mWx?ՉC?$Y5Os [8rw@Q+:J}`&lŒ_n~|TD5rt[i%KÐ6MLuN-( #zgƓw]pRj-9/g2cRӼA(\cЇY>ЫFT'-*44j_vCL>ɌQi 8n Ƈ5.SFXRaB?מ`1߰0c1RJH}HbU߸r{X$ZX2/ooqk%3 ݝ00~$w9a.ڱv$==b26hLk>n(k;m5ǃ4qAN4q0l4"򼰱*Sƀ)DWϙ^ӱ s k.~n'.ֶDX,:t.&i4̄.*gt]Z8zgM}# [ .h /K($:FE̳b. vMd ‰_.!<[k$LEƦ&&楠'AsI  (j<1.[d@}e|g}.Ơ9.g_㕄P{WY_ﻇ)cP +ONa{R8]rCQ \i(]T?F15ʯ=ֆ+ 'q/)q%wz%~+EJ%p01\ZVae#mK7 #?McK~8\YFM]Ƴ $o\ hͱ)z̡B(d"&(Ϟk{]@)P=fج|uRDd"{F)#I`ެ,T+N$cSXOԝar?_9wQ?&iNS 8EQIN;CHSh,JHNy2z;"|BEGF:xmpG(J)ʺ1lF(4SK\ Xk:6Ng5jh&G/P}G84!g լDک̷;Ek?nnApm1)q AʒYTNi[u9#hCg) LxUUi4ג9Y(y4";#uǮ~Ī֋oXظUftnj ުN!~q?.Tme92HE;#Z4&b 5;c礵Bl]W ɃRR362kTz"I5:ǍlCwB kJ"y5gi yXC&2YP ڭQ^׉[,Z QDo 1ݼ^E on wxҋ(19k&xK&baHNUՍ*a_#XETc{.t{rg "vGi=x߮΂ejJH`58U&*503#5IjFM#THr"? 9Ͱ2z)DE2ؙM'SN~ :"Y=]ArpM猹dJ@{9|@?U좴) q3H3UQ߅< EIƟo+7 f9%uBۑ9@хuZ*)Kԝ?S3~ɫQvWEQtUgHXt4ppZV?铙 ](~s2/ I)'*$+k\ ͭqʉgE)FaO!1Eg/X'i48ve6?"DUvm"7Gס@յ[_,Q s2듆33glk :o!XC"[!T(Cx}fP\4p+ t{-'<)g~!4Ck՘x~ pY;\{II@'y}zhjkXJƵ{|?X+P )ʤEU|ޫYξdl&5S:؂[/Iu%Nt= tP\( bs lLOrb⏳J^R58ume$[JjDm&"tM${AuڇR l%&<<`NJMXU>  GqczAB58 g <,H՚U;$9%P`eR m}רtV1EtP*o 99>Q.y)TfǏe.1H*1;JFnR_ "E吅"` C~X`nJ)ʬ2vWb|'\FEvThA%k^ \U[-:L# ¿1z,pQ$6yU$7w##@; C)a:a]'aU#ߎl\[d[T}doRUpiBtM4\\2-) QKR?^ˆ iYz>5>HD*(e#K!_sBԗ]J#ʡCcA)ϐT @%~.y"O9ې1:=o:LR&]3y r Q SDF ?Hx.E٘?`H ={\ $m2.㗩i`IP*Jۭ>90HF/ s@# 9Ϥb67p5o >g9 M ǯԙG.˕TD8,im)CƲx鲖8~W<u٥x԰G]&=?(4;m.A\1Kh5ͬq^VWbyp;zZή l Ä[~, xA΅=3ǘ3 4p爎< \{CY#ЖH:^:() 7@s|o,g*dHKvpk?|(Xa"$¨pkrKډOm,M֭{tGrBN}B^sʱ=ԁ[ɺk䌵BhX1A1Rg{_mx Fv[WOE]Ci+f8Uwbsaj<s)gՋa5]+ ~`t^D71Y2 =b()911 E0i,u☩u ;ex1bjyttBu*EFO!)}6bGͱF$2w,( dU WtS_cn h<7}'Ncg2swC{lA[ql% Kg,5!zu8J~"ڎo(󂌒"_D˔ީc>mgA`<m)ɫ)8M7w6C_ pkib3t( 6{V Z.y\']ֹ/潨q8qjת[y* +Vs-P6^ttŌH f(h r1ІSKk<hʕLTrYL!a1Ƿ#q<ݎmh -т b,z%U)!/N#C^;钌邚uҙ@<(FF4S6aטXݥP/I@#c%2C0zsel|DҲP뽒("ujmlJ"E0opE,1Ytz%WTbK =)͑0N=tZ3hM- ynd^q2Ǒ]pnG[U{f{uC׺)Tl|;.ڌ|o_:vMs;W' 7oc>HNY͊wje sIvSf+1R +΂F6 !pߟS{ys) u|tng4$ r+r8cbtxD5kX:4֡0EeGTfjs~"#'&A(C$id'kU$=OVB5,"7 'ڀU=fq72"3>A'C_(k$c)qAIBD#%r)FlF}w7=a) }.j'p`L#3ΐ<ܦX~-O66TQS8`!Fs7zXus`?k.cl\|I90!\L(`6&G2^͉j}w,ܮN8Z:k?7.\ǟR78Z%'H5%+\^MeQ%նrǼ;<{1l $ЁcO-ؘq*@OՆ 4I41u/,:`VI=WCވrd2cG/d7lfz7wZ4*sbR0ɦK>gv?'gyAO$&%Oe&Tz7rޔ]y6f,:)',_"<{|)⬊ @"_|M yuɂoOxZ^Æۃf;I:< s5#RveF'zp7wʺyjޟ\TViP-A3fM"yS, fI#%@w M,;Ǔv[IYΨ>'Uئn/mQZ~qnل {5KbP>"F^ќr!j;Ȇ77A c_1[vNKQo؜1 ai,x lhX|<*V2$CTH3`Z:›|yC *]K͖(s:axʾ!Sb0g-BWu?dFJFzؼWGќ,(+긫g |ӌّ^3Y`Ty%+*OlYXENI% aQo- jEkLzaPiWjڏQCAMF2_eD])$+ؕt-3Tur_4h7=[å޸sd^'_2H/VW%<\оKj]DU`і}tAnSf)P f޲/n>ZP(bEm:#Lk ǓrNy sc'$ 0_Q 6/VE;O'R~ؖrXd]>R.(zqQΫa XIS۪5pQCA~LU@0%{! s☰m*ў'FTYm l8!WFyf7x{BnyR~jE4"T5!i9 hWVb䫗mU~rB4wgp巹)n@*Yk -fjq|]k"qTiIm@AMB30xO=Wb"U|Je3 3C ˈli\5@5-/pۗ3/m :=Aȭڄ6]nL(џ}+N54[Э ![+5FzI]-lfXL0E*Vʭ?輝  b$g:&0RxqP1 Z6'gTtUvq Q7['$o#YNZSo?RhBwή}*UK??3hDyz r "ShBd񹀳tEeN9dF_?/k "[ƾ_[S.Q<%Q* pBHI0`rqYv>C_4B ϸ8*2ʨݦ0"$}ؔe-r.FbV7DvfA]F=$ȣ#[b#d˓z;ZJqTG١ ec ܢYOе*O B.nlfJOjXI6]5&π>k3E 3.W/m6wExTZ UK*R٘KQEaύfvx;{RK>f]>h0VDڅHs(AAr= yKq3x_vbU~r3pQ`#@YEMGŻ7)ؼքIr,/Gt=k1V}T}e[CZR, uf!b6 bJLSt&|9-1W5b,p!qYO}QɣÚFѪ($.A.ً( Re1 qG2 oAP4AKNj l߬T1fDE=P?&mDY I(*oi;O kmM@-T- K:Mۧ(oB-dwDhl(g֛]׹ȇʘ#殐?#.;o%s򒧻ܡ:d ֫vmcK>$|I"]llbo3ƨZ')O7w1Ŝg{d5KK*by)]NO0slD)aMO%ưP0#F?ZpWY[io'hR8pĔݻ̯*-7CّNV 'd?Nu5CX͓/y9Av+ 9g."ld?3K,}RHB4.2ߥxo`\-K]M<ƚQltx'Ht;g\#>߷ S{ *h, ,!kB1 WmR< 8 8,u=2>8'QEcNpf"Yp@ 9 9)^k[nh珞mf1L=Jny2*q._U ,HS` XgƳ4N&X>YmĕL6`4,|nFYhO#dpS qՑzʡ%.),֌5ܼ9+gV4,IJTV9Κh2-5| 6 v=~q0=αa !,+,>!=u ЩYQL E&{Y)}+SUsG,:$o~;ol<Ӝ%Y><4:lb:۩1Żza'8#ysh7=PKh`sIgzO_g8^56wBj3bӚZ:C.P`([f'OjOIpp# 9.i˿/L ɩ/ku@zTA*Q _%@cA "gnJE D7[pǾhY˾0+%%\Ñi"-Ogd./b]XMi[qF 4qz_R%`vRu!%WKO͑qW u;{4@Em% s8b>r@#@qAHPg*roFs`P6m9׿~(B6nػr;‰٫t1\O}PaI1-%7!vm?Όg A]: |A3Sip*5]- )DF=wAo[8hYlr"`b  )Pjh8VʲEKʆc I1R$(E 3uBݪ7.pL &kaa߅i8 g|.ItF:-OKH1|^.83Hwb?CXc͎Ru w*y+?7eXRlj8n(e*?;^QhsQWUS4B=s'|xx{qNj[\eg-qDh‘'/Zq0jwd&8@uFpB+Q7xct,> c^r}6Jꩼ!1Hw[Oy# ѤW'6膼91ܗ+A~tBW?f/  A̍?wC#MiH' G%ٕ0"I(!M<~"~7`8㞕XV@qLFsICAzNai"b17]R,;#P2 JFDIeaLhV#P&{T~^tɜyE*Hfj_ENo+`U-O`Ga]D( "V]ڇ0VKҐ, ڬp2܊dJ_ ]_m_:xS~8)wBr7Ub]Zt_%PZawW 2IUdmެ'v?Nx8]oeGn\-A}%e{?zr+čGP2| NPuPcPx-iy } ``d%@wcpcPRisN-QW+{ r2EY*; l&TUf BPّ&,[׾̆gfʣF>aK'Z@~ ,ýkUF QWX: Qp0Q0*IKٴjlG %rw.Ů 5c/Θ[(݁g=6IAIL$R*i 'l[Nœ`fkK⒬I@z!=#R4z%)=P`lNl,5B|]c l0*ll ֍FF;@m& S;155łk;] vD:" Jd$aGG\g6@IN:q7= eFL2sk|}6QauJ<=D*f|Ms"de;>pǻlZw?}UiNϝ s<&cHp8$z(ה=<So?8-w~ڍ iAdIV |\npʩ^}&SO g@OoТ _L2j`ҕ@qU[y8@^!^U6A.sp:clʸfg@#Kc cߦ~eڪ L,$j sN/Un [4I&,H7Z푻Jl9ee|elbtW#_IK-E*C}zE<) ǛTA4?Rf*9o&75SBYA̕(r>+a64W7 QWxd6Z/ KVFjW7],;9Ƌ)|ƚf89JzjlsܛAIӚdm lZM‘j ԣvG^1P+tw*$$Hb. >ʤ6#3='b2raa4 }Dg00b#ipjP9M[[u@{ơZEF $6fC.H^~u'Sލ9?C^toOPV `n"zQz>R !h޺eoVۦWwrƻW ƺ(z#m:n#Vxea),mipk90,`]Ɏ"1¨$ S`m6H@EzĔ}ޓ|ڃ{qr bz'e*KV~ݽ@zoo3OMvtDk>]K1H2RMz 6OOs,(s+bHNU6sf✺6ԳT^e'cY ZA?7ځvBB;K.dR`{NaY#"|*PK+\^EC8W honܼ e/NVԄLHYsHөZ?yu3JH,UzR<"?K΁7<5\Bᮽ53fkyˁEq$cwN豴ht#(dS}H!ʦ [۠hقMrN[ȽIrĔyMlá& KS7K@V!|y0ы3)Hm.BxFat VI=:70M*$Q Y<o‘Ձ&f/k$؀jvk8ZpnBeXiIZɊ:fV_}q>ͪHe5bśV4&)ڠK֖\=~u%`SaKq^mVUKޕF8*2Q~0:T/0C/ OAW8GƜ8%؇XQa0 8>zK#ak-O:GxFwM"0fFIqן4boȴ9 $ۈcA4GE+iPxSo g= X-ޫ~hxODCc]/{!{4Znet'=REkC}YM!=Bu,^v6Bln!9AP=d=26D[1\j.f'iMUDm&5{:ͥ/j_wr_j? ߭ǪԩĊi-"pqFJwejN<EMUS`(fXacнC6Rx#%``P*wy$;5Mv Be2|2ɍɊ@ǧՂC;=#o"]lD;#jo4^0EsR ndfOo>R-o˒0AE)@v?A5h ز|ZGS+fW.dƻ=uaڣ.ڞ|bEG լZe>YU`(G%H+KPu!E5=?gj[f RWoƄwnY*]iHϲX71.f=,`H}%[ ps09m3ܢ.C<~Hj%8#A1&.& T1gopiG*Md &7$K=WFgw[5h'taɣQVF.) @c Tȹ׏Y/\Aha3zF@JE󻰼"5[?ü. 4qL]mm!|IL%nnf1kIYl%pwu$,~xR}{;=)MLK%LII&r#;~[0(JؽVpݏ kfPYUNKni=8.!cLS=%"ݙ\\a H+4 jmE'Gv$I=`wwgS^vAў iY@K.fCUtڤ9UAs&ʼe j-(m-}*õԒ>i)"lS+ϱ-z UYhOL6f~Y%c|-4q/Bekpa_074wt_! rJpa * 3 gC 95,3]K*a儳p(kB,D%X\gEIuWDŽ6`+qWgB-|8r6\38B *ƼK(31 j҈ZDMG[_˜Rbfrn}D>4~ƅ,$ΓID^G6&{Cd|B5sX,0*Sq=P, Q6l3؋(Ls^J%1) /T#DD=ʻ 7"*<ۑS/.'qusaEOTM7'P݃@>_l\?֮foHm7vdH,&Oj\zo~>֨M?̢5 N %̧!$SB'QƸ O&N>4ck gN=eYA21:!:j'T K 3ݿϕPzp~YSFdvVNElirj:q%wE;S$3@sgsďeH-v/Mz2%Zs)*SAȑk e"Z4(P^tg%|֬RPV/ oӍ]IJ$>J27gx෎ܠxTYS$)! 2Lb֝|%ˀVD߬W8XktWJa1#$Ό FX&Mٳp 4׺#wG&IUKC<=sJ݀%b?P)2*/Z2KFiض.=93+_};c GR:ԕ9d$ֲe3HAq¦>66y?pRk_x*p|잖f8ёNw-קwl@lјU+NDbAlENL9+! | 2k>+51%8$mOθMVE&p(Ll^˧<)QdDg;RGkf5yɯ$$c%_. \6`8E0Йe#"/KM S669^TkO 1vQurX@>i RLuPT>3T^+3}.8iu P-(t: f%znY+9Ad2 {CX rw*jx;fL++ ʿ{w(mh>!18(Ӳ,ByKR0v4p"g&"(*˟)Ñ ] .ֻ ]f\.zOP$aq]z>Q]p}&)3CC`0e6B|LB`^S0XVY"M9l~+I7 uihat0HLT+0B jk;焈<ߐEb Phqx ՃOR8_, Uh/,NkADAYB/b7?~$V(RB^4r5hG%'4BGCvo8.)ڂӬ ? Fӊd @UN}y"T^r?K5T3cV/X T][罟Y 3',;/<~JJw,n> TJ8j>?8A'2Rxe7reԕ+!^Ə#۝I"+S3)XȲ~8PW0h2*NXޠ,Y0Ff\b4D >ն`qcBi2G]laLf #ē|[”U:_$},D:%:Zm]0M9cPh~ K^+띧a7>vxD-^?$*\SK.|C:yfpDe9صK =B'khjN~eDA 4]Vdoh@R](vxzS&Ll ids9\P gC~bE"Hf =&xN ; /Ll%we:@Knߔ}_IAxڨKOtcӽ}lYor"v ?XQUwĬ{ S&Zm\DbƅC>"Ro-=\aaX@CXs(ٰNaXL#VBebx۱+s!$J͇_-F_ΟdpOoSKn¢hQFYKyjmaJ?㝜VvВ;񏾓T7? i1 F4{+n{V;i܁ίQ7s/NԀoT JۭM/ @}'nŴ!( | MjܴT%~?wNNjAٵGU _TYso@zarU$ ߼ŠMV0?NJco[6E'ǐibIS>gry;oaA՝)D.b^SC'QU{ R3;V,B:5I &GAZ@%h3$Xݔ*gΚ ms}Q 0 ;lj_w3s"JA"BO6(ᎭIL9/.k j~+ ;jG'bFb7I`y`ьL6㌐ӱlĞ 76I%ic~thÂ3f31ID! % 8윟XO?Ej _wҮU.E\gc R?1W+D+>>|<'ۊ%PBtd[[jL*kHps<) ^ҁ-@VO#Xu`'B`v[Z;ŌxF(/}{(6TaBZP x&p^:wnb~šhv*@jϨyi4:tT jn/-qp ñ޹+AXN%V[9'K-?%7 [EY^cKc~C02Nc¹_$`T\/R9Y*5zXVH3cCc<&UqjѴ7)B^t^Gxcv~Fؿ Vr&AiOx5<"&!I":\n>ͿaLR5M>cԜNWYfp.b#ΝP֘I98 q/f4a1SR2b V S^ghym/ׅ&tA6$ѱk7!޴wK)kTͿ(v6':s~vjhG@=q۔xِu//p9ˋ!!⸕"zY~0]fo]okۺh&ۍ )ߊ/AɇUM3bNvH]`22)~zg4;8P`iZ RЕ7B=y'P S7v`_iY`~! iR97PH% 5T 9EfIxS33heҞ>[[Mxp-"J}zw ȹOn& &ξge$1R-08}i_s:]l52u&]nMfŘfxѢ5 !#RBhtJ3 Ƕ<@n?~TyNu9.1ħ4m(/&aSͨgg InCelB[ q|2铂M6FORپWB7Ld7ɎО®*<fJF(MY37IDg`Ǫ0Hx0S4a%j4ۧ[w. TjKHK luu/flcSz dB(P^cm[Z (C4Ȳ,X}CJ܅F5dW:l&EFgJ:?󈹚~wu9hso[+y_q:ǏfrI$ (<߁wcٝP;SRIŰ6TSX0R5i3פ˱|{Lv#6^{Uoxo0<ݘQnJD5oC7f~ smd2jz:zٳE+f=:HM>C@uДaĤB[D."I0)\_cZe}ED*b L== 9qmSݑEC*bru&ɘnk}d XW:5‰]Ϧ cBS`>@oM*QT<ܗۉEXc .ՍE qYZlBM8k30&JW@"R^g_O߬5=eO._oLTpXObոZm =}g"B]->>L 瞔;n; 'WdyC@ECiDCYȮg^Y GMb h*d\jrsU/1:q;2c>b2k5e7?SVG;?T9Ud_bt [XDApǍpY?; +>,:!_Z.:0,%s`)Fy׼kO()$F#Qٲ73ۭ+l VŇJ46;|Takϰ`FmE"H6Wo1Ik%ħ>Pba 9#4Di:{y/ m觛"0V&Yg7_)f:; {Lʷ}Qٲ.‰GĈc Jwnpŷ3/W;i=%10{/kU(bN\ eCAgN rfe;̺Jfϐp5@T4G*>ɲ*΁fmc=^!s.Wcxz1SI_2r9ً>YX dA}:@#\Ce4587 x;Zcnˈ\UCqĊCA ˹ jC9|B{9>[ \f(<C›?0'*inTx$;ލT3iGU6*);[q)ÒE~4c[F.y0H5l\4| Bh5Yy^T c=>xeUx"`[(us -ͼ_rsa]~&>EVfY5y43y'^ UFqmz™o'2&ɤRtϑ;jt ܳЮ.v*QVWUvXe_:dux<.eA>Q@9%'l.Rوv(}b܃æ<ۤCћ'f 3?ۃ:z;-y\thwNwpI*ntUHBfO M*G$ *Ax#8O=75 (+J{-Nd'PmfCJyxp:;_1.=AX=+Lφ?Ny w*;Yn0{ب.5419 ׊d'H.^G1Zͬ3xCXH*t/RϜ^J 8! a-|Ak/aq#gsEZ.Th&f }c_S͓UM.% bkA0JHn8_GmE1/k4.^SmwSu~1#(+C gI EvO(ddpq^;1+zL -||,>U^tݴnc@Ow #A8uxU2ْW Tޠ2, ̊?Xjr*j<]Ob_Ld2 S~fQ,= t8ay n"2vFӎxUQgŖR"A5Kڴ4䄚H*)N8ӱ99tUFI]&WF,Qv`c.4RAB7M+((vǷ]ó&Ce-4h&z]ulk ,2?H\kGr_ח'/(HBh1,!e,& pWv=HLc]`Grk9qЮO5z i' 8t1-[AIC#/HWguI]EV@{i8pDAAm!%qxRw2F~ 3EOaxfqxZ%,]:_Ô wܽ[r8? h>\vl_οKRڲzD%eϛSBKí.b`rYh%^"`=;q40Rpa>a0'\# quNc;p'䀹?'T [餫 +ЁI)ݝdKBU0,{vk*spF860`_o'R@h[ Md( vGN*gM}bKe=_ a)iIWqMB*Rlѕ~+ fcr#fҴN9e) j7J]W6X8YgNE~4U90?nN/uaC.}`XDme(FJ(h]'8kټHLz|.қfw4ҾgRu;bƤYRS3r좝6%/A`^s'ŷ^R*6g:,l;"J{xY" @&#OFl /vX7e6tU/#!-TJ&s0RCF'cq+KheWͤ/O$O>l-yZy=GduGR /lE ȮAZ"Ug<[xX"forv󫡴\ +X2;]tϝG&T) 'ZIf+g9:^D/s ZI~z3;FU/S˷{0 {WcZӂӨwیLlFQ&5g-I8,>hGߖO],T_ˁYNE;ț]=:%x'D_C\I3z%ÁMV&yhE2fi$2|^^sSH;PniH(ǭ`S.CVj mi/Ck}ɃՋxѝ7Epζ6Tŭ Hms)RL Dn.nS}f-^ @Am ;].E2NT( !{4Ǖ>`puZ#I%CeZm7qU_̞1HTqCĴ=i_Ȅ Ryb@ѿJC m&'K2Er3CldMic=AU`6V_μ=٠2Q>VBIĖY&`Ҍ*A)9ӺVu{){:̶6U;tc>uyW(LOnlk7Gy& [L#b&} \(i]7vtf_x(8[dwQGDd9"W,`*4VIS SRK6~Bwi7ٯԣΕ}>2A|ъN ҐԟYfK:DJ,o"g97NGwq5N]qoQ%VO !|)@ʷ\G}4<*(@f_[޵]{I=gR\,;:{" ;MXe!KbG^u0/AI\Xsdv Evg55@$8ֈ:\Ȼ^$ Z2iZOOGysq.jԔw?vқJ s[3Q!DwS xנʏ49՝HY={"}6#)ڥyٝr7+~="VEGXExjdFBVӢPgP_wy]~(2&'XEᔰ'+Hh$K[)~9HYrd'8фT%Ty S+Ciإ1@)-4d]9}===G[7("Txwcʗ2}yBk) 1%s6[@vNɇcz)JwZ2'H L1tXlo?5V=ɶ|)+foA~@3ŠO (4ۼ@oa=peZI#Tacdbɒv,PN>;DST67f[z@=6؉04\Q`.~r 6[7.fx"*`f@- Q}]`1M%pӁ'#ȅ:{p*QY=c?FtGe4.F+*a.ύy}ܭ[H` WdŊ t T4fiEtoIvoK#88 [7~c97Bm l~D;o!X.6a$ S Q"s vҊékgCtKbu!I1HIA L wړ _gi?'rg)ŎXΉES,< à.WDOw;v:k!*]CW f"w꼛261&ޢi33tMY`?:^V!(Ixe~3, [ "#*$`%ҘR D8)"0N1 "Pކ:U|jy%ʺ/GpD6?6 5#W:UkjE6YV YWGzzbey;=^(.=$S.3?8 K<}O'!lt *,մpm S9>QKrԪw/!CGyu4ObnT?1-^ʉ \HGIͥ $ٌ'εҞ"X'.$#Sup;`@ Rcmb|́%iS6@z AjԕZ\zwmGfD^Ŕ Hc)ֿaAWy3}}~Nk Du8z ޱa[?6uy9&L;lL|^ ['9ߍL`p^5qM'Э*m+IϤ9{< uDvf5MՎXUzf1<;^7dFW2U ⢙gAo ,Os1Koˑ0}b>&Z&d%Ͽ=4)JUJIkS^v@jnGqKyr㵮:]@cM .4$`{HM_g$3%JO, mw3 5DV,D4YPKu20\zĕN9'(V2JJƱ.0+CTX ;+%]!/4dK;p)jc0F~Ғ0tvLcӧj;;Suqh{~FO'^W,̯ztl@>P=(RH'ɢ!.yc2fo &* jn$vfGɞ}ueXOV+\Asu(\G;(Mu3~O)}|X[AMI4xi9E[u嵍CiPiþJœd(OB2Ȼ,'3?*<V8#>ʌD:q1P~3׶E“-ydiga04y0Ad!  UVڠHA̓2B!G9hF%+j\8])H1\f2 `rbW5rtH_r;s'uΚgcW`^2Ma-U"HzRaq-[JcbI{oEyhNY PyaE{sw>}Mk A(ǚ9ƭ ur&[5 >&8᠙X$k`boΕaa\FK1JC*A!'V?(II7q2D#?dIn!)d)XJ3B5Lž˅Ơ#9{ =o"4ns A=`$e)#N&lДՖDz kARu10Ak$Pى co 8gDv7F՘=;VgbҤ<X)oנБTIYE:}Xhi Q {=!]G7U>^LeX{wRpig-+0D% !5wIߵ.G:u޼~%ń1m5w̯sG8>@ǸebEΫ2S:;SsrcP @Xĕ{=O>BcwEyةkLך FdOW6[E |`uK}ކErH]O yi'놋qJM@a}F5aXc0Bo؈TŤgNp|lͩ{ͫ5]S U\arĵa!g2M|Ϭf֛/ģ%4s{tUE7R=~p NƯ(*uqHڼJܔp851GW0@oֱQ2uctܬe`5qDQMMl\=Pyp y${X'\jZA7Ajl.˳mȌO|&Y |EˬQmOrK,  *H$Jw E<#wy;GnPǻUp;Y5umq i/PDږ22SX?Rw1 Xr.~2)l`ϒ}azڏl#RZ0NbSer_ nhrʏkԵ.^DQP4]"'mwu "e\-if.}V9]Sgv֣aI|6oge1XD4&?C%^4꣧2 `cc>˙l[gӆth+`ڢ5қ_eϬNO Y ߗg_z uH)]%6%hezΏw <= ;?P2ẊvY83 ҇jh[o Fj\*XhȭG;.|+dl‹tj *Z|:MP9xQ7wL bzVv c[s'] 5;o }b'*NP4`jhL 41qCF n>8P`ΰv}ҭwR "[*t|us:wkJuZ4t8f<ํތ?w8O_p p*T@ F<:Uⱏ=C Z +^@Caԏ‰G.͞<9MoqjKM p-2kR>Qz_DSb87 "c׼٭ūڽةDnfA0 $ŻH+yi\CG">>9*峯)F ?K`&!>jZdg-u/)ŕ/ !NV:*A0Ч/ZAFo a {>3XrZ#4Gwd_+ʪS*"QDNqve44-= W>V-sgܛeB;R䥋4jw5ogwITi7 ڭe1 Jg7 6TgMiv}bF XB3&|ykA%匄*#ܐzi"'\`/qth$P=c- ו,P Z#utpZW[hjpvr,c\򜒰Iя8Gt\*gJfi^}jxyl,X9nLJ Nv zU!d* FCOCGzgzy4 ;yohCW8M{z*.Pwle=k󲹵gJYvWx;ҝPR;Y'aZg`nMsB90E ˼8eg&j֍Q% σZ`b =`}?l/8ԟ"b#Ŕ&8ICtbx K{3т=^TZZW(<*b>s\_̟J†EsJ nLJ.Ф7+|4AcE2֊{:>N+%Q/$tM?qw~Gb6|>r$OsrEwc)T?wT7%,҄*H@Ì= ` bp@bDZF]7g|jߏ\5(I'Xce+6NCI$ʛ=ݔ#j܏8Hh ntDXYiDurP7jgw3[@ 8Reh GNs d+| Yllx1mRon47ǚmRå* fd t0$!) emQlDe1-jW.P/mz?n&+K6/X)9]3,xl6ifL2?J*ql iv(!źI)muq_NBS$#7{f=0}~{irwek[ /4Y [ʄ`[Gy]ܓ!Inaxpx.\%̱ru;KJA9y{V)prQGn#ϊN/EvfHIeY ͂ymSjzt#1!,P9< h_ڕ߲kl2GYi‘%Y"k,\6,Re=nHL{/Қ- l5 |׻b`rB떿"}L"ׇ$DKVl7ɍ5~XiA%h-{ԓ[>MP_8_wM*gڗZ5ci$-ԓn{ mj/fglb^ҢKJE,*1y n}܁C)gh4B!8"'mvM%D;NZž dkaҰ}wʴ90AqЎ -haVUmѡ Z1n\;6FS}-apQ!S $!em\LhIF]pjCDHfH(V7\y Ѯ+Fg/Y UG2RQ\]WO@]u/*ź}t,ha鵼وyA[ӂ֮maZڝ_Ր(8&O|P`7Pj+"O-4zV~@ep!4xLdLѤu.#$#X8!:<(w41]ob1_M?c?_^{˚n,0 8.Nu7 j[`2q9Vϴ]+KtrL>z"{C{*E :?j2ۦM5?FE.Pz= W_,/p0Lo]pk\`t3UДĹjwO&L($5c70?J+Qv.:q!1/դ l3KIJ*fB<"n#䷐䙛B9=[VXq> (35,XԅW pFRk[Uzv= 2Y_x;q^b' x]-/Z=M%P/{qMal_.˕ъKZ=ݳcMq S&qzi>vr? '|3* [X= nҩ?8 bm//*w^Xҋ*{@1[)y@}$y'e9N۵ 7c)Ț˃˃㫌 WZA;++jF*@-CK/AjN\CX4ޡ@2"[b2A%}i5hv떣t)pyX-d׽e(eFYpyyFt/u\|%In#f:-ɫ`((QhߍVNlԃʁ٩Cŷ@9( GKkMlAF*{Fm0#]hnߡg,9ȫRUf_QEx ~9幩 5\݀v!$-@A;beI'^x[kɾb3uN9r%:^U Cu('Ĺ2`w9a|D%ᇗ*}emMwa8MEaoň$(@JC(+ \Ü(FeKx_{̰̊0{ܠy^W'iKמH޽>06Y`("Gkx45i iУeIl&֞ڀDӒ^D@Vi wUvB׷t~7W)ASջ>T.I)d9~9NizM,a~УFaWY?[C&N&^2m8r֨UAY\:iϨ@~A+ 4f\Q~.< f sPtjkyf*m9$nK>5GaAP TȍSWٯAޙEu[5K~Z-EfCf[݌l)jt:08 {Jۑݽ-Dv);RnO1,kE+y=i݃@u>y*p ~N6єGx׋3v"6q3u綪hna=fK'zF=St059uPɤT챳0ĢrJ;f$)wA .JhpۛQxoisS[>Vqt4 ;chTn` /bvᾜn[&aI%4MIsܷ:] ~Q^ ܏5,hB)QjlPPIJ]07$+n&'(RLgཫ;61#0$=c3"j;cP?&3 7]w5EF)w*@%,(:+U*`٩ ;x4Yw$ԇQc^A)q B`"JAB_"&$Aޤ-զf¢SsPHmpuOךǞ^*Az5'M6fqVX,pjhēK.IPs*~بiQ(õMM'vZ+KsX7?>7_隢יZſ xm﫿Vi ݖ`]:V: M8nnzۇ3f"T{[XWvqY tm7 )u;0c?1 -&%m̛:7ƨ[L+QJԨF^\xPBfg:a=t rb_M{;]̗?xڍ`ˎHzH챥d/f'a-7ӘdS4$VRu%Z |CE[CH(wN y2Og!!_ZM/L`f, cF,[A¿[3rUJ?N@- έ!!BAN[؊V.2rdO&0v? a\IAM{j"z|O9?TηشW"6IڴadHF+ȕTmXLW_lf qfg\^̦M-w῞VR_D%n]MtYI'hw}@@as}%:t(aaYw͢^vD1tT/lU*ܸ eRln~HXXۤdv ?gE̒F⤼j5/?S[A&Ou@ѬisppQRprsL t E_<\Nj) )0薱~%DVȂq>(Tr~fv:wozJ`tt}kz`gUaΟSaؘ?0 eb3ȨVy}Ba1E<8Tp(q |>غq mspdv" ̌40 ! \?s&-yk0vUosc5BbIwhӰ~v_&3e c /f(Z[/BO &mM| P-#Yʐ[`}Xgw$,dBd$ HY' R2nPς:/˓[58Tfa !;"~0Td[ANQ K?ޠÅ#csH?ֵܳ ̜d>)YAiZ~ݼ"[~_^WWԓL.*˳Q..~AzrpT9jOb9T#>]J5,fw4wopQx fDS$^|iWõ/,"bUKLVIQZh\FPtW୾ xQ1脹́G;-F)\Q^ߔ^}dV=PY떗 ^y&x4暀$ ,"3~8{nB[$وN8v*kY#]Ҽn_ž< j %ނV7y~rڡ8g0t;)t+.-P^ A{Fo$5ePU>hM8(9%xE8SDݥQ:e*І5<w]<  rO F1CؚOR5t1wƺ Kl?AU*n"S^CtRa$2|7q(ժ.G1mHQ'QȌCBVdspQ( 7[sO/Mfzk6 ݽUιvd]s5,J4Of:5H~P6dsDUlR6i sq'" ")$}Iz'Xh@1ѩ @̐=DH1ю耛`ŵ'S F9Eo} Dؖ !Fwi_ ٕKƫjED&MjZ^pVU=A^34W^{%eŐal~_F﹛SXZeGo c!HfL&Nj+-`16Tn O@ZXX'FsTlL_Wa>1ܚC0=2R[9ޑ:bx)Tʶ Z}p"ɹyβO;CE)}~LW1 O10=+cZJn^ ')%ZY~-;E;ݫ-!-Qi3<+M+|+L C.MpdM0ƛ=VB?,=PZ2ߖ3urDFCX*O t=/xBz/^ r]8"6$$idk_djy,$Nl! XI/r% ġѽ;3紼2YBe?mcC@tr8i 7Z(wb)4Y̨0-vRɭS;ո h|{PnL>>=d4N.Nun+yEӃLpg~|qBu ?|^-7MeZ< kSt*7]/ێwo9ll}ZD ڶA'dmEPTYUR4_OHⓢشw}Dz4AV 貖ZVO oF/." =yX#G7KٱrCx+MEgӧ(Pz|;[k͊Ahe1Xӽq`xM2D[E=xdMu} \ˋtq&azFF߶iwjc~7β105?RzzE` _M8)-3TtSvy XB375_&/qN~/=f`vhqU9+N >4R-io boD{~5x=cUapJ&|kF-Z'z'Y8<;5DyO^򱷢nzHC ~[ʵ^/gib ej\9(<}6}+CTa El#O?U7 e KwƛTv8T!o0T U8 ;z/k^XQG IYFûF;^;|*{Z9b,'q'T8Fi!BRuWX:a43`dh[aiLZMW1R% +2kDoQE4odv/!Xj_+õ ! 6[ 3tA2pzФo3V'awk@ NBFigNEM֧4tn;T=cHX#\XowLU*1^ -3I&}@1aPqwWȲy%gHڸ? +2Lg.ǧh {[|ӘB$b{ 3CIjO?%i-`厐]vB7@CyT^ߖNgFi]9gf621ˆn~9]A:ׂ7ix,l=9CmAJuGddd^s*Y6W } Ҋ@?z^-s_W_*`PbY*>BM/rl^tyҩjzGj$ C,`%Ii:amh}W]YqM\>~b0Z&}>FRG"JOw4?J-ejSܚ=ҧPx?\;~VkN)l/;^>o4[;\¸+w`2F~_g$}ų~a{$DdHWt*n z=yrڀ]弮8 [jaR2jEn9ZE|hNm*q&SZ.h=M, &ʩCQgkw@J)8xazJ1]|Bw iUL7H:/9"bʵnSZ(F)8BӒ ՗C^AmnWp]EgƦ ~WlE%3Yw5Cp.Nl("',Ybc^#&4n0.+ZpNJlvKUl(+kokP"T΂f3!M)ʏ[AvN|q͂^>Mֆ T!;O|o9ᰙqNH5L 6e|3B\w=z^Hǝ2^R|l'2 37 ݴjUMGya^"Uj2Sk )mkX"l_h=㳋QML]+YU6fLk_;*DDgZFoE9$fK 9ZL=$G2?L(j Vu~Oh_J,W옜dUe p/Fo 㺵fIp[0J"S #v|>-D_&i "0:=ӞgjaAAգdToER8 "mR4c1> UaUQv-N.dCŢS0mfpg]s|Pfytz|c^ۢo{g(ZBŵ"sDe0L}Am5mO!I0Sd ,9V,[f ),+NۦAJKoT\ZzTG5DzRtjY xXG:$SĶ\Cja :y JHEYRI׼*pȋ}F{< nd]y 8㙒%*8naS&zZZ,a!fb!M1[ȉlǑY'\x 6p)xV0Eyܗ'DݲU1>:'7DnиNG/;ȱSL)Qli:UE*p $?E{qW* p*'4rX:.+Q6x;{j쇸^Q (ęt) @ "jB7)<]]yS8ƫ?$bD]9X=u-V{ 8k*L3?)2QOLh=JNC `8jojqB]~DTNQ=~fL$vtV-jdNMnwsx\0s 1Q%4CQ//V `k|edl=&BE#ijwvj{QfuU㗄 p{o;&ڰX==  !gbj3}u*듫ME#b\U)Y.y1zfz݉q|2KH;D I` 0u'\;"w8H46OVtB]T_ç8PZHXh+$`\Kng{*p{ 7JKM E"o'8 (du?;Z%q!5ZQur))= +Px!47p;X i˜3WWbL,ދCDnGiفݯOυpІl,=gɶ8)rtn#%i~?>j xN9|m2= h&{i'Q?dU G>CE˕R[e ~^q8py92r!y]2Ͱb){ETt{cQzG Ж~t\dz'N۟zY.Dgݒ#/j!Pl{0f[K2%qI f-CtU ]*tLr<I `R༯ OPRα%sQcqƨ-Hwj(qQ5XrmLSX4"=n,4gzV@c09QE=\]HB>yEvm~wGş4 &l W.nVO>uCkfCe-X1-тnb CAZC+o!mرwWR72/bY:Fo,U16zK=T~ NsqW%e8{xuu>ljv@D[sX]R/DW݌xJqEU%֘ڹM!G<i(DzN 'Xy%=tz@k3Z#? yM"'J%a[*5:X{g1B%IDdh ͳ(y|QyK~X\]CnM.Hv^u WL1 a%h6Cp!|L17!P-AÄ֒6Iv[K <ˆUtUf|dRCzJX{Q /xq1{%;O0Y$ICj r]c5q$H˴2y?@o(2 }!077w%ؘm{c,?F 1!5Ƙ )zQ/c&|?MU^On,}"2(jO{R_z 괵_GݱIpm8ζo/\^5HӀ(}Yc-/;J HQsNqh4 i2]ݺ͘JQze@s٢>;b*m֮@PjƖ8T3 gOA8-"iL-DLwr%"nɢKӧ> :5q"ܞ l9(ey ֗h "7(<(N$K݆U)AZU jÝ[,5Z}߯[2p?c/rla/]Tۛo4̞ A{|R=85UÇ+GWq‡rÎ[yG udjn_ P)%i>Z~DPk<5iuا+2s:kaw**)mN!COqu0 76Mәw#a`w0,éh\z(÷/#$ ϷWTE" > oaB O^Ũ5ikk6ere^M<&35f3Gi+Tq樆 @nH;%F-[.o\r{Z'8ox,UBOz/p"g(Qctc-Y^8 ZJ4=eF}A܆ֿ(Xab)o;Sw(mQ"\/ߨw(;i k鼘 PJ #s_X!Vqն{}%WxED f: apy?\<:%x?86tЇpaVU癹6p&]$R.],fU\ۉA¶]'DX f6jOyQ\ek^"Ls<|`29g2:1nj])Wz_Ӱ@4-i\jjFpL6ee GX(SU 0!aO!Y'EcޝN_ CL#R. {F8)MrGp+T @q3a"Dt׮L 9E;]+hZHH[L1nA|LoVTK`iR; Q$=ŵY=q0[⥈!;y&4}tqK+ [$JM'5r݆Q>ed O.es 2ԼT EJ#%h^ t[W`eT8~ p˞78#6QĶBhySQSg82٭,d;߆ `CHTP=4&A_ g ‘>G]`(-l]J8N(3RߏPyůFzh Nr[X59l2؟;5Ȕo0 ]"W rw * iz37ur_*v簱8526:ɝ&ӧܬ~^݆y(f-tiTDƦxt~K|UgjOȭ; J3llGƴ[_  hq؛$:V] YU'\V)̺j5N{_OH_x:bxͅI;G0߫LM4Y mkW |;sg׻Y*4Bnp+ ea >LĊ O鉅2wJQ%I1AHF6#ɤͦy<1:|=`-gvRmj)yP+;'1ɺk|[mՅ?&Y# 1lTْw`bi@qF;z/r0Wfo34վ.-ftN1 99S&x ( wXhqPwۀ4[In1@] ~N|zY3 ?FaR!?"lfGsEIiw~Ee{QnGv !̚^eHG)'Zx @ ̑Rr+oAqLp^qs2^D*AP)wIis/-mra(_0x)Me3(DbB?ٚc/p;G$zeW.>B I8utzxLVV7#%Η?MvM/JRGK1[ fIމu\pI,wRBr; wigЮׂ̩hx2j ،wiDTF*-ae#MO=%h gtGD9{sGܾq g1Gha]M #`Z ;ُsx$bA4n:lUQfCJVu@|RB6aM|Hf6Wa lf^e2VSw9; [=& 8$a&F֎t0846r%'*8B`Cz d=& nKKvClU.sc_V5w6Æ\ >bqv tGwӫOR^n 9 tE5:&gj ~8~feV `MFզ΅ͯL A|Uo~FBp&l4GMB2U¯7q>W(Ds 0r O7[9d?tbyAN" ?%ϻ, H&1 ^/16ya\~C)V9aΜ$5S\!o)k/׏Mw_{Cr <pHɗy)3QN;'!+Ud}5O\ }-pq[BTo.ˊI1[kbi.UhnDJqVm4/] 4mΉκ 6\dZBj4לr-LYbFnM>d*tcOMBsZE~o}Hj7X"-%^_%_'z,^ۆ Xw 8􎐔Y Tvěm_XGT{(|\ f'=Cs1a!?z.5Ch-)L a.ID8hi%+$ fN%OU( e"m+8ϩVbǽW)q%^{Ng͊ʇ7E1Wg%LXTw o}iMNeKՇV8s(^~8:YsqoiqssϽE+<1a߈"+?LzY%we?E`,;kXxO)KM]g$R@ SӗFT[, 6C*>. N^A? 70@2pyI Olپ&rxӡ@epb 5:b…HN owN ː4fN:' 6 6 HX]|YUTz<IP]#=8Ļ"Њp ~ukƤ.+PwoEW`T1ʈPiڹMCTZrIR38rcMb3H?TGػ$E "Fpz'k AuY5RỲ$utm( ósFO,.k# 9<|gW?pN5alQF.āuSHRyasV!F܎ņ/hGwES3gmcf#C|وKL᣹q[M{8Z/iICg Ohia]C6AL:>-n H~oW2fH$zH?o{Dd6(W6`@ } 9o:R<tLXsy4UqH]O&A=P ny]$`VžqhiIJ=>ɾ JUcLrbz'r Y/nB,Q4 FlnoW\ ZJ{fKVL.U:k4K+E(fzz[!(T5i`5;E!HK7wPm%{]Y?$,A̵=>r"QZ%EȄiFR`ѡ*+9n|uln-2ד\=9m mmT(`| #X]k~l5OKy+0y[mD7yww)xx۝gxhaɔpC|t3ma0wXTz0=Y?4Lw7,Sj_Y15!M<߯[*x E8bUwa8u8ӛИHwHiB1Bf(^I,ރx,3SxX珌^}Ȥ7З \loiP.Ȱ HYG^M[EZ:WwW&^_ns8g7|@Gz >ޚ8B؛V {uzH Ѩ22'ѱ*FixRfÎquka?:]'1UI咏.cu$/pr!c.gRW~З~^ͼL"G嬿A_qok?2b??uak>@^ql{}4;{"ޒ{Sy YfcfC!gcwtpl}V&Հn,M8YyTLXYA 5^%U&l1ٿ]E z "[xp%N5J>8\k#Ǝ5FjUx;{דqW<k 4QҴ1oJvG"sV;+\ڃ 08Ws%>$ p{NPn7jӤ|/0q,_nVoaìENڝKW\a~dَLurap Pr6d˖5,A1)Ձ zߖy[ytRnlǝ)-~_/8~^){ qp>D;[h숯|lğE[s]&b/גŹ7=\uH]H^9c.-w>{ݿ~.!j >S+QtТz2bNRbJ6Ŵ7'1^ Q[m'W" p2 KA̗E0tʰH /w9r ?m€TYDBpk -g{[x 'N$jt_ȟC=rLW{noYfzA8#4?8Yte(5}5S-fk|~ .ƓY4?9C#f IW/xdA>acqLMGڅ[I|hg ZWʸgEpT@vPBYԥ^d"ѩ{sTJt;ԢJu7bbp,wWXY7<';+aO⟢[Wm9m 4bZ*Eg-h@Y7⸫"'F4»v00gx17uo(5@Rܑb?M B4_LPwW:M0 CA<1gO(`G؏&ЯY.'G+I{Y^Wz>>s΃Pԧ}:-NTuLI# }Mԁ# )Af~Ih4ܻ.k(CcE3FvXeE`2|2BcŵsIHH^e?Q5\G\T ULkdo峿/YrW.r$N i3b'kNීe:1klt0|-%o717i0qFu& p&QƋ:\ѕfSygwf/[2_*4}MTiJ*؝L_oL>?4Bto@W#) BVZ+h`]Oљ|-z}|9g}&Tm\7re Nv!Jja(3# MdYR;pGOL$b( 1*D!/&ka|)j (sz v謊[XeY{Z/KHχrvs4VkbYUIitia4nQi)vgROZ1s\*wI뿂CrA  2Q&T[?+=DAʖmQ ~prji@`|jx͏ֱbK#>?\`12 ;2Q.Om&TߋX+R"W8yxu"=} Xb6E~BO6{kJGc@wT}z\ A}fT|GAjI=#}&D+rO@|̡rރ_ F*9+Ac[^r;VJW0շ>BP^-l1urM=LQ9A$ZگsL -:]WOyhW9VNgagKn7w^s䅢v7 7NUrL~)@u8+Ŵ?H N\\l쭏y׊8{Ugp,LH0yHG+#=m:S0ʊຑJ g/CWrL1f:]n'q fp8B[XqcKQ!( _"T mc;h*O-ঊߌ7͟'ŘuoX1̪ ^e`nRƃo۫- fsU( +QrFmm? *2D4Ì!x+۷1Lz鞩.Mx4hG7uP]64y}wf{=}3y%dM jw.:hJi46N`%8C!kUͤ$We#d&x峏, y,/|q_,n| @ldLv ь3,̨0` Ivt)5gPPӘ$ #!F!tt c 99LcwLJN~dSq.+]a!jr5z^</Qf9޾D\ua}jNKR #nu;JҏvIK-$֜͜iύ>@W'Î=^.F'wo3 )Ǧdf; 6ï*rrFylNM6NC? -XUcw!8vV>*GU9 9Y6<]n"͠Ï+˄A`*mԼTmq[dZsJn0,9 =V&[{IcrJ_D3#lT-.10<($ES:Y%50(w+ͬ3w0Ө{8oW+k ʺZc Aʙ 9xP—u2{dIzP1kϖ%.<#ՊdHU% ħw]r9EdYcgq/ lzFgTcWy/F1_8 skw'她EG۽㧯n+D1`7-%"=%TtxG=pNG_Ԡ NΩ}XA#scJ1`֝tVWSY E6Z "|ls,^6"K\q;!uq~2u#4TӂWS$«\6bttƻcܫA1jq/dD\ 8rX.EjU\M9ksAVr[ o2bo~=Gjdt)ц=.|Na$X;LRK@~aUڴ(d>mfov {VPz񞨽[/+xN3P.ٔp>ј4Ak7^:vG )M^ 9/lHa,T~(A+t_Uex}$2;P묥e 㔶X)^OC+zNCCJ;KJbBm:5VqD[r"WѦұmT܈^ley~TJ^7t1pNkA/0)ˍeΓظVY$IR2d2{MAH^3IӐwW_\#B4LN(:$ Al={*Ji14u[fW##ukm,G<9<]mlq?>Im 'kAͮ i{$ӗR!x`x6C;qM:/ @ lVL\`0*3fH uIf@5%k*cJ2G` [JhgM$]91rZC2OoEsbmiKrON0<W!/+m]](/X!ʇ]jyCȳxۇxB}-۔ð.0<݄wUP*z# o@B:Gl˭ $f!kmԾGS#QHsM(۵)[ޣ y#2-+0(y뽑_~bsQ-i[S&P>Ei)GV{*X$B׵nrsƛ^L+vf;[$BM)U =wS '3W)7b=6w5¢ڨ +Ge al{nCOk+*i\'[E5v'{uo-1r+:D=]iv_%DZc~^5nX@& MZF5ᵿj[ L{*|oߜ{M x;lnBU˵ xD>5nu~ O $ǛHW-T EI}XI1Tfݠͳ+JvX%%@@[+.L,Ņ3?I,$[zz;zhH*zwdgHc )&/wk: ̻J2fx`$^ (G6MV2, #+dc% zڊioYɁ4`'  obRW]bm)e}-S Q`e7&9S(95+QWU8Z} _`E,{$GRXS͈nݒ#ՀcbōCM*`q3lIy19@tcR ym Ŕ)nW)BXNYEo`H x7Մ 厗$d],: QD*0C"$H5&pq䖳S 1VGg5)[⪸",R}²D@Hp\Ǿ2{=W}3ro%K*;RQ&}vNrOZYV-/% .jhtO޽_Ea^Hї{ÔD>1r"(| %è"`ub/uTw/ET.D#S"a\|* Щh;,|Zj_Xr Aej*/ʖkOZ1[O ád>haewarzzaTӧB $(g]NӹT/şNW$$`Ӑ*& "e~l$juL me@y7yL@<|<(/U"(+ګfm1;PD[VdUG5"lw~& gдN!f{]PiE5ҵ?6lk7Zyf;6F#Qv9{3]_< {3{)¡l(: #T*;f&U'EPguB3o Ȉ ̢,ɗ6Je[)|ħOôHxcG:.Uj T3/}يUm^Zy9{0 2+WSt) ƋMX,ǻR_G!L( dZӧ2 1ƕ4BQaA !FN LxMf:7Yio@yGZd~0OCuV:9#=[&?wZxm|MoG1C(&W{u*"׮!0K?ik\L*j׃:yR@;-$VF!L KoJ݈hIV+C'ggX9-?y#tR3XѾdgY8jz(Lؾm3N`<=:#';(ѡJxgsh6.F_}lsdfns\1̀2ri4ҏ]ME dXASOW8w{?ꐟO,,!Li,4ȇhJ޸j/k szs,hi:1# 탚?,P.D|UcL3C YĺíT?=~j2\R οp%inhKDWȈϏBG0QS[V#9`&B;;(ҁ O("&#uۏb͊rG$xj|dd1r`$N?_.ǯ#?Xj^E\XJA+C"Ha}Qoa c7^t8S(B҈`P al흁8ίxp7F:ڕ,cliV {PcnY(ÂDL%k񇫀=ı^QP(Sc&NJH`al~ s-ृ6z?ueRѺbmb.& rw(u(J!MIیQAxM$_2h3k;g GJ\öّjgDp $Wk[5 Ƚ@T >P$9SW4ʪRԵ +!w#Z˫P <%*R9^rla^I$'@BMfL]M7$ş}dUoAdS21ٹM]ZQrnL8Xt`Z0LׄH0RtQ!J,cc)y-]So$Przɒ5h[Cپn|l9%?:s?֤&]ʫ2CN3ηyLj?Ur@{RP>xVTSafVd~mrX&p,Ը|}ϝr\P y_iFHX,Oz)E7m)[CLc$d wKb4 rpܫGeNٓ{Vv€v Ӱ1WCnVٲC%?>>J:q"G'Ko*m خ}S4|M%ZI} K5G-8j?v&`|o%SI|׷}5^̨Ihsu3v+TðOZb\ qd-ofN)v;Qk%%bo!~c@I▧[,Q^`9q c4EXϤ"m!]MEEmtvYʬ'6Z 94=Lnݨ5\|-&P}qږLOvoop.FZ %c@ `5G8F3JX +K: Y5 b :SeZz[iVHJ0 (51;W5.2l=/7O> dǫl:<5AEoC+~ZjѭEzDZ݊Ӫz5D гsvxH̽Q*|prttW~ztDo.հMY+yq$͇H.R6 iD N>-''XBĐ:ܽVyx4#3' f{)_iI}YMd$Lb_xQ:5C=Uof?\h h}n jvjNgx, Dz5J7?Er zrah8WKrbX fsO5cH7wf+ ʁC+ s<@&@`>Q]B) u, ~7צk~<>p`aN[Ġ,mTfo57Cʝ:k4k kr_;]@M˿ doB a<* 4;ks{pr g39+##D)-y \a}릯dJZ%O*V ӭ`LYu$cdC>Qm?k9Sl|PDf]iڰfґpVA ,:@ØotY!v-VKrI0L`@Fݠ}+5ݛ2uQFv?oa'܈]z #b]~/Ӣ#@ՅZ»~EL+(`]Ny'n</Ya#նuR p:ջh ;=4bɥfUo amfhE&"(#{M‰˝HTK?)zZ}=}!^P?;LJ7Z77۶B< Afթh[_z:9N5B'mΗhjfZf'My6*)iK3{iѓo2djxfG_bu(ŝL]wM"la~^Dօ3-ƴτ"MV#ۣ$qG%Ύ}uE4-:@0)όvF yJb]LiY]2ޞS28)*M\gl/0 s|h*j΁, W #-贤-nE. H^0!f:;yIU{WFDٖM-6;KaU6&$c \2avʬ0tu^o['_kŦj,zC&RJy馘8m'1z>΋If<_+j-D ʛi?#Ltu"`Xd$;f|wHz`ZP'g8sOY[xꁿdVJ fճ(˙ASQ|3*ٺHYjRJIy܃_lo H>RDH˓6jCY[W}= ͐2DN-% o/>*dzO49ZC8*L:HJ­h}c3#*+eXHE~10Z1h6s5U'. u9t*] qV̸Q?S(_p3${3|Χpxp3+An $Y{;xΐN}f%IǷ=]xF͙a+֜\}PNdcPvnB|L2BpphkU(1K.@]#)7U\%$~䰈o S ő˦U-%@XjӦA(&̉T]4:}N9sRckښ5lKʹ~(vDHBXt$tdد\MD{%$ԍ>@~A?v1DW++E@c6j:=yyУD,DJ+%7ֺ+ X4aZFyE!OZi Id4#'ƨƴZa6}9s<4yvAupՙU  Fwc{bYvNIH_2+Zۄ :}dr|'t#ji dfMbB,kV-[IE>;iӠ^N{W(a\1<0Co&!<0x@nLjic;鍱03L-3u(a̛KN5"^ , hhQcBޞLH[~|a!6)[y^C:tfq[L1Lwp2dy^HJ=^<v̙0.yҧ/c }oX-P\A^aCci+1 BOH rAC"Ĕ?&9"7%&Qx3QE37? ݽgI;7rPh16TE+:FǂF+;b=?#Sfs~gc Er *}c?+!dUӥ(/" ̷4~&0W{%osHrfϷy!!_s+[Bƈn[[[W/@D2D;7cNᬫHˈN^t́p^BSI.y6u Ko!aB01_74L<0ܔV)A)EaNXߟ#"\RQB3G ˌlĚOxPXKԊ.2^K&QiR7 _޲L3{ n˛$>Flj[ }y~'NHj ?{3 єrm9ǻ.Tz{=o=܋,߳Gw*7fD82)6p CyGN$  %^0 2 qc# iW:qbu!׬C (G{߾\گؐ[>8V;2u2,w-Mpӧ/a̤Ig6c[VvgTϙ.>\տB*Exc`_U>t RYj*Y;]ORF?؏K$y#)^akUãV]!nz_xHѩ89֯[`G yc;Y ̉m^} g_b^P~zIΎU(EIҊހ&b _Yr MtƲlc85,Fr@vP0q5Xh"L7 /V.z=M)P rS^Y: |$T`qqTMAE]ި ۡbK 8 1)Ď~%33fڽCOloB)``a}04(`e~ jtѐC3 2+34T &3 JӅ=2V5ץ2#C^q[B# U')cbPm&h8֕ ='<"V̰ 98]AǕPgâ`ž&fJyûXuC׼WӉz4+xc4Ej!!qv궟DArZfnqO5A 1USC{oC#Q)d<o:~,5"AsϿiS XbSouP):B}N'4JG!y8aU&o@lLҐIC $ 2/3PRh!;V>#tCA81A]X(ƉSmoL5΁MpVfLý['ʴvEߘ@rvu#ZR\瓠Eux+Fq1Y!Ex~n`?{aCj*Vzlכ'ՂYa>w"2yy*{ޑ©F?vOTu;VƠ ~ `.(ەHSphbz.o:ugّS!ls~uz8''Mm<$EP<7[Lx U'B+" L)'`2}\ׅR%ʘ$PvjqVx>$NWg(VAۿLMUq1 QyQV0y]G$ X!,[Qψja #1պB ]#> R ųoDl'U[ rƟ mţ̘khd$(<%"s9PsL|c˓Iپ A*ouPwdDkG~=*26uQj ؾ6Qwyb=+zE B))&=f_PaO*\if?cAv[𼊳[(xsO8 :k\E+n^-,g,lMux@ #w ]K:HBI1O)pKcҤ<~Wm,xP7_jkYBmj%gx/<^Xξ;3ʶ_/!萱&_ 1)OԗlDҟSgE\8?ԅnwRce>uP-zdHh'AB0t3:z9!xOlra6E0(/)X4\ >b-"h"؈Мj!qz ^xo[2u;Xcr, @aS,6ӂTK|ضp.AI Zjk3`u'_^=8ZQ0샍mE ^!?uf{26~cɌ"2Z-2p86ȵ`b~trr^ᶗ-:=cOas94z[_rJu:Q͈8l7`V["8Wlclr aWv;sMje =Ju]4l7{0f<r7AQ$amTk_$?]u,[+)r%1H(y JTߞ{1](>TmGAŘAU8s4Ky/~{0|OR.HAۧ%p[* 5%z00] Up q>E4}L a>ZoOQ7OErJWA{{,~!xȀM^׺lSdDZW{ռgvq=C=fIjP9kz8sjTnK9짨M?ϕsV5)>;Gpp96nU,KdG]#\2I^6{e!Mbs_cyfM#)"4}ġ<'0~o(WAWOս{ExC9 RqZ3dQGMR{ddsTR>lmh5C'V*Xx5dv:ed[jxR`F~v*>Z%oOOZ࡙Ҳ;Ot@F"I Yc/̪uA {}HOl%`!hp$Al^JXՐ#t,A=3֒FἙl͕6@UUgB] lF8n ev,ykX:Y=^Ng䤽Ul޾$}ze.ۨ2N,A~j/(Gz]h8VIZS8xHDc1\*5ܬtXs{3"įfChoB~L+j{mj^{KD%B-l/$YM\ ({]6: xMh!95~9Sv;LxљH]9mI+wJ PC!1ptVJh Kq,sn<EUxe"$ŽQsi*عhVN45Mb3ls˫nQ#Q#^eKu]r!6IQ`aT#^enYqta K!{¬QmN jР)n ݙU׹[p~B.Ҕ)DSܐBFrn/譖;3\$kZc,MY_at,XIʸ7'WۢqGJ^D9XERpGdWs֢XP/[[_` ej2MdTWUg҈'6_+ttKf+E7LOJ9$]T fbAh-j^֭RFw-Qȉդl48^y]Hf.pi(_iofK,Nmflox\ (KK۝w0ym\ؗ>iPĄ!\5é҂:B*kArՐAmic\D/G ξم=KKl&hz-U 3eV=zt 3d(j8Bxt u{,((◑%Ys03XDD3Ү}Z1J~4cDjs~ Nz+ \DDr3J^\|{IxLwe#I+ABtY- ߭mdډ=YٝL"aNJܭ3eN)ڣڧ.XO xc->–-rR(t0 !ۥ<&cOHjυNӜ {k?:.N px͊mJ-9<6AjV="A b秛"'&uY־v%/65^Eы$C |=6㵒)sp&Ey-xf%0Cc)@  :T)`ъOii4ʢ Ow1wK5;}MA3yJj4:|k5,^c/X@}l@ L`Jو9S[IӑLʞB?Ux G4fr,Xw:ur'w bH&ĠL%:l jf*ed@0|  JB*\&(z.a,Vς6dY\׫S*)4 nKɕz|ƞ [*Ufj!j}Y3D! v><P2gDZupoWhx괫gZьD+)H ҉%E! %oC6( cBjpZ':_:Z K{VlDkW]~Y[\^ZW7\PSq%Er+tTx[ H6eAW"N9pl2$n+4(H;y׻iih.0xk=uF0Ɍ7q/-r'*&w2+&ªUHd <yLB"#1)Mᖂ.nfzA{W*?Se<1b уc^e91aLRF^g_3WP*^!}Ya]j:}qEп0(Bmxt`z?asJ*ǘW n:A*+&9˻ȋ^J/OXxognJuf$!-ϿRdp<4͂9]UAFLV1<%a%1XG#C]^~ r gJ,i<->\Pd>W 9#V`y1_QQ*G̮[0z4hD ZM i6$!ezRI# }Q@(ؼm[/ #"Ƹ]Dψ ^f&&BSjY+ukirhCG2lJ6pp3. -`/ۙS ߪĈFG3j)>pF+2_8S~ 8ZSC)M7dA>ı{{ӥ;2e7 d8uK{Ⴅueؑwh:u%M?H ?pܺv1*rbB).b.8Zɲ=oo~ ȫ *+sp;(I͋A}xI}Utrrl"UZ,jah*@7(f M+-qIfL7 RJ-ͯ`8/`L؇S5[¹UT7o1pim/D$Ec#p>ugPʩ!Rӌbd؛*&0]C# T5(j!Pb"dBAt7AJJ˃mH^8>1ZH/`Kܾ1h*ʑckSkȺ\Yq8cT(X9{*x8o 1 Hٲ~brqgGH%7<-amb(IHْ{Dei^J> j?fDD3/0yi=}(vV*UتsBQ&"ׁYghc. .&V 4NV~]AzNf,#iQM`z-[eO^$Gy7;|wEVMQ)0SiӶ&m[n܍g`}xD)>jY;fA\`9h\>{ۖiFtgL2hUâB-ourA!;Dv, =5 f$E eu/4X?A[N_`&<-b/x֕wW$΃e\G%}e\":7`Ysy-EZ eu[u}qN萍֨ Yoa[^ܣhVDƎ h~?~NHFfeaHTqTBpoav7?c`ÃoC)92Syj(,P`AXA ]>ϩG8QZ $.@D,ֈטBJB$O:Lp)T]{ 0)ldԦm@^,:Tw`'?L bZ$lZ}k0<$Da꽿\^\7<S2P鎛1$h PI8ǤRgbW|܋*DhD2oaap¦+2 nMM1vɘ5fˠ@x3r)F Xveq-(:aVVonlz:lAGI%< ؛x4[>"`k[-W-(Kmq++,6h\ͪ:|,D Qi6Vdsj kbe0P5)Ǧ '[׆$gcC!pQjjH^]nSn'pˉ%W^7f//^kYSScq=:Pt @;ЗGmW t+ p>7?v'7}$Xe.͗a۠=;f̰[s}˻.+ړ[$%7>]Z{2ُ FSdLՓ@aQPf|wKH;'~{Sk̐a9P7@4Za%lq8Dgu}{k>_F^kߐ0A ,羒lڢhr8 ,KG:j>xɜ2a~ ]0θݥswAC ;g!a?rWsű<ٻ,q}TKycvG/;gr37F-?:b_ \_9OEp^W=0F: 2@9ⶉU$y)A@܊")X96BՊ |jͤi8@x]U?dJ l2aJcλexT 9S,M>3/=9 WE?!wrWxBtj-*Qy+f3ǤY3{#pAF Db7RYY0NzDywejHe:qe P1C~F]Cz׼7lDXqچ@ q9YB6 88PZNKPzb*+¥oU!an^ui< Z=3X߹M- F28_JY2Xx>. g `ww"4KE"06W-g/eGC|zb(C7f\/JwڡSHAញOiͳ u] AR)(VIL>Zo}t=z bY|qilpZ)zbn()v0uM%_> L;1! :^m)$u@79X̊-U)T7eZ~`\q 9·2)/LgF!_|QsQ?~*! >ccn .EBrܜfqA:Q,HX[  3b]Yw} L &ӵA1H*EM*';xg {"1v#tԖKd?YPO2u}@9+bf;0V[.q04|j-*w/t8p0 ʗw`Ueݖ>pdT@oX|BI"6}P7&3NqSGhill0`D]h!Xu82"@Ag"^n;l's/ET5n9Ŕ'[lW} ֫ d-tC]17C4C 2G1}H@۬{R#4X޾q/яbࣱf e.u DGѳ{ja\>vP<ӧ* [+:R-l@+^WS ́="@81Ny,jCC'Ȣ_Hlo*"3[(IV>4L9pLT׍$Dա=ת[^UqywDSzSwa#8>٫%<,/~iik3|XBC\0^ JP?Ѓs[̈́l4,[P=-H(< Q(!AWbݝSZzZ׉+G"G,8җ;N[Ֆg-pKxCjA܋Q ?YEuKmQZ#N)U {_Sɲ*͡3vtuVY5_Xc6y^F>^w:ZRV`L1쬂XpZ$!g}75Pv?IPz 0@}ME@ΙfLkڧS gcǪDm0%`sGؾazkObMd{>BkϚ!.<si5f"Y‚EHίaJ^H S x=Zf.rR;&wnk@;i6pi;{N0kz,_a<gS/C/i㌛fG䊭pD'c݁Q|_c;hЗ-By.E`f&ʿoz&O4 uo ȂM6Qzih`fr&d괁?f,IgYÈs@oQW ֐%rA47~(X}O8;gؼ#:bWə<NCNoizDŽ5IԲ+dN!bVX1'x2>o+4Y,y|Il-ac*?G@xăe>@,S7 U΋O "jC "nIAE"OW˗jW[mЁQ>Ab2\yږw(pz 8x=+FԾgv4 Z<pⰼq̟/y:aOfƒYCh8\Nf ʮ(LwDM V"pAO csHB\ME<gMMW:{T4^ŗg/W~AT>oڒX\MGlq1L)*x59a Um"w0b=h!ٖeŔt9M&l7 H@FvZ&גXݕ͌i?UZҚ_D)qla1UrQ."wL6le~xgݖnհbIxl3>è+weyGԉ r.c+tzLs(dLV`3ޝ\,e|q ~ø< ; 8c$V>[ly9Vk@ TYr~"۽'w{?Ŝ:UjoﻎXo6_:Z.-|Sbvv]WBNɂ4.nx@*Mv ÐKR{΁j7^WW GKPhD9UXN S[KQ?/:jBBcSAzfdJd@e츧g +d4-I`C:BY5P'5\^|;w|,5 h3d]hGw`&-u!E DwHD[p[u"˺y|=.,];>ݢ: &@r{Vo2wL[qȧ&Ex x@ w>|; ƸGYPD7%p6@֧rˆ g1Lb%5*њODh#O~DƢZ$Ӻ**ImzfuBq (AA)OvP\ƠI\T?tR%nQ#Ue6Ik[+ hc28g@UJjo%.bg Жopkpst1Y =7Xg%V+!E8դ-asI8_R2W 8L=| "~"S+!³tG+sJ]Qz%o?Hݤ];B|N}x{SQx>7fAkXXGF|#ұGYezUIiKN yPX(3J ;-U NWHZ1XTЮCwcU)BKhqY2e\Pc GPc] - 5fqyXQ(::t򱔵PP_cӋ]==X[sgck^rIs;҃rhU%G}`еҭ^6 gqBK4=_Q$?Z(jkgM(`LXWN"ߣ#|wm!P<aBrM<ƦX55 Gk}OFcMVs%j*׵'q' j^i$5^z$&߯*ӔPj41,06BGb&ڜPuLOJ%}&8‹1t$= %_%͆<[M5B͑e {No)jqx"xMAk4zj"ȩ|?T~,ٗ4~/))dKu9yr`b9 ˺޴t3sHWS5>I2D.02_.~{|Tkb6>w7 = A\X{h>4b s4&S>^ /[bxP(4?m;?b/YP0n!m C|7LgB*< O fd<THYRK `xL-U<|NE9͙DS h词C{_tskð2['BeQ,[騊#A39sIX?ZA >\c{kUjUQ03}@F'xFu2;X]x`Lmڜ nF+2YM6aC#tU݃ zM=߂ ml}Bgq0vs~H!%P|$>Nm;\HP'ZjĞYʬ=\;tt }^!QXH|8gɉ)`"qMp2֎%ީttM&s$qx kq~FHC_T2/>I"-(A4y1ZBFp5u{W,+;P+k0?y C*]xn(H&:; r,; Xgvj-FdMO+N &\{ˆjXL(SڿUT 'Aۈe6G`"F`WOF*8,?ߧ+s!f~rfnAV ڋ1֠أhy!r:_ؖƍJ !WB\Pͱ֭a< %TJǰgВ4R ӭ=sʥ?14X.VQ{QIG#M2w&u(%in4Ri /l}+N:4w/l<3~uJelOg"ݯYD7h$dd ]Q] >w`2œ~G(7dV^E}:T^SP,K8pv0{`Ďd_So*W9($3rSO:=V!H{ܔgK^xdd. > ̵)mHHGh"g)jߌǽ&uw˿ q'HVtT=!(PBo/SteWT dm0^;G9|z.t2̜ zDKXZg&A+{oU.@gnT>kR^3mH/7K[uX]XC6ɓ:.+G:e1- 蒥k"$q-I$[H-Pu}OiGGI*͵$a(F5Qɖ4 pNn̊bF;l8w}*1P9O7-b.- Y=ʿօ.huh25. c\0~j:Xp$i@3TKvLz03~hjZZI̗`;2:z-wS+<ţK+1k0+|a)`\u]\KY[ߧ:d DבHtVq`;AS H j*,[dÓ0-&C%uɘL>٩6.r5S? y@t&B&KT 7{:&e(*C6 [cd9_C `d CuR1^(i1 "g9OfR FĊ_>s !wl{5) \?SQ&7=el{Ì2.Ky6ogkN0iH&·4EABWvc:;[<9vHP~qfjQz3okr,9Oo*wC[d+y$jdБҜ̒2Iaz}5Pi=`VIB#CoX dt^=SR͟PEy- &״sMq%m]M _ 9[s=22%?dS<~/_i~Is-ǮV [-5_ Ej:@c4b#f"悥FTA{o[AKȷƃ5sFTJ5;d>-{sI:{R2?A\T )|Xy6EMfO 0_7xV*飦MZ4.2SSShlH6rU ݊z%C0쭽}]P_c?z}=f(qr>}bآkaj` <Υ6e˅P3*L֜Ie(9_wxVse+)gq^exK&;}ٚ$Y1,ay,g;%pHadҏI0UhuNO+;D%wy3!?q8Բ ED4Ixdkqܴ.S@6Ӥ<ŁHAT,DM|wB`9X5 CiĔ]IބA&@-Gr3\mQ=ڏfw8TYK2֌2Hv묽 !XU}fɴv=Mm#%G^A+ #V.s?C ._1sTKĂ.7xPJcpuVѪ}\˝g2x7',E~K'QbۺC,I4f"_zr#")]$hr 2E6Վ8S*^%{z*ʠJawG=}Rͣ%4k'/W".Qlu_r!;D/O6Xd>5q5w++^ۚU"<Ղ>OmNCD$^ z/#Pl :k!Tpڸtʕ@pW'Y,ʂ-U^E> R`+aA\m515ӆwhaXm|ǖS/.83MG35n!Ցd ^Qrá] O !ŗU7+|Ɏ+&+>e^rN RS%(?HɾLDp6-ؾAsYSA)\s#!fnPFL@)78hJax7I Urxݍ'ʣ+Gt5M|Ȧ0g܁eqʰܱ~\a^)qD[|&cwrڂU-׮uȼO(dZ+ư]72+ũ3)#bI\qZT 'd/18oMJVRnsp|t7m>nKDA8mK0tG.J:{nW^| y {8+%SN7z !M_ww~f+~fw1!h]z,DljG]S6W[+RF&#`׊cY ~lNk7vG^DZ?+{;W?xv-0#Ҟix55 k1 ޟ8؀W$$8Pa3`&yq9bG!BN pmߗN ',H.IC&?OZ %rU/^ڰL%lgx"U࿫)4*2iF1J UBw+)63EGʺ1ۧq 7wl_|ыyxthU1!~0BctOKXףi V[i*O{B^ {2Mvz YAm\\?Xoʝr A#cѮ\ocQ\@$dmc|Жޡ۔Y+[b"$sCu69P:&Q&<Ļ+9Cǁn'L52NQ&(7B{}Ҥ*f҂SZ1RPzTg@r_3(o9ȽOEKsFzY!<f%3haSvZyٲU'גzܮaf'ti܆QC1?xǾdRm3r&|:l^Qkh>"Ӈ/Sgfj1 MvjxGԶ~lI4xlZzmGY%ӺI6P\-|170{ѷencM@R]<ܳv'@%72܉R\{ˑ$ F@6vD2fB^SrhW! [~'LU1xh)i /J.ICP. ٠0BS:WWAtlL8Z x+aPҢdDkj߾z;0W0/cjxUӦ9&G w^"LG|ߚ. -= db%𼫰5Uo5QnϪ4h]i]b_;tZp{kr;x0d`4i|@rf0)Ak=UPmꢻ|Yn&|caiAwP'TR4E. Vdͅ.J[|6t!l/ϵ책*_7MAd\[QU"tHtթyn?}wu8urHMowU4zL Ub>Z<.xTX@hBMI5MaJw#*%J%VAz~GʗBRQK٬Ԇ*@21>.')!kCT~9;FoDXuXxn}Xo*[nW,gэ8ФkDmdRM_˗;0a<Ш_:P57կ#L'OBpl<;@fƷ;.|'6N8Lk3 }^fed{&R ǡ?*4GJ"NRIHR+%BIcGQ]`]GS^1{TUvW: 0}Ҳ$w !ӞĀlCgp}sI|e/VxV`#ĵQv!7;\=KSv_˓ it鬉e>CDu=5\Hn0G[L0]|}uwvM<RI-/Bu6)K@\gLY W?U2N)Lίc@[-E2 Rln9 9(e5_T:b_G˙[$,6Pz"|։_Y+<TdA 1h\H##lN u뛵{D2>p+MdR;/2#J!F̽9*]d7_y/܄o5_ @)w4篳E6acn3[aI,Y@-^`l'aξߟ^C?&SLQHjtTWy.ROgzAXjVDѠ㟢UkP0;'_#9VCv~ߊ, PӴ~~kkxm!%4}mRmv=}cTX֯؇S+^ᐣ0dW *<ci bѼew;ǼXg|*FH•[Ƴj!dPp뎯K:rN,Lߦ, kWƳ9 [':6$aflwGʡ5V*I#diI'e筤5p"ł#FPx޳MNG9[Z R%sxP~z7Rh!&c/S5n6/< bVN",-ylIc޺s/"1޷`.zbE5UX[p/M.ы&Ru/E_DiH :22FaJR&dУ D8=:A1{6~;5as;'}Y'ި({@{q X/+H^5ݜ`h-@ol;>v#5CK)э JQ45w89ln _VI0ZN&#;λY$[c0]}ssgp8PN[lg\C^My/ok%]MJ o bq #fN67ҀS,! g:WqmqvNh\}^ i NB;69OAƝm{7UߘVM%{93=ULf\]Ƶ%1u'D#vb-U)mJ1z)n-6һ)|q55rHMRy%vwXǙȰ'Ek HдZ3" }4ƒsde|=|,is4F੢qBsLX*-j"Ӗ%wQ|l9ENo-e/yR ))tjH@|LTt~ guXtU㳈UNllXtt׷ӑ ? Ny. [+a7Z D^;dqGnEUlilY'Fźd!ǢJ1'H.@:ҿxpC6j+lbπbb6ÖϴY p>jf9HKkʐU}1uCyRLG 09 Ds2g*/xm U*3y<|28.>Iq6fpPnV>?C#ϒ-X l q[S:4 pCKc5ZU|3y=ׁcB+v"`+B?Hm)D<>*/"b#!Pno=5:1k|\ { ờl@Nh ɛr6vM C!>-E]d 7ɗ@X1xb=,9~Ld[ R9Ps)(\}9N$\ByAgqz\JLyH?"BY%돒5 ͗״~J*.;uս 3S ۪ǷD_SؼW5$ 89[F]Y*N=-%GBUHr: K# ht@uc=xEuAb^Dlbhu7 l6pCY[{7WB 7 9^=ҏPwmbKJ@`wQD?;[]=>||:8"$Ԋ#jV Cz j{|~U<f:bF6lc9 bb*7\ʛ`N6A$XjO:{荪K'BC"GvmaL[)mLz,#w=]b DR]S?"T%-\TnVıd{1;1H.yJa72ppYs=ЛoŲN<ܖn۠l-ۿ`]>O9Ā\q,."-SɺS4'"7w g-LȀ]·5PH:=韪70Qrt`ݪ'0ɛ`meWJvTm۰UIHt \`\]?G7Vf 9>g%+ϒDe9WC<9R&Qݬ§$$.\- ;zmf.+B^Z a-afSG~Ao q;tIT:c'w$ͬlJhgjƣm@5(TIz'ƐEﺮ#18| ӦFRPL;DFyzmB VëƔ :>k))}gUՄ`k'#oT7#4ձ#`P0S91IL&[#!Z-= GARXx39u%:Ԓ,MA-}.B-ZTA^>3!T=EⶐG+%"m`K -G+z3|׻F}DMVw{Es ؕA!P)IϘA=^ְch/re Vvy4bv!f5I4z ْ[D⮹xw,OR,EmWm #3˟ڹiȕBFhc6]ơfC`8\B1G*(*~zTa72l,?PD̐%?x_*q Z]\v{#|ڝRlS,p'HG; }暏b/`Mfh> |E} 5t#[,PfȬNcy$g=q?#Q1 }%Ɯ]W20^J2kE3n@nß*n 5Ad9т7GextKː{aC{M#>ͳ A/j1wשEgCh ~hCVCCa?}Ko8zN%gβr(tiE7˭ft1ʂTMkJC¥ =@@>Lm87]O>VḤ+rYAu7FhrAS-HklOpFTYD)0@}y#Ojcx`xqJA y7v6 Z喩#F\WE!W iJ}%ƙcar+Q^JAph!!5SL ɠ7WyvW1i&ҥ):[Vy[),mg(mEsaV":9~%&$Q*8B:VRo,U#0`%/a(.ԻnE$sIzU'>d9QKyi2 ~1X`~g  +bPnOI>ˇwtV#wiD( N뀍R䯅4Y$qN c/͗at5:-5oac&kԺhcX( 3h7DGTw&⋋'q*\C L(jJw/9=h3x@7 m;=ㇿ\;A%TKo'tfKY/Q:U{FAPR"[U¡Zǣـ| 6 Fc+:&ʵ~`ipK7NA͢g4rdQj<忬$s3 ^rEui;PFt~|+̻ "* h t~C#m(iprt ]J/BW+Ī}IJ&:Æ2AJ!Y`Mk2 cbRJyTƃ+#"NK: ynl YM"AFSt$ ?xlKv0Tw iġXq07Zu3sWjU|R,rMJv=%ζmZ"0r9!-6#lvkġ{lzZ&h-Ik/ŊT媡^;#wFVr5OL {e6ۅ6BXj(BlH15:wQZٮZ썯; gET8|w؝;/Ot!Em3yݱmfڀ&` }Ģ.{9"[/X|C1~a#ǫ,tB 2Ǭ7P=:d<*qHq P5?Lh{A|qSEUϸY@7Mg{]j%4$|ɂ3UD{[;XVL0P6aW޼6LxH_`޷? IJ[Ԍse@ۃɕ\A:q>9o ;(Rn4Ř9gI #< 4F"7ݞJUEy6#;+A?[1N3].E`!A0>YCQҩB+40g1|`rrO#Kf'۸exvF-YaL? bJKd *sa |g$.Yyra`|PKp7w:b!zeQ_|0JDbK/6n 6k~2}aW/NS@|A.\M#G} N=_ij6lnvuR^=Oi !͟y9Zqy }TmXYn 8MIvC\6KD4-\Q@h׃v$Қp"EsY sPхM 6Oj;sl\)Azq:mx=}zНXL@Yy̴#@Nb8)J&>M%K( T,`yaS`vqd Hȗ&as }3ȓ `Tbp2q'X`뵒?tJӏaLx/>ddzҎ7)˜,0GУAk w)㸩1PeeG\TtdhO{bd iR-Usy~S&D ug))K[O@Op ݯM)T*\d + j(l`F~U6LyLQSy=mUtoL}o' jO\s j1&DSnSmlf Uk>u~K=59:!ϙ' /[|s˥.(wZW ~٧ڲ_ԂUGr 8 EX^~t|#鏦.qiED\ћ !`GwUڕ ^{A(* FS`[g.L7V |$(t2"-t]~mC庱 Lem⛏A5l:+ewGb=0sk.MU+YOA5){Ƶ?9'ۑXt ۿQv`^ݏvED.찬ȟh:_xq>gcO~3cdx96\Qݰxy_I9~ǧRkvib,08 J˼wxi!xbI)e _'{-V$MbsRjrџDjҺol_xЪnLˑKI鴻`܍K\|59^ RY[ZL&/y^g}SDndV hXg@ڊ`OaF mqOM~Lw %?Y8Gye`Zނ6aV1*2H3d7PF=bZ/<8^t_twMqH7QElt+eln Jt78Ʋn0 3eHg 7洰؋񮥳Pn?\ĤŞyG,>z0HaLtˆj6# &Ús oQvȏj8dΎ(뙳q#qhOcT0nj 3E Q%ssLӸfÄI0Ά!VU]yo˫,C 88aI:yhLƏ |d~K/^49vݖwԄipǐV\j+K_/2mdϧg;XS[f/Pְu`}]u!+ lݎLB WV0d8ȣ?&wjqCGY::挠{U}sI6rCya`Sd/%nbdXs_ 0#yIxΥ]7*HL zsfcl02ĩ kK E-ӂ@:(5&hE0Ee"8W'kwx ۡitHE\Eb૟#Ck9-)Stm\hپ7'qn]weS5oq|co(B;яY  ѻp 7<هbuf&6 c}QJ8 IԫϛjwЪy^ފP7gg\2|kA80Tijc9,,wq]lvwLE`pgXX0y7o葨|ǶnE_2O3t9[MRTp(:a"oѭ4nﺛp/.7K6E;"(5VkD RݡoW1鄕.@ |h\e09G^|eКowc| '> SrY(B+K>?6,x%nVE/WdD>< BL1J?hq"Ai)* 1= e*#9>8w]xNsHy 4n{naƌe̔UcO2)cyo7b.>5sstj `]*̓3q֬/@ȉ>_ r7R'r8 OreN_\)Ӗ_Ø2~-NzBBȦm&-Fݣ80>jR?T{>\Ug.o}eu*N] #HswOt歖V5F>)k-cF?eBO"=EM^ (>C-A sĕm5  HexK 8xs§zkyamgIaκ{pѢc8؃Y!llrvTĿu Akr{w{HqqsqAR՛z@Y\R?6?{'Hr98\LQ5X{\eۨ?bEuǢ~m' MSKkqUg6[cޞW%e `˔_<)*,C3L'K`&ʏM4:˵T4ufF'1FO- Ӌ.SUA*4MIeyM/MmO(G˝}B}pɑ6(ź糕k\=Q0=#OG=8nIXq5?EKJ( 00175'l䴟c% (uQAQ2 x{~y՛5LfSU*S11;лy4iH܃!L"oPس>3$ZӍ<6CU^#fm5ӻ@̷EnwAl0BJa^9wp4rXA{tf {{wA(Drz,sSdng'3>>[6JoGW5W0{hN`~2eGuP%7*#.X @3K4|%u]ʲV*5DF/\QKu!>ܧMgЯn'||C8̙/ʊ_tHy5<-~OPp19pge _wڅ8c@}]gޑ;QĽ VȊfs$G`դ5=)q)#TēR#%|#;=>eֳyFuWmKj)tBZa&Gӵԑ~G\!DJUvgmcaPRAQs0e$!<59~zx+uqRC~>& n+ jySh1?g\5 I;&#d:jg"K)MYз>f,vV̂'$Yg#0^U=Ϊr? \\(+Jւ(ۼz%6|UNİ%}i tL Tt[-ɨ9ڿfPA3L6@Hj+'N!&yrc2[}j:լQY 9&7̺1õƱāέ"^o?*`s2N!TV }+2xQdJ{'&~Zfu±;qE>/SX'q/G'T!K <ÀۛZP8g^l\sb 1"ͽf﯌aFN[HBz)z3$ۋ+:l1! f(%L1 Iςq"1 bxE▙p3>-b9 r1-n98&Yyky |nJtw-4{lq<@L,/wLq($E~*Hcgxz!y75@ڭcL€nthKN BB [p})!yq tڍLG"A KYK[_Myrp"&4'\DWnev fs׫['7j}Ig]v+)$\;xǭV=.[@FV 讈o@KK3=f fXQ3qjN}L_t`QK;2G"gCMM(pE03f=xhcZojJe^Iӧ> ,ѲVRD j=ZnܥR< l |!'~DLQ|LGn_Brw KF"L75V"WƋڻ-'\c! ??)[_G:.lr)r3@tf6q'ɂxm,Mc:þk]RFbv. z -*&f+=tgF)mm2#L -$F ySCMjЧ[]WGŵ`1Z|`/3g)2ۤ.=n. +Ve|sDq5U}J3;iʥRddbA4s#=c8fn|=:4З`ߟ~peR0d̨#⒊VǦh^Uy PnHg*eJ-J8(.r$O3ѬޝtGL˱9ɞCT!L-^Xmz[DF G[w~RՐM,ڲg.#%'cmJURwPIo:L'Y%lXdx7T2_ϧrV^Q^nG*VYH$)ol1KG Hr<Ԙ*z)sWFؔZ?I 7 vVI'/?i:sa,,V\3IY'KnG}\ +bBkmt,HZMTٴk2 `Te/3l}fye':'#rGk=6 +z(}vpqQ- L?0߇JiDѯ.D@..y '{ҵujgW*IYPS !㔘V3f0ĚݝҷBbO>rOڣ{˦?NKL) '^NhV3({ъɃDuFл>roOAG3)V籆loɍnQ@eIcә疚23rpf_j[E|S#Vf!vu |zZH]-Zn.֠y'vb>EW yC,~VʺDI/M+oԢ8篇4zۯt&x(۽N# Z9) d&1]Qw<1mָ Vȫ_a;(x9TУI* xBR(UBuƋo/A"Ru2tC]q~f&"qg|دh$ɤ"dz FυzMQ)g N08f Nd?uG ^Um3Эݬ^rjU\r+alʪ#P!:)QfdW*[QTqtBb!:Ϭ`Xjʗd#6|\9B߅@Z d8~&F%Фhz E۔Ò4<yS/A[+p%ɗn&_MaVG춊EFyLx=|ˏYϕlFA** &s5saImт -ΤFƯ?XtH/ ]g;Rg2NQ ͒#Bu2PIfUssq]ަE8St~sD^>*T+37=e1W 9] aUOvSGY9?28|ⱄ\@ǎ2 @p 0`]חL 0i_Kfnw{y|ڣ~Z`.uE%k ۱ ;XʕLJ*T%ጺ &=IBbߥ:?w[x[7C4< _V k[z$R^!|bٿ,?(Vp d;z.J(4U'e[?چfL3Ȧ>*#=6V|lUmL?#M,X]k't:)qa7݋zz|H̆+.-!dN)FK0Wurݮ#A|ulsR좭Lt8uܐZ7M2"HꡁRၿb8ҩ/)ŁW!E2l{pFYi'cCeۼ#Ea7Q0wqɣ4ׅZ.Џ0.|pwXdT0ؽn~>=XBvVgVVqi#fLc %ܫ# 3Cs[wGCKJ,.ȠZźЪ͊ͭbR7/$U^q~5V^T Ѭͳyt@7ELAqXgXAsǞIq'抋Rk&SiP鵜)Ѓ7)A$Xcִ5* s,\KKA3  'k˞0a2*SabD8Y%,;\x0{8@ &Gs;@2*s!մMwyF /nD34 ADVfp~%cj3)90&,8Fr=^jė)׬>XćNJm/.^ |F2ș@"A\#]MA([,6^IG.N9#Q oˁZVlQ RT4zivfTODՁȧ Jn=bН 03o'XnasqLEmz4}6{!{1po}rt?ak6#o4>k|JZ)]Lz} C C 4&^kM?GsyH%C\6ZqZ75kIrnfJ?-ψ7 ?ǍR^UY7 ꕙ|XC? :!ikbr*Ed]?<6f!< p)!:?HLm\zx==m1ŸA/O夳I8y睗ƣ,x _&߾b$'6kDh@5uilJ]ދ=*k"]8e0JeH_MJIaUp.}uuGKԖS0蠋#Cےaד35x$y9G1Ckk M#Ԣ KT*AQ1 7mk9#J8AXVPJL[[z)2+'#1M R B;C̓% ={ehy(dc)a4rSW6_w ۝ ZZz>CtGӢ=u#JFP?tF(6WSk^:r ɭ70`G^Ʀl5h 1@} u|oV1jc7b94OB\usG$A! Dҷe|(hP&b?E?)[2{U:nXXа :DM,!Dl;2sm3!! +m*cC:`;&!oJr5(w"csWaw6浔BBpͩw,DF:l!3q8~UF*!i`idQe&FjIAt/J^n\a099;kq[A؉!"\-py(%4g}VSAbSp0PF}%P2wwOSa昙iCeS>m5(&-dz1\#V|#Y[