session_begin(); $auth->acl($user->data); $user->setup('search'); // Define initial vars $mode = request_var('mode', ''); $search_id = request_var('search_id', ''); $start = max(request_var('start', 0), 0); $post_id = request_var('p', 0); $topic_id = request_var('t', 0); $view = request_var('view', ''); $submit = request_var('submit', false); $keywords = utf8_normalize_nfc(request_var('keywords', '', true)); $add_keywords = utf8_normalize_nfc(request_var('add_keywords', '', true)); $author = request_var('author', '', true); $author_id = request_var('author_id', 0); $show_results = ($topic_id) ? 'posts' : request_var('sr', 'posts'); $show_results = ($show_results == 'posts') ? 'posts' : 'topics'; $search_terms = request_var('terms', 'all'); $search_fields = request_var('sf', 'all'); $search_child = request_var('sc', true); $sort_days = request_var('st', 0); $sort_key = request_var('sk', 't'); $sort_dir = request_var('sd', 'd'); $return_chars = request_var('ch', ($topic_id) ? -1 : 300); $search_forum = request_var('fid', array(0)); // Is user able to search? Has search been disabled? if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$config['load_search']) { $template->assign_var('S_NO_SEARCH', true); trigger_error('NO_SEARCH'); } // Check search load limit if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load']))) { $template->assign_var('S_NO_SEARCH', true); trigger_error('NO_SEARCH_TIME'); } // Check flood limit ... if applicable $interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval']; if ($interval && !$auth->acl_get('u_ignoreflood')) { if ($user->data['user_last_search'] > time() - $interval) { $template->assign_var('S_NO_SEARCH', true); trigger_error('NO_SEARCH_TIME'); } } // Define some vars $limit_days = array(0 => $user->lang['ALL_RESULTS'], 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['SORT_AUTHOR'], 't' => $user->lang['SORT_TIME'], 'f' => $user->lang['SORT_FORUM'], 'i' => $user->lang['SORT_TOPIC_TITLE'], 's' => $user->lang['SORT_POST_SUBJECT']); $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); if ($keywords || $author || $author_id || $search_id || $submit) { // clear arrays $id_ary = array(); // egosearch is an author search if ($search_id == 'egosearch') { $author_id = $user->data['user_id']; if ($user->data['user_id'] == ANONYMOUS) { login_box('', $user->lang['LOGIN_EXPLAIN_EGOSEARCH']); } } // If we are looking for authors get their ids $author_id_ary = array(); if ($author_id) { $author_id_ary[] = $author_id; } else if ($author) { if ((strpos($author, '*') !== false) && (utf8_strlen(str_replace(array('*', '%'), '', $author)) < $config['min_search_author_chars'])) { trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars'])); } $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'"; $sql = 'SELECT user_id FROM ' . USERS_TABLE . " WHERE $sql_where AND user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')'; $result = $db->sql_query_limit($sql, 100); while ($row = $db->sql_fetchrow($result)) { $author_id_ary[] = (int) $row['user_id']; } $db->sql_freeresult($result); if (!sizeof($author_id_ary)) { trigger_error('NO_SEARCH_RESULTS'); } } // if we search in an existing search result just add the additional keywords. But we need to use "all search terms"-mode // so we can keep the old keywords in their old mode, but add the new ones as required words if ($add_keywords) { if ($search_terms == 'all') { $keywords .= ' ' . $add_keywords; } else { $search_terms = 'all'; $keywords = implode(' |', explode(' ', preg_replace('#\s+#u', ' ', $keywords))) . ' ' .$add_keywords; } } // Which forums should not be searched? Author searches are also carried out in unindexed forums if (empty($keywords) && sizeof($author_id_ary)) { $ex_fid_ary = array_keys($auth->acl_getf('!f_read', true)); } else { $ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true)))); } $not_in_fid = (sizeof($ex_fid_ary)) ? 'WHERE ' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . " OR (f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')' : ""; $sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, fa.user_id FROM ' . FORUMS_TABLE . ' f LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "') $not_in_fid ORDER BY f.left_id"; $result = $db->sql_query($sql); $right_id = 0; $reset_search_forum = true; while ($row = $db->sql_fetchrow($result)) { if ($row['forum_password'] && $row['user_id'] != $user->data['user_id']) { $ex_fid_ary[] = (int) $row['forum_id']; continue; } if (sizeof($search_forum)) { if ($search_child) { if (in_array($row['forum_id'], $search_forum) && $row['right_id'] > $right_id) { $right_id = (int) $row['right_id']; } else if ($row['right_id'] < $right_id) { continue; } } if (!in_array($row['forum_id'], $search_forum)) { $ex_fid_ary[] = (int) $row['forum_id']; $reset_search_forum = false; } } } $db->sql_freeresult($result); // find out in which forums the user is allowed to view approved posts if ($auth->acl_get('m_approve')) { $m_approve_fid_ary = array(-1); $m_approve_fid_sql = ''; } else if ($auth->acl_getf_global('m_approve')) { $m_approve_fid_ary = array_diff(array_keys($auth->acl_getf('!m_approve', true)), $ex_fid_ary); $m_approve_fid_sql = ' AND (p.post_approved = 1' . ((sizeof($m_approve_fid_ary)) ? ' OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) : '') . ')'; } else { $m_approve_fid_ary = array(); $m_approve_fid_sql = ' AND p.post_approved = 1'; } if ($reset_search_forum) { $search_forum = array(); } // Select which method we'll use to obtain the post_id or topic_id information $search_type = basename($config['search_type']); if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx)) { trigger_error('NO_SUCH_SEARCH_MODULE'); } require("{$phpbb_root_path}includes/search/$search_type.$phpEx"); // We do some additional checks in the module to ensure it can actually be utilised $error = false; $search = new $search_type($error); if ($error) { trigger_error($error); } // let the search module split up the keywords if ($keywords) { $correct_query = $search->split_keywords($keywords, $search_terms); if (!$correct_query || (empty($search->search_query) && !sizeof($author_id_ary) && !$search_id)) { $ignored = (sizeof($search->common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $search->common_words)) . '
' : ''; trigger_error($ignored . sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max'])); } } if (!$keywords && sizeof($author_id_ary)) { // if it is an author search we want to show topics by default $show_results = ($topic_id) ? 'posts' : request_var('sr', ($search_id == 'egosearch') ? 'topics' : 'posts'); $show_results = ($show_results == 'posts') ? 'posts' : 'topics'; } // define some variables needed for retrieving post_id/topic_id information $sort_by_sql = array('a' => 'u.username_clean', 't' => (($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time'), 'f' => 'f.forum_id', 'i' => 't.topic_title', 's' => (($show_results == 'posts') ? 'p.post_subject' : 't.topic_title')); // pre-made searches $sql = $field = $l_search_title = ''; if ($search_id) { switch ($search_id) { // Oh holy Bob, bring us some activity... case 'active_topics': $l_search_title = $user->lang['SEARCH_ACTIVE_TOPICS']; $show_results = 'topics'; $sort_key = 't'; $sort_dir = 'd'; $sort_days = request_var('st', 7); $sort_by_sql['t'] = 't.topic_last_post_time'; 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); $s_sort_key = $s_sort_dir = ''; $last_post_time_sql = ($sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($sort_days * 24 * 3600)) : ''; $sql = 'SELECT t.topic_last_post_time, t.topic_id FROM ' . TOPICS_TABLE . " t WHERE t.topic_moved_id = 0 $last_post_time_sql " . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . ' ' . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . ' ORDER BY t.topic_last_post_time DESC'; $field = 'topic_id'; break; case 'unanswered': $l_search_title = $user->lang['SEARCH_UNANSWERED']; $show_results = request_var('sr', 'topics'); $show_results = ($show_results == 'posts') ? 'posts' : 'topics'; $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time'; $sort_by_sql['s'] = ($show_results == 'posts') ? 'p.post_subject' : 't.topic_title'; $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC'); $sort_join = ($sort_key == 'f') ? FORUMS_TABLE . ' f, ' : ''; $sql_sort = ($sort_key == 'f') ? ' AND f.forum_id = p.forum_id ' . $sql_sort : $sql_sort; if ($sort_days) { $last_post_time = 'AND p.post_time > ' . (time() - ($sort_days * 24 * 3600)); } else { $last_post_time = ''; } if ($sort_key == 'a') { $sort_join = USERS_TABLE . ' u, '; $sql_sort = ' AND u.user_id = p.poster_id ' . $sql_sort; } if ($show_results == 'posts') { $sql = "SELECT p.post_id FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t WHERE t.topic_replies = 0 AND p.topic_id = t.topic_id $last_post_time $m_approve_fid_sql " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . " $sql_sort"; $field = 'post_id'; } else { $sql = 'SELECT DISTINCT ' . $sort_by_sql[$sort_key] . ", p.topic_id FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t WHERE t.topic_replies = 0 AND t.topic_moved_id = 0 AND p.topic_id = t.topic_id $last_post_time $m_approve_fid_sql " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . " $sql_sort"; $field = 'topic_id'; } break; case 'newposts': $l_search_title = $user->lang['SEARCH_NEW']; // force sorting $show_results = (request_var('sr', 'topics') == 'posts') ? 'posts' : 'topics'; $sort_key = 't'; $sort_dir = 'd'; $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time'; $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC'); 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); $s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = ''; if ($show_results == 'posts') { $sql = 'SELECT p.post_id FROM ' . POSTS_TABLE . ' p WHERE p.post_time > ' . $user->data['user_lastvisit'] . " $m_approve_fid_sql " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . " $sql_sort"; $field = 'post_id'; } else { $sql = 'SELECT t.topic_id FROM ' . TOPICS_TABLE . ' t WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . ' AND t.topic_moved_id = 0 ' . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . ' ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . " $sql_sort"; $field = 'topic_id'; } break; case 'egosearch': $l_search_title = $user->lang['SEARCH_SELF']; break; } } // show_results should not change after this $per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page']; $total_match_count = 0; if ($search_id) { if ($sql) { // only return up to 1000 ids (the last one will be removed later) $result = $db->sql_query_limit($sql, 1001 - $start, $start); while ($row = $db->sql_fetchrow($result)) { $id_ary[] = $row[$field]; } $db->sql_freeresult($result); $total_match_count = sizeof($id_ary) + $start; $id_ary = array_slice($id_ary, 0, $per_page); } else { $search_id = ''; } } // make sure that some arrays are always in the same order sort($ex_fid_ary); sort($m_approve_fid_ary); sort($author_id_ary); if (!empty($search->search_query)) { $total_match_count = $search->keyword_search($show_results, $search_fields, $search_terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $id_ary, $start, $per_page); } else if (sizeof($author_id_ary)) { $firstpost_only = ($search_fields === 'firstpost') ? true : false; $total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $id_ary, $start, $per_page); } // For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options. if (!sizeof($id_ary) && !$search_id) { trigger_error('NO_SEARCH_RESULTS'); } $sql_where = ''; if (sizeof($id_ary)) { $sql_where .= $db->sql_in_set(($show_results == 'posts') ? 'p.post_id' : 't.topic_id', $id_ary); $sql_where .= (sizeof($ex_fid_ary)) ? ' AND (' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . ' OR f.forum_id IS NULL)' : ''; $sql_where .= ($show_results == 'posts') ? $m_approve_fid_sql : str_replace(array('p.post_approved', 'p.forum_id'), array('t.topic_approved', 't.forum_id'), $m_approve_fid_sql); } if ($show_results == 'posts') { include($phpbb_root_path . 'includes/functions_posting.' . $phpEx); } else { include($phpbb_root_path . 'includes/functions_display.' . $phpEx); } $user->add_lang('viewtopic'); // Grab icons $icons = cache::obtain_icons(); // Output header if ($search_id && ($total_match_count > 1000)) { // limit the number to 1000 for pre-made searches $total_match_count--; $l_search_matches = sprintf($user->lang['FOUND_MORE_SEARCH_MATCHES'], $total_match_count); } else { $l_search_matches = ($total_match_count == 1) ? sprintf($user->lang['FOUND_SEARCH_MATCH'], $total_match_count) : sprintf($user->lang['FOUND_SEARCH_MATCHES'], $total_match_count); } // define some vars for urls $hilit = implode('|', explode(' ', preg_replace('#\s+#u', ' ', str_replace(array('+', '-', '|', '(', ')', '"'), ' ', $keywords)))); $u_hilit = urlencode(htmlspecialchars_decode(str_replace('|', ' ', $hilit))); $u_show_results = ($show_results != 'posts') ? '&sr=' . $show_results : ''; $u_search_forum = implode('&fid%5B%5D=', $search_forum); $u_search = append_sid("{$phpbb_root_path}search.$phpEx", $u_sort_param . $u_show_results); $u_search .= ($search_id) ? '&search_id=' . $search_id : ''; $u_search .= ($u_hilit) ? '&keywords=' . urlencode(htmlspecialchars_decode($search->search_query)) : ''; $u_search .= ($topic_id) ? '&t=' . $topic_id : ''; $u_search .= ($author) ? '&author=' . urlencode(htmlspecialchars_decode($author)) : ''; $u_search .= ($author_id) ? '&author_id=' . $author_id : ''; $u_search .= ($u_search_forum) ? '&fid%5B%5D=' . $u_search_forum : ''; $u_search .= (!$search_child) ? '&sc=0' : ''; $u_search .= ($search_fields != 'all') ? '&sf=' . $search_fields : ''; $u_search .= ($return_chars != 300) ? '&ch=' . $return_chars : ''; $template->assign_vars(array( 'SEARCH_TITLE' => $l_search_title, 'SEARCH_MATCHES' => $l_search_matches, 'SEARCH_WORDS' => $search->search_query, 'IGNORED_WORDS' => (sizeof($search->common_words)) ? implode(' ', $search->common_words) : '', 'PAGINATION' => generate_pagination($u_search, $total_match_count, $per_page, $start), 'PAGE_NUMBER' => on_page($total_match_count, $per_page, $start), 'TOTAL_MATCHES' => $total_match_count, 'SEARCH_IN_RESULTS' => ($search_id) ? false : true, 'S_SELECT_SORT_DIR' => $s_sort_dir, 'S_SELECT_SORT_KEY' => $s_sort_key, 'S_SELECT_SORT_DAYS' => $s_limit_days, 'S_SEARCH_ACTION' => $u_search, 'S_SHOW_TOPICS' => ($show_results == 'posts') ? false : true, 'GOTO_PAGE_IMG' => $user->img('icon_post_target', 'GOTO_PAGE'), 'NEWEST_POST_IMG' => $user->img('icon_topic_newest', 'VIEW_NEWEST_POST'), 'REPORTED_IMG' => $user->img('icon_topic_reported', 'TOPIC_REPORTED'), 'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'TOPIC_UNAPPROVED'), 'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'), 'U_SEARCH_WORDS' => $u_search, )); if ($sql_where) { if ($show_results == 'posts') { // @todo Joining this query to the one below? $sql = 'SELECT zebra_id, friend, foe FROM ' . ZEBRA_TABLE . ' WHERE user_id = ' . $user->data['user_id']; $result = $db->sql_query($sql); $zebra = array(); while ($row = $db->sql_fetchrow($result)) { $zebra[($row['friend']) ? 'friend' : 'foe'][] = $row['zebra_id']; } $db->sql_freeresult($result); $sql = 'SELECT p.*, f.forum_id, f.forum_name, t.*, u.username, u.username_clean, u.user_sig, u.user_sig_bbcode_uid, u.user_colour FROM ' . POSTS_TABLE . ' p LEFT JOIN ' . TOPICS_TABLE . ' t ON (p.topic_id = t.topic_id) LEFT JOIN ' . FORUMS_TABLE . ' f ON (p.forum_id = f.forum_id) LEFT JOIN ' . USERS_TABLE . " u ON (p.poster_id = u.user_id) WHERE $sql_where"; } else { $sql_from = TOPICS_TABLE . ' t LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id) ' . (($sort_key == 'a') ? ' LEFT JOIN ' . USERS_TABLE . ' u ON (u.user_id = t.topic_poster) ' : ''); $sql_select = 't.*, f.forum_id, f.forum_name'; if ($user->data['is_registered']) { if ($config['load_db_track']) { $sql_from .= ' LEFT JOIN ' . TOPICS_POSTED_TABLE . ' tp ON (tp.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tp.topic_id)'; $sql_select .= ', tp.topic_posted'; } if ($config['load_db_lastread']) { $sql_from .= ' LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id) LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . ' AND ft.forum_id = f.forum_id)'; $sql_select .= ', tt.mark_time, ft.mark_time as f_mark_time'; } } if ($config['load_anon_lastread'] || ($user->data['is_registered'] && !$config['load_db_lastread'])) { $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : ''; $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array(); } $sql = "SELECT $sql_select FROM $sql_from WHERE $sql_where"; } $sql .= ' ORDER BY ' . $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); $result = $db->sql_query($sql); $result_topic_id = 0; $rowset = array(); if ($show_results == 'topics') { $forums = $rowset = $shadow_topic_list = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['topic_status'] == ITEM_MOVED) { $shadow_topic_list[$row['topic_moved_id']] = $row['topic_id']; } $rowset[$row['topic_id']] = $row; if (!isset($forums[$row['forum_id']]) && $user->data['is_registered'] && $config['load_db_lastread']) { $forums[$row['forum_id']]['mark_time'] = $row['f_mark_time']; } $forums[$row['forum_id']]['topic_list'][] = $row['topic_id']; $forums[$row['forum_id']]['rowset'][$row['topic_id']] = &$rowset[$row['topic_id']]; } $db->sql_freeresult($result); // If we have some shadow topics, update the rowset to reflect their topic information if (sizeof($shadow_topic_list)) { $sql = 'SELECT * FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('topic_id', array_keys($shadow_topic_list)); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $orig_topic_id = $shadow_topic_list[$row['topic_id']]; // We want to retain some values $row = array_merge($row, array( 'topic_moved_id' => $rowset[$orig_topic_id]['topic_moved_id'], 'topic_status' => $rowset[$orig_topic_id]['topic_status'], 'forum_name' => $rowset[$orig_topic_id]['forum_name']) ); $rowset[$orig_topic_id] = $row; } $db->sql_freeresult($result); } unset($shadow_topic_list); foreach ($forums as $forum_id => $forum) { if ($user->data['is_registered'] && $config['load_db_lastread']) { $topic_tracking_info[$forum_id] = get_topic_tracking($forum_id, $forum['topic_list'], $forum['rowset'], array($forum_id => $forum['mark_time']), ($forum_id) ? false : $forum['topic_list']); } else if ($config['load_anon_lastread'] || $user->data['is_registered']) { $topic_tracking_info[$forum_id] = get_complete_topic_tracking($forum_id, $forum['topic_list'], ($forum_id) ? false : $forum['topic_list']); if (!$user->data['is_registered']) { $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0; } } } unset($forums); } else { $bbcode_bitfield = $text_only_message = ''; $attach_list = array(); while ($row = $db->sql_fetchrow($result)) { // We pre-process some variables here for later usage $row['post_text'] = censor_text($row['post_text']); $text_only_message = $row['post_text']; // make list items visible as such if ($row['bbcode_uid']) { $text_only_message = str_replace('[*:' . $row['bbcode_uid'] . ']', '⋅ ', $text_only_message); // no BBCode in text only message strip_bbcode($text_only_message, $row['bbcode_uid']); } if ($return_chars == -1 || utf8_strlen($text_only_message) < ($return_chars + 3)) { $row['display_text_only'] = false; $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); // Does this post have an attachment? If so, add it to the list if ($row['post_attachment'] && $config['allow_attachments']) { $attach_list[$row['forum_id']][] = $row['post_id']; } } else { $row['post_text'] = $text_only_message; $row['display_text_only'] = true; } $rowset[] = $row; } $db->sql_freeresult($result); unset($text_only_message); // Instantiate BBCode if needed if ($bbcode_bitfield !== '') { include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); $bbcode = new bbcode(base64_encode($bbcode_bitfield)); } // Pull attachment data if (sizeof($attach_list)) { $use_attach_list = $attach_list; $attach_list = array(); foreach ($use_attach_list as $forum_id => $_list) { if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id)) { $attach_list = array_merge($attach_list, $_list); } } } if (sizeof($attach_list)) { $sql = 'SELECT * FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . ' AND in_message = 0 ORDER BY filetime 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); } } if ($hilit) { // Remove bad highlights $hilit_array = array_filter(explode('|', $hilit), 'strlen'); foreach ($hilit_array as $key => $value) { $hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($value, '#')); $hilit_array[$key] = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $hilit_array[$key]); } $hilit = implode('|', $hilit_array); } foreach ($rowset as $row) { $forum_id = $row['forum_id']; $result_topic_id = $row['topic_id']; $topic_title = censor_text($row['topic_title']); // we need to select a forum id for this global topic if (!$forum_id) { if (!isset($g_forum_id)) { // Get a list of forums the user cannot read $forum_ary = array_unique(array_keys($auth->acl_getf('!f_read', true))); // Determine first forum the user is able to read (must not be a category) $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE . ' WHERE forum_type = ' . FORUM_POST; if (sizeof($forum_ary)) { $sql .= ' AND ' . $db->sql_in_set('forum_id', $forum_ary, true); } $result = $db->sql_query_limit($sql, 1); $g_forum_id = (int) $db->sql_fetchfield('forum_id'); } $u_forum_id = $g_forum_id; } else { $u_forum_id = $forum_id; } $view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$u_forum_id&t=$result_topic_id" . (($u_hilit) ? "&hilit=$u_hilit" : '')); $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies']; if ($show_results == 'topics') { $folder_img = $folder_alt = $topic_type = ''; topic_status($row, $replies, (isset($topic_tracking_info[$forum_id][$row['topic_id']]) && $row['topic_last_post_time'] > $topic_tracking_info[$forum_id][$row['topic_id']]) ? true : false, $folder_img, $folder_alt, $topic_type); $unread_topic = (isset($topic_tracking_info[$forum_id][$row['topic_id']]) && $row['topic_last_post_time'] > $topic_tracking_info[$forum_id][$row['topic_id']]) ? true : false; $topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', $forum_id)) ? true : false; $posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', $forum_id)) ? true : false; $u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . "&t=$result_topic_id", true, $user->session_id) : ''; $row['topic_title'] = preg_replace('#(?!<.*)(?]*(?:)#is', '$1', $row['topic_title']); $tpl_ary = array( 'TOPIC_AUTHOR' => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']), 'TOPIC_AUTHOR_COLOUR' => get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']), 'TOPIC_AUTHOR_FULL' => get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']), 'FIRST_POST_TIME' => $user->format_date($row['topic_time']), 'LAST_POST_SUBJECT' => $row['topic_last_post_subject'], 'LAST_POST_TIME' => $user->format_date($row['topic_last_post_time']), 'LAST_VIEW_TIME' => $user->format_date($row['topic_last_view_time']), 'LAST_POST_AUTHOR' => get_username_string('username', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']), 'LAST_POST_AUTHOR_COLOUR' => get_username_string('colour', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']), 'LAST_POST_AUTHOR_FULL' => get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']), 'PAGINATION' => topic_generate_pagination($replies, $view_topic_url), 'TOPIC_TYPE' => $topic_type, 'TOPIC_FOLDER_IMG' => $user->img($folder_img, $folder_alt), 'TOPIC_FOLDER_IMG_SRC' => $user->img($folder_img, $folder_alt, false, '', 'src'), 'TOPIC_ICON_IMG' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '', 'TOPIC_ICON_IMG_WIDTH' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '', 'TOPIC_ICON_IMG_HEIGHT' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '', 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '', 'UNAPPROVED_IMG' => ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '', 'S_TOPIC_GLOBAL' => (!$forum_id) ? true : false, 'S_TOPIC_TYPE' => $row['topic_type'], 'S_USER_POSTED' => (!empty($row['mark_type'])) ? true : false, 'S_UNREAD_TOPIC' => $unread_topic, 'S_TOPIC_REPORTED' => (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false, 'S_TOPIC_UNAPPROVED' => $topic_unapproved, 'S_POSTS_UNAPPROVED' => $posts_unapproved, 'U_LAST_POST' => $view_topic_url . '&p=' . $row['topic_last_post_id'] . '#p' . $row['topic_last_post_id'], 'U_LAST_POST_AUTHOR' => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']), 'U_TOPIC_AUTHOR' => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']), 'U_NEWEST_POST' => $view_topic_url . '&view=unread#unread', 'U_MCP_REPORT' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=reports&t=' . $result_topic_id, true, $user->session_id), 'U_MCP_QUEUE' => $u_mcp_queue, ); } else { if ((isset($zebra['foe']) && in_array($row['poster_id'], $zebra['foe'])) && (!$view || $view != 'show' || $post_id != $row['post_id'])) { $template->assign_block_vars('searchresults', array( 'S_IGNORE_POST' => true, 'L_IGNORE_POST' => sprintf($user->lang['POST_BY_FOE'], $row['username'], "', '')) ); continue; } // Replace naughty words such as farty pants $row['post_subject'] = censor_text($row['post_subject']); if ($row['display_text_only']) { // now find context for the searched words $row['post_text'] = get_context($row['post_text'], array_filter(explode('|', $hilit), 'strlen'), $return_chars); $row['post_text'] = bbcode_nl2br($row['post_text']); } else { // Second parse bbcode here if ($row['bbcode_bitfield']) { $bbcode->bbcode_second_pass($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield']); } $row['post_text'] = bbcode_nl2br($row['post_text']); $row['post_text'] = smiley_text($row['post_text']); if (!empty($attachments[$row['post_id']])) { parse_attachments($forum_id, $row['post_text'], $attachments[$row['post_id']], $update_count); // we only display inline attachments unset($attachments[$row['post_id']]); } } if ($hilit) { // post highlighting $row['post_text'] = preg_replace('#(?!<.*)(?]*(?:)#is', '$1', $row['post_text']); $row['post_subject'] = preg_replace('#(?!<.*)(?]*(?:)#is', '$1', $row['post_subject']); } $tpl_ary = array( 'POST_AUTHOR_FULL' => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 'POST_AUTHOR_COLOUR' => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 'POST_AUTHOR' => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 'U_POST_AUTHOR' => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 'POST_SUBJECT' => $row['post_subject'], 'POST_DATE' => (!empty($row['post_time'])) ? $user->format_date($row['post_time']) : '', 'MESSAGE' => $row['post_text'] ); } $template->assign_block_vars('searchresults', array_merge($tpl_ary, array( 'FORUM_ID' => $forum_id, 'TOPIC_ID' => $result_topic_id, 'POST_ID' => ($show_results == 'posts') ? $row['post_id'] : false, 'FORUM_TITLE' => $row['forum_name'], 'TOPIC_TITLE' => $topic_title, 'TOPIC_REPLIES' => $replies, 'TOPIC_VIEWS' => $row['topic_views'], 'U_VIEW_TOPIC' => $view_topic_url, 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id), 'U_VIEW_POST' => (!empty($row['post_id'])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=" . $row['topic_id'] . '&p=' . $row['post_id'] . (($u_hilit) ? '&hilit=' . $u_hilit : '')) . '#p' . $row['post_id'] : '') )); } if ($topic_id && ($topic_id == $result_topic_id)) { $template->assign_vars(array( 'SEARCH_TOPIC' => $topic_title, 'U_SEARCH_TOPIC' => $view_topic_url )); } } unset($rowset); page_header(($l_search_title) ? $l_search_title : $user->lang['SEARCH']); $template->set_filenames(array( 'body' => 'search_results.html') ); make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx")); page_footer(); } // Search forum $s_forums = ''; $sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.left_id, f.right_id, f.forum_password, fa.user_id FROM ' . FORUMS_TABLE . ' f LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "') ORDER BY f.left_id ASC"; $result = $db->sql_query($sql); $right = $cat_right = $padding_inc = 0; $padding = $forum_list = $holding = ''; $pad_store = array('0' => ''); while ($row = $db->sql_fetchrow($result)) { if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id'])) { // Non-postable forum with no subforums, don't display continue; } if ($row['forum_type'] == FORUM_LINK || ($row['forum_password'] && !$row['user_id'])) { // if this forum is a link or password protected (user has not entered the password yet) then skip to the next branch continue; } if ($row['left_id'] < $right) { $padding .= '   '; $pad_store[$row['parent_id']] = $padding; } else if ($row['left_id'] > $right + 1) { if (isset($pad_store[$row['parent_id']])) { $padding = $pad_store[$row['parent_id']]; } else { continue; } } $right = $row['right_id']; if ($auth->acl_gets('!f_search', '!f_list', $row['forum_id'])) { // if the user does not have permissions to search or see this forum skip only this forum/category continue; } $selected = (in_array($row['forum_id'], $search_forum)) ? ' selected="selected"' : ''; if ($row['left_id'] > $cat_right) { // make sure we don't forget anything $s_forums .= $holding; $holding = ''; } if ($row['right_id'] - $row['left_id'] > 1) { $cat_right = max($cat_right, $row['right_id']); $holding .= ''; } else { $s_forums .= $holding . ''; $holding = ''; } } if ($holding) { $s_forums .= $holding; } $db->sql_freeresult($result); unset($pad_store); if (!$s_forums) { trigger_error('NO_SEARCH'); } // Number of chars returned $s_characters = ''; $s_characters .= ''; $s_characters .= ''; $s_characters .= ''; for ($i = 100; $i <= 1000 ; $i += 100) { $selected = ($i == 300) ? ' selected="selected"' : ''; $s_characters .= ''; } $s_hidden_fields = array('t' => $topic_id); if ($_SID) { $s_hidden_fields['sid'] = $_SID; } if (!empty($_EXTRA_URL)) { foreach ($_EXTRA_URL as $url_param) { $url_param = explode('=', $url_param, 2); $s_hidden_fields[$url_param[0]] = $url_param[1]; } } $template->assign_vars(array( 'S_SEARCH_ACTION' => "{$phpbb_root_path}search.$phpEx", 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields), 'S_CHARACTER_OPTIONS' => $s_characters, 'S_FORUM_OPTIONS' => $s_forums, 'S_SELECT_SORT_DIR' => $s_sort_dir, 'S_SELECT_SORT_KEY' => $s_sort_key, 'S_SELECT_SORT_DAYS' => $s_limit_days, 'S_IN_SEARCH' => true, )); // only show recent searches to search administrators if ($auth->acl_get('a_search')) { $sql = 'SELECT search_time, search_keywords FROM ' . SEARCH_RESULTS_TABLE . ' WHERE ' . $db->sql_function('length_text', 'search_keywords') . ' > 0 ORDER BY search_time DESC'; $result = $db->sql_query_limit($sql, 5); while ($row = $db->sql_fetchrow($result)) { $keywords = $row['search_keywords']; $template->assign_block_vars('recentsearch', array( 'KEYWORDS' => $keywords, 'TIME' => $user->format_date($row['search_time']), 'U_KEYWORDS' => append_sid("{$phpbb_root_path}search.$phpEx", 'keywords=' . urlencode(htmlspecialchars_decode($keywords))) )); } $db->sql_freeresult($result); } // Output the basic page page_header($user->lang['SEARCH']); $template->set_filenames(array( 'body' => 'search_body.html') ); make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx")); page_footer(); ?>DCRʝu9Czs`NQ~!ˠ~!as wjQaV^& X3P T{o wF9K/?%ORwǝNƞ[.&5.*ҠB8R7;~;2o'嵦!QY(Ki8藜Q k\bF n&k WvKe*BU:۳濞Es+} s1ݣSS6oB%Tޞ?6ʋL3;n. }xhHi>S9C'-CtCcs[+EQ/7,FVt<1CAكK=#lP-=iTg OKsV޵^s1m],y-dF慈%HHWI5%.FĶY*d]f P4joGN[&uwWW K!}å+C2T:V|I}Hލd)MpGfZJ[ӍvpSXNoEcD^ߠ4~:N W6lj00p Ǖ}sf}k9@=$5t1/spPplOf]?w2!odK?9H AJ|o4`]7@6lg /&$W 1Ug] .Z vSp;i>w-4]417&e*<!?_u[ІNZB!eپ>urAby3cKPIJC &mq}Et'm.H.syfjoNLgbeƢ[pkm/%Wi@AG&-O3

P8эmޔ* aZʎ+ N$rL2:3D;Z* [a~3C O լ}ZaZR"k/lL&kN$ˍSՊmRQq=mYeH^%$ 5mNbK"vgUn]XQ&՟ i~#5x 37e`L`C=k{}VqR*~|&ZOZl9eq,K7yg;DIqy/Z.UB6tYegۂCˁr %~2LeF.nPh -(v.75S7E 5QSuUྊ,cGRSIq14U7V.^}tjf~ddbmgQuaC2 rgq`݃vg~LTUyjOhQ*tЪeY Wm-Zl<| M \EHi%]#قL`.0%fLp_m'++ZB$)TqMow*K؏RQ*E^wĩ w`tssȳKږ">uu'uu RLy^je~!ؐ˫Pcc%yIC|/kMԪ^'b'r 0y~ObEZZ%ѩBѧYMrp5zXdGBCBz@qt./crgdG7"'2g 9" Oe4Oqa$)X"5-=2`ɛC0PiizGR#ʇl\ C%&S'm]!fv;Z/}oH nx!-yd!iMvZ6-6e QN VZܒO:Dm46bwGü?X4z%t\24Rj:l pusf"p2E ^H~` YW[ P5a d2޽/u7Y`#WaCY 11%K w}FAS:HHnߪ l诨m8gY=wYe5V{֒OL_Cإ4ګѺ>wOr" --}P (gsA͑lgW%@T׬$*qE$AZZ% 3OFyN.O;EWa?[}5 u!WkwozC*QٝU#mi 2NII;<|wLh'G yx t -͘Pkk{<+ES!`6c3׌M5hq6S1})_;05aNĚe_MNӰ&(Ɛ^?Ow*exlx rr'x3ZlHY<^ B6>x8 ('plĔ N>n$4tЗ֎SdLb숇(rڋ )#0Ubαsє H劊 G#Cd{:bT:aݽo~*cfY 7}g)& #ǛPilxp&(>"N=,KtR<7P v%P~Skm]{Di}pҳi԰  o*H1nBld=m XѬU3JX&e(Mڂ^c4"pHŷ<@8xaf Gs_֛Z&GL@o=iE\H^5Z11t\+: $:5#>V@Rd6v֯sYeeaBUjԺ2 o[{=HTXLlStcܽ_3L>0W.7/X 6o^x=ydu ,k/x #I!r ՠS{CpfA\M$gGqh^GC4I`C;Koءt5euΠ<2, QY/_$ӻ F J4&gYp3otJÅxcoP?U"OGBX|X@%1Oh'1V'Adi0%B.R 5yӳ YDq(@uTBx, D w;ag5+ fdTç-ݞx%V4aK\d}p?N 9՝kCB*K:iWBGjnރ|W@ehukkTk3J>P`VX~]^7S72&:iSXɱ7)V+uM]/! 0櫙\ܶ>ޚ\-p=ZD#=J^L:C?nA- (1M~kj2]M`#ό!e=5 1SYP$%F4uI7!됿VSvG1E|cq5 I:ZifFm[k O 0wZs0-vVAzFˉ.U;! D+62mcnreJMW^kgId <ϋ77d9ڿy~6Oy ܺԷ@gVniF .$<##]K<[n:xƄYkK)r8烛u6ɲoUVBg#dCO6KUBVs+aBv4<Nmj/9eCk>bwIq9YI7>_YDRg熥Lݔh%[hZaA (og픠j˳VƇӥ'?(/(E̐72S /ԛ԰p |KR|RFjׄK,5z>Zdfp33`~I F27xN*G~HQ #n'vvDr -i1 E?8G4k%<:(CҜIC=`>akqXR0:">7m-Cn/(\F oե2!YNY0컅E{]Z c(C?ECYu=Qumta#=O5/vIĨ?pp=rC.k HEڏم "p)?><Ѷ罇8C_c:OOw;^ r~{BB0 gXU ! Pd]9ؒw'(w[kTN4f#0!MhLP؝RKjRMnǺ#'I/LYfZr4bǾjl9AO"_Rsk~N_"5h֝wCGe~<UuYb3-ᆊ\n)yU7!HWyJf&Yp  |2$x{qDn'8UΊ$ڀ@zvU^uM"I9_a.hu^CjWȅӏ?lJr=8ъns`GkC4iU 79x!Bj_wfִLy(#ªNk9HN+S=d)/mDGhx2;,8%# =rAJ]bUټ/G{͈mAt'KH:!AfE$aj`~Ɨ_Â`Jbo݄zj=CMٿ9g!xD4'D6n]B(_gIvxOsA0#l,Xi.1p-,g1Y 'XX`Q,eMs7Ec2oownISY2  +j22a.sl[yz*M1iߗMed :Z_A$W0c>/¹XT"(p0,9Y* D8˫s2!1 DV8@CMj;VGNhO}ޛcx[)Xej>w9&b jv4? ~JeWƧ"5)vq]8{"r}?St?Ga+>fᵲs16a5U ǡkfoҏ@r>Y`+Os* tN) h/mhՊ r.mӶ08?EE%x0Td.¡V`#q$@grۛ7FQHdSYV7Rq(zPp(/`L9"$ʽ}4 Ȍ`^wChvC&C M3j`7( `%maqxlKn?3SmʘsE++4ƘW}dSs4`꾓uƥMBcBl&H]%ߩOog! 㾺# | Qff#|)*e@iBxc C2ٽ&l,fb]7;RYl@'7dwH׵ <Ut$d~*c*l*<Ғ&P,Zv1?qw'!IJUm> M:pcT>fᜭfġ/| P2Ux 8}q.>[ߤ퐐+#Q~ie'?#JMsbWFx&FStKe`ôBMm(AߓM"t#` zo= -}4դ$0 "gh9Դ6 /C^:E))$]*}"Q8 nϳ!ŠVQ!.9o)]Z\ل uej`9،}=\x-apEJ`t EG0Sϛ̵QF^W@!doԷU~&2մ^66PfQwq&zӡ3PSWv ^knHpMXe'X6Iɍ~XWjMC6+YQN x#QLL'm< `Hs3X%7*J jW# M faԽC%dmD}%OĈr+GR[h=Y@ -ncrnVȶ5`5 4G,D(iTR_G!K!9דfl|N &쒠=j3v2jا}Kn8Otmo]XSAHȋ2!FL9foU&oU M:[Kn r[ͅ ҟewc [Xrds[&NR ')+[F}jip V;osn_z}hШ1*n'ӟ$=֓ {aQ|K)|o;!_;~e\,Y!cZ'S0BzzVQ+CStKk\+lՃё8TX9qF~WaJ&q3/NމN2I=כ/k6 RL'n Y<_tc_ *47m59R锘 8=MFgIA}y-lvlji>|b(Z$`[ 0;78]W;١@|IHwm'% $:ؼtkV!X[[-̭ accZM|0?f;T1pqe=1q%e&#@DEhX!;-LX&b@;Dб ~. o]3n(V6Œ*7RԜkۋ cSj ycۺ9; ͚xe@镟Ԅ7wA0ISldJ6gc Zu@~ $pG<˅K_&8bpG1(W S p}fHp,w6k3U& C %Pj©v˗9ޛNWyqc[9l V{\k&ᒋ\vQfDjvk"ע妙+?BA!Ԃ5:0괂!id@WCf~-^܄S`+0g+q=ݭ"JgOR%t'/(T|`$2>$<TzH ~FU1I߯[63WbQ$f!GxC8b͹ҷ"sU`t2kZ6}}ɦg]魣j@N۬"Y#"A%'M vec)`9׹H=HFOCI^ީ0(Uy)s}'q m% /#msNA \lȘSU N=1@Vu4c2YI T,dV6V3c{Y=5Oer RTvq@ IVtOIәlTgFqӅIśZ~xqy\! v/ զOqqdZJ?ha0L;֏:(WB:G(98%gW m~ Š3;Xw!r!>{I om'5E;5!K2u%zGP2;E1(>3:+̾L骀1o"1/.l Mv>*itZZ" CD99'8r)rp=kD{6W`}}sWuDh]VFDrP+`հ9ՎaS 7*`SqHD@^Rhv?dQW^W2Y0sFzޭ66z4u, XBu,ڰ{ࣞ8Gh0x3[Ie1 '5Ja6B4˷1#jUyT[a1BEe[SRWxw= ~:U呝:Ӻc85riؠEi>LLAW=#<' &w6I{*9~k2>z Ā㉩Z`#}/&w Nvό&w|2ִBFMPM)_)v%YIj%= IwEGkJ{ wvմ޲('jMDC˳ $Sf& X7"1> - ڰ0\S"MMQhE:5\7MS Cjψ $uƾ˓[ݣ'Â)sӏuÇ F :fԸ݊)$}0Hl]$Is[.Vq| /CfI}OU{ݞ,'H?/56X1VF4%˰ YGa,(crriZVN M=SP0^ ct'hSiŖdvֶ:5lIv>ܿ Gs!P۱Ǘ '7#P6dh9!~JN7$Z՜ /g"r[1 ~DSQ~0& B7'Wfx3TʽZx2 Iw9 u?bl_L =Kt Tƈ IBV`ӛ>}j' %n|Jᨐ 5"e'pF*3^O6&$W̺Ī^`(yȈL!`0 0cz*lZ29nI&DۏP׫Jxn8( }s} du[ 19pR]}+ Yкz[`ӏD#VW)+dΉM6TW(HۻK(z߰jq*x|xk QLI$# S:ۡ5GI4 (!08 $*īaBJ{Mc*^'~P7ʺoc3= .SD"$߷^͈7֬6ȜJVUƵ, x-%N?<8H_;ۯ«< l&XmGWv'y yLRUj9N*x7 gI?jF7PMB*)] ږ9QTLqBR~?^1b~3ox0YuSqd\s vsqWz{duڸj!3(1\fR!JD<ۭ;CHx[ -/JBhuT%qE3Hc ,֫tAó>ǒ%5x (v$!b\iwj7PǬ<΄ vx1,%^{Gf J /f_=fsJ R  Y2cHga&2:E/هn~~@RW}_2vѸ4hw"m1G]iP֗-ˏADheZ%DP)tN?+5C_d`[Zs=G,&* ^/@gKҳ@ש镵{O4>4͉/,:Bo`3 ~Tu+ue`VěmݽN V=6LuD,flB f[JMRi$#K'$9"nC'z`v kWLD BPXU@YtgYsnazg,&yU[9dUQt?b*k 3\ɧSd9z.L_+dß~* 1(6Fm.X1N:Q@0Ӣ/۞X`zk;; Lyfuw [Wypy#>FhiZ`+NBE]!˩.hJIyJՑךOohnN/=`xsUSIٮʕ"\>**&UW9u4 ^lM%UV\ٌ- ?sCiGÿ3Ծ/ٽ^ Vga'o0x#MNzD 5@n)lNJ/ky31߲"n$cǕ6vJ9vzu Av&BybG˚d(PIh7ލl|X#ֺbMFa;y՛r6$XsȬ q*R{Oog(Vy9F0fl^b_ވ<{5{Eg7ܙG7mDN2meA6h&#+LiƿH>V NQP`Ε,}SYUu*\|/O݈ga ѕu2#s1Q:fv=@BZflo1%$:(6l/dUTmlIRdέyey]}s3ʉVP!#CgF?ZF?4ĂI$XiMҰ],w<~#SwrUp#^(b`m«A"୙2s[Dž~Ԫ+PW0":8Ԏdcz&兞AߏS2Cm`>|w-@lʕJ.bwi*;:~@ t3o_~/Hiԝ1"ƦM>ArF|nH_ zrBC!Y$R6#dҝBUy>>L賚GK̸&t[ho1*Oڧ.:L?ήrsUޡs,&܈c'*U2zTVp{2niƮ+GT&ė6?*b]_3rB 4 (<~pPwy~^!ڝ'mKGKO+(±sp d5xB/0x;Mx N9Bq*ay%$GloˤQq-cv ũvcuDI]=X>ԌljBj\kzQґ.Y<*ð%[/[L1-gw|&.O1uLU Us2Ւ{=6~zӤ p-ʸַH%EHʕ}2r8+F*=+WKF]=]#*Oʗ*Nߙg$ҋlD loDדMo'!'˓5rT.,϶!tCR9.d:0lP+(U4^>.LR}B"Y] ji7D䶷D̤**62X~E@c\FVn-g1>滯"WU=ŒJ"r5*K0zI_N6V8DM)Z;G |bҟ2&eo{{}{cbk $tCJ`8om;ɌVN "( %# lL3eoxQCju&;;4O HLqQ0@v6DYOGxp)ňM>/K&L+B6pG-j 벼'sgSE\#п2T )+F9c@ZWr>;b#^dgN|O#IbKxh(ݲ@bl fx19 2M,PV\Lt5.ґd瓘"%t=~.&u\U9}'tFS]iSW\ |1=:S[6r!4=OZ&Yt:܀xi 䶎!.LuLp)P NP{eFV5_tx&JqRZX\ ‘Qeb?V&XATYP5b->m=Z>uܗش/( 43^A\i"E済oͨ2lˤ=3 Irl}3Y -A߫.I Y0p#vF7*=5vƟf`S'bb'.hJ*JJ-u8 OR)?}5'3#n(3>*!$ S8SH8zF!@-#3ĘD9R\KIM^&w%=۩eXplPvStxNUR'Rˍ:G#i'i,$&_B_AP`!h\Bj&#'~ /o; ~ VK^e䲛10mcӸ㍍K=iU>S~%;r{\',+MBJتDq*N2/p?e`te +D[MC!ՍV"͌1N'2x'@q'Pao;Mf.z n$jb*?9#ꁁlY ή94/0vA2Ҟ\{PS.E!4D[2ƾeʋ` ZjF5) ":j3oT|J**c?݉ǐp ׸sL{\QR2>.C&x#/?Ƚ8SLZ6#Y)ZGd[-İJH28nJO!4wl兒#?&Jr0mଘ'b36Hl|5Mkh?l}#3hsN~1]H5-E^V~D#C=׶9N2Fgّb?]1A#O6vlrO|*4?.J>,ppI$ ;2t. VGGEf,o}Aw$DfS,оk%o@v~Pv"@uZAql+ATkI WbBᤨoOJ !7Ƭ9JAn`112L*! d,*@ 2'6Bm涂$G8!{?ϯqb?,;&68s;ko}* 6rTCU˥&8WZ<ۉ nWTґKͬ UN]"e.7ܴ&gucMr̉U^qN;mWǮ`Mr+{<$RYe1niCgT4J>??(NA6?I? "[[t};:ʪże=*3\ϦܱjZ1Pg3WgH(w⫞vFc|r`bV};1]T7,ܜ_s ĕ5_23,G YYI-c:6#v"}ie|O5x8W>O~~FYI,%,[.w%<>ZL PML8q/Iܗ6ҌWﹱ5I7\ k2whƬCyW`QׁuV'@;;oq.$aɼ#:nVȏtP*G M eX[x׾a7]a7ރV-5?eG_p N›ՊDe~ž_aI顥@ʳe<~ `Q:E▾ӴFtchi TtZocKU9e%=Yz9`_5pdErV+5n$ H x~#3nbO|";}T5'VwáԩK\7 g$׫:~k(`RK7  |PHݤB@eBbR% ŵh2&U .E*3:U%;\l $_gA%,+!lV7:SN&.*\@fN`U<̈ux]<xB{XLyr4gP*,H]Q '_3㹫sg%f_#UWSeg 8D=*[ӭTLJYf"4B#ږwK`X{+`v~@B|VH JBl>}@faꃯPpU"HbqtBQŒՈS 'b\/y> C[Uuۀͮ2-3V*,K2/]0k5.X1T0#3%=M%ptk9MPp 8қhƜP ~ˢRACwČ9i2iSkxA u(Q*ZK1;e{1L06O}41#f^,jDզUOTr<. B2{Y=ă?o'GB!]ٍ쒊l\ڏ{^~fl)8S|<.sj*k~\De9{AImZ.;YS: ε_C{ŕu6bDarm^ ءD]Jf0| $R]m ]w'ZU9<6L񰛰͌DQvalݐކ>d Ft]_>\k~- IFyR<2}\㼡;w\=DG6ZW]/ʪ5WeXD;E -z q&m2X/IvJ_2F{gc.2]ye_c{0p@t:IR#/QxBX4VGFE( rtVy\._J{%~t|$~P֑Oz >XW͌^ W͔knhb@2qmEY;o Xߓgہ {X+8Mw3 Jdc\*sqJE6# HiWұ' (*ɣC7ic?8ߢ7wT7a(e8+/CJXHjmڤAT:ltP83j6w{eiSi[20<Bj[#RCKJA^k(a.=W4y0^fa&폽 :b1&`DbN>[`iJX#\@4DHn /'sf,ަwdC̳#rY"g :4 khfVe l}AOEĄCJ]A5XrWUW61^"s,ؿA3~ qp)ouM>}E:tsl\ U=*6N Z0regt?NqN7{$+ (d[Jztb$apUYPB>y}ů|LH0[#-ȧ$0n"" Az'Gamdl+ՇQ}&x*ʑ6XzfE)cjD ښ.vIyo8wf#]gnq&Oy$b|zMo0qXSssoj򷃖`"V*_, f*ZHj"N!>֖^U/^6Ky]cVGXΏ,oo9j( dыh 3𭥀]rVJ Ǎ.!qgf矓_ucRP9>S7m1(e$ɠo}>lpĘq8N29: [AQTބgXm\2hQ"C/ل;F1H Z | m S.! ,Bz;W&)Sj2j01Bܒej~w[%mPJÀ5QJ`6]l4kWoڝ@A"Z˅O-Sl.8 !bxm– ?~< <=jlmv#сǁs;ҍ'kDnJ'f _iœXhzp~,=V\|yKR%Ε` 7F:waZՆ*Sqz8^K{_vFH|moU=۩rŝ[uGg%΢JTOr>$/؍f is^h#uktJmo6Ȅ_|EFe"3WO#tYplO t_3 ١BIGW5.q1w 1KFTć<'g)`#jGU.B" ~w[!UAz/,ۼLͽbL385Wζ:#rr1g{S) jP|湘^_Йb]D八^e;ON~թBKDdI`.+(`gjRWI#k/V{a 6|I͢(z;m˸Z AJ%2gu/_Oύ 5vkoe9E+w N0gv46%,6u2'LH@)"{T*[ñ((!`!k˫i|qx%o]nQo3?8#=!s0c?e,a$de"DFɺPp]]SDմf'nC^ S{]Oݐ@ +BBl*[Oh0j&o &~Qɍjtas놚8K.e璸ETqJm$7 c:3^;Ki!*7(ht)Gmdurٺ E⺳R*xQIΊ\ z:XŹ?ڵc{=wOMi h91'k>碛4Td^0.o#fBUBs|> +Qx^/J.>B 0PNA ԴK|~i"D4i8?vFd^PG<Sk6gBJrԾA2$=]A\<D1%3g'{I'9Ix B;}bh|@Nr*׻PpvŪ|T-4ҷu\ QsUVmQYP 'hl_+goiFS9mx~eGŷ~wmծUz -#T4,d2W$PqAXOҟprYۇu`bCra 3zaPF\I' WUZT,ڈ,.C͹"~# uTJh˸b<2wiӾH:}w aeߨgqe<~k)8k7e\/g5$ &'_nj QEu9Q!F!h7l8F}+Hy$Zz3Mk S .~>DAeQמjG"q-z8, _*eS#mEL:?E6,c~u-FS6/(Q/l9oR}b +46\0ev&㎊^?]ٴ=_X94r }aWqH683h_LK Vigc+U{K:.=^.J_kqX2~W:aR;vti)K'b<X< )zwbf_Q;ݞ9J\*ju;[)꺝*ϧ>lvlXYYkuh}RgB]b1f 0# DF16V%cC`ިJٴ5ul4 9]0;38>d&?X)xȉ' c4U=\Pi (|F }>h˽ IǗ҈Ɲ9n륏 sSJ8o gnq{ћwFʏL~fu/0:jT hy?tS=3=^ |t}r4>l^_hpuؑV`Ra)8s2߶Tw5@n5\~xC٘˧M8@ had>_1ENM΁i7GҿL&J[?YifW8~̀!4lX-L Of0;ջͰ&`, mݛo}W]Ɛ!U9{&60~Q͝Whql547j4UFMvܳLK\1; } T2TS_ 1%M;wj|z/[5PhE@B,C5:dXY3KlnZuGhC|`ӈ$^ 1!.) f +`ӝhFyWIĔa /7 kP!-ˬ4ѷ9IpXI:rNYջ6:!M!wAew.$_:s>r(͗GmfU 5{71`}Y=d,'!{3]]ḱpSKXdx#NWgRĞ"ߓ"DŎ>:2JBdODރ@X< 4|Kbg},_k6!~^acm"> ވG/YSCPU1>m4L3hþbZ}:bX@fA,S6)-xIva}y֯4I&eGn_;c$5\+. z`}R" +÷o0:*ʰ Z6ZS_ "S)jMLArK"@+ So"C55XC@UN{Y>(Q&<^KR-xs0ARBl3` 51'aʠ^ԂL;N4W")7"MSu6l%)M9-赵S6uϡ#9<m=!Bb|=9Ѱ )Lor/yG])KyEc4e+hTo\tLXl̔Ѭ9XR3H 0iWlhK H\;2T@6I[^ILy3F~/<3:+(?OsEPH"_ Q&˜Iұ}$D#z7O6b;e+b7;c iQ Sj 'DSeO%O<٤p+p[*N,7g.ݱG8-xXRaa!htP'>,^ο!w$Beϻ!!n~`au=Mt'⻴IqWp>v~rnkTox<-u-ФmK4rc׮-dw7m`Zs A֢':C`}kVc*Pjo:y8,6?0d=kXA%8{pL걫c\a*̂B=7rSql*(Xf,PgUu?@4)C.)Cڻ a#&WbͲ'@WDBr_Ðp<=faz94PmG'g mzx?7gĩeFlWe"8҂6&^}^eU%X5j#8jHk p<(/U 2ܯd^|΋ȫHR.ꪕ :r%<وKy,*rpF^<Ýp'\PQS Utldbqq2_T]W8DUߘժfk5[sہ?Y-3=̜XIy%#dLz%CZb!`0q>GŰB / Sr+j]ɶ(*Nᛷ> 叵wa4-=ơfDuHOmOf(TB -7Fj7A@c*6(>A9$;F d7ۧ&o(kUM9j!4ZvIobF8xLjѣ @/qE]zl7O!̏[^ioqU1 iwDS7Yy[`]1m?9G2{RENP,0 $İнҿ?VJaJ, Hdb8`lY&vG{8/yvFXwC٫,tc8ggm󴟓G~,Mz)'=ɂr6魠: rGSp|r3 |2F%scج6F!ۘj4N{" !薸KʰCy@ye ^qL v(اz xZr$UwTdi_EC](/Ce5@VrVUB '3ԙ6QM_y<[xM4Фnj_T]ՉK_ۄ.w]4Ņ nH!?zlRxؤ #QG}a"(Z Bb`SO{J=lW6&jg0 !Qv9:Ej0`6{{g(%%iYksv7P~f/XQڔ5 XZkw}2\//+;3kPIu:U] HEǿnh%먺']?Ǧs'jS~BZXFS 5^ƏaT68֠E.EIXmr zNjн75:_!8}DJufRXd+Lt12 }7_C?cF3gbv$F*jWr hM{#5{vU TkukVd;ƌ_6%7ڃzqy1cs[|`ə X B3mZt[@U7PƺĨp끓RO}RG*%6 )5QxaemP-Q`Қ\ҫ0@+J޻Vmm { [ڵx(iڡ H/rj2P8[C()'飪6HWGc8^iikyLRxe0 ׭lFA8EEF[]w~\lކw;)l.x1H 6فY /"X}Juy(?8U$*y5y [AAMvY_OB' ut ~\,m7w)VW_JKU츪^|j = 8bx9x,Ry`4x" bLdC&N3KJZwOVىr{_I6KARln2qa~\yS;⺲qZ>&d'3J ^֯Sθ(KzmFg\(ۧ+\&|/\ރAd{2zFK X(^FހKBAu{dOndUFN{)Cۑ1PQy+fW BK{VmZ"s)0Sot矑_F.y4Ծ>>O0toJev@{*&djtK -s3WG5#%4աa?ڽhPɊOKD1"-6g{W\:k+B.r Q([O+8/͘&i~24ΝH/Hv?kq~$eiiURwHp8a)[]zhٮofq*}%%4jsuJ &4KcaŽ5ը?Lj⋵Փ}Zo ҁ5l[7t4ֵz2A(ZVi(j5I^S| 8Y0zVUl,n{OD5qg?u[X~$vߍ|~>6+4{2|mV$?-dm')? N"/Lո]Chf@e=g;p2memWܟ:EJ#jf,v oմZ ޻'d`{K%Zl(q٩EݹMbkUUxM)ޅʛb:.㝤 ;֔'8&..o׊c\Ji(Vc[2wۻأ2.UyɝzP,13|lnte1k(uӦ[#R(<.X0uǭ۽OOPy`²0Mt4ZY](Sm*4o᪪unf YPX~x;ۤ4VPs~yb \H]jh[yY.5!yiyb<]gLt\ 5 iċf|U/t ?5/c;Кpnsϩ _TK7+E5s<E9%7ULz:R=vvmjo {Nd>witc+*Jέ@1 $HE@ hi[Y *XQŗؗwQ$g[]ʧ2ؐStBiU"j~r뤙>!^74˕;ܻWM;unuӷϭ?D0 ->_!,*GrXzfwnJf1B6Ow[Um1r.u.n6 9y$6)l&nZDQzX(.U6Nlk ˦8p'EBua+fO21 6+y{P膱7U>$,HpJ#04bl<"rSnުFfQU?xF~؉ѐ'_3b78Z-"V!f7T\ +Q'Țq'Z?HPg <'Ov!~I( KR1wq+^h#QQc&zJб?ِ/F{·bm k'?u7DsĜ?QI rdcH $@U\ccXtɢ,긅˃uSّ/ZDu [a?tF$}TV9$T;Cs1} ]kHvzGN9pq7G*ͪH+sںxq x;C/t˫0e5/j:rd&u΅qbXؔ֋Ld$2:C+gC'ؿn:) s}yw'ôXc Y '4 ņ0W8T5%IpHrTseJZ/0}pˀwWeʺ?5DyI5\x.[[Wm_3AoJ H;xbA`CD"Pm_5f[ !߯ $eu[a'@R^]o03=Q>)gJbKڄXlHg0@"DS>k0]@)6C'bէ'WYwInbEU`tr~iԔLkW'jy@W':͚# ZT\Gi:gUGc}b3Aŋ: 1aW_]6tEQoೡk&;KD!澨9@9-T"Ss,@72"pŻ$iÿatÇЄyyԠ<I%ӎvu^8mIrm84$n{el,X#@xE#YS/\\G!]pGLZ&E\yfErA 5ʔ.=VN`)-ǓH|Dš؎qUm|P=%$nhﰾ;bܼ;cBDŽ=[UjKFe31OwE.GJ/l\i#N^Q<KQn`sY&3ྞW?,i'϶֑3Aj+//M`—ǕI,Bub7.v>feRwRtBXu32^Le3W7NCnt0ѪcF^Vz^,M wa.M _zsEP: pM8i0[h LjB/`{$umx'f+Bp(;NKo=(ݻ8H\0 n{Z*ac*BE(|; Uydk{unSP sa2F q6 j.2לc@ K(jP'cS6oI3`VFfvPnd4,2b+XKDyN:}=:BM=CpIlhg2ƶ] ታ$#$;u C|[H ~*  PUyu) 3QK8r:w,Y4Y+u=Bxǩ+q:9;'/;L#7]4a W} ʏK_6/wqӫHsp330`}us4*T,!EMK,in FE9Dxz,dӏ=s"ZsPr?{tJ5ǖ >U.YQq(xcr$olqDaǕa#vR@OO[z3w21hwDT@BL~rVR,ED(¢Lw[FK~dC6? |U^gI-1ǭ8_aP3[y5+4@IH[q6D_A"!Qɻ ]J4@t0"¸ÿ&Pg٭Rf헂!jC?“C&N|2x )qF ƉTteppA0X#4Ge_vPP(} =wA0)c@TxYGo%z6T;NA(`R'=s=Rd̚ݍq+8i0(ze#mW)U[DE1'd)ՁȦ3= \ |=˄; k:;hCKR5nk=tJeB")Kws-w|P Bّ0#]~tlCM,r<57T q@S^/FI#w'i.qww{Z-Ge0x?y*ݱd(oݑyE^&ma>5 dv O>*VjBO#=oA>2#LZs4F>1{]C y˓/ -7͖:/nk#TIXQ{ֻӗ ;[}媱>rTaEO5P LrC } ~lO*ُxѸȇ'J\ D+`VD+5\ Љ/'Y9eJ%0w0Mwc"r%A"p 䴉 e`mXR^_T !lי-ixR+FΙ 1"@^-(Dq**LVkC%dB9>p%FH $u-N)_Y$,;q<6`|:$*ƳE_5 m1rn js |A:)0@:P9HF6bGۿּ9;?IZGSAۢf(;NKY цbVaL=X#Kch?[@Ո_O6.M\y߁z̓g0FԵima3WoE֍?_ċMb.Hv^r3QHxdЕEUuۯ<~"!n΍TY} O=O jb2 i~Yx ҝKd)@P+/*Y%ŇU>hed>C;.jQ?=Aq5 FK:k&s+bqj^Z=L{:&6F9<FM-SWPC&Y?-MWNEj2G(ɧr@ҁ@5PTᙂJ=3͕ jߞRuG$v:qIV9dJC x9=4UĮG&. sOIfhְSw`j"s+ۯky͎~BS'|żd˳[L2w^/vD=Z1ڰXbZ4]№.!;>>x'd;ӖR%S^$@ 2bլ4AZ&ZMTT()ls05HxЖ^ho1ߛ{"7~=ɟ؆C98B\;mULnj _ a0U֗Q<ՍˤrW& {)hx@w1ރiHCK2ҳK4)+O#ԪZr3;7um\8KPzJOjgD7+wFhj#_?BB~1tXjњJ1mx`Hv(a"cps!Rbnm H޿'F*Q" ؘ̈́'q:+)-_vm h~>2Jh+{EʭV&t pFS_a$sn2)&JhIyK]E! 59J|ɓ?&Y5Xk YSu3>QLͥl0gy< OGE" WV  ՖB&!q_8\ 5pm, 32"sQٮsv•uܛQ#F-̆(6_AscP6^ZE>kk~dCyayq5/>7mtU9CbY*jh&?=/XoLo6"UFKgi"ٸC%՞\xymnF!Ck&o3f>x`u6;284)Y-šYMGe lt" ;.om0/1@>L)O6GokP! =?èe@r[>fk ;QeGKls+V:g2<- VFf5.6Vz$X8R|LPDžϾR s?|l`Hs {QW^ݾ.4۴aQ>lj°,N/:-1(@l2ڸ'ʁ, ^zA;<pyty"bՉ*;~ފ*hA)gNYg; ^gE_j gpowwMyeQa5#+"5xm|MTRDoGt_'5eZ+KwKs5Z!Y|[OxLv~DiQf2%F6M:~؀alxraEwE9Jlx(pdm>LV.:]m`z ;(! YG-d|\:9SC IBsE <r\1>hMk4굄ߧUD#S. HrnK{[PYB}mJc[ 2ԁ|˴ٯl"G/?Sl6ȷk܋2J<(Xr%B9}(ѨrK1dk-W &Wev0:M,̴} jp\4 xjlNDwʈ>/_FE Jmw/LHe)22mU{2C|e@@QLm!EgVv?v %o3N\'7Hۛ!ҡMh9\c@hܜّ B>B v(qHW.U~Ҏw@hE6 T7tYY7REDW=m8VO&#I]@ȣK|Kg:j4dֹ䫨G4rn0_S "=o|#ܳ'Fi}3Q>fSwq@k2ڝ RTK\kCGa*W<PBa-6 2Z;=sTyыIbJ x8h4йnN:ŀxXlFqDoXQd+jaWr.$Fc:x)l[CCa=3]V'*f{bk8f4X.z2뾠& Vxd76NϬGMP_,f9e86.Cf^R@D!/s‡>,'Y_¶Ձo$J$c`'ےhXLՎiۃD)KtՆc4f |\^tp$YB3wT/-3pƼx%|)^ӂZ ; Ҷ`wr*-G1@ ǵZ6ߍ4<-]>*m>nFNn˥ u "5[&qetL`}70/tx޵^[$[JwڳPryW_b7$ț#((+,h.zCf蔑I@n,4zl5}t>|x:dguPHzX|VfP}[ Muh7HT luFtF^6M(Dw |4H>#;%QUjqh(,(1(f=ɇkmt8$.b$DQX"C#Rcn2H;sp4ܗX*@2Y+-y1Jx93e]r:w6L4ABAz <{5o/ S2j3")H *%z>Aav /ș.%BF-䬼ug.xo)lOB9<ԴX!ԺGJYPa-^pR2&K?Qꤢo'2LA3L2:p^h65SE2Eh@05d--GF+ws@|7RQ?PɸYSЈz_jƯi{~JOYZe)Ϲ&)Y7#O-$.>;4d|ėy+zVW6XPNoNFһXtC˜4%XNX.Y+Ӑ۩h?bK~X){ L(ev2`FʦW= s|I`Qr(ǠUGtS[Sm5dʓs^ nZ=]bcSIfv{W'mY j_#_A#Hֿa;G0ǰ=ps\)[],# 1dF?agbgSl?lQi=%^N#ʚjoh`.9Pn[;'2AiZIl4#QVAc-b$Ib-aXy^NaHӀBxH9;@5)':[o:Խ2O4LtFS)WS<:q|E0B4l G45+e%LIKG u[j* F#+#).]F*삉\`I79+)aeLk:qn Ob.$P}cÔiZQdzcoҁJßi<[&JD?щ*ɑMaIvcZ':=ȕ8j`m Rqn/M@z{xs#2<a^".PsO\S\Iҹ;Nݳ|)/u$'wK[BW:tBWp}⴦śĴyBdWrg531J woC<S(6tk^xš0|՘}07kqS DE 4QqP{Z/qX z끯 YV)% f{Y4!=}689`w(:e*Vq?&h{v7HpVo?HYbW m)+g7`Lv-½쭝$UD88MBw#ے`^Y6*g?e$B_]t"TkSr_i̳q g([1#/6#V6ˎ$bD诒҂P8RZ{=TnLTF_EkX/0o 3mdH ~~_ ǁ ƒ<6,~$.rڱ'n.btu.CE<1-IEW[ 1y坂ӚB`˼)k ''K4z=DfL2KTG v/ȢҖRTniL =<4)a'c g-\9oYC"'>o:Q ;t=+(  ',7{ r"sQBmwfW5haVkUȲiʵ9O.F$_͉_g췥vIPsͣx͋n})jnXT"bi\s7b܉|hߨSQ7)S0#h' :O+z+:bHR!fz#޹|ӆ Zkj, ~:ifax h⍑ǯoH+$=G}+D ғ&}ģ`kD+7)"1Ȍm=x37{c>)% X/CqY/XaB+0^g( [c&8*Е䇍bG],'X=H>T,511=I>L Oe΍T7\om@@| [ e /cGCaD-5 xddwbZԦ|i-rxxc i#5{}xmz&0)$R\S_QѨrC agEYr+Q=㑧~!0^ ^U^NkjVJ7MTϾcʥi@σhҢ%}po}cc;T:I>G&KvzzGj}qX)+׊Xd،y8+>B#%ZE|,XGrɯ.rwհ`HDb FF ė6j"',륺I{<&nQ`W%O-sO[3" ޏx#~ťģ15 R6u7X׈(c1ֱFFcÄ>77: C 4٦{r ~oS{8΍.cf\q>>rVbI -U^W~_L7N牂 q:j8P 2U'G,tIR@  ]ezMKOI}Adp<0sxRSEdJWwgaa^qwL`QhfU@IIr<'ػ1Z}s?xXГ*K@iQٕUԸ\kI6G 49LͯZfs`E,[ 1}ȵ^aqсoP$ .ns9ubұcW+R(3F!t1b?=G/XIȿ%V>j;͉rЉ޸QFEtކ?NMx-GLcZ$64#;&$rdz]k|Q֝u֏6CTh/R}ba:]5E [I.J߁*_d/^:ӌN꣠ʿњr3H<{1}ꬦ,H*:43+imE9i,KQ햝 Vpk! Lދ,*K5H5&`JN#sd|f)釃v#' 59 u[q1EeRf%&2?&"VxBڎVAARe `1%kT 7sK?9ǾU09KWCk=d{,A*k훩?_Gܳ)U5ak Kr=2U:V ~:n6%v20E5ٺ%`G &b[}0(q?.@@g -J`uDaWW;+Ω3 6\ª1 Rduk0M;J}Z0xl!mZd#|]?kn3 m"gaUN}tb߄iرY0)f:JMdZzabd@-Dj=]vx{5q.loﶊ_•©6oQq҅jo ʽ!X0}+o2"7l60G/.a e!7a#}i"7ʓac3 ϱr Y-02=_|B&>n7WGEgM[lΤfbMvo80O-/*' 8< hT.r"Gܪlh@PA5~ 7_V^ }.r5qaf,>u*Й|efMPEr|+=Ghn̸ $$zLwfʷ`%x}:on^;WGN.czъms. ̞ITp' _yi⎭$(f*  4 ~; (]%aVI4sI&}m`+ `ւk0y.`xwML |fmksA??BP,ofqtjٚ+qA7\n]VbeQR' vG9 ŝv4oࣅ8+}Ӿu3K-EBm.<*t sO׽[ MT[[=ǀ&kqO]Ι&n4}C`=$2G'b-C9`hfT0[-2K%-g y2Nd'T;ECRzg) `hP(TSN^e3/F'pE@*"XcR,QLcq(v t#O%r>{ T^Jw}#YKAvӹ|CҺZZMW2!|㦌uש* @ \ \ޅV/ $L?,-Q6S "`9)PHqvUԖW9aeDžMZY{wlyhGAtwMy '_It (gmoa:8#{XaW991vpA uZc)puDuRN)IҏOgln|UU;`YR4v/6jhfBߛAI^s;vKw,7p%-U1.ce1\4J5F ƁI{"gwuz(xfEɅqe|Q܁0_UHG@h/4bVr}Sx6&ĨC-~W׿lcHWw XU"Q& ?d&Pt:Ż.Ҟ5vB:t}MP26M%.ԠȚ`\?sQݑ{:a.I FX#t64ˊ^R16/π AfWq_#0AWWef{}JmE^ε5H9 -a,@~RrL`d((\\;⽥{6* ]_uɂuvos0cy9r]{sgLamfB;ڔ={u:! *s\U&+ C!u;%ۦtflgް!g~Mzo(+zk Ȋ_9ȁ#qqOgQ= /_L;6t-KŞT>1% jϷ6,3O~ZCRQ48$^cZT,vy XSAV#CY4 ^XQq:[8+T'#͝Pg~}gR{V(J8`Ihu ˽Jk" h\pw)LE$W^L݅a\OJygHBm)yӉrClǤU=S?ݿVlPSΎ ?Bg 2iCAW 5RAϺynG:Le 6tT[bVYL;^m ߳i` [ [-Zy8U'Ԗ,/$)^FXה=@*[F\t|С_G'D/p`|"HSFcj$o>\_xq%UCEh>+[5y|+`[%%geK{w0c2i3`1N8fJX[WnXElA <7'P~+8/|t&d{0]dji|Hn>z S*Apsx+--ӟ#C]Y շG*Tk a 4~Zۢ)O(JK7qEIց.LJ;u56@=JWҽHC}k>wk"Ft tJrubmW_ꃲ< "s*~G *ʌz$O!>4bT@u>wG"1* 15SC1=.S)-Ɵ8[P>AÐ4̺MKSsk<3o2q7C SΏ@H;(Lm2ʇL3t'٭ yr#IpʥgU8L_!!ԁS9bx @F2y2s0umWZ :14Ym3DӎTzuĽʘؤ2ˁ8@ y)Ú1& w):?bN3ScΟZ谫De~ޤ^Y_sh72yNT~kt;!1e:D2O>y܅nDORPc,ὺ?ZYkkhljI'5CU,C ͨ~Yzv9ź!à8= o K|hB4mxMw o^&/(2~hN3n= }/)^M&xX&-&Qūj{V;π=V7Jto|F׊yzȑTPTXߎ X'BfF^N[1z ڔhp5$ɱ'v&`hVpyGb}~rsNfw1b u,,[7(FV^t_P󌎬.@OG!7d'?@6W#t*3aA $KqCeX\\mm:É]2|nð6{nEWZKW^-_\*!A4k*n n[?UGaL τUFY3XF< 4-Q `cXT_(C[Z8L.`RACI8",D#9~ /`OMw̚7RSe&]]Ď=ʀj$4Yf''8];zQ;w!q0M75HX4zG19}v^@$=56-5||FA$|Lr oL~Qnb>|+}(fp pVR7WP$#Բ Yۮ1 D[xڹU]ixfԴ Î9WĜPi kYY_VrGp*mcXRט ]1#M!%cwiwCSH`9wݖnǨvnk0|yXIb'Fd$C8Y\CDEg\j;qP5lMY15۬)L&v78^tmJυ'բj#/%*dn*n>)xB~iЯr=kg= Pi"2Ä8@+yaWO"|&npAfjy"8w\Xhv*&v% DW0ْfg!99?8oEu7=:tF N hų3sHiz:$H2Lkc~WmM[za*.Nqс2cTb2hנטrYoD8ǓBۤ!;mZeݕ=m8]u}D~p nu)dheNXvx؍.J5| !6[Xw9Xy!EtL;~;?3^\H;oblbF-W0*n/W@<@;i*7܀)5~K0y] Өk? W&<-A3`D5bm^o,axӼ3Zk@RBS{x:XMa]~͟M*$D+|=Y)FDyJ-e,E ?ImԦDM> `=?Z[&u1aέfуOZkIy6J%ūA^ጜc >9* }_R%.7D! __gDр>9qV5dԯgeW*?3l7F1vx?_ߗ@1jq5z"W*Z5a)ay vQ :>ub4 f3Dss_.Pm(Oq:f?Tڜr:v,p$V+v+BB8R{;WD EsK*RT?PU~g W22s:\7MH|bT=Wb%Ad]Y;c2SID<7LRbZ=']3>UGJ#=tS1)k) *s3kWd}vF l,ujmJBfX\ PXH?;zQIݞ1q7#j)I6#̹PVS4˦>d>:+:4k"2B ^z+J-8C!U1qW7bDY_fcQ+tq}VyXIqecuas>*V1˿^>Q?.3$Zn\cfe^=q6g?zj)ĺօ7R<`(5p?A~6UMhi`~f/qJX)C3B:X\r,o|cR:1\i״Z^ӡr\9\ 󁹧mU͇4wT[G|3#Uzmmx0֪q>yScLٶVF ;g{LL­+@KQ侺8y)YNtMhcaY R"'H}JGk)[DZq0H:e6!umv)Y,B*ttih1A \"RSu1/wU@7%=L5vU|Rˌc]/e* "O޽t4?F=g#^SRfPׄZ-\v|>#z(Ei j9P-A=%f$@Ko{br9o_ ]"xdveZmUKM 3:O_G~Yt:tVfI?A8;!h$ Ce읱iLU%,-tX?$z wjBjs{-Ϝ4r-1>tN.mWt;i]'֗%K Xb8]4Rψy5vsL>r8B@c}u #؜$m.*%mBeYIf'LR+^lrΥqnHҝg^MS8$ݞp.Qۻ4x?۩`tإtBlD79iS|rmG;Od\RnS!ٹ,={BB&.E=W6mw!-7gHahSC \G#MeGVN1TJfb$nR)/STo Q4n"xu@N˹Yόcw0V STC$+i>oN`&Fjjem3  |S|O4h%~DTy`$w c?wCgSSyxg [?Vaԣ;`ޟ6 ,OeϹ4';`x~Ϡz&A|$ -T>Kx8K:2g~%O Vt XO ZW{H[kC].AMokHO/1M\k /t+X-ibh1.5Ə[b!2EXVi&0ߠK;IZ-cʳ  ^;LcT zqrg%+|o*Lu@։V,XZb0~QIj5g58gτWUZAj1Űl+j T>Q-/u92fS~.SQhRd` Ć8M1M "~ƧUtHN[+>vL~nc;aM猇V_;"#Czx4ҴaEdDyGX1%bc?xBjznoē@ ."x%;K逗 7 JiζW2hS+&!SVY=bW(ePw tTd},gNVXH'P?m9ˌp  maOBIZSBw:^vfl7kw(Up ..,Jn=#YEr/p`/ᙢ}7̺ {7j@/IfTujGeS}{A'̟TJfe9z6TL )DV<9E;tz;'ZFd-#fFN.|r7 T4{¥4SYxg(UuLv0 ݥ2}DC@TȞ(= mHᐅ9nwK'}]&/E?6؃ԙ/oTTO[ IS?;_8Mkl1֟t]'#6V&=:}6w4`QkR~)+ py@A1(E*33aPt|Qt8>e y MK 6!2~2:V 3߶~ 1}%n$~{F: =㇫=TE6N唫E$ezyNFcIFF4E($Ƥ47߻#+Wqjs{ L˜Iru)]\Z ͺ w:\^^,.BAiqr 17ӸiQ/}c$nv0G&m9}m' FcHՉT=wN$KQ˝o[~k U*o5⧭|D߷ ϯҡcW&P,\mO|(>*8qѓ:(74ߋhX SR|ZҥS7ڲ& (G LUž #W-^!]QXjQ&o[F0{q;d\ >/z.XdeӎeH#?Ql+-+S7ets?^>-[fʱ*[22Cn+ǽHks|qM{9z:ju{4"9:(Q%9';URcGF'XcE:wq9 L[$ ^/>%Ħ}p9w1q׃=@ZDj0msC BOP S ؿcGN~YfoF9 2z ?μ,7XddeW8;b^jU2X.)T`L"}NK'pF/?Z5I 8omtMX b:>qq?$Oݮ+Uqoq+o^^/'J2ªcvuJYÿl.i ֏V & β/3ѫlGOt7Z"Ne*-Ыj5ёYn>[Fk%BI0[$0IMBzs(f?Hi荊J9澝q++C73d VrMɣAt##2+ ؊2CJ2%P0&Dg#Ocdz/ć"«ˋP<՟JΫUQ0/>cĖ fDzzY4G jO^cѨeG2Mz:jxc7N\7xcSb.qujS'S\~.m?0r=8Vxs謴aͦr?& #Yj8`4~yF-BE%;y1w '-^a+3/gGfDY1DZ*FT${C'1 q: M=<_VBW\ =MLWx/л+N_;vɠICŕП&Zugp42|JJ`z)iWIO: 6>7>sV^6`%}}M㝓+lxDx >C'եoo<1B/uktĸGq}oH*)n\Pz3Rr:É3rˉ~C#>I\Mn1ޝ/)zA95jמד*cR?[ 8p!7  MkJFXd|>pw:@deeσ%Oƈ{d-`gEU=akIƫZc߬~c5ΞJg.TȨJ4tZOiTbL|bXBbz!{ӏ5cwU<;s"T!@юB{$Ωː* ۘ"+k&bű \\_?b4*b:qH q|R*SyD/JrID9iMyL;9@&s%$'ЋOXc42xO%d 7r!/ۻsQq 5<獅*6ldU^/+S HӤ`Džwy>C&ߋDƉЮD(]'bg3pi&88>ܾ$`ž6) /3`1^딣t7߲ꏉ? ZC`zhna.ЙEY Ykn-RJC:KtXD1 v^Lr5xIx;NN6zo$JpK?eZ"Ͼ ehM^ex5ڗm Z>1E;!2z†(,q H~Fa0d;& .5 ^GM9bILiS),KGt-NZ>a*$G}Iw~*Kg$&|sA}>\_xҬŤq@ 8_;? =Md"Hx`"9̔ Q8%y',#ѻ5Bu(År$LQWo)6ģKL$_gGpgA1P' Y*lYqsYv;i-Qd>*b?%_G5j55&$QZ,%e8O%߆!ޟUdȎ |SȆ:_ЋӫTP[tH=}̠ 4TiK6"˅Nׯ=r`!G tTlTf]@ބͿO#XE /G) _n7}0̂_r8 &_fӄ *{Xtbt*o%xM$YM\+x=0 qͤYan3s.ukc{爌@cԸ?, `ܭ0MV6~Q8y0ǂMo Tr,L[8sFx!H`}`o*YVM,Vx)2%Oi.D&OrC$*=bm.Gi;o/HA0jb5cG4S(8q?kwI8rĈoĔ;Li 3˝!F_7l!$v.9mBI^]7\GI)}8bķs#ŋ._]d*$`zKQBQ͔VR b8r. r(7#ؚ.}R:9RS*6~࿠uyNgKεN-P_FZ3;XYJ(; v8"VHZawzdH )ůH 9=|<&1&],mopTX5+Zh_m7b{8dCx\:gh8TZ+ԇ{ICG&5?6Ezӂ8aD@wP>1? qҝnkB\uɁXa3R^,C YEU *$@92诓[cmt-zYj{qaA?f?&m!#U1eTۇeՃ~Ӱȵlě&Fвfk,eRi!0Xi-`%]Si{=(Ѯ6Q YS'MDg¤'^݈|Cćm:M\ѓ1>;<)-Ya3w l.'5s"FıgDJ襼MP;y'pa]| VM#kW1MhRv٬CS}0DsRYQik5Ldt #=h箱;!8h{;hY5ujKBI:3@|r 6&[eS$̟_wd <gVϪ fm3f@P/ԵB+$r\p,UR7>_qv@/[\D_*E"O{L&VǑi!ucP%OKZ(U+"o!6UDlsӾd .[Epf'"DoW}'#i܁?Мi\t++p؏Ա,_dvU~y3sK֘jTRI#M>o$}kpS>؃m\\m~͊UXT*X+ I!mh>=C0No!#΃K,X76`{$i~)@Icؘ2}pM7IX0]1q:dA>&MMZM2S;on,)q|s fQ?Q v+BDO}}n;"_յKIp2E ֻL'X{^DA1>7Η>愮* =?zei睛<ѓrZϢ#Ybɶ¨|GDeejcA Jo^>v,gp[3 CyXGֽք)xtɸyܕnFojEzn%η |1>j$8Yx,﹝eE59‚vaGh =*{Q_ue?/T3߯PQKUD!~jfîl5ŸF7 x|9~eGv,*{ϓyY>q۰w/_5ƚt2?QL0VELm^ܕDNVF0hEb7RM`\ A4E:J-K> U ceD1W5>;놇q B1W4YMFJv|ot8x=y~N7C0k8 9luCnj9;u.(Q#鼏8qCgZ]CfŬQ$d.`^APw4bX_Q/?}8ޝܬ$,_@gn> e.܈k #`u&}&SI֜Z+? 8s0۩:>3y6@ڡE,uAd-YFkU.J Zm-3i.2wT8O9c* >]lk W"Z<{{tL8[H<*+Lmߵeu9io|#:TU_\Q zR'˜$7J劈Cvu"n*TMf l\(ak 'Iќ 7] Nlp0ن0k -%i:x"a,%9'z+}e8|L,'⛫P(f\Ր1Y@d#&LOVƭ(qHvȝNΟS1-näNPU3yy2]hէ#QwP햂>K -YUvO [ɸ=|O{ٴ-X3 )7w#{ГcPm*}ef*3q`|t_ceM]um/6q'+g:(kIe9X>Zh!-RHfm,;H߯C*(V*4y)Zg,c6ݔԌ9 ds JS'Ǵ>9@Mde 4XxXU^yCMZk\`[R^e5ρΧ!NJ鏮<)Z|g[TdƊ;Ḩu?oQOd۷Ϋ{\d̑ NH߯ai),֙C=5X_ 8C7UF [t\4r̞Ǿ?;ldfGP|^6@q&_={,"@5HPH-8BQ j}NL"绖p_a:q Hv6ytL{"޸UZ_ SL Z%6x<))ugbBDM%oQ8a:KrHVep(w I8_QY`MhFȮ2A{1kȺ%؟}'+q\dⲣm_]x6"оD y9T:}l!O51E ow2DvN),[Ob\_bm~2~j߶$4}qp8>x_*Uxؖ:+:5kO{D{ 1+6sWV[} vC71QE$剺wTĠРۄݜ؝5fcjHXZްý\+rJMc:``^ ƪz/l$LTsk3p7P!4ž Ve$A[;@敋U֣~?9V% U:;1ey=#QS|c֍xeۛu/^P6ĎMJ7R Gy?8 {Lb_\ KJ[NàsImF<ٻ DٰҌ ` T3LZ6zƈ| MYв 8~m/_0|:t=94qё5m @BKrxFҜoi'̓sYcQ@4(M@_ٙ#\S"RU[6#\cVoW`QF2 {ӬDq6DE+HOAmh,0Kn,Tsjn-S \4XpѹPʐZ|tc)$.۳tP,s /7\BImS jQԏ#Wx_ߐ[(NȶW} `Id2뗠!.N͟ʶ [u)"Z|{Rl y8 K=9r5]P^6Y'LD7e*q]#H3gxUp_9qƬe骈cݢ] (ƄH`X)l͟9%P̨ܼNZ;sz\|ShoNoF=Lv7}xn,}͉$OLŲ>W:Y(+ZSq3%Ym9(۫{"?ұ(6d?|:m:iQ߿1̗߰#Q^Sӽ\q->Hod,Q\7z>K6Pljm^<|-ߋ}Pt~|#vgt?][KN1naslҘ"O휔$6'kl~M/v[Yp#Vԙ`3䯻zD` Вp#}/ɘf兌b k&)yhЋS/lLx 9I})([4h&18|ڃ 4D(lRQ2.3{drRcmz)pf/Vm,/Oy`0 `=ms;Xd nqfi!Y/\IGH> ]VU{/1Y,.%@5{]k 9.07hm(vQ `'&~.yƵBm9P˽JQp=#%y*9w;)F^sB|a wHco~NPB3ã2tVXǹ0NZkg&QdNOo2h+*:\GW1C6) tZ&m*]%Wݻ0!Yu,Wpr¾8u_I;^_C}:@Z:<@1L@%àR ̉R>Hh".3B{"[em)SvHa.D':3%- j6aWHS WkEWZZȧ7-9E:PPŋNF}a?ZɃ"c/=*Qf K:[ߘz M[_^6FQ"O BC#+N5UU1$'F1k@El~Y Qr HpnFin(s%i}bRDcМuJ80$AR @Ӝu 1ImRl);,: aâ]8u?K/fYˁL4r%$e/W0P3lt/V͍td~Ǹqn80G+׽cK>3ҴJM^QnSc-d+FCM͊9ٍ {.8~pmh8aɇ5} c"2ݾӎz/Qړ+lxlچ ="d&{QsƮ%^75 Y,CT%butwQD(/uui!TEKEdSS'S*Cޝgsڳ)=qV3DW{Lg4h`b-R vYItѥ/s3ʯLd&&wA%&}I߀Fd%iQanDo;:t#ɷ yU 2vcY}hBȮ)6葬)/^F1QZh3e2k_`3# #OV+S+Uw"^()<opnA?ugz8v/!.B֚%\J^a?1$1Obhj6"i`)U\E kb] pDfoLM&/Wø}dg=mVōpܳ}`vwaM0|IaEDH z[PSg['ށĵ9`(X7M)]%$a4 ^7ϖn]a $imA@RhUGF0L듿ܑG^ڛ3oƗ:`xXjW.}ޙGh pA_=f ˪"C,P6Tm{mC}aZ䱧I,8y <2 yMx EZϛl@왋CP-ʎeD֔yB V+sٞl V`v?L C yߣGz\,yer %'. Xfx E表55g`zʄkϤ >&ӰO}!ܤn p%Y=Ň|p3diqMӜYX Қc%8jX/{v|Mdb8)~)O'(P \΁ɲ~ 7HVQ-iOpn 壷sAKGâ>C3䒆 y6IDȆ0'f)(KL4}هg쪿BkR&n-s($:$T[XNK 歏N9,S>`lHKXjs݇w\p8E3hG|aCj9[Lu-;OAcvdVɂk"14*GL*iWH3hx5*U:p*86=x};Ѽ /^ R+v +7b 0v7  [ wI@U]ƻ9jnf~\=æ!{QwZWber(RsAKّKP؂2v~8d''&n80ݒVԷ>"K橹J(i!B|Q n(g]P^AtCqbaWה+>Tk`;aY߫B<1pa_-Pe<+ߞ`syR`Q??+EUo) XyTP oдF"d+Pj( B TU(xk}q3!=rGMԥlt.JI3cUAr}n>;[!^bGfϛxLfjИ >Tmioz F6mb]{q"ERН!bzwB ҿ_9qAԇNo0 `X8wֈ{i_ů:\C8AqM+ځ-a0p9]^`U4e̪+ސy? SOSj9kUIJ Nt#-d ,i84{pNti!qWo|C >+ZGE#6q?ib*k^S>$`K>n^8Bvra>dOoBhb+ Y-"t64^ k˲iL5(6Fa[@:bss$LUz>֮)64-FzhnΥrٲ̓W52OoZY.bӊ7(.YL{vo߇M $2ܟ@ 6}=%.I;0SNAsMdu[).',#gfuU87HG,Ux"ynWT}Fb]˖','xGO8&u젝®=eCip /2>5@ѼRnI@V_`?H^C9 kc\>aOnz]ƹ;Wm7mvʓqr)% yYnB ~1ZyN gsu< %* c9pjB7˖YtBEw~Z~}{$!mⷢ4;^ yDv06r\JwQ`(אͽ x[1W;1ԏ! X'6.Kx h$| Jœ6 :@蝇b é|D.Ϙ/3"{{l~14uq[R^AX/ YVd>0jz 7n)FbcѸYz.ҙn0nD7M\{&HO)ObK11*f [G4nKgmϼ3F:'R3dp ͥ!e{6_Xͺj٥KDI0L]I"6_` j=m2 cVMj-k0k/Xr9%#k4'Q:fMyܪ2r}F׏7]|Ö́ݎiF7wV8S|4Ũ2'eƨ =Ry~;^/`|t`˅(N?vZ*G5|KxQx򈩎pr,/'(Tu똦܅[ZDޟIԎ>J%(dN~#<5V//:4)Ct1*Qyk1P09p *JH_7t⤳O⴨$"ho a ;C糣a򚰊j6QDH MB 9vlI  NʡP$rKQ8dA'6k/ziP8jrPlAXj+\}4`Uu?~]4zLK^. e^x AkH3Squ+>@JN eϦIjFiB>CЃ}Wz,"+_f°hL }}0)j%YYD gP-i˒{/Xm 5(NǷ^n%JY}-#[ۜʣKoK*GHBm1o9i]SG)brxEtħ#ot.SX J<-f݅F? 6%G)uC&M<)YiF"q4e'rr^̿3YƍB.C"j t6e57# o$ppWQcAg Q$kiqb&Ӣ_22@q#5T^zìq;lz,/$T&2GL[ sIm9?;ci\rCh˽+vT9cN7,rzxT`k ڿ^8׎?zf$쩹z#zw"I[V8~4oKdVtُ߽Jd~* ?L!Y]?M/U!(ϸXfd^%Dڴ5;0-7ТG m,v'HԮ_?fE& Ym6+Lη* w'4:Z2zA) -v:Ƨ Jn[ io'CL*XB^fWaK¶I7H`wl`GvNi3_=>k.=LK9_6 SByk P %t䣷h3@qIvH' fN0=AnM`G+k Ӟ dփufg>߶pٞx< X\`|I~p)4wbsJT:闝HN R_q *Se{NwA-J+`|dIŇ-Ŧi]3}pw@j娏vSwhLg_dHH|n2>xa}|sG$?#И ӒpFgw,K6֎(崤e_̳~4VB'뮽!kJLk.#xp0 'mJW#|j kHqKg|Ȥ̰ Tn@q O+ϙiQ-b#"ݶEj xƨ0 7Mz,B_P=IݱS3 ¤ ~| fPL< O:?l [;`vD}FƏrEWZt3o"m0 1)kKГY{:t:ڙxHF6MzoN;t4[UN<Zw?Fp@M-}t:M +}3Y\8ܓ<Z'Q6Z}t=Ŕ^#g4MK60(T{_+4s[61e]M+at/|RPL)oUH۬ѺAҢD=(Vʪ3!9 {HcC߻!f;ظnue"4ln0/Ts} эV5_ MqϿUҐu18v V;_ߑ]1l[$Vэf^|`$W9 >"F10[qw~m9C"'V<;݂ Mr<חܞvN![|8W N}1o* $#<%&if'/[aRk3w*w.睤_&7|^d)+|wF >U gnظJx E5[r [fp9ɌPV[5EYx-5BF"N] :8MG`VqW2ˊ ^%D12#mO0>0dއyLDqm[_xw p_4@cj{ w~$K-L횸SdԁMfM[ ? $/g_zi:/7K!tTs-=YVK"L?;}]?fgƽsJ.҂k/!WYSaj` '.$49XV C!9cw ]aU~&*^"@5\0K&jO+"DD3R}!B>Ȱ,xhWY;BwAOxüzʿXXto=+r 8f$*;1XMʝW:N(W?,7XI8GÐl=H+4Jry. T)kB.'B%'9'v".c{dCjU$<|^ǯiIC+:+ފĐp f"bl~6*㬈m}Q-}nλZy\wCBk?X^96) ɳ7; tZXDYC7FtKl ǹ-ג".VP@NavMmS5x EBT9(ZF1]s<_{B [b\@SAz%z]qǬnolG"'ѻ.ϝOV\x3Jp!W5Ti)QX$h$_K3q]fހA- iG3b2CtUhQek9i|47n*Uzv}߇o@'& "2Pw%$0 ФȆWF4KBLԼw5=J 86żb]iê wRRʶGuklUq&fJ(5q#VcX(Ae\Iѫʂ*O`q}_ܦ1FaSJ6D5Wd |CYʳD; ܰ( Y?N ^>*W{u)9Y*{뷼k闿P\3R0/ٿ4N>cW Kl Oyc%]O}.DXzmM֩ƒsy'{a]Ձw]Mg8%tx_hݹgHɈ++AGTA tEHoecG^pzEؖ(?nKدeُ5Fu&>lm77S>}61Kz7Xɼ+KFѲ]Cy_'UK}4pU^= Yd(cb\gi$\=ɩ"̻qhBYک)edv6Cmd_3y 0I֟dY|:YD/mWiЏJn sdb{GjYj~-Do;2=oS9ot6H%r^zQ.%gf2S?B-j*Kh"IWvLm88&@TAq+շ"c.X9Ru_ s_hߠx ~şN 8g<{yH??xX\DcżO>GS34NXԉ0_peR=2Bx-9 J}3hBǎaÕM GEj ӥ`rn#];q$Jj~h=AC LUϧbGw3)P] V<{#bnNZ/96 (<w y &~"@N496ӷI^6=/ޚUAX<0pܴI st#2J91!,Gu!tHlݲ]n$9JH/*i6^λR i? s,:ڀٰrOWC*zb^ D!p@* : H |asu,lҁsiZTVrtiԼ6RR 'EڞGW87Y}s-]L7Bܝs1̥]hxs҇ws[NT|/b!]%+m܁H.(\'fB$eI?>i!ցa:*&!(mn\0zŤߣ f?Q`m?fC;h!Rm<P^ڴc 'zr*'LAT,^]V͞UW`٩~̛"FG1-/jWSF760jB ~׶Sr9:S,~T!ד&PMA|ɯ>?|b D KP*1POxUsN8 (t?\ip1vxn@P1޸8^~\o?[q'ܐsQ©z3oO "}^c) 5GWl%*(?ds]IߝaukՋ io"Hx;DٖRzߘZM)@Pɥ*#6~~[>d' WL!\ 0R f)>eo%PY5ً-"+cE\<}z}0ry+j90zK9zN_w dpNңd4, 'wmБf>+[~NCt tE[RVC!,/]2-h oΐ6L%DGp|D-C^Q6}$ǜՒ Gc 5U/X^dՌl+A~wtepQVMpC`8Cn(ձCZ ]7I6Xqc-|w/ԖRWkx*w!.5{0¦"}ld1j ;X߿"eR.0;leRq܊Џ/&%WxI_â wg*֭J(6`(~pv1:ce;P+X?mt|"s[mc1z7,;=dR$|R\N