'install', 'module_title' => 'CONVERT', 'module_filename' => substr(basename(__FILE__), 0, -strlen($phpEx)-1), 'module_order' => 20, 'module_subs' => '', 'module_stages' => array('INTRO', 'SETTINGS', 'IN_PROGRESS', 'FINAL'), 'module_reqs' => '' ); } /** * Class holding all convertor-specific details. * @package install */ class convert { var $options = array(); var $convertor_tag = ''; var $src_dbms = ''; var $src_dbhost = ''; var $src_dbport = ''; var $src_dbuser = ''; var $src_dbpasswd = ''; var $src_dbname = ''; var $src_table_prefix = ''; var $convertor_data = array(); var $tables = array(); var $config_schema = array(); var $convertor = array(); var $src_truncate_statement = 'DELETE FROM '; var $truncate_statement = 'DELETE FROM '; var $fulltext_search; // Batch size, can be adjusted by the conversion file // For big boards a value of 6000 seems to be optimal var $batch_size = 2000; // Number of rows to be inserted at once (extended insert) if supported // For installations having enough memory a value of 60 may be good. var $num_wait_rows = 20; // Mysqls internal recoding engine messing up with our (better) functions? We at least support more encodings than mysql so should use it in favor. var $mysql_convert = false; var $p_master; function convert(&$p_master) { $this->p_master = &$p_master; } } /** * Convert class for conversions * @package install */ class install_convert extends module { /** * Variables used while converting, they are accessible from the global variable $convert */ function install_convert(&$p_master) { $this->p_master = &$p_master; } function main($mode, $sub) { global $lang, $template, $phpbb_root_path, $phpEx, $cache, $config, $language, $table_prefix; global $convert; $this->tpl_name = 'install_convert'; $this->mode = $mode; $convert = new convert($this->p_master); switch ($sub) { case 'intro': // Try opening config file // @todo If phpBB is not installed, we need to do a cut-down installation here // For now, we redirect to the installation script instead if (@file_exists($phpbb_root_path . 'config.' . $phpEx)) { include($phpbb_root_path . 'config.' . $phpEx); } if (!defined('PHPBB_INSTALLED')) { $template->assign_vars(array( 'S_NOT_INSTALLED' => true, 'TITLE' => $lang['BOARD_NOT_INSTALLED'], 'BODY' => sprintf($lang['BOARD_NOT_INSTALLED_EXPLAIN'], append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=install&language=' . $language)), )); return; } require($phpbb_root_path . 'config.' . $phpEx); require($phpbb_root_path . 'includes/constants.' . $phpEx); require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); unset($dbpasswd); // We need to fill the config to let internal functions correctly work $sql = 'SELECT * FROM ' . CONFIG_TABLE; $result = $db->sql_query($sql); $config = array(); while ($row = $db->sql_fetchrow($result)) { $config[$row['config_name']] = $row['config_value']; } $db->sql_freeresult($result); // Detect if there is already a conversion in progress at this point and offer to resume // It's quite possible that the user will get disconnected during a large conversion so they need to be able to resume it $new_conversion = request_var('new_conv', 0); if ($new_conversion) { $config['convert_progress'] = ''; $config['convert_db_server'] = ''; $config['convert_db_user'] = ''; $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " WHERE config_name = 'convert_progress' OR config_name = 'convert_db_server' OR config_name = 'convert_db_user'" ); } // Let's see if there is a conversion in the works... $options = array(); if (!empty($config['convert_progress']) && !empty($config['convert_db_server']) && !empty($config['convert_db_user']) && !empty($config['convert_options'])) { $options = unserialize($config['convert_progress']); $options = array_merge($options, unserialize($config['convert_db_server']), unserialize($config['convert_db_user']), unserialize($config['convert_options'])); } // This information should have already been checked once, but do it again for safety if (!empty($options) && !empty($options['tag']) && isset($options['dbms']) && isset($options['dbhost']) && isset($options['dbport']) && isset($options['dbuser']) && isset($options['dbpasswd']) && isset($options['dbname']) && isset($options['table_prefix'])) { $this->page_title = $lang['CONTINUE_CONVERT']; $template->assign_vars(array( 'TITLE' => $lang['CONTINUE_CONVERT'], 'BODY' => $lang['CONTINUE_CONVERT_BODY'], 'L_NEW' => $lang['CONVERT_NEW_CONVERSION'], 'L_CONTINUE' => $lang['CONTINUE_OLD_CONVERSION'], 'S_CONTINUE' => true, 'U_NEW_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=intro&new_conv=1&language=$language", 'U_CONTINUE_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$options['tag']}{$options['step']}&language=$language", )); return; } $this->list_convertors($sub); break; case 'settings': $this->get_convert_settings($sub); break; case 'in_progress': $this->convert_data($sub); break; case 'final': $this->page_title = $lang['CONVERT_COMPLETE']; $template->assign_vars(array( 'TITLE' => $lang['CONVERT_COMPLETE'], 'BODY' => $lang['CONVERT_COMPLETE_EXPLAIN'], )); // If we reached this step (conversion completed) we want to purge the cache and log the user out. // This is for making sure the session get not screwed due to the 3.0.x users table being completely new. $cache->purge(); require($phpbb_root_path . 'config.' . $phpEx); require($phpbb_root_path . 'includes/constants.' . $phpEx); require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); unset($dbpasswd); $sql = 'SELECT config_value FROM ' . CONFIG_TABLE . ' WHERE config_name = \'search_type\''; $result = $db->sql_query($sql); if ($db->sql_fetchfield('config_value') != 'fulltext_mysql') { $template->assign_vars(array( 'S_ERROR_BOX' => true, 'ERROR_TITLE' => $lang['SEARCH_INDEX_UNCONVERTED'], 'ERROR_MSG' => $lang['SEARCH_INDEX_UNCONVERTED_EXPLAIN'], )); } switch ($db->sql_layer) { case 'sqlite': case 'firebird': $db->sql_query('DELETE FROM ' . SESSIONS_KEYS_TABLE); $db->sql_query('DELETE FROM ' . SESSIONS_TABLE); break; default: $db->sql_query('TRUNCATE TABLE ' . SESSIONS_KEYS_TABLE); $db->sql_query('TRUNCATE TABLE ' . SESSIONS_TABLE); break; } break; } } /** * Generate a list of all available conversion modules */ function list_convertors($sub) { global $lang, $language, $template, $phpbb_root_path, $phpEx; $this->page_title = $lang['SUB_INTRO']; $template->assign_vars(array( 'TITLE' => $lang['CONVERT_INTRO'], 'BODY' => $lang['CONVERT_INTRO_BODY'], 'L_AUTHOR' => $lang['AUTHOR'], 'L_AVAILABLE_CONVERTORS' => $lang['AVAILABLE_CONVERTORS'], 'L_CONVERT' => $lang['CONVERT'], 'L_NO_CONVERTORS' => $lang['NO_CONVERTORS'], 'L_OPTIONS' => $lang['CONVERT_OPTIONS'], 'L_SOFTWARE' => $lang['SOFTWARE'], 'L_VERSION' => $lang['VERSION'], 'S_LIST' => true, )); $convertors = $sort = array(); $get_info = true; $handle = @opendir('./convertors/'); if (!$handle) { $this->error('Unable to access the convertors directory', __LINE__, __FILE__); } while ($entry = readdir($handle)) { if (preg_match('/^convert_([a-z0-9_]+).' . $phpEx . '$/i', $entry, $m)) { include('./convertors/' . $entry); if (isset($convertor_data)) { $sort[strtolower($convertor_data['forum_name'])] = sizeof($convertors); $convertors[] = array( 'tag' => $m[1], 'forum_name' => $convertor_data['forum_name'], 'version' => $convertor_data['version'], 'dbms' => $convertor_data['dbms'], 'dbhost' => $convertor_data['dbhost'], 'dbport' => $convertor_data['dbport'], 'dbuser' => $convertor_data['dbuser'], 'dbpasswd' => $convertor_data['dbpasswd'], 'dbname' => $convertor_data['dbname'], 'table_prefix' => $convertor_data['table_prefix'], 'author' => $convertor_data['author'] ); } unset($convertor_data); } } closedir($handle); @ksort($sort); foreach ($sort as $void => $index) { $template->assign_block_vars('convertors', array( 'AUTHOR' => $convertors[$index]['author'], 'SOFTWARE' => $convertors[$index]['forum_name'], 'VERSION' => $convertors[$index]['version'], 'U_CONVERT' => $this->p_master->module_url . "?mode={$this->mode}&language=$language&sub=settings&tag=" . $convertors[$index]['tag'], )); } } /** */ function get_convert_settings($sub) { global $lang, $language, $template, $db, $phpbb_root_path, $phpEx, $config, $cache; require($phpbb_root_path . 'config.' . $phpEx); require($phpbb_root_path . 'includes/constants.' . $phpEx); require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); unset($dbpasswd); $this->page_title = $lang['STAGE_SETTINGS']; // We need to fill the config to let internal functions correctly work $sql = 'SELECT * FROM ' . CONFIG_TABLE; $result = $db->sql_query($sql); $config = array(); while ($row = $db->sql_fetchrow($result)) { $config[$row['config_name']] = $row['config_value']; } $db->sql_freeresult($result); $convertor_tag = request_var('tag', ''); if (empty($convertor_tag)) { $this->p_master->error($lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__); } $get_info = true; // check security implications of direct inclusion $convertor_tag = basename($convertor_tag); if (!file_exists('./convertors/convert_' . $convertor_tag . '.' . $phpEx)) { $this->p_master->error($lang['CONVERT_NOT_EXIST'], __LINE__, __FILE__); } include('./convertors/convert_' . $convertor_tag . '.' . $phpEx); // The test_file is a file that should be present in the location of the old board. if (!isset($test_file)) { $this->p_master->error($lang['DEV_NO_TEST_FILE'], __LINE__, __FILE__); } $submit = (isset($_POST['submit'])) ? true : false; $src_dbms = request_var('src_dbms', $convertor_data['dbms']); $src_dbhost = request_var('src_dbhost', $convertor_data['dbhost']); $src_dbport = request_var('src_dbport', $convertor_data['dbport']); $src_dbuser = request_var('src_dbuser', $convertor_data['dbuser']); $src_dbpasswd = request_var('src_dbpasswd', $convertor_data['dbpasswd']); $src_dbname = request_var('src_dbname', $convertor_data['dbname']); $src_table_prefix = request_var('src_table_prefix', $convertor_data['table_prefix']); $forum_path = request_var('forum_path', $convertor_data['forum_path']); $refresh = request_var('refresh', 1); // Default URL of the old board // @todo Are we going to use this for attempting to convert URL references in posts, or should we remove it? // -> We should convert old urls to the new relative urls format // $src_url = request_var('src_url', 'Not in use at the moment'); // strip trailing slash from old forum path $forum_path = (strlen($forum_path) && $forum_path[strlen($forum_path) - 1] == '/') ? substr($forum_path, 0, -1) : $forum_path; $error = array(); if ($submit) { if (!@file_exists('./../' . $forum_path . '/' . $test_file)) { $error[] = sprintf($lang['COULD_NOT_FIND_PATH'], $forum_path); } $connect_test = false; $available_dbms = get_available_dbms(false, true, true); if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE']) { $error['db'][] = $lang['INST_ERR_NO_DB']; $connect_test = false; } else { $connect_test = connect_check_db(true, $error, $available_dbms[$src_dbms], $src_table_prefix, $src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, true, ($src_dbms == $dbms) ? false : true, false); } // The forum prefix of the old and the new forum can only be the same if two different databases are used. if ($src_table_prefix == $table_prefix && $src_dbms == $dbms && $src_dbhost == $dbhost && $src_dbport == $dbport && $src_dbname == $dbname) { $error[] = sprintf($lang['TABLE_PREFIX_SAME'], $src_table_prefix); } // Check table prefix if (!sizeof($error)) { // initiate database connection to old db if old and new db differ global $src_db, $same_db; $src_db = $same_db = false; if ($src_dbms != $dbms || $src_dbhost != $dbhost || $src_dbport != $dbport || $src_dbname != $dbname || $src_dbuser != $dbuser) { $sql_db = 'dbal_' . $src_dbms; $src_db = new $sql_db(); $src_db->sql_connect($src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, false, true); $same_db = false; } else { $src_db = $db; $same_db = true; } $src_db->sql_return_on_error(true); $db->sql_return_on_error(true); // Try to select one row from the first table to see if the prefix is OK $result = $src_db->sql_query_limit('SELECT * FROM ' . $src_table_prefix . $tables[0], 1); if (!$result) { $prefixes = array(); $tables_existing = get_tables($src_db); $tables_existing = array_map('strtolower', $tables_existing); foreach ($tables_existing as $table_name) { compare_table($tables, $table_name, $prefixes); } unset($tables_existing); foreach ($prefixes as $prefix => $count) { if ($count >= sizeof($tables)) { $possible_prefix = $prefix; break; } } $msg = ''; if (!empty($convertor_data['table_prefix'])) { $msg .= sprintf($lang['DEFAULT_PREFIX_IS'], $convertor_data['forum_name'], $convertor_data['table_prefix']); } if (!empty($possible_prefix)) { $msg .= '
'; $msg .= ($possible_prefix == '*') ? $lang['BLANK_PREFIX_FOUND'] : sprintf($lang['PREFIX_FOUND'], $possible_prefix); $src_table_prefix = ($possible_prefix == '*') ? '' : $possible_prefix; } $error[] = $msg; } $src_db->sql_freeresult($result); $src_db->sql_return_on_error(false); } if (!sizeof($error)) { // Save convertor Status set_config('convert_progress', serialize(array( 'step' => '', 'table_prefix' => $src_table_prefix, 'tag' => $convertor_tag, )), true); set_config('convert_db_server', serialize(array( 'dbms' => $src_dbms, 'dbhost' => $src_dbhost, 'dbport' => $src_dbport, 'dbname' => $src_dbname, )), true); set_config('convert_db_user', serialize(array( 'dbuser' => $src_dbuser, 'dbpasswd' => $src_dbpasswd, )), true); // Save options set_config('convert_options', serialize(array('forum_path' => './../' . $forum_path, 'refresh' => $refresh)), true); $template->assign_block_vars('checks', array( 'TITLE' => $lang['VERIFY_OPTIONS'], 'RESULT' => $lang['CONVERT_SETTINGS_VERIFIED'], )); $template->assign_vars(array( 'L_SUBMIT' => $lang['BEGIN_CONVERT'], // 'S_HIDDEN' => $s_hidden_fields, 'U_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag=$convertor_tag&language=$language", )); return; } else { $template->assign_block_vars('checks', array( 'TITLE' => $lang['VERIFY_OPTIONS'], 'RESULT' => '' . implode('
', $error) . '
', )); } } // end submit foreach ($this->convert_options as $config_key => $vars) { if (!is_array($vars) && strpos($config_key, 'legend') === false) { continue; } if (strpos($config_key, 'legend') !== false) { $template->assign_block_vars('options', array( 'S_LEGEND' => true, 'LEGEND' => $lang[$vars]) ); continue; } $options = isset($vars['options']) ? $vars['options'] : ''; $template->assign_block_vars('options', array( 'KEY' => $config_key, 'TITLE' => $lang[$vars['lang']], 'S_EXPLAIN' => $vars['explain'], 'S_LEGEND' => false, 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options), ) ); } $template->assign_vars(array( 'TITLE' => $lang['STAGE_SETTINGS'], 'BODY' => $lang['CONV_OPTIONS_BODY'], 'L_SUBMIT' => $lang['BEGIN_CONVERT'], 'U_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=settings&tag=$convertor_tag&language=$language", )); } /** * The function which does the actual work (or dispatches it to the relevant places) */ function convert_data($sub) { global $template, $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache; global $convert, $convert_row, $message_parser, $skip_rows, $language; require($phpbb_root_path . 'config.' . $phpEx); require($phpbb_root_path . 'includes/constants.' . $phpEx); require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); unset($dbpasswd); $sql = 'SELECT * FROM ' . CONFIG_TABLE; $result = $db->sql_query($sql); $config = array(); while ($row = $db->sql_fetchrow($result)) { $config[$row['config_name']] = $row['config_value']; } $db->sql_freeresult($result); // Override a couple of config variables for the duration $config['max_quote_depth'] = 0; // @todo Need to confirm that max post length in source is <= max post length in destination or there may be interesting formatting issues $config['max_post_chars'] = $config['min_post_chars'] = 0; // Set up a user as well. We _should_ have enough of a database here at this point to do this // and it helps for any core code we call $user->session_begin(); $user->page = $user->extract_current_page($phpbb_root_path); // This is a little bit of a fudge, but it allows the language entries to be available to the // core code without us loading them again $user->lang = &$lang; $this->page_title = $user->lang['STAGE_IN_PROGRESS']; $convert->options = array(); if (isset($config['convert_progress'])) { $convert->options = unserialize($config['convert_progress']); $convert->options = array_merge($convert->options, unserialize($config['convert_db_server']), unserialize($config['convert_db_user']), unserialize($config['convert_options'])); } // This information should have already been checked once, but do it again for safety if (empty($convert->options) || empty($convert->options['tag']) || !isset($convert->options['dbms']) || !isset($convert->options['dbhost']) || !isset($convert->options['dbport']) || !isset($convert->options['dbuser']) || !isset($convert->options['dbpasswd']) || !isset($convert->options['dbname']) || !isset($convert->options['table_prefix'])) { $this->p_master->error($user->lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__); } // Make some short variables accessible, for easier referencing $convert->convertor_tag = basename($convert->options['tag']); $convert->src_dbms = $convert->options['dbms']; $convert->src_dbhost = $convert->options['dbhost']; $convert->src_dbport = $convert->options['dbport']; $convert->src_dbuser = $convert->options['dbuser']; $convert->src_dbpasswd = $convert->options['dbpasswd']; $convert->src_dbname = $convert->options['dbname']; $convert->src_table_prefix = $convert->options['table_prefix']; // initiate database connection to old db if old and new db differ global $src_db, $same_db; $src_db = $same_db = null; if ($convert->src_dbms != $dbms || $convert->src_dbhost != $dbhost || $convert->src_dbport != $dbport || $convert->src_dbname != $dbname || $convert->src_dbuser != $dbuser) { if ($convert->src_dbms != $dbms) { require($phpbb_root_path . 'includes/db/' . $convert->src_dbms . '.' . $phpEx); } $sql_db = 'dbal_' . $convert->src_dbms; $src_db = new $sql_db(); $src_db->sql_connect($convert->src_dbhost, $convert->src_dbuser, htmlspecialchars_decode($convert->src_dbpasswd), $convert->src_dbname, $convert->src_dbport, false, true); $same_db = false; } else { $src_db = $db; $same_db = true; } $convert->mysql_convert = false; switch ($src_db->sql_layer) { case 'sqlite': case 'firebird': $convert->src_truncate_statement = 'DELETE FROM '; break; // Thanks MySQL, for silently converting... case 'mysql': case 'mysql4': if (version_compare($src_db->sql_server_info(true), '4.1.3', '>=')) { $convert->mysql_convert = true; } $convert->src_truncate_statement = 'TRUNCATE TABLE '; break; case 'mysqli': $convert->mysql_convert = true; $convert->src_truncate_statement = 'TRUNCATE TABLE '; break; default: $convert->src_truncate_statement = 'TRUNCATE TABLE '; break; } if ($convert->mysql_convert && !$same_db) { $src_db->sql_query("SET NAMES 'binary'"); } switch ($db->sql_layer) { case 'sqlite': case 'firebird': $convert->truncate_statement = 'DELETE FROM '; break; default: $convert->truncate_statement = 'TRUNCATE TABLE '; break; } $get_info = false; // check security implications of direct inclusion if (!file_exists('./convertors/convert_' . $convert->convertor_tag . '.' . $phpEx)) { $this->p_master->error($user->lang['CONVERT_NOT_EXIST'], __LINE__, __FILE__); } if (file_exists('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx)) { include('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx); } $get_info = true; include('./convertors/convert_' . $convert->convertor_tag . '.' . $phpEx); // Map some variables... $convert->convertor_data = $convertor_data; $convert->tables = $tables; $convert->config_schema = $config_schema; // Now include the real data $get_info = false; include('./convertors/convert_' . $convert->convertor_tag . '.' . $phpEx); $convert->convertor_data = $convertor_data; $convert->tables = $tables; $convert->config_schema = $config_schema; $convert->convertor = $convertor; // The test_file is a file that should be present in the location of the old board. if (!file_exists($convert->options['forum_path'] . '/' . $test_file)) { $this->p_master->error(sprintf($user->lang['COULD_NOT_FIND_PATH'], $convert->options['forum_path']), __LINE__, __FILE__); } $search_type = basename(trim($config['search_type'])); // For conversions we are a bit less strict and set to a search backend we know exist... if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx)) { $search_type = 'fulltext_native'; set_config('search_type', $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); $error = false; $convert->fulltext_search = new $search_type($error); if ($error) { trigger_error($error); } include($phpbb_root_path . 'includes/message_parser.' . $phpEx); $message_parser = new parse_message(); $jump = request_var('jump', 0); $final_jump = request_var('final_jump', 0); $sync_batch = request_var('sync_batch', -1); $last_statement = request_var('last', 0); // We are running sync... if ($sync_batch >= 0) { $this->sync_forums($sync_batch); return; } if ($jump) { $this->jump($jump, $last_statement); return; } if ($final_jump) { $this->final_jump($final_jump); return; } $current_table = request_var('current_table', 0); $old_current_table = min(-1, $current_table - 1); $skip_rows = request_var('skip_rows', 0); if (!$current_table && !$skip_rows) { if (empty($_REQUEST['confirm'])) { // If avatars / ranks / smilies folders are specified make sure they are writable $bad_folders = array(); $local_paths = array( 'avatar_path' => path($config['avatar_path']), 'avatar_gallery_path' => path($config['avatar_gallery_path']), 'icons_path' => path($config['icons_path']), 'ranks_path' => path($config['ranks_path']), 'smilies_path' => path($config['smilies_path']) ); foreach ($local_paths as $folder => $local_path) { if (isset($convert->convertor[$folder])) { if (empty($convert->convertor['test_file'])) { // test_file is mandantory at the moment so this should never be reached, but just in case... $this->p_master->error($user->lang['DEV_NO_TEST_FILE'], __LINE__, __FILE__); } if (!$local_path || !@is_writable($phpbb_root_path . $local_path)) { if (!$local_path) { $bad_folders[] = sprintf($user->lang['CONFIG_PHPBB_EMPTY'], $folder); } else { $bad_folders[] = $local_path; } } } } if (sizeof($bad_folders)) { $msg = (sizeof($bad_folders) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE']; sort($bad_folders); $this->p_master->error(sprintf($msg, implode('
', $bad_folders)), __LINE__, __FILE__, true); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['INSTALL_TEST'], 'U_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}&language=$language", )); return; } // Grab all the tables used in convertor $missing_tables = $tables_list = $aliases = array(); foreach ($convert->convertor['schema'] as $schema) { // Skip those not used (because of addons/plugins not detected) if (!$schema['target']) { continue; } foreach ($schema as $key => $val) { // we're dealing with an array like: // array('forum_status', 'forums.forum_status', 'is_item_locked') if (is_int($key) && !empty($val[1])) { $temp_data = $val[1]; if (!is_array($temp_data)) { $temp_data = array($temp_data); } foreach ($temp_data as $val) { if (preg_match('/([a-z0-9_]+)\.([a-z0-9_]+)\)* ?A?S? ?([a-z0-9_]*?)\.?([a-z0-9_]*)$/i', $val, $m)) { $table = $convert->src_table_prefix . $m[1]; $tables_list[$table] = $table; if (!empty($m[3])) { $aliases[] = $convert->src_table_prefix . $m[3]; } } } } // 'left_join' => 'topics LEFT JOIN vote_desc ON topics.topic_id = vote_desc.topic_id AND topics.topic_vote = 1' else if ($key == 'left_join') { // Convert the value if it wasn't an array already. if (!is_array($val)) { $val = array($val); } for ($j = 0; $j < sizeof($val); ++$j) { if (preg_match('/LEFT JOIN ([a-z0-9_]+) AS ([a-z0-9_]+)/i', $val[$j], $m)) { $table = $convert->src_table_prefix . $m[1]; $tables_list[$table] = $table; if (!empty($m[2])) { $aliases[] = $convert->src_table_prefix . $m[2]; } } } } } } // Remove aliased tables from $tables_list foreach ($aliases as $alias) { unset($tables_list[$alias]); } // Check if the tables that we need exist $src_db->sql_return_on_error(true); foreach ($tables_list as $table => $null) { $sql = 'SELECT 1 FROM ' . $table; $_result = $src_db->sql_query_limit($sql, 1); if (!$_result) { $missing_tables[] = $table; } $src_db->sql_freeresult($_result); } $src_db->sql_return_on_error(false); // Throw an error if some tables are missing // We used to do some guessing here, but since we have a suggestion of possible values earlier, I don't see it adding anything here to do it again if (sizeof($missing_tables) == sizeof($tables_list)) { $this->p_master->error($user->lang['NO_TABLES_FOUND'] . ' ' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__); } else if (sizeof($missing_tables)) { $this->p_master->error(sprintf($user->lang['TABLES_MISSING'], implode(', ', $missing_tables)) . '

' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__); } $url = $this->save_convert_progress('&confirm=1'); $msg = $user->lang['PRE_CONVERT_COMPLETE']; if ($convert->convertor_data['author_notes']) { $msg .= '

' . sprintf($user->lang['AUTHOR_NOTES'], $convert->convertor_data['author_notes']); } $template->assign_vars(array( 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], 'L_MESSAGE' => $msg, 'U_ACTION' => $url, )); return; } // if (empty($_REQUEST['confirm'])) $template->assign_block_vars('checks', array( 'S_LEGEND' => true, 'LEGEND' => $user->lang['STARTING_CONVERT'], )); // Convert the config table and load the settings of the old board if (!empty($convert->config_schema)) { restore_config($convert->config_schema); // Override a couple of config variables for the duration $config['max_quote_depth'] = 0; // @todo Need to confirm that max post length in source is <= max post length in destination or there may be interesting formatting issues $config['max_post_chars'] = $config['min_post_chars'] = 0; } $template->assign_block_vars('checks', array( 'TITLE' => $user->lang['CONFIG_CONVERT'], 'RESULT' => $user->lang['DONE'], )); // Now process queries and execute functions that have to be executed prior to the conversion if (!empty($convert->convertor['execute_first'])) { eval($convert->convertor['execute_first']); } if (!empty($convert->convertor['query_first'])) { if (!is_array($convert->convertor['query_first'])) { $convert->convertor['query_first'] = array('target', array($convert->convertor['query_first'])); } else if (!is_array($convert->convertor['query_first'][0])) { $convert->convertor['query_first'] = array(array($convert->convertor['query_first'][0], $convert->convertor['query_first'][1])); } foreach ($convert->convertor['query_first'] as $query_first) { if ($query_first[0] == 'src') { if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $src_db->sql_query($query_first[1]); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } } else { $db->sql_query($query_first[1]); } } } $template->assign_block_vars('checks', array( 'TITLE' => $user->lang['PREPROCESS_STEP'], 'RESULT' => $user->lang['DONE'], )); } // if (!$current_table && !$skip_rows) $template->assign_block_vars('checks', array( 'S_LEGEND' => true, 'LEGEND' => $user->lang['FILLING_TABLES'], )); // This loop takes one target table and processes it while ($current_table < sizeof($convert->convertor['schema'])) { $schema = $convert->convertor['schema'][$current_table]; // The target table isn't set, this can be because a module (for example the attachement mod) is taking care of this. if (empty($schema['target'])) { $current_table++; continue; } $template->assign_block_vars('checks', array( 'TITLE' => sprintf($user->lang['FILLING_TABLE'], $schema['target']), )); // This is only the case when we first start working on the tables. if (!$skip_rows) { // process execute_first and query_first for this table... if (!empty($schema['execute_first'])) { eval($schema['execute_first']); } if (!empty($schema['query_first'])) { if (!is_array($schema['query_first'])) { $schema['query_first'] = array('target', array($schema['query_first'])); } else if (!is_array($schema['query_first'][0])) { $schema['query_first'] = array(array($schema['query_first'][0], $schema['query_first'][1])); } foreach ($schema['query_first'] as $query_first) { if ($query_first[0] == 'src') { if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $src_db->sql_query($query_first[1]); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } } else { $db->sql_query($query_first[1]); } } } if (!empty($schema['autoincrement'])) { switch ($db->sql_layer) { case 'postgres': $db->sql_query("SELECT SETVAL('" . $schema['target'] . "_seq',(select case when max(" . $schema['autoincrement'] . ")>0 then max(" . $schema['autoincrement'] . ")+1 else 1 end from " . $schema['target'] . '));'); break; case 'oracle': $result = $db->sql_query('SELECT MAX(' . $schema['autoincrement'] . ') as max_id FROM ' . $schema['target']); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $largest_id = (int) $row['max_id']; if ($largest_id) { $db->sql_query('DROP SEQUENCE ' . $schema['target'] . '_seq'); $db->sql_query('CREATE SEQUENCE ' . $schema['target'] . '_seq START WITH ' . ($largest_id + 1)); } break; } } } // Process execute_always for this table // This is for code which needs to be executed on every pass of this table if // it gets split because of time restrictions if (!empty($schema['execute_always'])) { eval($schema['execute_always']); } // // Set up some variables // // $waiting_rows holds rows for multirows insertion (MySQL only) // $src_tables holds unique tables with aliases to select from // $src_fields will quickly refer source fields (or aliases) corresponding to the current index // $select_fields holds the names of the fields to retrieve // $sql_data = array( 'source_fields' => array(), 'target_fields' => array(), 'source_tables' => array(), 'select_fields' => array(), ); // This statement is building the keys for later insertion. $insert_query = $this->build_insert_query($schema, $sql_data, $current_table); // If no source table is affected, we skip the table if (empty($sql_data['source_tables'])) { $skip_rows = 0; $current_table++; continue; } $distinct = (!empty($schema['distinct'])) ? 'DISTINCT ' : ''; $sql = 'SELECT ' . $distinct . implode(', ', $sql_data['select_fields']) . " \nFROM " . implode(', ', $sql_data['source_tables']); // Where $sql .= (!empty($schema['where'])) ? "\nWHERE (" . $schema['where'] . ')' : ''; // Group By if (!empty($schema['group_by'])) { $schema['group_by'] = array($schema['group_by']); foreach ($sql_data['select_fields'] as $select) { $alias = strpos(strtolower($select), ' as '); $select = ($alias) ? substr($select, 0, $alias) : $select; if (!in_array($select, $schema['group_by'])) { $schema['group_by'][] = $select; } } } $sql .= (!empty($schema['group_by'])) ? "\nGROUP BY " . implode(', ', $schema['group_by']) : ''; // Having $sql .= (!empty($schema['having'])) ? "\nHAVING " . $schema['having'] : ''; // Order By if (empty($schema['order_by']) && !empty($schema['primary'])) { $schema['order_by'] = $schema['primary']; } $sql .= (!empty($schema['order_by'])) ? "\nORDER BY " . $schema['order_by'] : ''; // Counting basically holds the amount of rows processed. $counting = -1; $batch_time = 0; while ($counting === -1 || ($counting >= $convert->batch_size && still_on_time())) { $old_current_table = $current_table; $rows = ''; $waiting_rows = array(); if (!empty($batch_time)) { $mtime = explode(' ', microtime()); $mtime = $mtime[0] + $mtime[1]; $rows = ceil($counting/($mtime - $batch_time)) . " rows/s ($counting rows) | "; } $template->assign_block_vars('checks', array( 'TITLE' => "skip_rows = $skip_rows", 'RESULT' => $rows . ((defined('DEBUG_EXTRA') && function_exists('memory_get_usage')) ? ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] : ''), )); $mtime = explode(' ', microtime()); $batch_time = $mtime[0] + $mtime[1]; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } // Take skip rows into account and only fetch batch_size amount of rows $___result = $src_db->sql_query_limit($sql, $convert->batch_size, $skip_rows); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } // This loop processes each row $counting = 0; $convert->row = $convert_row = array(); if (!empty($schema['autoincrement'])) { switch ($db->sql_layer) { case 'mssql': case 'mssql_odbc': $db->sql_query('SET IDENTITY_INSERT ' . $schema['target'] . ' ON'); break; } } // Now handle the rows until time is over or no more rows to process... while ($counting === 0 || still_on_time()) { $convert_row = $src_db->sql_fetchrow($___result); if (!$convert_row) { // move to the next batch or table break; } // With this we are able to always save the last state $convert->row = $convert_row; // Increment the counting variable, it stores the number of rows we have processed $counting++; $insert_values = array(); $sql_flag = $this->process_row($schema, $sql_data, $insert_values); if ($sql_flag === true) { switch ($db->sql_layer) { // If MySQL, we'll wait to have num_wait_rows rows to submit at once case 'mysql': case 'mysql4': case 'mysqli': $waiting_rows[] = '(' . implode(', ', $insert_values) . ')'; if (sizeof($waiting_rows) >= $convert->num_wait_rows) { $errored = false; $db->sql_return_on_error(true); if (!$db->sql_query($insert_query . implode(', ', $waiting_rows))) { $errored = true; } $db->sql_return_on_error(false); if ($errored) { $db->sql_return_on_error(true); // Because it errored out we will try to insert the rows one by one... most of the time this // is caused by duplicate entries - but we also do not want to miss one... foreach ($waiting_rows as $waiting_sql) { if (!$db->sql_query($insert_query . $waiting_sql)) { $this->p_master->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_query . $waiting_sql) . '

' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true); } } $db->sql_return_on_error(false); } $waiting_rows = array(); } break; default: $insert_sql = $insert_query . '(' . implode(', ', $insert_values) . ')'; $db->sql_return_on_error(true); if (!$db->sql_query($insert_sql)) { $this->p_master->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_sql) . '

' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true); } $db->sql_return_on_error(false); $waiting_rows = array(); break; } } $skip_rows++; } $src_db->sql_freeresult($___result); // We might still have some rows waiting if (sizeof($waiting_rows)) { $errored = false; $db->sql_return_on_error(true); if (!$db->sql_query($insert_query . implode(', ', $waiting_rows))) { $errored = true; } $db->sql_return_on_error(false); if ($errored) { $db->sql_return_on_error(true); // Because it errored out we will try to insert the rows one by one... most of the time this // is caused by duplicate entries - but we also do not want to miss one... foreach ($waiting_rows as $waiting_sql) { $db->sql_query($insert_query . $waiting_sql); $this->p_master->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_query . $waiting_sql) . '

' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true); } $db->sql_return_on_error(false); } $waiting_rows = array(); } if (!empty($schema['autoincrement'])) { switch ($db->sql_layer) { case 'mssql': case 'mssql_odbc': $db->sql_query('SET IDENTITY_INSERT ' . $schema['target'] . ' OFF'); break; case 'postgres': $db->sql_query("SELECT SETVAL('" . $schema['target'] . "_seq',(select case when max(" . $schema['autoincrement'] . ")>0 then max(" . $schema['autoincrement'] . ")+1 else 1 end from " . $schema['target'] . '));'); break; case 'oracle': $result = $db->sql_query('SELECT MAX(' . $schema['autoincrement'] . ') as max_id FROM ' . $schema['target']); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $largest_id = (int) $row['max_id']; if ($largest_id) { $db->sql_query('DROP SEQUENCE ' . $schema['target'] . '_seq'); $db->sql_query('CREATE SEQUENCE ' . $schema['target'] . '_seq START WITH ' . ($largest_id + 1)); } break; } } } // When we reach this point, either the current table has been processed or we're running out of time. if (still_on_time() && $counting < $convert->batch_size/* && !defined('DEBUG_EXTRA')*/) { $skip_rows = 0; $current_table++; } else {/* if (still_on_time() && $counting < $convert->batch_size) { $skip_rows = 0; $current_table++; }*/ // Looks like we ran out of time. $url = $this->save_convert_progress('&current_table=' . $current_table . '&skip_rows=' . $skip_rows); $current_table++; // $percentage = ($skip_rows == 0) ? 0 : floor(100 / ($total_rows / $skip_rows)); $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $current_table, sizeof($convert->convertor['schema'])); $template->assign_vars(array( 'L_MESSAGE' => $msg, 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } } // Process execute_last then we'll be done $url = $this->save_convert_progress('&jump=1'); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['FINAL_STEP'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } /** * Sync function being executed at the middle, some functions need to be executed after a successful sync. */ function sync_forums($sync_batch) { global $template, $user, $db, $phpbb_root_path, $phpEx, $config, $cache; global $convert; $template->assign_block_vars('checks', array( 'S_LEGEND' => true, 'LEGEND' => $user->lang['SYNC_TOPICS'], )); $batch_size = $convert->batch_size; $sql = 'SELECT MIN(topic_id) as min_value, MAX(topic_id) AS max_value FROM ' . TOPICS_TABLE; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); // Set values of minimum/maximum primary value for this table. $primary_min = $row['min_value']; $primary_max = $row['max_value']; if ($sync_batch == 0) { $sync_batch = (int) $primary_min; } if ($sync_batch == 0) { $sync_batch = 1; } // Fetch a batch of rows, process and insert them. while ($sync_batch <= $primary_max && still_on_time()) { $end = ($sync_batch + $batch_size - 1); // Sync all topics in batch mode... sync('topic_approved', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, false); sync('topic', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, true); $template->assign_block_vars('checks', array( 'TITLE' => sprintf($user->lang['SYNC_TOPIC_ID'], $sync_batch, ($sync_batch + $batch_size)) . ((defined('DEBUG_EXTRA') && function_exists('memory_get_usage')) ? ' [' . ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] . ']' : ''), 'RESULT' => $user->lang['DONE'], )); $sync_batch += $batch_size; } if ($sync_batch >= $primary_max) { $url = $this->save_convert_progress('&final_jump=1'); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } else { $sync_batch--; } $url = $this->save_convert_progress('&sync_batch=' . $sync_batch); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } /** * Save the convertor status */ function save_convert_progress($step) { global $convert, $language; // Save convertor Status set_config('convert_progress', serialize(array( 'step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag, )), true); set_config('convert_db_server', serialize(array( 'dbms' => $convert->src_dbms, 'dbhost' => $convert->src_dbhost, 'dbport' => $convert->src_dbport, 'dbname' => $convert->src_dbname, )), true); set_config('convert_db_user', serialize(array( 'dbuser' => $convert->src_dbuser, 'dbpasswd' => $convert->src_dbpasswd, )), true); return $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}$step&language=$language"; } /** * Finish conversion, the last function to be called. */ function finish_conversion() { global $db, $phpbb_root_path, $phpEx, $convert, $config, $language, $user, $template; $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " WHERE config_name = 'convert_progress' OR config_name = 'convert_options' OR config_name = 'convert_db_server' OR config_name = 'convert_db_user'"); $db->sql_query('DELETE FROM ' . SESSIONS_TABLE); @unlink($phpbb_root_path . 'cache/data_global.' . $phpEx); cache_moderators(); // And finally, add a note to the log add_log('admin', 'LOG_INSTALL_CONVERTED', $convert->convertor_data['forum_name'], $config['version']); $url = $this->p_master->module_url . "?mode={$this->mode}&sub=final&language=$language"; $template->assign_vars(array( 'L_SUBMIT' => $user->lang['FINAL_STEP'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } /** * This function marks the steps after syncing */ function final_jump($final_jump) { global $template, $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache; global $convert; $template->assign_block_vars('checks', array( 'S_LEGEND' => true, 'LEGEND' => $user->lang['PROCESS_LAST'], )); if ($final_jump == 1) { $db->sql_return_on_error(true); update_topics_posted(); $template->assign_block_vars('checks', array( 'TITLE' => $user->lang['UPDATE_TOPICS_POSTED'], 'RESULT' => $user->lang['DONE'], )); if ($db->sql_error_triggered) { $template->assign_vars(array( 'S_ERROR_BOX' => true, 'ERROR_TITLE' => $user->lang['UPDATE_TOPICS_POSTED'], 'ERROR_MSG' => $user->lang['UPDATE_TOPICS_POSTED_ERR'], )); } $db->sql_return_on_error(false); $this->finish_conversion(); return; } } /** * This function marks the steps before syncing (jump=1) */ function jump($jump, $last_statement) { global $template, $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache; global $convert; $template->assign_block_vars('checks', array( 'S_LEGEND' => true, 'LEGEND' => $user->lang['PROCESS_LAST'], )); if ($jump == 1) { // Execute 'last' statements/queries if (!empty($convert->convertor['execute_last'])) { if (!is_array($convert->convertor['execute_last'])) { eval($convert->convertor['execute_last']); } else { while ($last_statement < sizeof($convert->convertor['execute_last'])) { eval($convert->convertor['execute_last'][$last_statement]); $template->assign_block_vars('checks', array( 'TITLE' => $convert->convertor['execute_last'][$last_statement], 'RESULT' => $user->lang['DONE'], )); $last_statement++; $url = $this->save_convert_progress('&jump=1&last=' . $last_statement); $percentage = ($last_statement == 0) ? 0 : floor(100 / (sizeof($convert->convertor['execute_last']) / $last_statement)); $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $last_statement, sizeof($convert->convertor['execute_last']), $percentage); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['CONTINUE_LAST'], 'L_MESSAGE' => $msg, 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } } } if (!empty($convert->convertor['query_last'])) { if (!is_array($convert->convertor['query_last'])) { $convert->convertor['query_last'] = array('target', array($convert->convertor['query_last'])); } else if (!is_array($convert->convertor['query_last'][0])) { $convert->convertor['query_last'] = array(array($convert->convertor['query_last'][0], $convert->convertor['query_last'][1])); } foreach ($convert->convertor['query_last'] as $query_last) { if ($query_last[0] == 'src') { if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $src_db->sql_query($query_last[1]); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } } else { $db->sql_query($query_last[1]); } } } // Sanity check $db->sql_return_on_error(false); $src_db->sql_return_on_error(false); fix_empty_primary_groups(); if (!isset($config['board_startdate'])) { $sql = 'SELECT MIN(user_regdate) AS board_startdate FROM ' . USERS_TABLE; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (($row['board_startdate'] < $config['board_startdate'] && $row['board_startdate'] > 0) || !isset($config['board_startdate'])) { set_config('board_startdate', $row['board_startdate']); $db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_regdate = ' . $row['board_startdate'] . ' WHERE user_id = ' . ANONYMOUS); } } update_dynamic_config(); $template->assign_block_vars('checks', array( 'TITLE' => $user->lang['CLEAN_VERIFY'], 'RESULT' => $user->lang['DONE'], )); $url = $this->save_convert_progress('&jump=2'); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } if ($jump == 2) { $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_permissions = ''"); // TODO: sync() is likely going to bomb out on forums with a considerable amount of topics. // TODO: the sync function is able to handle FROM-TO values, we should use them here (batch processing) sync('forum', '', '', false, true); $cache->destroy('sql', FORUMS_TABLE); $template->assign_block_vars('checks', array( 'TITLE' => $user->lang['SYNC_FORUMS'], 'RESULT' => $user->lang['DONE'], )); // Continue with synchronizing the forums... $url = $this->save_convert_progress('&sync_batch=0'); $template->assign_vars(array( 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], 'U_ACTION' => $url, )); $this->meta_refresh($url); return; } } function build_insert_query(&$schema, &$sql_data, $current_table) { global $db, $user; global $convert; // Can we use IGNORE with this DBMS? $sql_ignore = (strpos($db->sql_layer, 'mysql') === 0 && !defined('DEBUG_EXTRA')) ? 'IGNORE ' : ''; $insert_query = 'INSERT ' . $sql_ignore . 'INTO ' . $schema['target'] . ' ('; $aliases = array(); $sql_data = array( 'source_fields' => array(), 'target_fields' => array(), 'source_tables' => array(), 'select_fields' => array(), ); foreach ($schema as $key => $val) { // Example: array('group_name', 'extension_groups.group_name', 'htmlspecialchars'), if (is_int($key)) { if (!empty($val[0])) { // Target fields $sql_data['target_fields'][$val[0]] = $key; $insert_query .= $val[0] . ', '; } if (!is_array($val[1])) { $val[1] = array($val[1]); } foreach ($val[1] as $valkey => $value_1) { // This should cover about any case: // // table.field => SELECT table.field FROM table // table.field AS alias => SELECT table.field AS alias FROM table // table.field AS table2.alias => SELECT table2.field AS alias FROM table table2 // table.field AS table2.field => SELECT table2.field FROM table table2 // if (preg_match('/^([a-z0-9_]+)\.([a-z0-9_]+)( +AS +(([a-z0-9_]+?)\.)?([a-z0-9_]+))?$/i', $value_1, $m)) { // There is 'AS ...' in the field names if (!empty($m[3])) { $value_1 = ($m[2] == $m[6]) ? $m[1] . '.' . $m[2] : $m[1] . '.' . $m[2] . ' AS ' . $m[6]; // Table alias: store it then replace the source table with it if (!empty($m[5]) && $m[5] != $m[1]) { $aliases[$m[5]] = $m[1]; $value_1 = str_replace($m[1] . '.' . $m[2], $m[5] . '.' . $m[2], $value_1); } } else { // No table alias $sql_data['source_tables'][$m[1]] = (empty($convert->src_table_prefix)) ? $m[1] : $convert->src_table_prefix . $m[1] . ' ' . $m[1]; } $sql_data['select_fields'][$value_1] = $value_1; $sql_data['source_fields'][$key][$valkey] = (!empty($m[6])) ? $m[6] : $m[2]; } } } else if ($key == 'where' || $key == 'group_by' || $key == 'order_by' || $key == 'having') { if (@preg_match_all('/([a-z0-9_]+)\.([a-z0-9_]+)/i', $val, $m)) { foreach ($m[1] as $value) { $sql_data['source_tables'][$value] = (empty($convert->src_table_prefix)) ? $value : $convert->src_table_prefix . $value . ' ' . $value; } } } } // Add the aliases to the list of tables foreach ($aliases as $alias => $table) { $sql_data['source_tables'][$alias] = $convert->src_table_prefix . $table . ' ' . $alias; } // 'left_join' => 'forums LEFT JOIN forum_prune ON forums.forum_id = forum_prune.forum_id', if (!empty($schema['left_join'])) { if (!is_array($schema['left_join'])) { $schema['left_join'] = array($schema['left_join']); } foreach ($schema['left_join'] as $left_join) { // This won't handle concatened LEFT JOINs if (!preg_match('/([a-z0-9_]+) LEFT JOIN ([a-z0-9_]+) A?S? ?([a-z0-9_]*?) ?(ON|USING)(.*)/i', $left_join, $m)) { $this->p_master->error(sprintf($user->lang['NOT_UNDERSTAND'], 'LEFT JOIN', $left_join, $current_table, $schema['target']), __LINE__, __FILE__); } if (!empty($aliases[$m[2]])) { if (!empty($m[3])) { $this->p_master->error(sprintf($user->lang['NAMING_CONFLICT'], $m[2], $m[3], $schema['left_join']), __LINE__, __FILE__); } $m[2] = $aliases[$m[2]]; $m[3] = $m[2]; } $right_table = $convert->src_table_prefix . $m[2]; if (!empty($m[3])) { unset($sql_data['source_tables'][$m[3]]); } else if ($m[2] != $m[1]) { unset($sql_data['source_tables'][$m[2]]); } if (strpos($sql_data['source_tables'][$m[1]], "\nLEFT JOIN") !== false) { $sql_data['source_tables'][$m[1]] = '(' . $sql_data['source_tables'][$m[1]] . ")\nLEFT JOIN $right_table"; } else { $sql_data['source_tables'][$m[1]] .= "\nLEFT JOIN $right_table"; } if (!empty($m[3])) { unset($sql_data['source_tables'][$m[3]]); $sql_data['source_tables'][$m[1]] .= ' AS ' . $m[3]; } else if (!empty($convert->src_table_prefix)) { $sql_data['source_tables'][$m[1]] .= ' AS ' . $m[2]; } $sql_data['source_tables'][$m[1]] .= ' ' . $m[4] . $m[5]; } } // Remove ", " from the end of the insert query $insert_query = substr($insert_query, 0, -2) . ') VALUES '; return $insert_query; } /** * Function for processing the currently handled row */ function process_row(&$schema, &$sql_data, &$insert_values) { global $template, $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache; global $convert, $convert_row; $sql_flag = false; foreach ($schema as $key => $fields) { // We are only interested in the lines with: // array('comment', 'attachments_desc.comment', 'htmlspecialchars'), if (is_int($key)) { if (!is_array($fields[1])) { $fields[1] = array($fields[1]); } $firstkey_set = false; $firstkey = 0; foreach ($fields[1] as $inner_key => $inner_value) { if (!$firstkey_set) { $firstkey = $inner_key; $firstkey_set = true; } $src_field = isset($sql_data['source_fields'][$key][$inner_key]) ? $sql_data['source_fields'][$key][$inner_key] : ''; if (!empty($src_field)) { $fields[1][$inner_key] = $convert->row[$src_field]; } } if (!empty($fields[0])) { // We have a target field, if we haven't set $sql_flag yet it will be set to TRUE. // If a function has already set it to FALSE it won't change it. if ($sql_flag === false) { $sql_flag = true; } // No function assigned? if (empty($fields[2])) { $value = $fields[1][$firstkey]; } else if (is_array($fields[2])) { // Execute complex function/eval/typecast $value = $fields[1]; foreach ($fields[2] as $type => $execution) { if (strpos($type, 'typecast') === 0) { if (!is_array($value)) { $value = array($value); } $value = $value[0]; settype($value, $execution); } else if (strpos($type, 'function') === 0) { if (!is_array($value)) { $value = array($value); } $value = call_user_func_array($execution, $value); } else if (strpos($type, 'execute') === 0) { if (!is_array($value)) { $value = array($value); } $execution = str_replace('{RESULT}', '$value', $execution); $execution = str_replace('{VALUE}', '$value', $execution); eval($execution); } } } else { $value = call_user_func_array($fields[2], $fields[1]); } if (is_null($value)) { $value = ''; } $insert_values[] = $db->_sql_validate_value($value); } else if (!empty($fields[2])) { if (is_array($fields[2])) { // Execute complex function/eval/typecast $value = ''; foreach ($fields[2] as $type => $execution) { if (strpos($type, 'typecast') === 0) { $value = settype($value, $execution); } else if (strpos($type, 'function') === 0) { if (!is_array($value)) { $value = array($value); } $value = call_user_func_array($execution, $value); } else if (strpos($type, 'execute') === 0) { if (!is_array($value)) { $value = array($value); } $execution = str_replace('{RESULT}', '$value', $execution); $execution = str_replace('{VALUE}', '$value', $execution); eval($execution); } } } else { call_user_func_array($fields[2], $fields[1]); } } } } return $sql_flag; } /** * Own meta refresh function to be able to change the global time used */ function meta_refresh($url) { global $convert, $template; if ($convert->options['refresh']) { // Because we should not rely on correct settings, we simply use the relative path here directly. $template->assign_vars(array( 'S_REFRESH' => true, 'META' => '') ); } } /** * The information below will be used to build the input fields presented to the user */ var $convert_options = array( 'legend1' => 'SPECIFY_OPTIONS', 'src_dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => 'dbms_select(\'{VALUE}\', true)', 'explain' => false), 'src_dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), 'src_dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), 'src_dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), 'src_dbuser' => array('lang' => 'DB_USERNAME', 'type' => 'text:25:100', 'explain' => false), 'src_dbpasswd' => array('lang' => 'DB_PASSWORD', 'type' => 'password:25:100', 'explain' => false), 'src_table_prefix' => array('lang' => 'TABLE_PREFIX', 'type' => 'text:25:100', 'explain' => false), //'src_url' => array('lang' => 'FORUM_ADDRESS', 'type' => 'text:50:100', 'explain' => true), 'forum_path' => array('lang' => 'FORUM_PATH', 'type' => 'text:25:100', 'explain' => true), 'refresh' => array('lang' => 'REFRESH_PAGE', 'type' => 'radio:yes_no', 'explain' => true), ); } ?>}صKGd%i5tcUP~2W=$ݔm;zQёkPm]nZ?^"cL‹ԉx:OFBv^·5tN I(T`YA.ZFDz-ZkpS/ y>d|Y*RH0 HRRE9uY,*+n`mO+0hɬPA}]\qEwʣԁʬ\G\6of›wsMOP:pbΕ>2}gV Zt}riF,V~/wZaUɚWyO`ҼDA%]̭N`8Oݻ~$Kz}k)hxSlJ<-FwYjq>*6soG[>2ukx0.BCrQ E&SIޏOPsVC:s %^2'3 ş9YIzI5L2Me)h6ZsuMtB+0տh|&5"ӃZqo;/z/5psEeW8l<}וlN82ФAwU͈"\ 3E p}{fnmT PچrW:g >2ծuǏz#1ﮱX{z/c}1<o|ug qA#'h|\R`^u5A0~p:T7$_C[\ 4ۂ;3V üH,lݫCi=՜wD2oUFYcSJڦ4hZpp|ݔn4s-NQpH%-IjOw1>6Iu?xjJ| (p"SiOIj~ɗth N0m,f4 7p{qQ>"C_WOJ՞ɩ`K9yD*Tvb9uUb+4=4n9 5@2"#8Bm!)Lm^#@*'{IG9K HV/>s%2?8K _VeΠ+/ZvdEc:t?ڑFokCpӃ u7N+%iIXs^YdDEÇ0DQ؃sĦ0c _aH 64U3rRk_ xm"~=odmRu0a)Yi[QMU.$үWʭUyYp,0Ԇ0Lpv\acCPvPJN>mr ǬAg+@W"Aׇ3,-<&[·ZQ' Yrq3>dn OI'Kd#X: zl'y6U"Jq;#kQZ|HH:~5iQ[8MPg~ҢKiVx;$ډT.p5+qkEth`T^%1B 2`ML8xZm̎1~- 2AbÚ>[C@A'37hKKGs`ujQJǠ?*~p|&VuƒZZw$.e7ǒZҋ^&O}⤖AXkS9o";4LXu++$ KOwHgP.`[]jS,ǎ5(#`Oj2[ L}˖4N߬9~q왩 4?wS*pkp.5iJJL{&uay|%~i~ԯ"6?Z?r$TpG}6(T(q|=%Ġh27XfBv1ޚw<;lveC^<=ءRw/ʿY~tqWx1%FHPE-,N8EZ:Ciډbtٲ`XzfxKH;Ԓg > }!{%_Xo iOKat*eyz &럜c=~<;GS )-MeK{G4)-ƂHT p6Pxnp^zB[H<eN]6 œ[9BvRޖ>eZ)6 g84L<|^x^^3ͮ<;Ͳ?!a#1Ibs;jLBӴU/L(|U:hҢJbKWh5 |jni{f7R(da> MKD Y6 =~&ɚXaC!wC,n־y%)se rXG-@нbȯ5Ҽ4p>[^"X"2K͠|hڊ7M(^ HLx2^̫p]S)j[<&'Qi5ݽB%hwY*;eq&;# x?|KߗM=U )({@[++lm)!&ox #ŭj"d+0*<9^h.0"j&,1mύNZ}e4ƒd =sger+[if+l-僀vπ(]jhBG_;8ƇSHfڄF:O|zm37dKt&t5QɐEq31Pv!.;غ,0eFs@ p;t`5,粺LU |g>Q ZFrcYZl(jEpŹL` W?2+OM(4u_>7'&^C`iM8`{tj-njN>>е{5bz {_`C[|PW+4M8G+_ jzPvmT~ŵh{]}q;DmM> D"`o6Q)깟ѴTZMRSHAn_W :Xs_R#*NA} wN%[oM؇TÜ!%IJsJRO:= 55P(-bt,_-> 1媡-Nge?#jU.}.R+$ mG|ׄ}Бk?:G`(=ΆޘL#N+Bؤ( 2+xfuPѳd]SҴ\s2pӎh~S]z)`(gi\e2О4Ȫf-NRϏepD Q\ CV!'|=gBT=mj4Fz""ɉ@ c ),eYo 摥rtisUo` W^Io:fi nEθϒr D/R~ ݬs. Eg$GM0p@z.xZ̍ P@ay͊nso#ۚ\ۉ2[3{83BoEtC%AItfGfm%-߃6U5xt[]|tDk0)L+~]ϔ+Hl$zpKȢXR} 386Glg6韱sWH+!l$4ks]y&fn ⽸;U D[Mz2*`jd.ZMB9]b)AJu]Hy3ʢPL j`ZG\o1E:@5| }:g+~}?a/c  -A9ˠAl+B9q9?N>rf-m/_1bQ8}xBVjFR5NB[S) 87pF\$a Kg(%X#Z 3Iݡʍ-?woGVr}"Ч*[, ӱ Kٗ~}E5lE=ڟ[4}_ [JT (2_&heI^OK}:vkl44)FN|ZhzlY3jV#{A ~s)-G5W-=kL 0OT۲0\0P, 4nIAy*b5k"bOȼj/L`H4d`&nԠ1cz[bZ72cU X}wbC-/z*^YPx~:%,8Q@ׄ|ظ)Si>f0\L@mRV0:@23i+{8KRҬlߺ_+1` ԉQGdP͓,HB}Z3𑶮4fo{~Ǻ"cSѵt}22fQyCc#ax,WuyI@#3[[Mo٫bЯ Fy'x0o7b[TB ⮝5Ċ&7qLDt2ٓ4Wvd8gp}B_ >ՉdzmG2Ǯ׿-./ƑmGqˡ[4JNsԾhĆY,)j͋BR1 1IPЅ<8bvhBWNl{l3 -t[ҥ"#MN9kAH"fvcq&x[d4`qWf#*w?XD:`>[أEw\N#z}9p>țJ}ifɲ92?؎"{%x` 9H1K ngE4#'ӏ!>scnsZ`IdVTpƩ[+ĭߨ!T#_3 F}G=>}a !Os }צU(.sBp97׵ Di᭨9[P\&ՠ *$8M%ZHcpRvio^4M`i lO|`+iq NCW^AP ?ëy}[6Xo2b@CQEnkp8M/-sbZ((#EG { %fX3E}UyMn۲ Zh;$f)T gp*4I>i0ri ώxnm3U䔉O*wz**_8fZ[+2SH)= 3_b?fY=JR7n5[pАvlN_5leN]tcsΞ?,U̒"V ='-8(bޢtҔgֱyB\vsuryٖ*rMEׂ.QZG[lQN a>{׫'X cTtűՈ73˭}/OFa0k•9hg0EZ2~ZbUb55|/fcFC1b UMx΋h؝Z!J++bڱltNOVY%XvJuƄfEnK(l`|* QCYq-#ɎWbkҔ(iHgxv2iQrNYeSxo72 CT,+S_ИcIr(=JB}Y`qosJQUfF{)gDWz-,oMCżߥaj^ZhmiǙdhikѠ3b.-~!QkIc*O.&DljS(S[kuʚ7 AO'!I7 ;YL|.]I^8 >m4]UѷS?gQ,2Q[))GS4=khM(R'3?wDbwav +܇D :Ff9 YF]ӑLҶ}@tLGϠz&?#_=NtQ@236t0lG&,&seLP]I`a۬\ЬsF `r} ؊M9c,0B[v2}G_9,DN1D΢WTAS-rhy~׏Dvև|d>]S6P$ew^0LAجQTm=,>*Ft~OK\ pA$`^lw+nIjOqo]`lI-:f%"@7 Cw@C^-xm]T%grOa<ܹ8re){ geaJ -dE֥@Լr2IuPN/WD܍[QSJ";v?~ku~Xzw `z<wo;j.C9&ߋP N4deit.q (>%1kňzqC?eܭV}3j="L99>]B[Q_q azlNBTTenp# mUl o_JkUi\۩ݾ{%+&)^{ʭn/"rji7*6:99f_ۓ\Ik|:Is\;Iy"9(q"O ۮ)ePy,/mZ`I@JL:+<ڬnmF8Ɣ [ U-u`m4&BTɆh$'+3Bpug̏rZa%5y& ˇ?m#Z\Q`,HPk6Z,$R- ݸ| Ѫ=3d[*`La@ b2W-T ʨ< Q-"ƻ7-΁0('h69D+Xʒ᧙7L6vwb1{-:ݔRc9ӳ!qMP_ zj^F_ulT>(=dC'ty h6R~$Xt'`jit*w=RH_D&ϑd.IYL]2fc\핽uvνXwDRN2lA(=2>DK'Îr&əMft@QDlE@Fy=c ?mpȂ! ńsGٱJn6Ϥ ̡=/lQ^$K {qep8@Q7?m1 qB't5[ep^KBVwR6 T%PۗFXTlLE*:q8˞ےI4y6T\ļan"eE2@sbld2jфv t3*lјWDf^RJLJ 4~Y2ᵐ.sa2) nUi溦RؚG*NVQ dYdɢ1 M0j~r D8 uXah, 1_`tC#B1RH}dc3;z[6 @#7 96XR+$;1Rg, Kyց  !`A&w4m)ӃQp_nRۑA&quV ^$˕q`]⠲9PjBӃ?nxaתSB +_U#wX?4>PYȃ  e*S 8 ƍl٩bРnv =@((k5]3|CBdP4ѫD(-żq>3ur͜#?zǚmsU"̔fR7D'>K:϶\kFtwI#ܚeoAfIqu.*Iz+39> ޕ8!4YNp+,/ 7>\[EGW[ RǠ q#+O;Rf/1Gt<ُ6@ε0pJW&³M/6x5I$af." /]mHGM-+<q>^q*)\f\&EfzJv2Ĉp*!ࡎMR "sf}j"5. X$g*@; 0G_cB#:j8L!N/ݣyX"IxJAW2؅u cŢᅸ ["y`7+'NQfUcM3Ng>TYS{ ̺[yiEzlQ'$j;]nRzfJz?rG[LY<‹g=`'*fD iO(hQZ˔C4I#-qU)|Rz`[E]~aPr/#,$CepXN߱aeg{#_UFHѨu=ә U3Kqw+^>Y$.UЮ+>/WB gj;CM-怙v>i͉K՜kCa0 3&53KICqG@FPK]/VEزN,'jJxRCwO@4y)+-ذ m&eWaL+ i$CC?AV+γJ+H[ gCgjlѸ~c:`TTTL}& Bw 61?V92_HcKfّ7]rtxReڔ0A:7),n 6v/57@*哰3K8HԢ,wF2ϦGv>XvT`ڱ6d00T,=j- G}jPx1  {OcH_IΓH sVxp"óԌ<}Í'bM?Bc$, =syִawUV_D>K)B(V~}ČDwq«\<̀7j'N*U=to0ޒ=׊gI,1[|+=۸}_bJV2|i>|߃>K9PJ`Š([!,s)А&C^F]5nއB&>GXq'9=l7! \t]CHY ;qJ;g@$6:+PijZ>cu^+ԸX]Le6]R\S6G=nByhy~bLl-& =u?L5rϽ?"44YIau (u4]OrwRcice-/w[Sa5y7QZhT[pbL9(AȻvh3UW:+fy6ԗd 7!4OYjxQC]Rup7:vhO:q= 'Q1މ!VZg\bs$0l=^I#Q &X-/@0 TUp0 W\GD7vScAW蚇XY&_Yg@δxYraO4OkwwL>D $ȧ&s9TDQ;Ci v*ٿ y bvC@᤼[n P,-,3Y :Fr{Oyp0ŦсAKاA@(:=A֦WXyM& LO3+cO㵟Z8T&c&~pmD+@F6Ah,a?Fa'?^_"ù6WopWFfb%^/n+Ot*Z*C ;];+[slLx9ƻ}88uTjщ|֛JKIi\` ]Ϲ`\W{QtgM1 /@J$XAҜD AauCuliohLqȒgqh<($ c@ 0x㾔Ee^{so[ P(n5v[=Uu?8*D@4Wa :Ow +vXH$Z ŋ̿Fڍ`ޱ"Ja2W4t"U`6P%veIB$(oI@( n!xX BI)[ ~JpЎ9*mP%YE 9'N˴-{3Ήƍ·:iC`iw_db=M-iVrukiV=1u=QxGUn3HVeV-4&Frv^˹,`lؖPLWl< J$Tj'l&D*DxGU[\EQV=We7ǿYSK=>}5]`ʗR4͵KtCi uF4HP|?%Ǫ{8(9vHGM;֯;U6> ywvcKZ+YRAWTIXAy":}oC3v2Z6hXkQ*~&v|2P2T괄‡ 3;K8eyR K.e,XZZsIN w*`;lr7KœDv伭q"AUP=YNgfC{Ҹ ӎP$5A>uQ'\?԰_<Al} ;n1lQ9ຘ/ZEnkr?<`e@ok."ۙՈi7HOH[1èހ$1p Mbeu83mu1q &(ȡ4R4x+2,3,LfMT?MՒU&ktޓ<bwWYw/WB/ V D3f_AňF&`<bY(.̪vULfb@2g8üͰNI+_Co(~e7§ ˋ1pANH 1#/ngfiE{қR&}j'+@!h4,{vg0ȼ8`@;XAfwL\nև"omm狳)ƛ$So\@tP ;}H4%X_Zj)Ô>71vi62+|k#j4, les0Usp 8K (dӄ<řHEVA)2QiW:_.&2v H*VJ~[}[f*k6\lZ,US 4$59\Z|qe3WÝ Uk}yҍ]GT#S $ssϠFCTprnB6mA06b9Oڵq,ч&g.j$<O7v(ik x}OBw8ìLkՕs]jM aI |ʅ5gs|&fW$qS~1G5hh MݔNnv<$۩x)K[}9kxM gPDv0"x L|K'wD1eW&Slo @A ۨ$8FުT΋@Akso-<4lUmȾ=:# (?;\k̎p Ghv[|JkiZFՅxbdդΎq6xh݃1`U6uk, eHA4!M g9e>[lc45lK9!#|.W&f]Tq:ʐrũs9J9`&R괺#| $.>4UOsOtT4*}2([!ߩA986ɻׇ3}F"9x|"PcSUh8^Nt4~*- eּZ6O3Z+2WP>èRh. DEfK -et Twlb|xfE!O^iô3F{c o FWwG 8h%йieR) wVW XkG tP/P.[ ߦVia˦%4)Ʌ_B1M+ee4XGٖi3:[q u8A}4?9p(faHN D'U.ZA"m a'^fǾ}J,@`}e ,_{$(.!aDMxI]>Y 0~>cШPL,,ޮa4<}py?dzgf *tegW+as󾴞 2>oUG?|8ӍfT|u"B>~(lضH6S`t_r+r0 i$9%k=|^q5XF~Y5|,^R l,OSw"S|`t1Ulp%&#61`@:'FWYҡrnĝEt撫9I;xa:z=23)Iv`AZݚaZ+)^IY/~sxq:Hy~$qil`LQsW )°>loܾ՝Dύ`MXR``R[JK~,gߨ=~J欔+?I0?KG[&S}6%KkRbz ܼr] !P)Gs5T?4uj.,G`P9.һ9st q ~SK1(f3B4.6pt/!\Sg{_E$I1~С ޒE'lɍ Lo{$!RN%{y!,R>r ."W,?mܮn@ gͶ'zly5w LBP 2ag-i nN;ts 0BFA׬e=ܶm+J$0tX۠2GGYKO |eCnRy!S:~:hsBXU5iPqLa( dHğ ז9C. vF ӍZfzg6:ÛJ&:}*Vr7CGze ds m.#FY=wX83@) Z1ȣXw۸rkE &+>M8݅=P{t*1xZrW "8o䊵goą~dN1Uh^~H D8 sO̯[/PtNa($N-䐃ʦMN1N4۬>Rm"'Ӳ_ (r &Ub{~4 O)ԃN-G;3yZxk 4q7; !.U֑tYe OnpC1aUZMN4#FqF{CZ퟊qAh}L`oc{4kՏ QU~*m@Y9<_Y/gX!mF ʕ,[ 2iov {eXp2 A=nw~ģs ?e}@`%*<O,a'Pfxľ_ū0#|YVHL4iS* }v5jN!y萸>RU}gZt-qs\)"[Y"> 'J뿲{9 Q5S$9Vc}yƟǦ(!+sp <:g3YS,WwTL\KtH]5 >D:³ SyVJC'*НLQF$-+7%>ˡw\[1ߖCMTﲰ@2L>uYariU+FAbGQ8OB;'nŲ }`cU:(EnwEx}>TJBVT (?5oM@B$e/=r6IkJ;҃CzՅygj 3Z.5s^gw4{f3H87j_KyڲXi_q }#k:Ѵ]?IVQ@p߿\.?$~}ݗ} c΃3]X(_>S"SS|*U,CpUϼ,Er Ӫ&Y]p,|i8`tt%A:=/E~ V똻P)(uY4ҳ&%X=0Dui7> $qNdHC3 %9iKW>5i&+e^t&z0Rt)&S@{2XBsK'E4y uZ@rb%VЋцe~ \ ;f;akI?YI>ˀGbRƂ4OD<=Njb}m;&t) G;'eS8-9둗mwI7p& ^=y, (HYm _ShL$0r;@Rg+(SAmYh#kLt,Uہ~_ѬFl<"9&qŲڹЯp ,TDsxѢk8aS/:Rɹz)`HEjb bߋV RG@$[Jƃ@pa 9TKrp3眠bvWB/F:ڰcZWq-Z1kuٗQFfT,HNޢ:$1FsqޫRyv궸!zxgDO 4aSq{k_UK {od`SʄWnOR~hn7VKLVJ1>(Qkz5IA ^)/O/ ~C 4T ^$?tW%԰v;I9]K|BMFZt~LK- K0:d =5hD)b]PhRj OL޺.<wR~=]ib LCJ?\>Ԝgbc;7)g$&m'* ݘQҫ`Qaby3.#rHP%H }UqwM55SE^ݝ kWqnN~M+zP~ n˷\rFP'asxݫ uPn(mK8  ¢@϶1٘|%v =N0iL<* \Q]lɶreRYO.3GzI~5<:km]4ih=lyq4 d*rWȹ%MT8HPrt"?5G Ͼ5l78U56 yV iȁYR\L֭շ7,)n,O!b'8PA?[4%.sL&p5iXخTZC*-[strZp, l>/ cMWD]8dba=a9']1!Z*VVES 5RϢ+Eۧ; *ȡc{#I L |6\WC>KxNl!O{w?}ڴ$i*l{[\'uG#itO/4QAvxyO|V̼OWw%)o)S)Q[`8*:rCua?GvfяF'Ov޷΀,5i+d~}csRMXr<?bia.e/=em[Vړ/{NK$m:P[ 39V.|\TY)($D֭vE "SI淀}8߄T[;T^7||Ap}p^m7)d~0C V Gg1n!$ 0vq'v9C (5idT6_ 賣þ5qiV]eTx+n+N\HOzM#7-c&{k~־;fb5y3X2+bdg/cP+8 'fye3A2s N?h._ҭSxDŠ?;QPfǕG?1fo+Nճ.<\ ^>M\ ]g*;KK9^HduM9QX 1?Y]m'adIg8l/T`[3s`}4MhxQ:yA&I|7Db$uXu$Ym:"NjWml%u$~h&pĊTz)t ,]#1eN i[;˅{ tns'$@hͨv)NPA O3JH]rnL"}GH>aWx4v~=? |wIVKOQv%;J{F zʳ9KדCa@|;xQ6ARetekݲ,* 58Sg&OpXPe~ ;"3b:OzJkH,!w<G}LY;20 'nXchKNXb\N!^o Xqʁ:<93~y*/a1od6Yw_oC5ƿͅ \.1(ySPXFDO)nV:c^IyF\쫦PXqjB4/IgIʤlXPxul?j T5@brʎꘓX}>g'jq>ͷ3b YfUN㮸 ZϱΗ'_meSHZÀW:_]#r oNx/=-U-$+LcȳwҬ~0U&Cf@~4 )\9=$2%*dfB `h# {l$"8-0ΏFa|zOpl*",@Iu)SA@*}`,ՎRnZvu +فV=%?/HH0Q `' BwG*'\r `V.q]cB6ѼidFRNF&jttH@*Ql4K*]^|C<n;}E(4nM֦^gHE8q+A6)!Щ,}1;RLYn%jAw]eTiia efIB,gP |vX^Iyud6TSX%7/Rh+/ؿjl2I-2K UUQӕT>y|Z"+R0D> 5uǝdі`AQSAj,ZxHDm*_65sոC2S `bWD,Y#հr7KZEpKxlȚlYϷ9!<_vF2XBa<;hCf=vDd =`hRsq?ccGl1`<;ј~D|-%TuS[.jLwjjdbFZl<{ 3QK#1d Cv #OY+׋~l=O1W1.:3!w*!Go>51C d ~<^j)$?;R"* (X>Yp>F%074s#>vdJ)TzL-YA\Xߚֲ;hg EL-?YƁkD&5Nkֱ(e)ҋ„֠f<7MIZ'7"*ٳ T11A۾L߀22.]@O~hN7+g߸4|2`}ozNs}YZo_>z0%%#M D{)*Hh<(\p:B<lĺJKН7GWIbl{Y(f ~GByG?oE?I A<$͌=C=/ +0^Qd,Z]C|^"m`^1N$\(Bv{I*{ 'JeT. bIwpiOv4@$Ea&t(Eʶ~O$d~,:qF,f^SNN_W(Y ri `qP:3ZP[Aݒ36PqI)!%μ. jݚ|ndA, x-žڽDYLA1KA8JSݏ-w{o԰#*0k]y۴:sde++Z i!6;t+y}bH*<z Gٝ 2AELhZV\\/ NL~/] ^) MKPՋ{{MԡRI4x)j8jUomu`e$YT@5|-V3=+0 ^T #@(3B5HbeL @LnCu.@l-0Y&!Ut-"'$3 gzgTڴcIy ^Fd52h69Ф)Sr(2ke,jpt–[~6uviDV#@oQ998oi($2PqOw=9/5xĵ)p*rإ)\h%B # ]=ɱ̑"jhZݧctl3e5p'V)+ ׀ 7G1ٚTD~2pRXlVVہJ!0B_(g rd.)!њ"*oȝ%Fg$hL⩫f9IIuv^Zw,hW_UH&faObKX虏0JY\GvX!/j*tB&5Q2 {b اR ?i.;gQqwU!BޟT\]Rռ vn>ZYe]R6q 2KT.v7XRfSZ#gEzn[ gƔM!_ 44%zkMhI" [-/ l׻KC #~;7${.4`'Fh2 lS;ӂ|}Pr/Wja˜"A9xTĠQUAMQ.l]i&Kr}sLقsU>!ӁjI>8oϕSbu6YtjKWxo~Ds /M/xK(fi%Y 仢A{LXCiܼ*y,!]]*aqRb$3MvUĕgL橡aC*RM[ Xcxro7'^&zԉ+XbU*ߙ\Td;3Gۚ+adяbA޽u֬J@*e>:8Fڗ C&J/4UGnN}[y!}oqS^Gu:z@{r*Ш|E}Ok67r&e镢xvۯ tqCuڤ@FӸh!BXĞTkNJk^-9̒)Dо|B+ 3>]MH.D)ueAnAA9$2PTl[߶:Șj7\Sh28n ǃ/&Ɔi&{ i9dS>sH2C¿ z]4Mmk xTA.)[~y(6 qqÃt&Ň-sI19xe%TS: hȷ<~C^9e+Wg{kLsl$v%82+Ҕe"+>Mlf$灻4d]:'Q54"R}&/ B̏[  lRη{jNyt [BmU&]vhÓ>+&<&.0vgEs,)q^/\4}hS+D?0:ѐ[$II]z3 k(ssʲ-7[/kގf)}֕PKȿa,}Ⱦ'PV;P~+}onJH:sUHf-^# -=ⅠwC}AfW~J9Ҹ&v0vdȢݳ:Mo#&.$nwG9(ƱgK5^~:SXxWo?ZՓƬ 肴ܷ3lq WhjL̬=k|BآTK v /Zp#G#$u| Fl]fǧZ̩ϽquT'hժ*Kg^eWo~$?$IEh!0{CY,]P U%!#cXvswG6Br5\e4mܝ[S>͐#筴U^}2HZFl0)nv9Vv=hjԄ6„vFZ[詠Nd,t$þy$2̈́ʢ*~M8rʤH/u/$(QyD -z]H9Ȉ|֔YL+O5v`u6&Bp%/~L2Ǚ$(TW)лs$7KE0,%i7%1H6>C,eO ˜@[ma8ϊiol$UF?lPrYf'7dDzok%V/P5*\QΎ 3i4-)GV J4odӼb PPQJ6(ћbKՖ,,뢼ST9~!:))Pi8: MqՇwVWrX>>Y4Ϫ hM+,ERvY,`7%~üуge^X{vWTr`S:f)0JsyPFn7y ԥXf%zC+˕ț!kar^l<dzi<ap9%$0F&^zMqՕ|YA[&1qg&5~v__^}>Wުfǃ~ k+Rgt&>)q>v^]_d=as*hPa)E0V 坻#7`]0(x_}^B$-SˆedڴCF9R!_ž>vuE- 9.P5z&|n{HK fO-'|RmgT-;/V.d:@wri+q%{b H@B|@A g~#Ilb/G)Cl3%8m@T}jW4Dh9g$2@Y<)FP!.4wENq-τ5ByݣK 1^ل*P-Sn( p-瘹X<=fNYǔ$@ Ϋ3a:}V@Wu(*U6ߪlty ^"yUfHk!_!l%d`Mf">LMU"r$ۓl*/n[oPsݜ"NieA&›Aj GŚ@e_hˎ@J)E76ӊ2`q䳘!(][rp ؿOܙh=dT.c*Quj\# (#E #Ye#o :\^]H;A2M@-y=64dm P\ !!#Vrm$X%m*Pmф^{3lvFk-U푡*) Kp*QX6 K$;WkOvqt}&/6ex Ћ_2lxu.[0ܴ6,2PYHJGR֐ &¥Ȣђ*ƭ&۾Ɔ[Q}'O=&>> Fl4uMBپ K*~$ 0s!#e0&%҂Xtq`nDh'$YK7C QIr~Z՗UwEܹɿ4tٌ)/;&rn 'Dq2h ٥%OBn/A\+``xu1화jl~sANFo}JMg+9q+ BdC6 _vlb֐S–Z{x< F+"Ϝc4/c6 RŐG57SC^w=o"M'lLWx^?\X{j|Ƚpvw]J]Ʃ|࿏|o(2%^kF')cei"/NVe=3Kk/d!&1)MTzM̛ 1)C/4C-T.1&Н,C|H%rl03+ q>1EH2 \Byb6ʐVA-U+ -S Erby| k%P1wx[PYpS;]`34#習DR8L~> UB],ٮe=gɩXoaKaQu}[-}qf1nadGXL-igTMzw^V\5GE Oi{i7z{.gMDc\xȕfuS <ܞz#\BsqU.vp vҬvM'FʾR}So 0:l0x./>h2{,>uJ _}SOo6:+ J|m|`…#G"~sqNj8%dMP/孜R$z W] f (]0uHhdzm?:?>&j&$J7[;%7w%Qx=-zc[hU;zSj$,AoRjilT ޕ!-1/*WePMMm$^ϼZɴfFo-t2frW=f8"@krK+~;C3 'xGsVG6:* DǃU7:/=醰~N<;h<ÏƐ/Ӝ._|]U)F3ejlf'^Gu.+Y2jEIOA&Xbl"Qu:f`y%fXҙ]b(u{N֕  ,x}})vm42+rm鴯Tpf{S{ۡ /Hc)&=W:veL>ˏE3nLՐ|eț>ɨMt\;VäJb=}\!z@0VW+nIL0N!Ji}`<6BeƮ΄<>SѮve<0۶1M+n1Ybgĝ6Xf'/KtTBz;ilCPZS0W;cNqc,|st Z#XFJǧVW3XTT2WNpkolp~5o*=ȧ92)5:FH>gD]EgdCy" x%erv}x-(z=~~GS@|YSCbug"UЀܘCĕ]xl+>>%*v A(L'tcʐ׳?i'{Ui]P,1A7mt+BHI*X hZM]{# %\&3@sqeܻ,k >OFh!XOu(RIpjC<2D ):`c'?d: Hʩ1#R{dRXO7Sx,Ѹ[dCT9.@[ &%/ R-<{u+Ù~i\w=cX"-CeJ* `3tK8 jŰ/tLr+Snijq`# M%,-Q;l ΀);v74L-g^<|G}sU't~6JF$JBGt⼂HYG"Xd^-]n;`daPHNC7TCF؊nQzoַ//Qg%x)1Ğ`>'fZymtԗF1?jtr9g wu!||woXDb r..|EOrwZ3W)3*<8pW =-lor5fp`^e9Ehf oYrf =s6F #<f)GY"UG|7E4l+zcE 2Jdą{qc3Rő`.8^q>J!EߣHCGl&o)*TuwyBn&<Ǖ9#?%73 zhE0v uÊeH)E9" X#({i6{Xa@Qnސtt":?%Nh>S%"|,~6n]ny=}/:uo (>OǫwoP ,<.:#Z}Ɂ]Tj$ 1O2s߰ J*quEr] f!qe4HUX˱wee*ěl,R{(U%eo&_/FõhŅ .zg:_N[ G@~e`Zt?։uw UzW!Xv&UFT4gbx`V2.{m=uLFs:,1B\x _dm=O-ԃP #Y#P!.@ U#Ï:8=.Ӯ +>PxuQ XE['89LE"N:|ƈZi=x$6pr9'C!f9x1'rÓvJ,5߶M墣#%&+3EZjb|.øPC_|PIaF2wr[Hư_D|3 WyHxG`D]90e]L'kuk_OOPۂ? b.U53 Gŝ¿#{Oy?r2sIsT~17^Q'V-c z]$vQ9.,`]j/V|$Չ |J i^6fEvṆS knOMz7=7bUC[0F.`˼|=ݻ8el<}5o.@/yUu+ QMX`GP?Ԑ,ª2`o4dZ>gRB IxjdaVYD8 Y)'VU$ꕨP06B;ѷ~_n5hkLb~oDK*?%klIIɭVvZӯ!/8ax埙UhOBL8N?6jH FwG=# (\KxW:UV}mݲNdpP""[ԇb}Ra,R_b)g)6WtI5ǫ=mHT? ӓlۆٟaT `.wU Ί+$%*3m5ScDHJsBWe|tiaDp"R0m/oe#'{^=T۾ӴK8zHBj! r1:V0j6= - Ov3E Yfg(6"m݊Kl_v*ZN3C1u3+AoD+e 'a,|OuWqxzꝂyg\[/)'#SGIfs2Զ$@o)$RvfmTRU_VQv mx0x%Q@ˇsLG6T+vi28v"bկ&DJȔҿ笅6rk3O.@-K;WR2EWα=={wyzMpx5Āv)Uߏg[֙4vz$VTeiVBkJ*9Ғ=Q̫Nve!tPjWL/697=fzHx5^;]lT&<7ԕ^oF<'|ٸQԸtC% VxN^:G7\= ȯ4H@$SdN/G6ŋk:ai@MԼ?Շ9!nM֠c6rK_9[rf5ǮC<%>5H8a0s}^5]G leg-Kc V|ЭQs}  "! 3D֥+]܂ L5ztzj-{Ћ"wH)?͆I73#% ChhQ9&3Kk(d .TX%of$H~&nI^(1m/MaЌ>tJRQҁru>@X)@^YfoFK+I1xiQs|"$*&Lvziv"rJUFs4m[/y $'U@;Aۛj{sq.e%'L~}+VG` ;6o 'R+z"#=$|]um<@:X,d ۃq5|U'Zqeql'՜:ֆxR f0#oR >҈A\},Q8"}џ,fyTO<|MQ-j%ʫь-aM`)yd ?aUvl^JEt!O*xvjgwdf-[z9H\Q9'U8= v4;Ue01q'|\_tu^vdQT*|{ihO+e> YRN7>9:+ M[Ж ouVGٕ*,i\W+qrBX^=ҔI(Ykdmڏv'8Jz4tO(.уOH3DΠ>i=D"m_VOW7zmIcׂ4?<9ujjNH1{hZf,Tu&y퉗Oi98,D VPPRwK>9ܑ,"pRTL u1_5p#$$H6^:DH8rq N u]b3Ӷ " V2 ;vyչwTiʥxP__JG00xZ[2-ԊAaLa^g54ZYEX6& Px?˨;0&|&ni](D>i9}jrT$1Hiic' }Hfpwt3(f<<-/%r9 `Zrx͇u/u!] Bǽz*(⪉G CE,"0+x}g?Vd@7UuH@mCt@kMfƓ?KSa9~?$j+>H8 M ݣ0= HtOhGxE(BFxV5X g7v [kgd*yW@bs 9,J/]4WlOL,w9h;"}t}*Ⱥ~C9~&4u99,j :E^j<3ߙzxÝOUig;XtICdI}܈yݱ;O9)R6UDa֨9KE 7y'CTm!R_X:^!͒be8q&u֧@ixgNc1lhTRaw !0:{Cq W氿_3VFU Ӡ@-QŻre!-%[m/*w^: YOS^WSj,5 c[ۙIohS7cNvռm* 4@duC3}|")̥Uތ*9$ØDE|.pQd'HOȌ d֎~y-fq^[]ͰhJi;r{( K͉BZֳ\A yhǵ;ʁwg{C5yD_wx@7B|'m${MD\GphI5Xc -H{f[# ȆE);":Q{VNJ;#~jA$qm4GĩRh_{C*N+זсarFIȘ}7X[>/iL%SiHon"I$?y\F'fjncu{%_Y3b7<{TKK :ƅIB.)\rہzҲt 0ԂU =~N}եЁѼ<lN$ kŌ}B8pO?ͥcisep%qK"U/n,ac [u/>`U Ę}mrzH@I?nCx%tU0p2'}g+&QfƐ@jA#rI-KFɎEaTUeQ/ ?>ϪG$]tˊx0T= [7E=qɪUۭ dT{Fξ##{51[\Y$q GpQhQ9/!-etoINsxed\9@5NVl G!?BzTq-)F4HGs\ћ&7F+P2[Zkb2BCq-`!-nZ]u"$5}) %G6ga yPeSZ#cNmI>Ft}Ma`+--]oͧCӂ誻6AJ5MgyBEu1f`NpAwE.hO;aHO%QgBb]ueŨH+0/w01 t^A:[HHI,ɓ:6mY̐d0+uYX)o9(ٺn`,y@q6zȸ ^\>ŊHq1bq8N҄C Pwgj@8 D7wyg2I21壵!:v;qõcU֬ =W o,)]A ]'66\APnl<e~# Wpyw)'s[&=*qiJw)%1KT/ 9:{#1GP;o_^pg-9J;^h{UD̵4+(uᱥO YIʝC:w6D8nkbHBz_KoԋbwNQN0~l# +ŔT;T <}&SbsMP6uPq8ýQMLY8hIc XⰮs~"*/6E |z/@˕#z (BKOeMfKGsQ !%]f- Ͼj`p#oRn0fL߄(Ȇ@4ajI=Z?,J8q-&QJ /G_u|Nƣ,b8Q jt^Q(e.~ S$`:{X Ap)y&*m0sKK-] %ʖ'r iiM]vtY/pi`TĥŗBó`|'.7m-O7 ř;*tϭZ\୅t{3iE0``9v6en9pG@{DZ,AaJa!u$?/|)λ!#:V'&n:.K1 %AgpwVkO;*}diă@m1x@n@xm1=V[\Q崩˽%-`"W4P^zsbЪJCkHYQĈ& m3SVIڐ{VQӟFhA GA?.S>52 0(ЭN(A8|";e@<ǗŌ G'b/(wz[ }xpU`d_f~uG1/h{fF:j-Y4׋;}RPHATO~;ziҒ Jz7;?>J 2Mh ig2;7+S"^ <IJg;u& <p:&dMGU`HFεrA1 rm_q6y0l#_Mw۪<-odG[}4q_ CloݲK(\Sd32Jn9FJ(lAjԹeA9ӿPlq}7{id7|U57jͳFߩUhϓϡS Dᓇ. qdg.L_g-*4at爷E|ٯmg2Jأ_EC53@scQ#t'&CM|ˈZ_Cp@I2n qq5Yh;T--ceׅē{Q~?/:~S]>)#z:*Υ51 /ෘ,&Kv>WDR,m{8L-r7$tt(}xuDlC1ڱT 2:Iiq.}mbï8H&GO4riNkݖpc% kLɵA-kV-$PJ! s{(x` 1ܭ8(+΋5v}_ټ2sV!Xs>$EҚ 's& w0\$-yfw.8_`kk_]<>!S"֚ 56m.2*YAV.5z%Drʻ.S87tep'?% /He.^eW6" r:px2CU fo; |pG, v=  h@xwPwtAcO1^x7w%ݔNާhMOߖߒd,p7H&fip;Ha( f9vҺ8X]D5ӑD.%0B'8w e\ n~ g KޠhR`:<jw ,#]9v6Y%`Uj;䩜կ[RZ~+!;ˋQ[S*lJa3#dMO[G;9Yx| K:TX k;{NKSr w 37 ?>BbT#PX{3 ` \.1;Dj^p NEU8q@nGn)IӏΒ3 Ev;uR xۼ"7[lb (O*~A]UP(WњٳX+ޥC< MGȫ@/ZpoጤdZ \wyT2_=k@" v/acԆ*E#W=*bK6xW$9\f2qbں~f+Ʉk={  >@f5VP]XX5` v6Fۧ|g1yD dV Mq>ZZ ;d 2À|{V>Yʅ.U4 b'{V0V ϰW-^T]R~VO0JD<krf-Zpkf󟅃hx1<O e]K gOy,(m޾}T5:52m4&Z9TqZ}fv!zGN#=>uW56b'Q{|TUH\8e8jӲN=Ls]I+8.;KbxNy3(T^:du+?Zv C|tMf?(86XZ.nF Oē4ѕNZFA5%>$~ZP/W(aRPXdρ#z{pL^8pORF^~/ycEE渜F./G}l|?#ڕN':y>+~SWg`DF׸o@h!56m}ITl1hտkrO%4bs>66c )Ǒx EdaK]$?D,]!3K/ܢ`5kYDsP) u#V=[Ɔ323,|Kx BOϢ)fG_v'fiZ|o^uh{TWDWbW5uR6OֻW V82%I~BF 35$YޓiyaGФ֓9D'qu;,ާTlU.ja8%\dyK)`Ɨ$`ڋ61xa\jĪYb8(r.[1gT6O6֥uu+xY>56a7IN?8{g̳Xo"ظzkѐlDǒ$ g'qqƼWcfSe{aCno6]őo#i5z&}A1spm2 a:?@^2v $*x-b_nod RVRr5ê# x04/z6`pb&E% W8ü"0C#0Lξ?n!e >8YQ]!LgŏI7.SNDB^!2΢u7 2PSɊ]" EHyv{m^Eq -eᠼx|2]9hSPP"sq*B" zS5&QȔ PhQ~kȻjBHEtCzcXvۊHkޏۓwmdÚ!c/OmV :b70VVzLHf4j+zpVΌV=(+IPLk=v-y'cg,/5<ghܔGQcI${Dίy-?Dy+v^#gd᯵]=,Eh'l0N -zb'4J(SUfAXnw<>)|Wܼrþȸ2 ㅾ.WJ‰E`&6͈Dn"eb2IqEx:E|~)^G1OTkw_Y,&{j֝$aeϨ~(%?ƨt>Qx-:2٭A^3%>C®AH۝ݰ 0QllEn\~ 2ƿI@O_zddXyxUM)U ]C ZQwGXnzhאm0`s8׷wy_]eAm4~\stH3:ϘTpK ;Ď>GLiїpwW,B,WΟ,^gpmB㷷y϶")+lO%ۑC.:y!ֻoVU.-h2a[sda"1Yh؆p-2%Y,63`@ܨ>Ȧв/}u13tYj0 /OE 0NVCǽEz4ɵuf`SLJcwXJ.PRúF'Jm(ıϊ.\xVM$ ,bzԏ|_ҫ3vpfmVM{DH޲e=?NE y=z=c ­hY.5THaaΎBNyLCYg+Ë#hWLF?Ye/^aBe*@YEMkQWg)wؤAVy½ҜTCr֝Pb/>inxцRu?pAyƛ!&F84 V_{_m|QdP4Ԭ:a< e^oaU?~J]-ThV&u$"gT Gdz隡vH9BʺsJ{V:֎^fB-0ȋ1 S%&q׮Yrz o3|U9m{Yƌ#0 OF'fJnwa:M&mF>րt6h`B/^D1(SJ_|O95bi3ΙNb =r6EJ@)'*kTEJ&}[vjx-O)s026EIk ~]#X)h >S6H:>@@{3vgM}h`uz =nMSg8Jpڍ߆ȿ2d"H`Dv\j*Fn_~tr61,{3z3C݆z%T#b  3蠈޾gc g\ˣ 0Xa1LCHa^=Kw$Dtm;UA(S>l/H 1:dxGGl% -  %s.޽Fv<_n<}m׎,P/ņk^ΎT9 >a0'/f9P' D'nU2\Jl<7"@0! 6 ySESVX,W<ΌWi缉fk!9ewmI]R7#Y[͐4jMuu[ʓ!Lh~rє]&I?IAd^ǹKVY7 f8>Di_ڸ>'9Bum5TBoNC~&e3QUw$40iqKpjIw-8k#ZHRKاq 7 u](Aݿ&\vƈ  qptvh/Ih% o䳺њ7 I8uRAP|ܼ=pjƊ_jNÖb'BXxa.#$$y[tJcxl8Nij( 7I@>G$<ʕX;l-'6|lHygfC(#dpeLQ"ea܄G/< &?V̠\>42YcƠ;YRĞ*Kg^lS9}Ӻ,]OJROoԭӗt`X[Xׇ̳L 0fm:6)>60VEng:/%Vb n OHg"7^/}RGG+pIuف '}q 8jZ"g@(/ F_; s]B%M0((Dshl5ߓуi gJĊy+6S] Dض:M)pIk-ĮkX1RE}H^E:{h;-{ K~SmZ&(k\w~~&\CoMp>_v D}y{-m%r-seg inF@y-uX{) R 3%)T͗-W-]qJ]ŸUΈRh8} C EΙgL4F.&B_ܜaKD'OCyBW?5_]i= =r^rIh,+ [[@k6Nl;18^hp]\OqRx4kәTkg@Bd*{fekQᳮѢSJU&k BsCȹAis ~%l%W(ZsZA`Qsyy]/8V7`VP7Etl-@Q}PM0KYC|7|$*q }ߩOMorFqfKZy< -2V ZN"D61\0Lv7wʹ}K{aϋhVi7ߥ+eŇ5XT01ThX).J; ME 6ex0Wϫ2>OPSXob$Y +$ca_jf(qļG<#Ӣ i`n^U ; 1šT~1iZŎ{{{^QtrjyHtt,ȷ} {p~Ȋ3V&'4㻕?6QӱB bXimHne!Џ7S޴|X뿆yxWTqP p$z#f/N lҀ_XLf 8ΑkeS[h<)@"khn0rn@,ȧ]'o+t,0f`jN¡n !&뾌q LX,?L7½jJ(Ehga7S'20: KH{JЃ<5v7Ro\ɓtZ\o)&>;alamp๝ `K*BEX[ndOOI>p/`ɇMXO 2Lªڕ_P_eZvLx6|+RQ۲n͛nIj$]^`KCl<4UNO]AY6_3<,Pb1a#ǥ{j&ұtyueT|WX _6R:Ä!eoy{:YNV}]p{|"hy58uб^Kh!Pv{eѡfS]+?~;R5)|e̔Qlx5ZɸQSňG%cMYJ*yG:lmԤ` VYXjW;`-Ltd=\Fu|üA⒒,֠9:Ha yQC4xw?G-Ap>1 2.6^܋t65LR$2E~V\|lWD$O @ni L=gWY?QP3r*Qb58jd7^N34 B[?M,Luf{&4{܈pu2вA:(0Lah Ngv:'1g%)–PBF>:"u=X`44>zfjKaNwYJ"?K w}?$"KJp ה3 RI#k'LoOMjH mւ2 pPd!~2zHaiI*FwKpuńmy# OG]KW 'K"=!^Ӑ :죧HX#G,72ĞF "#ZsKX>ӣ>yDN0wCk̊;ca@MU&vzR螿.흡.EMj~?Ή0gˡhXN*45|q:-0*_Jl7bo* a)?(xMu?Ԛ nyuۂ<:m.@𛕞`Yڔ=#|^.'3>BHĩ[jh).KqP1U59 clx9~o&^6![?si(}CKzI mLkzu""llBΗ0A\'nenCn,CǾ}rGqdzXq#eExq Jv"襽+@Xܟ47~d͜ᶣ*KaNP- B 9^#ٽ^M 6'Ē'LFϷGpטO *ԨeV C{)K?kY=En At':Mi&  .L=%NE@BѨ3ҥ5ֺ =dr"Џk2,ZoX2q*W%fu*p4ZtzI #n~iGPXmW>I0[%jzaF:l:: F): p"r'Ё+Tzj{ߛ:V,Admy9&fer3\NPo7f,cW1¤*CiVs{iu ɈˡհVZ.F#Kߨ)cŘ7E瀾Z2>}؀h*k+Z*&,.L|ȅN=[Sh Z3ocDl^؋-$2G5 (q=\L |HGQfȶUq\riO{g[94Sj̷yR$TVI&.JQߪxrw!Ðw`gX|~;xVVfV# w;juvFg2a;)Id;yv9?KT=:J,Y))_Gd^Ro: ELp<7ᔷj,{Dk!ا8_;W̃Ϝl+XJu2/q4;uj'X> G:TRLvId@1T:쎓}icJ%^y0Ǚ&y~pMlW#%ȦS W' f9k2l65O "C]屼Ky] -/&+F*T*#dtEd~{?$ai"TnB ;x4Y0 ٠l@բT{}3U;._a%G_b=[{{6wTPo (A^7dr6 vݘ(@N\Ћb׉ZGRT\l-CzQm$-:Tw68ܯgy3,KŔ1Lg)Tu|nҪ!I27AGkL:&&p[u>>_'خzvc"$aAV ܗ)O ~j-{֊RdH V#c΢qYo%kNCg8_|x%kk!YN9vu.n 5oɋA0şGlCrxFE(D"0Rkz<𖶃é|F`@ڵ&dC0FiaW.'9;BohW[-\͓"%Ê[pU%26H(WvwFpߚJB _xґ5bGfc¹ZgF>-W/]Ln_S6\67W=n74׊"4Á6qs~V|ϝ 1 ۀFD)5pQ0);'Dƥp+^ _ J1A}է(XctŰt 7 Pft oDx.ﶮCؙdmB8䚷Lrktl<&ЖZ- !UEP+]cd6Quηֹh Y,xO O%$͚gi*2u!un;7F Mv\Fy@)0!5j3NAȺ4XUsn  7UvwL3$~W@'-?|#^vx3}Ȓc" 4]{qVO©i  qn 1mn2n%*՚y'-7a&>d>juK5h8Ū6L` !$G6i*\eQ]U ;GؾE,]m@?kCqC;`AyJGnuL 6vem}2rx PND+ |"@4huT3vp` tA ib![LF2o8(7`' exLA\aZ sv,UlxƂȉXw) Fr U9[X6 olpā93m ̕*߂◑ aMH'<.l G1͌,.BP,4uiN6tîJ1 7,&)G~.//^b*Ҍ\ML`ٔiV[dXL1hkU~|rJ(ASZas7\>|*k@ H@h{}7osdc(*I!.)`})Mqv~k_Ak;ぺtVYfRG838ۼ )2wTsn~4oz19DW JɸϝWZ;*^8M&@AU'CǕƩ(?EJ}؆bMo;Z~BM29Ѣ)>j\ 6E,r'mO #vš@ ʃ9άwBǥtE E-qNcNGږVMV6mP;8n5% `N J&NZ7:柈ǝb=ڜ)Y/=e:6tUUCfb8/#$Bڃ !< a [K$.5*5tc"_tJ\ LJz:cMYb6* ~2?C686*VZA~rf8q"/F 3 L\:K ,Gg3@BL$Y<қ]J/0-;^<_:d /v Ù#8{|Xi04•H<62>-RiJhݿ}CW ๶V7A%4e+Ǟ(d")çG!Ⱦ-Gݏ4!3H+A I(&+?V巣ҟ'g`T*`HHtw (wAH(JV*e?݀8+QGHCB0ȭLgUoKj S鎎89"2Tx(5HK*+=TFM(>u@1h T][s)fg=pV2jߧ˯:TO|[N(ҭ%{%McEFQk}|0#}6iG5-+J#>3U'GQ_-yiZ}rxDw N3?>؋3 ҅ =[; φ]SHhHK*BDF ]SZk#ݨow{̀%]hU#j;8_ˮoaM^ "*;hwFya,DLT) 9o:'ލ:D=҉hO\m-k]1yQeA=B= $V ΃)sB;$5M2q{o=}m[ј зȥgua?1oU= цVSq?^jxf|^2v$ns`pB5·UB$2ο%%Q?7*2R*mRLronpUN:QV7qNKf$2<Cߍ Zc0m+˦ѭd#SMRWƲ:ц?* "%^a eERݒCv{>]PՄE/)o>"¨ ̠IpL/HTX-|߬]GU'-S1;%ds$B?w} :?x_}TfVJr_ >0\RTS㼸ݣhy5^K;(xnؼf $dny)SZE;E~m5Ȼ33ZsI zn#yfp[.5J p{AC&,P]ȟ4( &HuيU,6iu@ 9H=1;ψ^n >`npeLPՄ|p 9&CA3dn^UYV &* ƌ/PV/RC#K6K } z [J[n}Rtܻ/E.Z5lY\N}l7T`e I≬qYpDpVcؤ=:/vgFcxn|'Ae鸣 D[(o^d b)DEC~0tK(`̻˵17^GR6צ|Ju"?ډwX ^_s)8VI/+u;VσW1*⮙Sm/5[֌ $}psDY+H8smҘ5V1Y`i' ֕™*^E?ACRU~˲,+L39!Dcz l7Шn_*v i.yս 茀Lx:IC{Gi6Z냵AN.UbMq+Y!&6 Z>oݯ+'Dq$Ջ!D7 {8=E.&#Lb f7//\|3Y]!Ρ[އ[y*v[,3y@ N}Á(,kjV^.Bl u*_Az95+J0]gh'ZIc3jU,~]:8H9z39>VCd!jZxY7$+ r/d$S-TtRGg1N!zKRA=؍PZ09YiFrebF/!:eZZ `U̩3Cբ?bnAdb2prXl`#pYKDqьT; as,qM#1SZо>P{K+/DңJ[ٜR;9gBֲywTޕ7QWٲCF%9GBݫ< 3Pg;ӡ$[o0j5 d-Y9uXh%胀6FzNV ˶D).y;)QLCqRԀS4f,pYWM1ץ}f!G&JWۥGSe#w3ĆyݚZX ?4]b 3^M5 HRWGk_ϜKU݂]9qa1;iv,JuiGƼǠ;Ņ76%t\sir/N?Ȼp{ZƋjbe%0zV|NYPM8>j :\(| PIddDBAp)4 5~F7&οINsa{gLlGXEVH{9फ'o/()K[8t*L $~E5:ۢ䋌r)i=&H&q( G.mRp 摧3Tp6ؓSTٮEITPypJDg)+*Ghm7cí$%6.m&F(5/YtDA$3%%Cozh )(V!.mΘAHzX!E`$>s@T:$cɑRX,]~q|~~@n\?dkSW'DH}[IaX!+XFYj^s]Oy7:00F2"f>Ms>=Ac7f 1VWtX n"z;8ocxd?<N׹L<_t֓{pnM1 +i35§I\"ĄzHyU,Bn'T0PRYQ 倏`@8ا~Ywi̖ÖHݕ}w羔ɟ:u~Lc4UKy¥CU yoěf?kV6' v#8ʻ>̲uSS`&1_&\:r L@=/opsGMmZq%ݯŐ`@3 F7M[.Bf+}.mOC'vI.8 Fxѓk*8U4B4ԒQ.:tn8*9C`N0? ;/3o؊>5N&2;.N0/jw7,ũLܢִs`+МHi^!J_7T[a}}%=tz@ GeCD)<\H4ȳ`q^xl kR)02s LY*#m[דZ*z:AeT/3hɡۓgFن,}i ĉNO,tQ+6a7xw-,-d&Q6Cȧ^5]ѶQ YSW]AوqO|qKwS8b|V]ўh#!}H8x8q>,|җs30҅EDѪNuRE`n29ATd-.˴V2r[FT d{QC!Iޏw<0~W  l!,u ܍y<k!ȋ߀%&Ǝ7:u Pu9#H] CIs;8lqyi$*JG0JwɦOܶG}Vܹ5WO뾫uRgب(1#ti-Zߘ. H,#p##A_=yW\aWy-(YI#֦C Pt !-`Z`=0zBJe?!a?wB1gQu,t]1m2`E}F}2DAv^cR21=DaPv;:%0?ማ3]o%.MVE@>ȩ.Slz,D:~'6ewWu_3M9Te"B%n)In}rA:s\0#HzΧ2/#/W_7֚DWsA:n)ETv %U }2өˬ\ǘ}K ЧoN>2{ ΀_m`XVB Nv{}P諻dZ_o) .oZ?%B\ }AYo͏oL!B Y!}U-w~d )j!Vij8r,S0 uĩl n|w8&Um u re/7"h;{'SߩP>%9ճ\72kP2K&+Kx;`'MI5'(gmLҷ`2tΉU[f?V @G7"!YM8BN<<5˯X 695^rW1_Eo}qOR;洿L=@\BReJ/.)n2J1c+6+Aw!W]Nj.,!J$E  =>$&2SaSϲ>hdۘ;Q?j\7~>ܴ$cX=ID^>[ RpΘMw:{eLv\T :[Aog;"5`1$`jc[4!&b1MM%=BJMڒ2Bl?FXӤO5ZQa楉/XL BYjᣣZ"|epE!iٳ?3-;E(q'vcJ!kQ T_>0ʏzMdRcN!r])`Az ooDG0s *eMʧ`w .*/΀'u=T0p,@c<<ʿ>Yvesn:YFm릭Zg-m;hQcRп嫫T[>Y7Sj}D;JgOatlho#@Ls~bITDN6l@ֻ QGsfHE_\*k,o^S!Pm O?`N]s;U`2k,QAuQʛg[wy> cfBSGI }Qâ-6D^RȆL#(ĆXςL0# -0x<[;O Q"인{-Ӧ`6DXkPPF=4Ndd k,_y;vm+1D*R.aʛPBEf }0>_2IP铛TðJ\l]HuB~|Q#N0OS.:{ o&6ku-܌lwk˼0}ǿ9KI*ӌJ)u+)2vQE(:bm8PW|Q/j`%,/]=ڼ'dY'"iddNw.?`Aذ2Y%uk|AH7O++PCn゘[1w6\7׌x\913xC57x b>|&Pm§5g.zYG8(h. W2p%AΥV|6kLzʵ~Q@ZڱPFtގUf^e脉U)Ė黇Ƥa{''4,'+dk-o#FE"8RvC|#9>{5ud? { AbY# t'ڭΟzس B{V4k%ٯLҩ y7kz 4Cb ""Z(2RĨw HVT}\O#Tw)8yK>a>+Z/`q#3|y$nc0I#G xp\rbL<\5TD Cj s)m/ާTs[ Ӓ@^{Z uv}!@a>,TwW4ܦwPeFVMSl "@}+if}WD)qGߩP<=5R/'6 v 7u^1*4vWH]M{]a7 /^bFs Z&XPf\قn^ ȣ4pMg ^bu H8'58PgL- g91j1ShxS dBqے  ,D\;/@^(CO(Pv)fZqf Z?9,U~gHby{\T,HxԈ}]NQvo_//MDm6EѻDܚ,PБ y_f (dlP(~ WeWzLB?Ϡ"?',*eRKhT!=yn"k08)p(%6۾bW̲*E<l^mU<-U'Qɹe|VHeȠB:_;J!Y\8{^I܀6o;^KR Ww/H2ZDmE.*niS^2|rQG.c4bnEh6u5(Jye㶼8<H.m[c/qf7+[q):(c u?9BIz%è{츗!8x.};Hnc14ۜCLSN\mչ7fḘS礝L*ξ!TQ6c!Eg/R{{[b~6G-&{o69~$*% `[A9A­+#>hHltlC|m%aZ 'T'$,HlfR}YLr,"&wJFO|fQ~\S|$˙$ ]h*TGK762T|/Qqgc(6SCە6쌯DMNtEhw5]H&f cx -\ЗMf<{_F` \Z[KOld&X+e ?BV*i#s~ a-$alRtylETxEʑ;GքuhKz 06 I!1YI&`"֌Eqzw\Dߙ|uN0+y}f4br\Ⱦe!$*۪a|dW5:.jB#\H*vyc՗Za=K_r@fèNzԜm,9毰Vi|=S%BY &W=j?lBcD* V{udo&}j? KRAV!~KtyxTJ,7RhPQL|r|qsOg΄͈8'`Fs+Pu_FHt(6OUX0=83ӓɯ[vR/C1aȔ֜nݫQKJ 5B_ 6陹R&BÕV_M`)Qck*by%woNET,k):L2CҎL=!)WP)o%qw x@۞&:g"FFRv_fРΦ O4~EZL#+0 |KGxoXrIqR 9O +K,Օ|~bݽOn((3ݢ] 7o:+7cAQqtcVxG5Nۤ=Ps䦈\`>%}uv#:aWǷ5Wm9s"jBJ7Hb|$-K҈Qtړˁ.O I,MZ'Z e)i݂>iF0s E4ln}jvgƽPLeo(C]{*^;f,gLi"@\7LF *1|Y<3t;N'mQ8τDžʗՂe`:Zۈ0 i+:խzh1&QVD7BΗ._п\MR|q &7E1(=!Ϭ;#E}vMhK x!)Ո:Pcje.NL2:lT2L9d^3hiSBML&}N#Ѻkts£:9Hsӿt G=2Oގ,ͬ}R5xz55*/c&;{Q=j}T`휥<] Q 9,^L]/d3APp7U|ݝ4cau;J DPFM lk LJK=Q\]Lc#5 U& wR^vj9Umz l?I# W8 :D@Э`)w%1H6= /eDlz F 7ڒJq6;֛ |$ !bLH;#X`hpqމLJʢwx&t%eiMToܭ`4R*.@KhT-2l֦ð'Ì`홑Y4w:5q@Jc` 4*TP 7|vQ jPV^.AhTGƎK#j(Ybނr3ZCRh.U+K}g5?J[,ݏ%_M&:jMp7ugr}07u2A q Q-d #[:~9Z (zw[1 "zU֪.l{A#ayu>PJɟ+e4S_v%|W?ULrrퟗ01TbmW.+H!? t+CM`/ ^xБ;39CO[tLoR4g i9 $ ^^ 7<\{ cE63zʟkauKaYdng0lD8M@ScUj7),X*~d2 2̣9@}ASeYpFS"At7vkp*\"rqy:Xq F'z-G>i:dv"T s:cu}_s.ԏC}rC(Y%p L7[m_z*7DDA;rG(0$^15zXJL*>5w F !٣h~Ҩ*1t|sjȡd|:)C}v}Ildhxx~)801ŞT>4ͦՌKY1g~WPmBR-8LB[=P⫤|ZDQbvږI?՘ٛ&.{Ϝ\ķ 5g0撻A?ƁD#?ؗA x5]Xۼd ĿPR:^bqSٯ'_!{y؁1C?Wϫ)Wy'6fHaԕ1.0+*"TF i൝Ư9̤@m_~nv`l':߼N9'¬w(fvE S$(#̶ٙeu=hl\0JGgOK^U䯆̟]QQ~Olwiu4ut08J.4h[wR*odY۟̅\쬁,@HB)zM%ynd 9uuC?O cY3 =XOf:Kih_xǀXtS?)}MF1xqqѮL|ϑj{o+콋j/1OKfhIڈxqW@ 7RwK[.w  KO%o_KKGT+A!W#:DT+%lbõO jWa}U%㨓 l} |{}AD ٨L9wUZ lQ {5B@$Q! w/:l (s4Il= Seŀ iw@(ܙAxŔpMM~M1-gׂl?X瘸1A-W/l޶'#[?!yqPJbmbpY]Y!+f: M;.(,),y[):k={oԯj9rfgqobZܦm">%I QOB+&} bA@{fcf@~HN";A$V}@ɟȰAɘ1P:} -8 Iw`lZ,<}DZh)h+6Ҥ0P<$+P|Π`IKYQ.$}d_TyJBc^'o@ RZ (_wyt3& Y;VOg$ 06 "fs>kdI IV7 Oht z/}mt 'ZsS2tjd|a<^,QDuUڸ[<)-]3S޼2[g|03B2MչoŚPG`]?H;*vSCr%aIc$]Mg)ƣ=QnBne4@-0FJ 8mS,}>F/ 9cd=Z/3EHm3q"Dqe0 :25;H)9U}ژTؼ[ʟ CuYԧoq$[s]n4;+o_Wpa5*P]&2|F$Y#t@Д{jjl5 >aLU V97QQ AĽX&T-&y^wD 93×O7IP7l552XWj}N"bƶZkxkE$s/ C| _':/+Oԭi͉TbP:[UcU4{CzM9=(.i8shD3U3]0\F39#$dSթ|1ȽEy[{GwDH<>Y/]$ʟMi.`od}&CnH3Q(L6~N}T $%ߤ|(׋oi}(V&Ρ^iY*wA4/+@ćUz0h$pF$F9p"uPktbq);vZH5$zum ':E$8]vfb">g .oHY/v7WL{e.Up`cj':pZoFL d{xV"crMD/ ]Րa Ҹ1<<-"Ͷ=E] ̏lчݜ ϊBy+7VqʕCw>[EW2-+K}VIxϺ-fL클W"TGVɂ?OM~HWVXQZۗY̗I~>$T7M'/H(CBp@l: (EB$Xz;.˒fˏƟ}K_t8HrNJVگۥd]•$usF2fa&4@M7M6>٫_0,K\ٱ])Nrv`Y =O>e ZTHtxz> ~R /Kk#ogAͿ53t_47H5wz;Iuݐ2HU'J܊3>7(j 9((yv60 6E=01n ~JO\qRYgN]&:ohrg_ }{$jz!|lV6}*:3oV߿+I`0 AҵROw"1Pڞx`S Zi<] h:=!}.- I/C0>TYdIk$B֋bXptUhck]xpKXLhE_~ h 54U%] ngp)Hȍ7>?#!>TQ6_.U2pc>8ˣAxg*T:)$=بnG}~ŏ*,]ZB<繳W)~GQ\Gb +2f+3;- '3UG\95z*GFt`L#En j?j5=»習tơa&{+Uuk@$SHxd3eo/(az}u`-pWbIo;p13R> AW b5XyABW eA*~RY.X;8㨣$X>辭hR><P+[t3 9n/ܜxS0?kg> ŗ eU vl禃_$-ܶsќ\;CA}/鈝vıDhu\_%|߳y+GW)7l N"p#R}m:*{tĕӹY{*a%"B󎈐fF ώ'_&^5lwM0: C>-F7b6IN+3cpE4 dcUƉFfikӮW(gjLeVC\&EB^_Ǩh4%uu⤩Dy'm.?8P!@,h}lOA}P,X3jh]ؕ7#LH9N=Aj/*'DTN᝺r7Lق  ]e~+$emPfxsR i0cZW2>r'5rlp̸\[X-,֚4hB̭ʑL['vIx4񯩁~8^FƮ9B6 a$i\ur^Ww@ ,V9.Wx:-uisS Y#%7Y|DR$ᅦB}8m)1IESE zat\EMSLFQ4,v.;^ Ndviɉ!DNrdQ%B1|JՙI̍X 4 ؓUg4ƈV Sa&A:8ifQ9ATfG4 aMI-eQⷹ(A[_F0w5=^b[wkEɀ;[H,@v_ʃm i_eP`}4F%F5ȾBf#^ _Ah{G*v-0 H;b994bD:S 򝥑q7YY? ¡t^l7h ԑRk}lLkvˋYUNz&SrcjZO)L0+@)'7po 'XsISڵݜPKvPN,.ndٵ2wT GІ^jKs[ͣSbqY2_E"a9˷Ǔ8;rȈ36pԃD2,B,f]z(2rI''=^Z&u)109x#^4_rR3$~8 <2-@ St+*Q*.F:{x9sný5 -#0*,J/$]X?uQCA=7LPu[W 'MgFdBT8cEo ɋ)h-()$n-" #@Yl;-(.% ^w`~cB/<@-NK/,fqzE!ڐg@u5ݺ%|RQZ62Ϝ JC:ƸHGsT @Y`T 8=zGskEKn i~Uv| ۴۝{*Ǟ_A~cɣ i!a-7Ww⾼ ڤyO0ɸtJ/V^jQوYĸ!* M춲dEE(HQ)uҠ;A@ J/*blYZyy|Eκzq:UnS Yh\TD3 m ! g7as֎e(E# \,rd3|ıXk"a‹^EHS ~@X6atӸu<;ET[w, ט4.A*q*XW7,ݢ+i Fb4[{GB=y ]t88Flf@Z(]振cA+J .}ⰼł.(7nef}H)Iyğh07` PsYGX1h E&iJ4a/uW!{@#Eb(1sY XLFXtR^|÷}d0^(NYAx7msISeN*࣋DT {C H}yݩ+Rwyڛ1L o"|Fp)Mm'Nrg(&ӺV'f?|BgL{|%m0h=ͶǹXP, 5X\|a߈c^97ۼE֢;o)vAT̉Y,yzgbz\p-r%WѤ_* Q2#ɟctq"ǯN=ό$%h9gF!]qip8#`=žYNijA_Cu~!h8"Vʗ6!x IyĔX/HF>s:.j!aCvҶR`nE7dc(s5SZ()Fy=p'Mq֟Ӓ)Eغ<timIDāGdy| %NB ^cdi)0M3+ }spJ ^sk" ! ~C\pKHU+bNE;l-\@ <"=(/R>Hnc:uzV;ֶ ,MBpUzgFqX~N9e8;^bl=v~<|g!i3ϭZCkI<~!=U,KvT=JPH[0E=?F?Thy$Vg"o|, N` /ț?7IOFab:c`k/yC&dEK#%Y:AnP8\UL=`~ !ֵ.G+5ujFEԺpHqзoMzEPZ1 ]"+#àUAlՈW# !=Y& ?XӖod$'j)](3] wu4FOlu |~ ';P'0J:pjڊ7>B):!~6*9& RWCBüٝlJ/U򳶛XL{>Ϝ4^MxBf\ܫB<_ɃG Dnvfdl$m)H@zٿsXfH=`"䧗:D>*5<v.lY+[gȁ$쪥 YCSlNP'NXH/_@X]]K[Z-?RP[54 F=AƬ1Iz b%әD  6QIE1^ゾ H51[[ďDy0V餝p2^Gqq5NR4:)/5by*ڏ _t;6NBFp韶FpOymI6N}tFc01 ZP.ƳށAc{V±Kskܐ2-mǒ<[.)$F&ӟ H &\k(J;6| ~i,S.[\s޵tը{P+a )bΓ"c A~|/T5Yh2爐ݫ p Ԗ^l/+|XNFDL?OTjᎮ)w9~5~E.K%1Fn4XPɟsl{ ui3hayPWd<JMEFzMIB|dEloͩ=Gvm ڔhAsz+q&dÛNS5zwϻu,Z ΤyrxNÑvDC1$҆~)7j{/l⯃z\t zx C{yݏ}'.)ݒr'J;f,Cm$^bE‘3 *W"J. (!uf,~vMZ8ti"YzHbhY۩ h9G:ñl<5&ܻx@S3VG_"HxiR]u8Z[~vroi[iT[CI$+|^ mP[)aVYm/]ǶOW͞(TY>M%֦˕@҈ &wiYvd=p:Io}`zd}ߜ%Nacy<~?Y30ȔݏfIՠ3ƅ]-(Ju56%źݙ)~^J] CBNw4M>Q3b>8 2^Sk|P(Р&2M_$j~mScnhKu|^&7Ca?OC*jj^lgb:I4NM8;}ω} #)O7zCW2TV9 y(t8|;DOvQ*=Fu,Z6ߖ@L/lw'+ZEO'?py1ekqU0azeI9\L5~v:8_fgp#D ՚jfFŵRj$N9!,}P#<]V!w,$b׉)KAۣW>Vv)tN : 7~z3Q-+ k=/NqQRRkaMzqJM Ɋ/_f=+Y䉎W&`&=,U\5v3L}x?IseݮvzQ茌q2,m$!SV_ޢ | Z#s66&qaNjiF3woÏ,cLhc?x=;gq3Np.~hwu^F <` ζ78߭ᶘD Txět. K[D(K.kis:bΤF1EU骔QHU#mZGv?7TD0K#JDr"n_HRo/ʳחyv>%?xI_8)O{rkxjm04'iTvOn?IW qRzFEf tQrgQocD?nP@%NTKiiU %IdLxpߑ gsMT![sO{5S{Z^bPq_9cY;Z t]0/hG}*&-ͺ~~W; nFD8z+ 'o9`\юp}oDGN;zxFE +pG?3,g‰W_Zv'Qط:|X_(,0} ¸?\r$E ^ EvzLwR[%y^F+Vo:|+V7y1fU?,Cܳ2n0y=B^8[fmQ= 0018l=![Rd{J5`o8 u j9!ԸO}h3W.C &r0j=9 bOQ6f?װƏ o l< 3w;rmt<ѓ$]֙CD_BǮnۼ)k I$KJ://R< Fi{ue68 T41iZ8(\/Hh1?|+SCe`"~\k{1j!;}.`׎q@6lnD(Wyv2U0 8Z/oBkMS f3L׺X-d=}̾-_?P&b$UBHjPΗ{50Iر¤?yJ-1|&F0a*3GPm<ѓۨ@;-C溶sNs}jXZNnh'G|;?z zquz ;-zX;>|_bw=4i\Y`;҇S1I3yk2 a*{a8f#7今#5 mIvbU?ΰۑk\h*(Ye0_T+dV2E"n49Q^L|sBlApB&Za?(chG d kXZǛƃyY1v '3TEVitc+(UkLǐ tsSapĽ|8kr4wR^~R bwh +GqٖjIƂ!E?)39+r,*Vig^TI+ֲIH!E~?L^S y;!HVOhP!1j _PޥYJrE tX1GЃOjax!Dy|; ji+47%&yk;a|Sez9$R2'҇q(=.~ cW63T} m?!ZIkMUB_ |ϣ#4G>Ʊ32ޮ#ҳYP֒\fe"33k;NX S @ Pـ#:lJׅ GoqMtBi=P5W1(|[~R~TRŬT?M9=DPUˀ\sR*~kWl-'LUa& (og$qr'B{n&OɞbXܝpT"*2Y]ijABcGҡ󙽩~-D7F Eb@)9gԯqvo%"0nQo]O,~isS]e0eTEJhͶeIU.4Vhd}H`%;P@i)D74簴^kU;-^oۜhq&W^uKBJ>*%,h-o4Prp1{BOn{ٜSrfn0[{$1sOFkA K?YV]wh"S p(ʖDS$ļzv{ڮeؚ>SB7W~%tYU.r!Gzx1Fcvy!ak-|an9^Xv֜M8D)6bMk'o*d'm8 \R9~vH J)pw;!]ZWoܙ[k.}4wA8CG.MS6E8郎Gz:W\#9BA6U{Tp)ra7*^ ga4+i1ddXEv+$SCI:ެ)Y7:z8ӟ& P}b:8)q1/,v=PR*(61< Q`AƲ@U^ ̰e,q~ ӹI$@"OX|ԣx&)X |jWĂF}斲/ߦ#s_lzGw7LxAp.]2]8%;xt51J:zH~ԋ:9CC+~k;@S}Wܕm 8XbPn+Jg܋,irZ˦,?z>öm}iy9"Z '#N:ܶ/gLڌL@,pax :fCh唑ÿoyM-":.Ii~-0)ݵx[T̵#O)3ڛ8jۡ2 e]NR,!$'SnGKCnLgt ӉSV'clmٹfs?DJ2(r/0#w= UB߀W)%ۙix)xa[-8V#-` jEP{畇ϯ,Kp U\/ÇLT#j'S]qZQ9!PCBjtbj?/V(' # ʾADr))2!VuI[[ilYIKf-;4=^rBK [LoVFhUv!p0dgw0GYuqQIN \|(֓:yb[->uߵ>d>I|ZK㪫v6lښ<f2jdiD _@`ț^ 1,au=^'m;p_iSǦbRQdݿ;#w1:E RdqPdOv:* _C<ʜ5(m[/XuzK߹%[,~JՒJϳ^;=qZ}ٳ[$%҃ݕ!jXx4nXp@TtrjiJ0Qjo؊8(m(9# ixy z'Qأ抹|CDgL#ƓLl-$#nj{LCB‹MT\JؘvCZ7HYz+ZyVh!s7<3,Юi`b I3S%9֋ېh#+4zdaL.2 B@%P`p{XĢ3"6Hc5<#wN `vY:bW4QFR+2C?=OD5gԂ) Ά|5St>GN5$a-hpv~w|f\//6+Dy.Q&4,fnf`-oZ-uYLc)I ल*m ȚUӡ0{{֞ t("V%KҌygJԴC6.? e0.2K RQu$wq WK~Iτx_Z&hW6]+#<]u=kM\v7]ȣg%=c+5X9ZO oұž/n wI_p%86Tݪ<zSBDHI{PhMLl@ Оf>-vd sZG(^SozQQeaX$挎9"gk :G qB / +!ѝ7P}%mڙ mȮ4_h];څHZc myaCa҄=o_qtŧZƒ cxgPthH󆴃u*sڧ}C yڻ1̊Ikd>10mYS:4̫ ll_rVr/HCIO>AcGkx.N=kO9&yI^," lGDk<e~u ]⡡)J$`lj3f_`i3B ,: *5EA$)NPz}ЙFXMɯѨ >>Pk KRҖCV}s.7Ugq!:t* Z K8yP8oPtBXk5G2jg{ \WHlRkKQ(`ExAvLd"qIS?Jm|xsu.[:"Yu{=YýŽy5ؠ B? ƽ.{WN:}Z[ʬ)wҗL/f6[褐Y/9CBzysH\B@34=,dkZ)D(mC%\)J *]Hl&"h^W5rPTq$a3'9lF]k`2hRayA);D[eq< @5c=0 _<׽p ѨS3Ϯ bú[CĻ@\bjb3ahhA~ O8ud @ LV@:HHjK0Na%MV1K_N\tݮ{D+_hN Kndb{~’!S6M-KJAGHcLmAjg?AwGeߙ`pъXˍX`nȿ^8VlV9@v*O# ]W+;x,6w G(ԭ_+egI!4DGV _>p{ع=0mu^Ex4#0IbFS lTڻ8"Aig5Y-sγ۟3iCb=| xNTK܅G2C0;6 EXZzH'\ujZk¬}E8cۿReEX=$'|;.⶜l!`ĒͿWͯ/a4\ڎ\{΄S2^w^ZmɼiF <m kg+ʋjKi<5peZYD*XDпקN]zZ|J׏,=88S W(p v # n +^ =DYS4KpB¬O?4 0soZ>†r$.:8"{h\IΘNx>/)'PD/4k_;Ø2L>C%Hna+n=¤(Z>;i_Q鼨iZdde0i5ܖiez2m\KE"(3]auSK}bC~E/̮YA7 frF+FLEpUq NfYhESY9BJq(FBge'SZ <5Z$'6 \p& O$?jOS+hau-V,V^ !a^yH:j wc`HQ! FX yZKoZLe@#gV1 QB&g ye_Bi߬)2P俺ٌ6j"!֭Sd #eЋԺh1TbKVoҳny `M;(x1];jBɾwJKUiՅy7p/.24mF& S:օtjLЖ,aS07h~9#쭪Xm Pë9%C_V֥GfV4IEo&N~OO[MyC2;Tie'&Soa"T7вj킵+Ǎ<]%pzFL!0JV6΅۩"a7&[Ƶ&ápBD;K=e>&| è%j@8Vwќ/9a{{K5#a!i)Sy:{j0HtezD0o1ȑ8킟TY%tLi=4^qA5Fvw&+U|,.jYث9bX ^%,/LKޙ0Oc%_fX۰6&\a0',rRR\tqƾȉ!3_2^]9ԋ)2O_ao֠*B^iWAtZ5FcpfȜ{yb84V/[[wf3 g@+Q>MAR(\*m!7$Y sWXU/<n%DiI[ B9u>A]اa/hFwx0v//<2!${V. `K" Y(_'x ѧ߶rЂƚ̉тdLwGDڳZ4ѭDέ]rs_MȻ[RcedawcƧ80KC "^ПoHf\V2Ǖi0*%+)V:t빏MoxEGr͒\̭*V&(+4xP jQ ^X ^xY_pĥH[C@/b @ |jB5E(Jt6e"E~D+T5*>ٟ[߉s¿G{ӕC+W~L'ߥdc+֡&uELZWq!u! lk4g }Wgt.FT7VKrlGľded'wR;"beA{$H<(!ES:< ga-_73'hːJYRN"Y:;Ϲ_' 9@6=6,4QӦBݵh^eRSй'[R2 Js3 v`̱`~5 pY16phEZS"jѸrr>gD}Y%#~wÛoHjjs܂Z}.E[p5f)b rcl9џg:yGar#  &Wg/ 0X>HVGD vh:)t_4=oDтKɀ*A6>f/;,+{I܏svG,[.?x_X/,rkgGyυ!: }T򈹆a~D'p6u']B ?EB D wxkPdg~@E X<hM qprRahADOSD&=U4a rcl. 9P.>+c[dp i;{zX|1&&Xl->SߩF  =' JcZP-5&<@vU% &ҷdz.{sڤ?4a-/j PM~iC/a"1x;aj u$q}۳4@Ҵ:;O̕ZI r~X1So>P͊Fqz^_7z_SZ@])g NcbsZ_;K91|\v=pS>+Q6N366V U.EJh&3|xXٖN k -la:.ow~v? i;7J6%ڃ z~J+40K!~ T(ɦH(0I( ˫nh_rS;+bacBhmWxw&"yx.KJɺˁ/[+7CYY"Yj0he^oן8DW(%UVE_%|M _-!l"/G-ۓ(ڇL*32|5-Ē 'i.^vYѪPwyO_KЕ*`,G\j`<҅}ʭuqw/@#?vRl RC`Bڂe{aQ_0RD/Nf-P]*e6ߖ9Zy[-Sjѣ[B0zvq_\6G0PL ۩w@)fVܑxj{D#uhm(o==>!PئS% Cne,rI-o+8Np>=>t}nUE'/<+v ą"o7*֒)gF PsҋюW --[Ӂ@T&IJe[|!NM#&W%amOޅo~_))en݆^uXv>ںD` rsULF StVٹ<) F)C,q ]F,7iW2/؎JJ*C7\?&x UxV&d|uww0g^K_GVAmujV|K2?0F,X۳WGV>;yI8 VڄOhA >QS"\slF˓,cݶt^!˷鉍9$'j`G=dÑQqe$jض*0H3T>@aPȜBp7F'!.6WL!k9T0@=p}hcJ|te6YUρ{tkW$t9 f#xSH=9@e쵍։7*)A1QY' H^2q<7#^W_.XXњؠY0^mrR ,QBͥl{H>{ρU+Q77މ´;L'n*WW $(}$,@xQf`ec}t2 zfXnsaRp,'F[ſc I+rv}[b۠܃3Éf.׫rbP9^){@@7]Juj':W K_C pāΦnG/Mɱpes6C$ވ ,jL|$O^:! ~4+*] fLz -Yt;GzNyu+Bdd0`}]z05!˹O Z)Ma5E 18[qvnnOhf ]W1$=iw_x1nvNlmI@( vU n/A,[K%jvAa6^r(p[6F5_@ݍ1ژ,%B_/VPQr+vyFt3fN|R]hkйY+ ʫADuw.ٔU pvTO^YHp>•,tO,jwVLgh9 YҥAx1w}:4o̸"^ }E)Sc _gh4+ڑS~lC32  amPME-zze:'hY{nOK{| j Km#Qc}qF? @`vrEXߔ援]&DYԄ@ WUHQ$2XIGQo%y~b"_5M t)@GNbM-t@UnTW,f2JAd=o"ٝ2ѐ7k ul6z13JF<$-7#1u.m*NX殿yIݧŝ|809/JBEqbzISuH_U$2ff+8<[3.KMOUK˜sY.*@H4hj{~-?]E>Brob&vH披n)W~ڐhJ=m4L TʵR>0jc뒲=g#Hs:5ԘH)3휼{h1mƻpFH>4׌Occv̯W z0`  ܤ$At2aCS|:ګղ"At+f~)(tsC*?L߂DNKߥO- &0qi! \RCq*kH5CC>Wyzf(y1/rB9ݳNh1B8j]たӄ4`Pӆ{ ((uvW<Yu]۵*CsArz*nm& lc Jqgd4]ݞ9k!)q\{ؾ2`gx aEQiuI†I(%/ǑMS{pX7T?XFUXiZs5@PЅ_ˇ!JR|f9.`ޣjL%G 8d&U5/< opЦ!`/'O d"^ug3ĐM]".űV}-|TF1 ^5Q$4L®qut*mFzQFS^N2Tf*LK⎅挷$;jO$RzHï^SQ.R{]D]C' Wro'%ԈԘ;P/HNQIfo{C+NCO*FmҫlmTm:#a%^gCᘕN6K`I#%8lfEBEcO8'׸Q,V_yw ʚNI#-uA U$‰i\0D׵V,V7mKG;J':Fi~_mTlDknXo#Op-"2:e\f4̡"zC;W3Ƅy!f)xbF\p2ύ`x'-7kqyw׭ /}PUurw}σꊰo}tgsedž" HR#m#[]O#.m;.̈́-w %MӖEY1"02qG| c -mk-%Og02둏0oWѶjbBI͞9m@mwޢ|2'10v!OђM.b?J4M7n|E$C{Q-rezP룰Qy5 .ޕchr"\B"Z {!ݚI/ [V0{ENFW5pi rPʪ)+@\4BF>cI LcmZXʿ SL#ɝ@d2K4pj˗& !'\ՊجԲDǺ_d8L&v6\ )dq QVT82O@*lڻ8@b9+efzy#ƸìB,–mW{-u;UTҋ*i]}Lᡱ]ɗ jx| lZ=5ʚfN>=U+G*/.i M@l2wM 5^$ .9rv|D: r<\aƷ@ntũ|ǚKӕ‘r~z~gZ_~+ $Fז}~?X74)a/&"ݧcoА%?r6fB}nxS*{9{6a#FY_vE֊uoc7}gvbKo0CUO(񻝙3?F@*Nk5+"aHrORڵmHvuYUOr(DC2X#۩ּB30{ 5xoKX|-">p*)^_DN7(3a˨ހeӹ7ZJ]gΏAU^:hvdݣhG{Y鞠T"8/o~Gw:5-i&}1tK\`1ղ W{-:q<}lwҚ 7I*ON}HƗ=;-0Ɛ5)2뜌]7\0p=y:hb{vS'iC*% ;-By1ǜBE &쪵ZbSگKV.\T^>gYN(8ADÑTfH Y3% R7(bg :wd)^yc0#rU@ʨ绎v[$Ռק[^Kߦ G&:6bIDW %:h< &hgцXKR:ko]S lf옷A=Eŝ!sB|EXG(cH%޳!}x$4wW ȻɻaK?Q gKyBS/h,3$&W: iܞxc@tȔBMQZ;dgB:¸\h+pz X}ڑ!a9-u%oĚ^=\gUۉ )R 204J 1QȈڿrNv}<HN :1wUy2,r^舂+1mWZs@+XV{5i(߀M}ɸW24Os7jlϸfgm퉴Sug}-1R%$) ΰ`'vrȷfa%q=3nx;CJc]? ^< %(c Ja~WFnŪ&RWP,=ɀޱ7+EjoY8\s^WLz/lRS-7jPPwgqil|'Vn-)<$)鄆>YT"Nz'yb:fp5V|OJpDm5IR>| 2r[+QќhE SunT7dhDh3Q_@ӔrO򭫻"NѴ%\ {Ta5ͽ%arh?>L'x0f(k-5=D7p#6xhAʆn4m)[@_8("ԛ%IWGC\A]FfjүtUJx] {>fbMHMeɳ @ݢvNRVn=O aQqsQYnoZz[_ɃCa!JiF&kP+^{ئ^OEt^م XW]dRtxۊ]Nrzck&[*iPz04ߝ}?#Ncĸiܭ.0F;AQ'i>^߅ܢvx {:E&7I_+㌄n@|n*gi]-W12)H2)baDz-!GV/cMaƁЖȡ eay(ڡ@c g&%,Ol8/ѩh_&-ĐiR9#`7 h :-WIq`(Lk,~2—ESTٰ dXXbU#\dxCx Ph>Л ρc^HZ05uܘv1cYPh0# iGp+*KU @s(]w$7B3OT Ӭ,d)7 xY.O(( *j+{EL uhݙh!GγC4ņJ$3TA1Đtc SRBn MOHZtS)XJ"ǕAgx7Ud-{g^鈽Fr_ E^g5x+\J \d1%: $#\a^D8Vū?Qz.9KdHp&[>dJ]?2㓉#I8Oi#J{1߰pP[,هof`n %KCfWDJ!l7&1 Znd>RptXB1@/۽GȌ9>h2"ɻby<_"ۭ._`!0pOAR"oO| S +jlmL@Egz4|vU4U=[ 絃Ii7&oU4$oF.8%(p>aN eMҡ+[ЎW t<%>sZPaq'13&^Z_~.f-@oߺs} rܠė]àO%i9$`~`qI44j{2}"|0Nh?i^}/EQPN`ˊϸ%9oYI5 ^rImƸaCDz]KG7. Q-+<)-2pԄC>}61$7n"+ZL=4" т;?(XvrFrF:j`V],i|Xmi7SN'Uŀ9e' 6 NC@2[g>~h@G>of5CܗbqȺ%Ea_r4(8Ԭ)b279!58sv| &.7.I$t+dPJ'ogqa^ sN @ʉڗ$cK=NW nb ͟/c(-d \zo89T-lћo"Uۋ貁aAwUWwp/G_3^,VۃJ{mz;E96u(N@iœk4OjRgJ].XZ'Re|۪{|bpK )Ig8Co#~3G+5_cs(âb^`bb-QH4&ol U$>O,=O95.qLhV X^ofp8 K*z*9 XHVRAwN7<ۓ餁np+GErfcn"EI13@3vZ#˨:֭{RGe>%HƇU:5T?y<" ݝh:aZ|z FLoy)<ë_4ƀky뿲 w7%9W&äBzߖ#v8B,RK`_I"g_6ca YXf[? &w')R6 ydGzC l^~ eO}dn_x!6 WAhiAn3;4*C'ľ:\㏮e+?:QBU]vG$9/ַfZYs6J؛W04w1 J[!в7 4&]Nw3 Iv&@Q%Q=gTB5:7 5ީ5͛+kܴ5i\ǧ.LifG4?{]H䇕^䓿9O!6V2 ,%';6(O?2iK#ƪTY XӛJ/yQ2s~+>h /ߝdcjVK?7V?n–g$ {;eLE.q9^ }oS͟آ?1wr+R SSj8)m:?ܸdßP'Zzx_ 3A׈xLwUV'7Fc AХx#J`λ!^`6ёA. 'x9Fx7r/?[̴wLOɨ)X\oCTMJ4LGO/'v'$uPu?"gF15OAyؘz塐 A|ܥW;M|R){ni*Oƣ˧ d_&ax[U6N $ɄDmWqz~LT hliˋV&3|ovTxU>3&xP+{CK2VmtxD$,0ib zֳ=ih"=s8Dcgcʖ3 9+uݘ2ZM˟C3]l q)Bqe*IH,鏉 \0#Pc[VT,OfJ2K-#/iXHutsBu\:. Sal:AZ#';?xp}Y\?hHiZZg=6U2J*Qk@ L6x|B# ue) bƵz>P-O@tSxm0!_Lo d=XEH黸/ ' Pf=LF%03)o Lr;`ZNg' +̨gJw'.v"jj\'KUX ``1#g< *&]{[f7G]coh35́sWkU w{mtP.zHuPga I sjw'0[1cZm#Sef4&I>n+2H rEۀG⫔ i q)寘*I=?=|MW(gAn>SX@չe;*Y{8(,ڪ0|y.i1=⥂*=BUIaC>=˄ˣ[Gr /8K=L>디^8L @!%zY ZAg?QW–J!>n_n=\&uyJmpY^n p+ |$*L~3U-N3B3pccP=  ^tБvem[߄NaiM6Os{ß]^[`_֑~c$ {[90d2h䐓#*bDA9pxNH%|1bVmK6s1M<]Jg9>(Co'!A>g QMj3e \wGd/knNҕɣ6ފ\ցeo8cAX:"At[^ ^!-҈~M@B c}fZ}t+Iq`,/yϙ˽ ,lOZ6DԆrʶP{j*a"2C R!;X@AkxL?% EV 3zȶЊ#*e9PkV;1>L{r7衕טvl^Q6/(qGiAdߔWPɅT&'ҴQj׫ƠTfVwwVڥi]Y2QgMa֟OPZ-( (kr@1fߍGt~V>(A3vꅽI7{]*?WIx/ǚZ~0Gb|[TJay~?4HmfC0)R Jۉѕv~Hi\m1B V>aAdBv)+9 Ocs_FFPEA{|?C.1(k y|G@#=;M]:9dK)tA 0j diƉ+PY'H B#ZZ}~"&@trM"6=&.np]~rHs6pQVmPwXgSO^$ tRyWz"}C ~9okPkW_{fq(qڳk`{[xJEeŋhi\A?:!-hGn.W,b 0%켐9H%TS:7pc'ݻߗ 4hyfhłξuQzYG&˱,0(Z3dMVN;Sefe۶7v 82]|^ @WH"XE% s\*ku-rH+VW ._h6@4/|KP#R0{{ysT*6bx0!_^b>G3Pv])7)fw-{aÞ4=25y0$j_8ֻ IRξw;.k87& >/#3^ڼFxfU]M 83\wIǨ9^^^0dJ sYqF\nե*kPܷBǯˈ+E 2٭udmt sJQJ t"#;^42%6Ai-'"Ҳ@+Y [k}j#@r~zTDB9;թ2 e!՗ +pI~ɘziGշ.ƍ,/OA-[v0ЄNnO:fjAad1od921i`0voЮG@1FCO j3Ed뎡Zx㻜"u;,2(a6fDD 9;R%I_5 >X`i``*³z܊*%;k)(NLN+ظ<>{aBKǒ%X[DW]l7kS6VB]9IMEdힰ΀D=>.l$kE.{8X\)")%#- JBE%tX5F!WsE?ArZy&@!tv)͑\9NiвIeG^IlYt$ `36^h #sl-Z,߂ܨ62R |x|[DzgaUyksl4!n6WNNb[D%zRpb!@md̑`yЀs]785;ECd\a=F>LFSW՝Vݦ<"$z. )ܚYg :e\IIx1dzy,Z`#!znyrR~ ؘ6v=wHt\g=Ykk%{ANpʙ؈`J 5&{O70Wl"֍'j]U/CvN.]ōE`a 1KJ-`q>æQ`HM<[Hꕳ':Fv ;A9t{ CX~aO=TF^n5ѳ8c<ڭ+z0Q7>zn͵!ρuS%3AA;?gĉšp ZPxPd Oݟ#pGJJkϷXOSξ!G)\R/׍'1k XA8i|6D0ۣ{Ԝ˩ OB[14tl[tJŃtQ)ܼPYT:6@&!xͼjat_ 8rіX8)rnS(Qdz[#36CS%2o Fĵ*I/G:}O'oEZ2B-V36+u0OЀghěnzܙNW`-ir#Ak?5̾Ci3Q)~;GKTr(Nqתd9-ZIdD$B wGğ :<_9}c`e|*Δo`|T.[7x7J]B*4U.|]|v)s²ښ&F4!p4뮘 t>#-{ N^6c2#pTZj0+ D%7Ѿx Wz˗d6E<`sl-" }E,c2w7173Q]/lY[x /ajw}ԁ_.G$#w)6E@rނrjz$XD8fCX_l҂~]/W֞{ٶRXZDvѪ]+R&. ,WM` u@E%s!J)բG9BXYWSrح\lT~-xw_PaaNK`:D9$sE4z$O+%y#ƆmQugw5dR`SOH1WnVxS?z2*Ok'a[>+zNaw)?!<5m;8NqP6ˑ ;Z^vD t߭_]N74Km b%]0"a?%W@Q>{<MORPD +sȏ)T Bsy>Q&0p C BDL=+S4dIlZ}Š8mh7^=pP.D A. /f iƯ?Sq$jJcހ *6{k`;c 8D&WDy P=rH` :c@~yCVoo"NmBL8zls p4uX)c[y[:Ԟ'VgeD~-Qr̽fgzb2t7  \YP@>RĪS V KVQVC=y憵c`G',@U.t]ǝ!K%ophN5 36m2AJltOSpV R c; {-sNpTܐh9j[rǵoAUߘ;DZ?[R8.HXKVVB(ݖ>轤LnӟLԬaoLE{ 0m}Z4ɍ#B b'0.-Y@>uN3#Zii b~{Z)#N/YWk $Q3td+Qp/Kx4v3%ޚiR< .>H(_tTcbK7 l: v >a.{HmCgdJool5 FKAqFUdzaJ$*ZEʌX^ Xbׅ<\Phqq%.~u{2i#rN4VLQ-҄Lv(FP9U3Q"5A:m$-"L3BZ9UF?z2fÕ12q;zRj8OÝLy2u~ Rpyjii&.O :hlv99DvF1Kq_yҮ-=+>_#+Qu,[)\+$07} ~dU-k/GjM+ 02x_G@_4;$- A5a'6[GG Wi4)(B(* ބ5~9RjTgdn{PpDم0E"XfɃlQ>K!-m0/$,u>MʒPuS/i<,b"%8vY~\7,FP_dWB)_wp@L1eݠV{ O4gt۔5C5yްZ{ȬXrJ13" jEUe D(b>T߹/ UH6jI16wdj.y9O]uJ_ { r!#󂖱腑ӳ08+,)5RR5F!1eQlCÐ4 kÌmv?^)O_70xH %Q(5.xqHjhXyزthNR,Jk&2"LrG)elۻɀd bd Δ^|bl 3`ys,il[tҥ1jf?ko/wܷW92±zY[# Zr%L@\a0!-4&e)aoN_vqD3- ?I4|Z/Sy/@(񇊟[@BZV!HMkHΛ &RXGnѢQ 2t6by4?>zlή}flV_i+εQ4\ŧx{lWfY. Zn y!dGqry6h:ڊ5l)e3C 8y 'MVa8zFz uµ^` AW e- cn.,; '@q2>.i5o), +?aN>z_1=6gΈa7QsE ؅aa|*+Rv QƵ{ p\M N#s؉Ƣ^bx%Kjdek Ήtzzg8x AGdŅD TXD76;9%O*$1S:՘̓l z/#@ b']e-Qc*M ^sRHv\V tGaИ _[)= ;ʠRGA#U.;~{T6ZJzab.c`lK @0(I$VgWH="L)j{晉A 7ʏDhoE]sŝx~n-$HBk[A3?F 1>DB\6/!dF}4/* <-";oOO8c'pg.0cۅ,ðf|̦q6eJ,]j5.]z iW6@N.%py16<`uRzi?,+K@K㒉G!6Ŏ$ٚE[@Ğbtl14!uEsucf(p(_ N꜂^QL^.T\u~sבơSwc1%2?ˈ4IEmx!/S ƾ䏥hixub6y̾ Zvݥ\|nKJjVZ]1InHx L )2I;D~ËĥLxϑ (q`t4 9YTF:O BgӟJbn#M+YȜRŵ~jDm.groEXdXPO5໐ؼRm?MV{?CbPHv Hh =: kۭ9⠵'  Lx炘^{$ȕd'YMsAd6 3w98"x _̯'ԓ+EJqRWSfƄ=E 43pUk1mLrvѳc,oި8q bٕ/`J s_=nM#moj=3GwVm iBdih DTYѱs-qbW6I'r?44i,N O;>kt)4-r1⬖iNI:P7i9fi+pGw'BП2I{ɢ=R"F{%5kĚ\WE: Ez-CTr~<$ö.Tf0ok^Kws',<* K m%trP}LJP- 50r?TQN݇oi sKCNmk)ߗ#EKƍj]0m$?;&:u:dOޟ6}sEDvKJtv(?o 8 IJ+I!+)74 i>bu8{)[QwD1M%gldE@~)."e X潐4 .,YUE ~@ӯ̜ޖiOVmV+` -mh!lB1MV:374#g ;+ts3G-fRD uu/ ttt'+Ӭ+S+EJDjV] v77ݨ(:?@_١2#y91<8d,Bv,Wu_,LZ!\Q{PK`]pB'8kӔǢ +m W9}x " .۲xߦ`2y?M4o ubϴ+(RLb|BY$̸=FHњg]71*TԳvu:>@.cMSJ0*#|L iԯQ;%{ hFKaCbco͢LKWS#!G|O ю W!ߐJyny/-,`/.B`x[I42HJYk̨n0Q)mtS*'\c8bgxiӋsN7:pJ!n;5lWd-->L< %W7`F+lf .X{ 샘wjYɲW?Hjr:۠lJ UbM3wu]KU%E˝!ʮ{ښ:p?fGp;=L)]ZG -euTv_)VxïQK: ,¯I;ȱL _2%͛u6ЁVIT8jvJNAsʜlzk^5UVANG0bk|zGWYaĿU :> :Brtg [ѽ1J}v$7 "=6/?A(#Q;ɰo}f)M4NVb1Jc#R15 , lE0eR7 wlZSWuN5)-bkH%DbzH\NwJM4? i_cslܙA;;/U7t0@'Թ9Uv>d`nGM,HPQ͆= iնB{¾!=w%|u;הU)juiD{ <"Ώ|> L|v6|K x{'sqUY$dbĢ|O?rt潄Ups$ 7 A.mܕnPS%K9Z7pLF>³P_tit/0 RHTiz#e K!mb9fCfBޅWJv{_U!-y̦IJ@)+H;tLd)# [j(K qw![?'n\ӗ_T}ԷɈNP#\uB+{Gp063Ir6Iǫçߪulx(0є s5ڢdۨ}In1-DT*yO|,}@WD~/ˍ΅Z]:qͪzA"@9>9]PWx`\rZswAsae'baWU5C *ݭ-sb 4,My C]fb:!sڥg?ev5 ?Bx{r9"9` p6dhZUӤSO"g@w:88>(وWW`pyP,~ xtQ/L&BTgCy)"'@GGsG]T65&IvE)(Ư@(sMKg܎$nAy̆2wxQ+f5^BGTqo"r[ 3Ȏʠu9l%cގχJ7f0,V˃:j}2NE81tp}r>"+w*VkXQ3ȐJojT< Pԏ#zO3?b2e"48ߟ4Ƃ"L;' jmE(r[,? A*szJצxxV$T5dNj8e Y{E3?q&𻳱%-͆9ݿ@Loo۠OsW"(6\1j;a?H46ale g{'(ǯ%JzyaPq/27a!wҰ{n)ۯ@eΓUT}o*ѓA.C@~w5rhyxH-_fAz $o9p3M5} =t Ѭ8G 0@[`D|r ^dg+!# $ |VOՓQ5>Fd2ϲl/r J$J:͓TJ.8/惫""&q7׶#fwNDvwyOBD$]j}("E#B?z8%ӷ+>!_BG e^w?:rx F)2Gq<j3`l%F¶ܾKس|>i7QAVl:ı#ϝ(RlZu.&|+8&‡<oy}cҎ e?-z4ӝZco;pq\HEO"#C{ MBlXT%e6sk*ΒtuP"7VTI%/K[/%洡ls,Ge('ų _ }m|s,ۺ0x]/U-4c,`oMR5u(ݤILr ^DbP^*N8[9ĖdMomշ1^$XB4Uf58Ơb 6[f4\{%;b$XxWU؜ p O!_ujIͰlQ0PtYbݱfi5}W,%Nd 7H5&h}'ߜD*R%~›hࠅzz"kby_ѝ5ͺe#,4X^20o)H^9]wf|T֢?0d0#Xf j77+l ҡpmX=3XS!pH{%bH!>.g>Hsf#L4:9B2RCה4ˉGo1RSͭJoL]LӞ`]BFciTѐ xрs jѸSMb`) BNz>{]rW;L 7gDEr[x6n8d$m/`MylJG\F4 `Kh4GbȭZ£gW+ZL8jk9 FupH,{KXflքT[ĔmԱ6EBIhm\"4v7I)]~,<C9-a  H~Lr_4|5~>] eB+Rͫ\TY.G0C4MB\ńQbz0B@:OXP ~*q)IKbfy_uJ#Oj`l$fQNy%MUtO@#I-S΅~&+cK/n ւdE1඄ܞ` #)LOݭ[yR >(VGOZ*2E0r  !H8ўK̊<9t(1ۺMj2PM=:k [5c1r|jgKd4ߵf'Kh!1XgPn=L bCFm⧭%JwW敘`  ?}I`zBrњQeAb^D Pk*q/61orPBWOGt[<;i>(\$3:9x1fo!T?Gֿh xI:ը,&ND$cEGx[L!Y6 .S9kʘ"v*Fv2Νq༵zܡpXtgDX+zކUK~OInٺ:պ1gs VX a(2A7;'GJXe! V~xY<*n8ѢyJ[^Rd;[@"ɬfIG߽oT/( 3̘$md!zD*u j9FaHcEB1f&oAG^f_[RFz 6̬7^iczƂuŤίb~>Vou0WB6-?iXL&L'2Ϙ㎾k{Ɯ:vpWI XmCZ#C..OkSY J ;iCa9mj.:KE S?( Ӊ\}O`޵-vJsΌVKާÌ,P<胖C|xWa. G;B">K?WI^fa̬eve+xbޯzM hi#h0Etys)("H{:m h7,Lи[`&MA@0b[cmIc_ػXBO\-E1gkyOx|P14ɂ5S T0j !©! ?ݯ sa?6)#uyipCrEqVHEۑ+}reIFpb&[ cq7 ePv=2h9vUٌd[8:5@_2+eVIQ mlV0<%Ŭ/O5-V .\[S;R-,Ep[a:E 쯳(ZZdּ5ݷ:w+ϭ fBvƏ93B@CȆ!A};m+mjJ f* + Za(cMGȘ8Oq(&tdlrI/mEW.)I4(Y|E A'w]qL {RCwF,U!d߼$vOJVmxz5Ɠr!iָt_FB)\}o&[9C3qNᵭI>6uuJ/@Q;@kæ$t"`~aWx/ L@m D*9$/̅vRT3̲sšSkLK D*E5O>q]^oVpTaMp:iƹ{أTر7t]%Bǖs);x<޷IhF$,s%^ )Nŭ bmVq2u޻J=@/[-;TlCցM@iy #j#>h͢% g\L`}K'8֐I`*bwk,QA63YNikryb=tP%zR44AT],Dyrw^ z.WX2F`n2Wt$Rj|żxPYi;~Ruf|ks= 0;%x irԪ#(%+UHr]֠_ /#S1jL/A-~Df%-;VY-k#!<?`* b{_l3Ne0xVh`2QeBƐdh>ŏSJI ʺLqcC%ux\gMNMZOTvq,X}jk?s.o8v׾ >z=ސHC)\%@gLl\7ļ+Nvw?bkdMrMH;xqع*Ti W9E5]ފ[.!C?!ЍTbN@9> _`0ޞk:sNeA݌=Yl)G+}[fG{mu2xDB{ɻM[m^ uidWX єL~Eߜ_^_RxAo:0D:m )@ֲh4 [aY|x " rc?9?EE<$;)>ypf&ۚXUZW/yw|1vz﹞/ӲT6g/Us"d%䧳"8FG6OKUpK{ԋAm9aeᖜrO}{WQ,$O,6 ub -#8s9} y5מp9@,Z9j8TG UŞ̀YMWJS7M'1G ݇aIIR;_dI@N2ai jw^Τ Ip9)nQ0x<@x?aBnRM s~#[;'P}+'S?ǰ*J$FRuB TgߵPʦ.sss/U0J&!mDxԎK)3q:Ҥ@ܰ~=MNH.|#cQ\qv<-~E~VjS ,/L;"f=IM<.~*Ѧ #* {nGr ]?Y4=`ztLݽ6T3监rIoGj!6gtE`& zP0%#(qI'6iCsZhHă*4"{1A/AB;"k5A;)oY;A]xQjNsRl 1"8l9L}1(4?<. 8Sz4 yrJӢs В6"t^W͒0g&B$(` h5cmī0g[T ǚA|p-cr1(=e5Y8nxե:ɱk>]{?dveĐ[Iʦwפr%g',>G9ݢ|I"bC])EJv<&{皏Lۏ8vo +Ef|FHdHXG!Jyr٫>%&\4r)ųh{硛-2?SL<:~X{'nH瑄l&dcZʣl }0\Qԓ18k]k1 ʩP6g( xmV#y-5+` ߘX5}E_g+$'5g̓jˬokqXtϏp'[W RJņQģ<-?BA`BMn|vp/cnUi͂"\*9} 0Ks&$WW&NOb8J9TY3 qXQMetbf[j9,Uly;~[Ztl2 HZȆJ0ua]G/j:o)m Gra/ZʜW71jg3q0&O@m:ilyazd /y*}q~0@b =p93n+>h%g!~'uUPqx~ 1=rt;wLۥ%UǠ?:v>2*+nlعU 9gDZ2Ȣ[MhX( ^<'yR `;t‘PBnXu(/]hTf`I+' #X(NOQ8 N*t_j|:Of;<9j쭦Řa`Na CQ]Ac@U :>ҁ9T.EvV-yyAlnN(J?ًsgrM*|'%-hM/h9簭"T=ΓySj`ٛ .wy`g+j }P T%}`нyk xXD"S-p}yμhyqI5)YN|ߏ`\QLOKݩcyr˭ViW:$Ƨ&&Yhq Qk=e+bνKB{ |ڻU؁JJ2ZOK!S Ⱦ3!*m7r 2B__;ly5|)ucFwC?ɦthF⌆}e u ߏ,N+3pL!)KFf~H?7ۺ0xM;gqD)Jmk".VZ|K sp s1Y1,dT8aMsyضꂽDZ-D$?C/Er|*DH/bc'riz_r)l:L/ Piktq@lw๿\:j:H+6l0eR52d|VC+?䝘EN5-Ry 9 JD 1g{4kG.)^sh':S mu|\;7@-u:;ɢ{#(o10w$+;x_Ȩi@>1=FñQ e:/9"a 6aeam?\la0daĮ1r ?NLW_( +Hana? 4`@_ȘyޙQ&A}dg0DLx`>[Iɑ'< 4>Zxj#ex!F"?jӞUN&g[f $ڢ'b r<5=|-N#RlWkH,΂k^307bxv_k]$ ɴ^FGWMNj5zAWކsDP&b1qsL6 0q~:J~r1〧\| Oc>/.(d&=^3gC']@g54\jd=lWie}o ׈$nٓ %!!G߾B 4  = SǾ8 W($-t\1Llj 8]iK!_Pl JpZ)ƎChIηIkaI./N/։4q-!eLM &W qyIRbJ:=qܾyA-gtYXGNx-GqP&p ,jcͧms͑S$V+Ր xx!AopnF]CUgBD:4od;Hl9vP" XCR/Wls!eTכ ?_DtN )$5$5>6y6eDݾqJR\j"'8[k/*z?["1AyX_U0/Ԝ;G`Zl_:,ְ}6zu.fCVC0!f62g^=, $MZǂtxIf)BC _t[XUદ*]]ë"]TuуZ-̍ ]&$~c3vEs}<Y7H%DFoOi,4O[2%"iwN}a)ܜy-mxrv8 Íů3w\WvUIfu@ͫɬÚ"xEOQmbћ ;JCJZ n'u#W!M:"?QV| O39akvOd:whh?DǞaTs)0j|5K #MDW~nNi&---!;>1c_ 5w)L7Q- +Y^ŪzcvuBE D"弬=@:\xtԩ?+Un\hO.pv#vz`ov`W0$mة(Ubײ?Q~ۙwbXRl߼נ֟7Q>Oj\Ypq@bhN  8p#r7?5CHad=wd3B{- p w5UŹɞWB.F.&4B q  %~mnB`uחz-hID uM7dx|Ģ劜8!O\.uי4^pPVwsRƜ>H!?#4W$pI-'0y9[(hU!8a}ڷa"2;nTe2#L>0eHz<,vUb7>$fMVs%|QaI4{QjMR?eb~hʄKҲ*^ r-\0Qp#8*6*j$ *sIk/ >Pi00pcjƯx-è`GFV&?Po<Ρ㿳j-?M_I̛aVa`1ΗuP ~[w-qz`ڣ /oΨJ+~K3R ߊy],&8{7ޘ+o iF<="Fu{ _x_xH`?j@%(G  5O$R:mi;$hI6ʼnH?^"Ӽև*w8cc {ባyL2/:jg$ GS[THZ*fZGJh\гqPy{= kAPԝE<g&azbRuדvQ8Q Q /mtC]`b3ǏWܒ'&)&œQէ0$7nG6.=m'dtz$TND,<F{^rƁ˻lT~u Y'zj.Ž2HY5 鞼2$2M-Rt5%C%ӧ\1(2&HyYV@8t*D6ԥC`I^ 0^=cFc.غu=pxVnh"2^EPA#ؘVڗ !`O\ͤn&pa+QPqXA-mxdC5A H 瀋}j=,rZY<.tbaw{SM:AYn -h5 ì@k=@]!_aCmظgD\ls;ڠr<+*ƖRbU0(#b&; oйװ>j6RL?ih'ՙT#9\(BwuLwٰ(quqo|+-. _|)qf:Sv(ss$ m\NX%g7sޣP# ӓ`l2ьFޒ>B<: ׏j_$o @P͉5֖ `6ekH-uĜ$uW'0ba̭Գ ɛ-l:%R*XcܠE.M{++(z6ֱ=!f{0 YT+eq<UPvG1noO|zsfyCiY"B[z3 IiC1Y~!:oC[ &z/~nz˵RJ&vx(aW3}J[K~D{q^”P-ͣ'}У}V_Sr(?{9۫kӭqY \fN<OZ?xtn͚ATOw=51ąa*YvH(ݦ_*No!H¿@'+[5;RʞSA["j @2>l$ +Q ei}?טDP^#&@ɾO&y=缾>6GfOaZ*Z|6K;ztϼyc>x$1hcuӓR&F%ۍzMr镴k7ߣ(iK.W5[6EhOVG15+=/Z|*^aEƦ!aABDnŬ A _:vuq_l:ye#܍-f20-2kt:ó/YZ4lPX DAO׋([DvqH>w(^0,z #8qI-@*}q ^\OnB;!ZJAIgGA}^^Yf\ͧEN+.ݨ~0,G3Sr|+Q`Um(a1x޼#ò)G|RաZ9ݍ F(g0n5p핷jJ^x36'>oңIET1$fe!AB\:ۖ6LU(>(pkx~`hcKϧ-aH`kZ%'hU&/ w )\¶ry8J!u8#!ܮPX&V\ýhW:l V7$Zoɼ!9uWV?mTíppYCF3}+9ݔTՔ IHR_//#5*«ͣASs,P伛,Ù12y)iDhkLP8]~u (`=rȺu3lCt%ЭQDi&-)&ْ HF&iF[ /u9E!J6s}OR l_rɞ> l&% #~D yQ4EɛCtzH>UTX4<2:v_ ERE?\mfyK:,p34[IۛefU !B嵣ĵedQr,e"{ ttcvq^8H584B <'шj!ט%&n| LyZz|'-;r6ʥjR\_ᖏ2z8|4a81_ |ӆcf{]EXlAE=c0BյdGhnj`WdTQ~jR;sLw9O;yʙO [RfqMI= U/$*[OX]fM+Π߼rtx'.ͳ6 h6h ,c|RYs+"2SCF&Xq>q9rpN`*]k6}DG֑yUk>әXd4#2Ơ6pl$T|FZhtR'?jFo385uP\!~B))QdH"$s*O 2&<JJˡS-JsEPa` Dvb̅'*2VX](Yh`J 3:Q~363TjjRc9yDCMNv^O[Sqftn+uOb`9V{`D [Ϛ3˜l T29ZN)4`<>rY=Ms "|5.腣Yv&a&!^7E4W1 N<ZZ ,. ʾkSrd |aHArlԼ)k~0. ԕPV;I,@~q$zpS͙GdA$_E5 ]f);$go $-]Lզ /阱SA V~ 8}DqE8] cXc| tFbS :dObߙe~;-%1G u]r'jf>p3THk9luRpeL<{Z2(ؘ+lGуг %Uep|2s>lꈘM0D-e7ialOݮwv 8.xy@VW|~^5/'vWG2biJQ\CW.GjSd`FJʤV<_1NǧG(*M+t\ AZaC_ GуWuOoA#85cH6a 4݃\@Š OITr ڥx=ԑ} U+rS A.r5\P΄OjEH܊} ZF1^+z.\poVErou%59'A K,63Pr!l)By 7e$D6go3Ў| -t(r GLA۷V>2CH/6!1W= f_@ .Akj̈́D*[  G?#[3er,T0?`qٲҦa7F&TV1~:lK&[~, Y6TGXkF5\.mqf,B>?9hG5r@,Эo!UJq%MF{b;JUcU]!X +^- >b`gNdSJ/~J%|R - 8 5GO8VĴh')|{q ^f 8F7Lt , ŷ.ZoO9IT@Ŝ7"_?Ad4O#~,L#dݛq]KǤE3CLBW#<В@U)󤲸5|Z[.gB|ɐmd55އvxs+Z;$Dg߂FöӤv4YVqi=k \ SmHͣ 2@&>qWftEva/2AؿA!?=jb 91Rf4TEHמr;\vI ﲌ|b=箐)eJp*&_\Q*PMl*RyKX'F2h(}"7)40CY܄b/o#b&(w n6Zb pÁT*w"2C[,x%+OrlLbPOxL'8n]vV1kX(M#Av\7*!Tms,AޓN`ʯ&s:x?1!z$jŤ[߰I y-X]P]"|!VWb)&8cb` iK]G;)g(rAwSAqWK.!栢*]%d{I*jצQiIbF?ӧj|+~Gt\}j+ҁ ArBc&Gc65@#6t=Gx`D#p% s<(#ȑl1Fxsd|!f~JRY 0JҼ(Ǽ %BjYo-#dW0__q= ݛxhʍj;+l}<1ׁ ެU? "GCVe `.w B)8ec$5B;֡p:V9&LU1n^tLcRؾ!f&h(JC=(sj``0i:P?n&k*2UY,sXAVpy$\D \abԮRg!~|c$ G(9fF,Saaz> {_=g-lc%U%U!" 0dJov'<Δ+zW5@/zЦ,1I^uh fu,Hkv 8DoZ6.a '`) `Kv:'|hqZo%汳.{$Ge kfKk@JG`K\ dd;*'ixu%r.V=zG$[P?,6&18?.on1+_:=470.1ds b&s}A>ʪ5`m9ZyY55J0TZ]rɴ=qUlZ@P_8'E'\OuLcCĉc8-@\ܪlf VstF~>LjL$gmB=zf2ogGC-sc͡ܠS[jBžɬ0tL4t~jers N#9f1f\70?ܺs͙O!Y,郜0c2jrE(7*׋,bzg~mj dA9G#2_;UH7.ux@ ~2}(4*G'i{|8NSQ q2&<\k8+ґVD=_^oe隌}C&4\" T`VR&?D[rP~A"t93@APA+ڃvޔ/ds^1sH_'lfx!xp,ťeqfZw\gxE8,ڞxqށyh5a)|,ni$٥'Yt!h_Un_(SnVmߞ@+3PB﹁>,#1|0]k`Mr2c+(|26nGq:*3)r|@Ls֛(;PƠѲ/p_k+0|de54ކBb}KJҊ%a-*ihRlHퟛmjq8r8@#P)SC.äOTa)Hs+qB"YKAqr k3r(2u&V'~F?8g-?Ȯ*c=P@t<ŸjJP3̑]Q2srj~IGf]TS#lzY <wW2 ,C2<*XTЃ`#5N藍Q"ܠ2i帱 xI=!JBц<\XCi|Ѯ)?'TDݰͬG$YXgcH%p "+%=F7vy{PI^>|(ޑ0k#s''z~N<}=_f?Н;eCYp-= VZY"n: |ϏȔJg(jgwkw- err>s0.~ɍ y3OJ{YūJ/?V$?)Yj$~e~/p0 pKt ,e\ԙ:Δ,`]*|ٜ.Z$:̚6/J73E—3d)/;nJe`x=ooFĆzh͠I1hβٖ#h{gfh~v,؅3 Ud,CgR \TדW8M 2!e(P-hAUA6㝦y|ƌv=<-cm-p i--H#% zLnS-\%p6cӏ%k Auߞ4#w6!.WE譮+MW`iBpf5uezTݵf|m~iRk;]i4~ 6'_ŰR|cC֕{-_'IyiDcwrͅe,kcX}[adyn"M\{t[%YjU/]io}8K`M>S =ݴENą-"j/U` <]V0<jn'DM0`6f;'1U\{J+$L{๵(h AR?:{fav*,X撩aw9Ãmktδ:PJ.=:3 :w߂6v[ʁz˵;_ }S+U)t,`-x`'M`,͑D(2%2e̊r^(w!Lg" CғٱO2FJS⟶$jVdFmj[r; 3^O'HTR9{A~؂MZ߳Nҏ7/ :1oL8cP{dC1UǜD˚B4+QD0O֧!'(Vn^_Qi//ywq?(ŕpT{qM@No""kfz3-!9^\KnD= yCZ;p\,5t=[4WVRJk&bCG\?:#Pt*$3CZϝ9{'|I%IJjR֎*R1 ^#>aC"D{Uribuk2o=̬{%#F )nj?Yv!H̻F=Gk(hs2fG Y@D m wxCd%w8'߬CM4pnԣ< $zR 9J$nY5 #͞PZ]RCutˁBRfM6̫yiwT4H+硒A٤A07yb\ϻ(Gc]@yCހx$8Lp\IUxhdE*Nk[?Ra"kWU1J -y=C9Р-kc:7d'Y7M  /dx<7 &uvI;ulq&TYVMF{dQϝ)3J•=)D#_(H 'feIϯoTjnŭE^\ƒƖЍj-r35*ۆ\j2ܳ( ,a)vkR.%w6+D%NZ;~)@\̑!U=?r0w/H0k3ڣ^~㱘oAs?֘-9Rwuh !IMzaI⵫?2*q&V kA 8 |$c5.v`F>MLshYRvKc%\ǔoWMEiRC"՜cVr2{BR&MrOk\$Fބ0FnKͱܗۺwdE>ak:&I 0/* (H=fɷ,ŹȍZԬ<Jz=,%*̨jtK9fK۴M翏nn35)ocXd&A2N[O/:ܭR@Z>2ltC \i47y2bSjVfjtXWG;yUo:{;}64q>m9KΩh9cpw-iX%]}+ AƘě!:^sBM t>qҪr/{7k7ҳQ.e^E|?Qr`9Aӛ.ڈ߰~ Գ/5LphK\:Nك A;]K>n4y֝Ϗ ٶzDV!?.̯ˁu]ԓ#${CYa pL*;PR/g)of03&&!!1pS4Ǡ-bܽrF:zl}c&^\|-"92Y7=h&L\N/e"Tc<%o¾5nb/l އg¤H@YО+{̒p Q%KC[p~FK"?.hH9H{q#9W?ߋZ9FL bؙ[p"8uTwL,[A*:)5X_}r'O[ _\ݕ''A3QĀH1".X"a96*߭O%$F=.Uٛ.;ն0=~lNpn$ 0%cLaZS)Gy 6za2D|yTڑ@ B:WX+ⰶ> ̾52C{~baW԰D](7U,B3Xu? /nmc֚hI1t;$ywQKpǀ\yי%K*=2FI1'Voa GtujK saDM%?d36an|c ߋR0373 Y%grMh sꐢah:hh`[e˂r+VAy1esbڎDFr4d`@ 窐1OA$DNҠDn"A=T೼XK}/όȂo @WY NԂbYCYDmXr`zIg1|xܼa,iѡ8U7hشT- sremA Z]1`nn$PsrMٱo|M?@[DR q!f$2GsQD%|Z낆z9-sb^S ;z._d=dPFg@2Wd a ʂએXZ6K?F4@ÚQ .?4FIp H~7B"T94HRט.1^YE uMUbh <2ekՋ5'R=L:09Ͻyժ ;M`޳VcC,78 7>% )"N۸y:+@j=,ɭ bL&&t D*5D1S!LGan7_rVW7>C$kNs +dE$yǞyptlLO?04L7OBkr&%",2˚De&F? t%f#qf9*Ar,@|MC߷t${8w@jaSwb Ֆ[͠T\b3'˙b/|#H}ȴ1ϊBKx(GhiaVmNOv2}cuEGIGrRmص2QRT@oqQۏALIi襴Χ% }pLco[W%^~>vgĥJwn2̖Ks04ƞ/;F `T>Ԗ=;?o8l 6ܵ@qS{N%+uU2i%Ә {NϔL{`Vk3.6KvԸbkFe$ҲzvOZ1pDDmϗ؋9 R>5(ў)˖k ipPBj?Dk;%"k)UO j@mĘR=El=xM53 <) ƺ>jrhb)Ch.?A~!Y&Q%:C B?e`BxeN@oanuU/UZvzG#X} r=Obʊ0$<.CA[mERq8Cl9gY鋫AϕlDaۥk Me `y^\Y,dll^`^ci,=vfڒ~>"~jccκA  %!6iiI?7?brƏAKnpyfDަ1#xbwxH#qhgkc}S`+*}lN3zT s,&Pu_Vj: ]6~=,!- 4sy;vTMm 27˽ȸaZYBi(V2zH>s?EE@jv\: Frmc8*luP ggsH O nÅ@ʓ=M^IN/uj1ևoc*:$z{ go+ M$7~ \m 1rLP'y>.0O[_pUMFEPl@sk(lZ§@{"4w;ıA8 H-'|؉NnL|eG@l W.X&ϣh΁cre8WY90 ,x=K{J$&ҡKDV }byhO3OGG@8+熏,NK*7(@oèݜ|+nbj9|[]Y2,\6,ntZ0@za!F`EH(r%[NPo }vgZ=W=DA4% ?aKj\) EK:tnw+_) " W;MEd9!Fީ٥ l.Wj&H8_HAk#n f(ԌjI;м-Фkң=gE~{1PO^q#ziDžo\0%sE-9`Jp3x Jo.DOOՈQf'ǘ42vv9$hh0 \{#) eKy]$ l>Dޓ J4 ӳ3L/HG}98A/Rm+ΚBƔ{5C;jրڟk^ J8;T {A;|K 9FT\g8Q y  {$\!+@1bmaW]JM$jAO#Mf P;ՐTU3^kAAN{BE81%$ng.Lx3cdhy5K8`V H{uTsz!G @E Xׂg*[^<:oFK̘{!jiNT{⮈'S,ҁp39JM/33+  7B0>VdKЭ%C(PJinZ :#:㴖_ny5jX+V wд>&-~\# ɆM-Afs9ҦnN;KeCiV/r.9'ŋئ‘3nDv%߭i +BJgf꿈 E(i\9fZw&Ym  @&1F>6M7i*qmYµ5c\[(m&]͜yB3kg,1퟾a+V"ͨ4h|*{ |5yBZ;hį*P}9&í{P*#D ;<"!в ;$*. M؃yG98+e˭/wf*MW I  |&@5_3D&@ɦԖ c_JHt':d倷ʵ' [/:7/FviLƛt$L_$,u$V!Ž`iJm! $\x{+!^EKQxٗOiw!nvt v  Njp9QI{I;qrG09Ǡ[g_QGG u~0{jDH=,BWnCm }4]%%QK[/ 1A>&kK6{E)1H_{e^n5fhi}罽S\$tN^OGP2\mjaDŽ#s4e H3lAp7s.ـSrDcReEwBdHJ6C(J+<,課/7\c5z,cbN(Жd:\"x="~Ȃ5Ee<Mg5gIJ1^:50&uTVL+Q )Zc 5L]%۲ qpdT ! [KߒkP.gvR2KUM&/03V5VWJY=}|\\,4iS#~DD3Pyo\N=_ohh-s/r^d k#nb`3Ħ#{6myd4ĚCJ(oE>AT?qZ3^YT]#- /ߜЎItQZО +O&pDq(QZH0%w֯7MK9 ETYce񸿃m6pMaI&Њ-[N찆gpFyP)& y = ^Eޕ/PA52$U<[ds 1⦴>:bb?IX, E7Z候Q+< S0?ksj^ð[=óʲ9Z^93u&y1>t``) &s:2 zjZ%Mk@-4.&xLF/رQNj#ud hٷ8z޵U^H)ϒ3:o%} =K!Z>Wˌ msk &5Tlܡ6*g^m6 >2:\W@H;íxAJDKI`r!Z+@;f bSƥ05@R}FH@83xfA;+Oۜt${3?!tRJYNг+ݬaXbJGv, vJY46j&|JQ \Z;M5y@]qe}8CswT{Uq_kS[rlƙ_gIzi~e|$tUg6mÄepH3rfzl(P[=HߨN=m4aIDg0W3Ւ#m1'JPFt+39.QsI2j?]m.¢_y:R$Oc+ss4A F!&'3ӈA\*4H0$r 2]Zz4;Xa=r"t*#8[cd5ij 䨆?4L",۪O5Qnnaړ ?XF;)],,*Z 3}-e' >hj5>E38U_) &4~QzZpu Kq@xh&ٟIВ=+FK gMxyAMsLrMW7/qGq1лiz0J(8 T ϗYdXe|K~9{5cdHʰzr_aBvuTqf-}ㆧ3 e74 &[];$֠jjd6Y4@intJeѥ h,ږcXp6DC88;aF;2hs/'Ǧ3rxQQLۀU c;h>K^r3_c̦ҏp PfcBr [o@֚3a@}&|^f#;:_A+.vmK SFy.(K!*Q](;Icj#r]!Îu!nY%9_ܕb Pe `kWTmtsS{?ռ4q6"f( )3߹rlgA8^[m֢Ie$VR*Ϣ*fXKR*[q$|å7.Z7V,j1gL&*mMj9;qO#jЇM\j*CwE(|! Km&`w3PX'$XJF( 3Le?')$>B)~k䖘%6#x4* oA qݮg|z/dqg2o@ɮŵƏ6!6碙VKbQ %Ąj5C ƒ#gϱ4vP֣^<ҭcK^#2Y0:'F[<9r:a:GQV6qui@ /cKwΕ,!lRXj&ڎ ӡaSLygJL}O!il8 +>>ՠz@-­ 6x71_cpjwB/fkdpBsľwW8> hj567p-QW%ju@x%(!'B1WD (ʱ~p ?16yRJWxbx<M|u--1"UeΞ j *9^O4ݞlx7"%f,wb&av4aL.H ۩& OxoC}ŔAXQa~iυrHLelضv{nZ6 ÏDDP-Z@>F1=Owkas RM fPg:>LٵAj7oХ<`pE]bq3$ٔD>N֦:%"4l@]6 @c)~HFv(LkӭV N*--M0:n c+p1T5Сr`qN҉)F9JvEkv3B,A5p3PIᅲi=hJb^9p: /%l8HQa4 |`eTC[.T籼O ^7d?gJ9e$,BuS# A8tc+:O'<{%g/I,еaIZd" ĩ$4R/חO?,9-~ K+$o&$X$#t]PaS׊IJ1 *KB&K/~|wtF5;JjsgvT9v8h%-[E~䧜eŻأCJ z.!gG9u"-<n[ubnEGWvk&Mc)!D~ ǁU*~^ms듹O(mH1U/EfkR ,,Dd_yUpp@s#cH[NA|ЛUz]&%eAʈouIv8fdz3iZ=GJkWZ{%Ч.z%aG_oR -od:DUtVuݼV{GwwA0{MHpS]"LK"cď rjk|dHK䙣C Ǫ8S#dxǝ^Ra qģ[*(,fQ sꇸ֨ze~`M;$U-'^[aMϘ&j`E͝acjhөMPF:~mË令;AgٍW,j91pސM6.mf?!cvtG|o+Wd'ds5 S0v9Y25Jɏ_aOL\m%\1d?38JW7B!)mb23t'; x2X'guWx(!i@ ]&YDCW\bR(MtߕXӑ8g# ?ᖞ:h_QP,]X?Rbeovݎ 7%㨜=[K$9>ptbn)p>`Muǃ>F*eu@'pM2t0 K۲CuXf}}dn/ӛK@8**$S_{&{Dx إOjm(tޓ9 =Lgmpg!Tn1Cg\9M!VC+2Xv6dD< NX0-[D& -c틭? X9?Ofll N#Q,B/-BdwE0?1@lx/%# EIa(/xX5h4cfʳDE9]5i~[TSXp~i6v)m`*TRsuCyqc5|C |Aʻ/mҔi.2MCÈW ߋZGlDK29jt)|M h@^j2sy3.W˔G' W%ZܯQSusD@%ϭ6fӸ ޏK6xŐeÐJ%[Y:l M@>fDN~ Ѹ&/C9L<f<#ԋD*0eMIX L?!(p, %U/Z*PTD/] ?s<ՐF_ ҆f4 2@# fEX׮xiDjxorfYicr;*,Z#~gYD'e dDA2*!!H:S;Xj'/ wFA8niHbYW1AJzU8x:~+*סw@ySj5CNSnn~@F:s%~$!K`.Adaix@ܸ1YMצHOV4oҨ}#sͮif^sK`ni}97<rэ.CsWx գʹo`b[YрjY{oPe9PkՉ]6U;"-Ik{L1(vdVEQ=1 li!GwwDFVR4D4s4b lvb?Dv!ѣGȴi@Q`.vXCp= CcZH(4`17N8C vp BңVoJC2 5)WL 3{ PCN|_'& d:_ڰĎ]BAO3>C6 4}KZ6/@6+r|Y@B>t :6bm@ yJXw(/&-sMaxCGPiI* ZX$]c d{l1qx J2l u !?T;vL}#̀90=v=1Xͩ$ 31I AN @\/3' s(|ΕJ42r:)LNK\!IUlV F=W0J'-;a^j`*B|n)Oċ<%z;*&dGk*U 5reʶ0(Qb=GqPgkus?I 10MѨCMcw& O8J'ɨoK갮[͎3Vbtl_g2 $+6[tpmvgij<^2.1ހ.C QS^Vx} 5q<`qF_a R75}U$V;jJ~^xϵ+@[%5iސLRV'Ls괐 .ʰynFK rU-kW])l٧P 3HTCP?z:tD̜}&(uu!\ QJ/aW;}7(pd_ƻ cnעϿYj~ lhqpB b-q㌨h8f &b 5{ 70VsRH6 Y]lHĬ.6%`m yh?cb%b[˨OcK9p&AZV9.q'k⁖9Da 96eP(g9>C(o`/@ͨek&\>ȗ h:~ e +C65evcI(L$P?u.4-&H{3 m7wC=XB%XǜH2?盢c\|DZ}Xyu:(f?J-qg{RtNq'V߂N4}jÊ95F*/pqr]%ۙD70=f?԰hsw!m?PiW}b܋Zf$([7 +Rh|I$$ `P\|D@ӈbZ[EE71giTս\g1Gf8({8ٿ6y Flce\llAKxȬt\X-3M4k7]6!֓ݶ+BVGNrtt(#1A[XV0~Z4|+S^|<n4m\K,.XӤ@e2*OU_ͅ7S@4ƇE 0&<J~m0ꥤ&@E=G׶qs9|/]]ľ,ton_I4{9b 5E #ds35 h>_LDb ҡ%_Zz[P,}A^}i#k'@e6NaQ.|bnWG\7*N A~J; ˳cn)ȡy ;а^rξOZ0"5fQ&=u[ e;4Ы { f(;;Ԃq[=>}waC^)M&) 근ZEÈp]9MqKJ_+1N;M'h Jd60# Վ ) $1Y6?=|iɡrG\1``da5F{=Y0Aқ(Tp %\(QHmHYB5ʼn[b"w;Ywlj2n,iW;AJcIh 0P vJB+^~ A,Ei\t6ܢ-ǿCi\{HIœX9f/Le7jqIr(|h?+ENg* 2H4{ң#<^`Dvb\|(05F8ANHi""WF;Hz'sZ{x 'Gm {ZfgKޢ"Og&>sQ;02PHT:Kp򉮴dڭ􂵔,p^|Em; sRIX!=9@5Ke1@5L)ZH̥R-qDE[ꭌHƭf[Vt_מ-ң TDIa KbE$2b(w\ ̠ 1os:D6q|Sq긽^w'Ywj ۫$7q!)Ʊ0ܯ,_H=|h/':{iz0_N@?É/{OݤBǎ`HZhY/jH4YxGB[c@"u/pD&Tl.! d y$+-JŞ8`7X @iymy0uͷ-wlrD۴Ū[xB?O-Cen!Hmdl[Wjb=ź+Aŧ+ &V1hL>/zP u_pB燻Bk-@cA#dCti HHI;dX]y菸 G irP;5^blPxzT'dieC{K&8VEr-E"$X5C㐬O}Y_D`V dS H;t*B֣Q-ik}}ԴZ%^`RQY@TS0n/"Jp&J7AUmDAf^[g7EF1[0GŬz>b֢-q~Ҟ^;%0W @zנ}!d6Ց2pLc*F\bg WtDخᕠs ͕?~?:E Y MCHV<%SҊ1s ] B aG՟:iI˭1l.˫GQBXp<19v'Fua3ӌ$_V*.OqnQQ|GԤx6`70I>=psNNe׭pBb߆n[4)z۴T}7_QL. ǨLfFmU]N*_spᓔ((H-}^\ÁidсqzIj6ՇXbȶMCQ-1̞F_<{+Vq'wMdEYj>mmg 1<)q0Pw׸բ%عiK󑪓G<ԗѻ+A J=?}]k(eA9$*0R Pᬅ[zeϜSd@{vML8uS:xi(5s\IȐNy25*=id|kBwNxDh˔$#rݰqڸ@qZ[ǝnZ8=tk߮ cHD$͎—O*ٰرE-s!oyxl^bN=Ď!PQ$RٴhgBEcJ=#.5'OÄZ5rHb1evLzH߈lq mjMH0?n>Yz"q-SR>, qPB0=2iƋw'WAd߾\n2Oj(QVp#k槀3e %7UAt5 Q ]W6[TɆ8T7i@Bc^LCg?{}A37#8ۗvU_Mxֲkx/KrsE$Jϑ `\X?csiFoSj@vm*+4uGct j\1r-zOY1G#%6bNř-ڱG[U '>sNJX-붫S( TG" [éf#\5)v@^E ZLS^'œ'!9vUגf66Vd+417~̯>L;lGdPUkgO)z)]4ENOR &a;Kxp'5TݿD9  \Y_8qYi|͖8G>񤳳PZAݸnX1R7*1g|{ d|HtwMz:|aܿEGSƀu,+LψNf=m4s"^_؇uVHzDį8KY4j6;h?#i|^+oKcb% 6=DN.f&bɲ+OLp_RU3]7 !7Eַ"cdt1xȺ$[c`Yug8sQhNqmֶ}zJ$%Y*W!n {%Y];<:BG^L6# ͌c}\i_u]+ p+Hi"l;'»mQ-(0{܄D'll&P̂@Y]S35<&T&d}J0 Rp kxb{zŐ8鐳}< MITC{O!^F%[-ߝ,G6üN}ᶔt*y:#n Vx> S3a诂DƄH2dC#TH8eo"f?Ä^ʰa9 u%m3G N@ KDNZwQ`+ƆT!څ㊑.@LL]~,F@LY@ncҗD(Ȳw~fb,9y>@1=԰Zjaj@'40'TU=8cŝ%NGyV]ͫwp$)Ȉ4d*1 E%6/"'@Qxs15O`EnSe8ū8VǨ9:/ .Wl6G9fJa`i` |7F#umv}H <{-GjZ"|B'CkI}oirz Wܦ5c+Kݹ_]6 8NE%J.s )`$Pơx8uy!nx"f[ o{w֠lSSi"X89RNٲ9* LLjywfُ+ιJSj_L6,XP`#҂:a$@/X 2A|7xd&95$N!p;Z)D1c !qtEH:jC¶@v}5"-}&yQeoHQFrYqΤ[-:ߩb.$7xRte3w]FO*'v!:'R||I13;93lI42xyM ?8 jm@JN' < ̢ݢeF35RepaPPgU9`q3A]ϔ‹rG+D )' VGKm6wqJzIG .o+tz@5 ֐l4c64~h q=qC[Imd "ín &XV]HfE@^eE~,<8 y F>XzSDP9yG(CgSZUbp룡rFA=z#w0JS>?Va y+~:>k߀H*\ wuD'.DO)߁~{Rt[vJ?G$ *Á -5Rc`i1; *VY=,Q75V16uo*q鼡Qw_: ,{WWXh e`N8.VkgIfܻafl; w.N,v[M-8}ЈOr\V´-P2Lhz)8䊾,)*XMlLbZ<}M%P8W\P|KQ;M_}4IGά$K, ӎ(=;Cmxi$jj>sl^æ_P„?Ԫ֊\(.R_:{dJ<2>Zn<c_c7RNZ McWXF-.{ݒԧs/p0h8t*cјh oǫ"xF+_ :dǘG+(qQ%t?X;Mm˾- 8ppi ll!vY~*"_Y[6-ӡ$|ːwp}Wؒ?\0"us759A_aR-^Ju`/!C9t# hAhTBF(Jh#ZW ~)T̀X+0Rrl!B7(5Z ZnMݣS##{"b|jѿNi~DAuӆ/:;Ƃl>OI%lE *|!SA_܄UҨr n@ݠZ gNcʵ_UqyHtkÜAqָ9ET&R ̘4o4NE SO 0? z!RަoRlJ8rqiI$mqGM=TQq IT49@_$MjRR\Ic9 h^'64Oa2ɬ3XLb4q]<Ncq6IŃb^OI>" w% in ;é;nC>P%Ż 2U/\k᣹/((`H(CvxXAP$\,ؓMfO1!Tj}?M? #P;FtIm3ED3D/#X:ɰS̐_fO۾k׊H`-}UFv[PY6p^3L*-9QhojuCb" ' <jHC86*d}8;[C/&lݕe*DrYݻ-q7`Uf[>'Gwjƻz6A.>^6keJ! 'b(g/zuI|l8AIC2fV#=7B+K}iռ 'I ٗBYKnOʓ_ P@R "PЪ;t56SdT ;BAI8Į /`lc4cLm %!X"au5j$vXH#D*?iF4mfSHKŶsZmPNhejpV|92\5:lPʂr ? Mٶ)f)dތRL¢- Qenϝ(dC%n M=+;`_]u}VupP*X@+`N/]Nn0G\6Gw>@J-".ۣtA ,ٛvw ^eQ]ǹK_VT'z=-ӎ%BvWC{*aӖĉ r*J{}yBZcIl^wy~%32jW[\+Al[e˵;zy"XŒ 6nU z[󓲳QW%XJU:A22ڋi4Tʹq5a֔п5z4hEG 'V-}4~Y忈Aa+lL.i ;$ ,OjD\Ep56dTC(9[͉hh6RODBlIx@F)9d;W֬"B؉}R``-:c'v8'* 3Ͷ՚hASgUI2Z9_Pm7eKP 3N_ ߥ_# A9^2v}>t2WBBIt-81rP)B0,x9hƱXIm-X}V *j8ZϖOڢ;WJsYq:O%i,ݤz~ʶ&D +D귕ᣉRX{FzP~:}d]_qB;YJQ@oW˃a%vQ7V6hyr2<&̊Vj-p^BqzE!JB ѝOEM[c~nkye*4qъ[KDE9"׾'0!`I * j8sBF{ٜuZDc+#:|R*{/;=h{g(>aC֞i:Dr3BVcɂm-(c{;R⥺W~v`d ftX4760x'I!O09TNeݛԤ^`GpBİrQ(~hX \pPSLUb h`2"g E!Hx `ksM 2rCn_z%i"Zwh6+?ëp,$}s[f-hu?wv\S8)eM?ϔo-VOt̻ӏaHMdrC(陱ag;\y<=27 ա}:@Ē}%9p^_69d)\DڰYfa町ŲG&B]LYM A 8LOK˕Rl9ʢr /.H~=Cܔ!+]>#4uDErAX[̳6!7-Q|x1[C2v PIG:@ ncjHT#X;1Gf $9Yӂ21E8AyJA<vU*@CQ`}*)ml em N cHg¤}rP0+ϴgLP9{6! 7egX#ʔ;{,2[gXNz.VY܇wÂ)U$9~O CPxO` SmrA6ƸFZ}^ Cާ!7ns^ pA ({[{I/}m ~iTg^>.5Hm2nC%8P~'(Nu%/S'd85`Lu짧TW]m/ʨl$ð`vsBb~g\>8q]%?nbKi`Hmwy``<̼ ]65ћOrҍ!eN8;V:#d(M7<.,Pc4%4Pˎ~_ XڗwL Gߧ5{ϘZrL6&IGCZ8鄿Hhd #v 6:/R"8^*K6_LpZmDQr\30]w8,g%cܗK}Bw6.0#E%3F9(GP3[&~.ҳ{#Mr1("W/O>bb?d,#w츰-]sBe|o",oVcu5FuU(..и7"<yfb|e<|雹گnf-C*B&r]E7B'CK*c\dOg^oh $7Z#y62AsǼ|F"4%+ApPqr a2Y%mEՄK<@C/~ZV6e $X|K<E"R9TJ!5p,?fIw HA>gdv{-4;%C-@Ù@fFoHП7F栂z& 'KD·yBf=w%м";:+(CotzhA(pޣ77o 8pwE$$n(4-bDfs^ -[Kj Z&H2{, qYuqfINyٻb8C}AJӨT,f(糰:I^c3ॲhs+ :Tا?7φÛ`, YNcC_ |V Mf 箱{CKJ@v ic>~E#v[%ivo,6M[Ž`YȰӐY݋'ɲoEN2< BNsw1 H3:&6x9& Js[s|[5MAr*!Sz&a֮-9>:`R' ]sc_$d"A6M-|M9ЈrPAA0C-k,VM&(ɏw 0EbNmM>aA4)uC?qf{ cQFܴdpg٨5JW͡fAF*Wa+NE _K+T6^C_n,+hNYRҫT0vn~JaVB % umԣH2oJoxv yLQ eULxW6rYm Cc;ۧoRJr>j(Y y (e[!Q=[eXK@4h 2g3`K/$Le Ɍ0q[Ar'QX<1LbVqV",ࣺ:1Ý2=y'1Wds?m9e.j>P6En=JӘR_hs[r0?>1L@,|0=<ު:Tγ{ߏBeo+Iu{`pӝLZA`6|sFܱxG3M8}xws/E֖o(8t.z0-Iq:hM9ZhL}ștj>hI5]ZWAxٻ5wf@r4:U%הXG5BPv-x䆘7HPلZEJI;Y,^! Y_bͥ}67]^4ڕrq3u~32>I}cv9&mHYt֑X|WG2AJ,Qx˶3д.jd43 ʲ+n.uȶKT+؎Y/iL֛b|kxe-ͥ2?'8ĐE̥9ƫ8y$Z.S(>]Yuq!E޷Xx~^@KE!L0Zf'_ : [_ͽ}ĐƉ;qrť( <k ʋԅ8`ޫp,7Llƚ9w"^ }T*<7nvVd*8Vb ږ<\RO(`ErW"hx1Tȱ݌ENw:}fØ,Gs=o ـ}_\{&c|۰rKЎJ^fDS^H:iY[j -4jPR̐ i85[wr^D j3~4uKYm)l9Fy?N_afg3p<( ? j;vS/m&`}\'̅-xX}]?M{c"OEoGCӾfTRtRQZ2jrm;G•''{p4oҟM E%ؼ$!=lޔ,0?8Wy Dlg"U@AUIϳ+ْ٣ UqGݐ&iyGZSwxi<**x\ ѯ QE$mrFE.hߍZ*kPL)ZmW?8IS"!t✴.+xNt:D]I0,$;X}8W^֠IrkF Md{nM2c瞚FrǠ+σ|D˲)zCo#oAzI Jh@ѸLjRPWlsW[i<5̸qO^l҂o?6֛nywB HÞ^o`M4"ϬkOLXc9Gu1uIS R[cCԬ6bHΧ*F4+0bCg6:8zhY+(3M+F&=]vTH{qÉ>|-l_neӠv5\Y5[  eXˊΉ̆LG9 :QIXRj|ce'Y/OwvN3I`!)JGzavyk̾PD:ߡsAEc|aIUq铂0"22t={^ݯno/*yE~u=y4a9EZd3%F׷f%-Uu_]ܪ+MUVu+}t)i'Fdd{^fIJx4(JR(\45y- +.o# }8p6ټ@E{ z̧60'Qؑv-dk={;n8\Zmzf{ 'Tn:mj )E<Ԭ'bw?>оsd6=u" =:o ^{uꓐ޹YF$: &`@:QŤ gG+C뷫H'E3Iif[AآlrsB