diff options
Diffstat (limited to 'phpBB/includes')
144 files changed, 2784 insertions, 7093 deletions
| diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index 67fba1094d..7413152e7a 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -36,14 +36,17 @@ class acp_attachments  	/** @var \phpbb\user */  	protected $user; +	/** @var  \phpbb\filesystem\filesystem_interface */ +	protected $filesystem; +  	public $id;  	public $u_action;  	protected $new_config;  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache, $phpbb_container; -		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx; +		global $db, $user, $auth, $template, $cache, $phpbb_container, $phpbb_filesystem; +		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx, $phpbb_log, $request;  		$this->id = $id;  		$this->db = $db; @@ -51,12 +54,13 @@ class acp_attachments  		$this->template = $template;  		$this->user = $user;  		$this->phpbb_container = $phpbb_container; +		$this->filesystem = $phpbb_filesystem;  		$user->add_lang(array('posting', 'viewtopic', 'acp/attachments'));  		$error = $notify = array();  		$submit = (isset($_POST['submit'])) ? true : false; -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$form_key = 'acp_attach';  		add_form_key($form_key); @@ -160,7 +164,7 @@ class acp_attachments  				);  				$this->new_config = $config; -				$cfg_array = (isset($_REQUEST['config'])) ? request_var('config', array('' => '')) : $this->new_config; +				$cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => '')) : $this->new_config;  				$error = array();  				// We validate the complete config if whished @@ -184,13 +188,13 @@ class acp_attachments  					if (in_array($config_name, array('attachment_quota', 'max_filesize', 'max_filesize_pm')))  					{ -						$size_var = request_var($config_name, ''); +						$size_var = $request->variable($config_name, '');  						$this->new_config[$config_name] = $config_value = ($size_var == 'kb') ? round($config_value * 1024) : (($size_var == 'mb') ? round($config_value * 1048576) : $config_value);  					}  					if ($submit)  					{ -						set_config($config_name, $config_value); +						$config->set($config_name, $config_value);  					}  				} @@ -198,7 +202,7 @@ class acp_attachments  				if ($submit)  				{ -					add_log('admin', 'LOG_CONFIG_ATTACH'); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_ATTACH');  					// Check Settings  					$this->test_upload($error, $this->new_config['upload_path'], false); @@ -334,8 +338,8 @@ class acp_attachments  					if ($submit)  					{  						// Change Extensions ? -						$extension_change_list	= request_var('extension_change_list', array(0)); -						$group_select_list		= request_var('group_select', array(0)); +						$extension_change_list	= $request->variable('extension_change_list', array(0)); +						$group_select_list		= $request->variable('group_select', array(0));  						// Generate correct Change List  						$extensions = array(); @@ -359,13 +363,13 @@ class acp_attachments  									WHERE extension_id = ' . $row['extension_id'];  								$db->sql_query($sql); -								add_log('admin', 'LOG_ATTACH_EXT_UPDATE', $row['extension']); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXT_UPDATE', false, array($row['extension']));  							}  						}  						$db->sql_freeresult($result);  						// Delete Extension? -						$extension_id_list = request_var('extension_id_list', array(0)); +						$extension_id_list = $request->variable('extension_id_list', array(0));  						if (sizeof($extension_id_list))  						{ @@ -386,13 +390,13 @@ class acp_attachments  								WHERE ' . $db->sql_in_set('extension_id', $extension_id_list);  							$db->sql_query($sql); -							add_log('admin', 'LOG_ATTACH_EXT_DEL', $extension_list); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXT_DEL', false, array($extension_list));  						}  					}  					// Add Extension? -					$add_extension			= strtolower(request_var('add_extension', '')); -					$add_extension_group	= request_var('add_group_select', 0); +					$add_extension			= strtolower($request->variable('add_extension', '')); +					$add_extension_group	= $request->variable('add_group_select', 0);  					$add					= (isset($_POST['add_extension_check'])) ? true : false;  					if ($add_extension && $add) @@ -418,7 +422,8 @@ class acp_attachments  								);  								$db->sql_query('INSERT INTO ' . EXTENSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); -								add_log('admin', 'LOG_ATTACH_EXT_ADD', $add_extension); + +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXT_ADD', false, array($add_extension));  							}  						}  					} @@ -475,8 +480,8 @@ class acp_attachments  				if ($submit)  				{ -					$action = request_var('action', ''); -					$group_id = request_var('g', 0); +					$action = $request->variable('action', ''); +					$group_id = $request->variable('g', 0);  					if ($action != 'add' && $action != 'edit')  					{ @@ -507,7 +512,7 @@ class acp_attachments  						$ext_row = array();  					} -					$group_name = utf8_normalize_nfc(request_var('group_name', '', true)); +					$group_name = $request->variable('group_name', '', true);  					$new_group_name = ($action == 'add') ? $group_name : (($ext_row['group_name'] != $group_name) ? $group_name : '');  					if (!$group_name) @@ -537,12 +542,12 @@ class acp_attachments  					if (!sizeof($error))  					{  						// Ok, build the update/insert array -						$upload_icon	= request_var('upload_icon', 'no_image'); -						$size_select	= request_var('size_select', 'b'); -						$forum_select	= request_var('forum_select', false); -						$allowed_forums	= request_var('allowed_forums', array(0)); +						$upload_icon	= $request->variable('upload_icon', 'no_image'); +						$size_select	= $request->variable('size_select', 'b'); +						$forum_select	= $request->variable('forum_select', false); +						$allowed_forums	= $request->variable('allowed_forums', array(0));  						$allow_in_pm	= (isset($_POST['allow_in_pm'])) ? true : false; -						$max_filesize	= request_var('max_filesize', 0); +						$max_filesize	= $request->variable('max_filesize', 0);  						$max_filesize	= ($size_select == 'kb') ? round($max_filesize * 1024) : (($size_select == 'mb') ? round($max_filesize * 1048576) : $max_filesize);  						$allow_group	= (isset($_POST['allow_group'])) ? true : false; @@ -558,7 +563,7 @@ class acp_attachments  						$group_ary = array(  							'group_name'	=> $group_name, -							'cat_id'		=> request_var('special_category', ATTACHMENT_CATEGORY_NONE), +							'cat_id'		=> $request->variable('special_category', ATTACHMENT_CATEGORY_NONE),  							'allow_group'	=> ($allow_group) ? 1 : 0,  							'upload_icon'	=> ($upload_icon == 'no_image') ? '' : $upload_icon,  							'max_filesize'	=> $max_filesize, @@ -583,10 +588,10 @@ class acp_attachments  						}  						$group_name = (isset($user->lang['EXT_GROUP_' . $group_name])) ? $user->lang['EXT_GROUP_' . $group_name] : $group_name; -						add_log('admin', 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), $group_name); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), false, array($group_name));  					} -					$extension_list = request_var('extensions', array(0)); +					$extension_list = $request->variable('extensions', array(0));  					if ($action == 'edit' && sizeof($extension_list))  					{ @@ -621,7 +626,7 @@ class acp_attachments  					ATTACHMENT_CATEGORY_QUICKTIME	=> $user->lang['CAT_QUICKTIME_FILES'],  				); -				$group_id = request_var('g', 0); +				$group_id = $request->variable('g', 0);  				$action = (isset($_POST['add'])) ? 'add' : $action;  				switch ($action) @@ -648,7 +653,7 @@ class acp_attachments  								WHERE group_id = $group_id";  							$db->sql_query($sql); -							add_log('admin', 'LOG_ATTACH_EXTGROUP_DEL', $group_name); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_DEL', false, array($group_name));  							$cache->destroy('_extensions'); @@ -689,7 +694,7 @@ class acp_attachments  						if ($action == 'add')  						{  							$ext_group_row = array( -								'group_name'	=> utf8_normalize_nfc(request_var('group_name', '', true)), +								'group_name'	=> $request->variable('group_name', '', true),  								'cat_id'		=> 0,  								'allow_group'	=> 1,  								'allow_in_pm'	=> 1, @@ -905,9 +910,9 @@ class acp_attachments  				if ($submit)  				{ -					$delete_files = (isset($_POST['delete'])) ? array_keys(request_var('delete', array('' => 0))) : array(); -					$add_files = (isset($_POST['add'])) ? array_keys(request_var('add', array('' => 0))) : array(); -					$post_ids = request_var('post_id', array('' => 0)); +					$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array(); +					$add_files = (isset($_POST['add'])) ? array_keys($request->variable('add', array('' => 0))) : array(); +					$post_ids = $request->variable('post_id', array('' => 0));  					if (sizeof($delete_files))  					{ @@ -938,7 +943,7 @@ class acp_attachments  							WHERE ' . $db->sql_in_set('attach_id', array_keys($delete_files));  						$db->sql_query($sql); -						add_log('admin', 'LOG_ATTACH_ORPHAN_DEL', implode(', ', $delete_files)); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_ORPHAN_DEL', false, array(implode(', ', $delete_files)));  						$notify[] = sprintf($user->lang['LOG_ATTACH_ORPHAN_DEL'], implode($user->lang['COMMA_SEPARATOR'], $delete_files));  					} @@ -1029,14 +1034,14 @@ class acp_attachments  							$space_taken += $row['filesize'];  							$files_added++; -							add_log('admin', 'LOG_ATTACH_FILEUPLOAD', $post_row['post_id'], $row['real_filename']); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_FILEUPLOAD', false, array($post_row['post_id'], $row['real_filename']));  						}  						$db->sql_freeresult($result);  						if ($files_added)  						{ -							set_config_count('upload_dir_size', $space_taken, true); -							set_config_count('num_files', $files_added, true); +							$config->increment('upload_dir_size', $space_taken, false); +							$config->increment('num_files', $files_added, false);  						}  					}  				} @@ -1073,7 +1078,7 @@ class acp_attachments  				if ($submit)  				{ -					$delete_files = (isset($_POST['delete'])) ? array_keys(request_var('delete', array('' => 0))) : array(); +					$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();  					if (sizeof($delete_files))  					{ @@ -1095,7 +1100,8 @@ class acp_attachments  							{  								$error[] = $user->lang['FILES_GONE'];  							} -							add_log('admin', 'LOG_ATTACHMENTS_DELETED', implode(', ', $deleted_filenames)); + +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode(', ', $deleted_filenames)));  							$notify[] = sprintf($user->lang['LOG_ATTACHMENTS_DELETED'], implode($user->lang['COMMA_SEPARATOR'], $deleted_filenames));  						}  						else @@ -1121,12 +1127,12 @@ class acp_attachments  					'S_MANAGE'		=> true,  				)); -				$start		= request_var('start', 0); +				$start		= $request->variable('start', 0);  				// Sort keys -				$sort_days	= request_var('st', 0); -				$sort_key	= request_var('sk', 't'); -				$sort_dir	= request_var('sd', 'd'); +				$sort_days	= $request->variable('st', 0); +				$sort_key	= $request->variable('sk', 't'); +				$sort_dir	= $request->variable('sd', 'd');  				// Sorting  				$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']); @@ -1147,6 +1153,7 @@ class acp_attachments  				$total_size = $stats['upload_dir_size'];  				// Make sure $start is set to the last page if it exceeds the amount +				/* @var $pagination \phpbb\pagination */  				$pagination = $phpbb_container->get('pagination');  				$start = $pagination->validate_start($start, $attachments_per_page, $num_files); @@ -1346,6 +1353,8 @@ class acp_attachments  		else  		{  			$this->set_attachment_stats($this->get_attachment_stats()); + +			/* @var $log \phpbb\log\log_interface */  			$log = $this->phpbb_container->get('log');  			$log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_RESYNC_FILES_STATS');  		} @@ -1496,7 +1505,15 @@ class acp_attachments  			if (!file_exists($phpbb_root_path . $upload_dir))  			{  				@mkdir($phpbb_root_path . $upload_dir, 0777); -				phpbb_chmod($phpbb_root_path . $upload_dir, CHMOD_READ | CHMOD_WRITE); + +				try +				{ +					$this->filesystem->phpbb_chmod($phpbb_root_path . $upload_dir, CHMOD_READ | CHMOD_WRITE); +				} +				catch (\phpbb\filesystem\exception\filesystem_exception $e) +				{ +					// Do nothing +				}  			}  		} @@ -1512,7 +1529,7 @@ class acp_attachments  			return;  		} -		if (!phpbb_is_writable($phpbb_root_path . $upload_dir)) +		if (!$this->filesystem->is_writable($phpbb_root_path . $upload_dir))  		{  			$error[] = sprintf($user->lang['NO_WRITE_UPLOAD'], $upload_dir);  			return; @@ -1524,13 +1541,12 @@ class acp_attachments  	*/  	function perform_site_list()  	{ -		global $db, $user; -		global $request; +		global $db, $user, $request, $phpbb_log;  		if (isset($_REQUEST['securesubmit']))  		{  			// Grab the list of entries -			$ips = request_var('ips', ''); +			$ips = $request->variable('ips', '');  			$ip_list = array_unique(explode("\n", $ips));  			$ip_list_log = implode(', ', $ip_list); @@ -1676,14 +1692,14 @@ class acp_attachments  			{  				// Update log  				$log_entry = ($ip_exclude) ? 'LOG_DOWNLOAD_EXCLUDE_IP' : 'LOG_DOWNLOAD_IP'; -				add_log('admin', $log_entry, $ip_list_log); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_entry, false, array($ip_list_log));  			}  			trigger_error($user->lang['SECURE_DOWNLOAD_UPDATE_SUCCESS'] . adm_back_link($this->u_action));  		}  		else if (isset($_POST['unsecuresubmit']))  		{ -			$unip_sql = request_var('unip', array(0)); +			$unip_sql = $request->variable('unip', array(0));  			if (sizeof($unip_sql))  			{ @@ -1705,7 +1721,7 @@ class acp_attachments  					WHERE ' . $db->sql_in_set('site_id', $unip_sql);  				$db->sql_query($sql); -				add_log('admin', 'LOG_DOWNLOAD_REMOVE_IP', $l_unip_list); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DOWNLOAD_REMOVE_IP', false, array($l_unip_list));  			}  			trigger_error($user->lang['SECURE_DOWNLOAD_UPDATE_SUCCESS'] . adm_back_link($this->u_action)); diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php index e245eea069..c9225a7eae 100644 --- a/phpBB/includes/acp/acp_bbcodes.php +++ b/phpBB/includes/acp/acp_bbcodes.php @@ -25,14 +25,14 @@ class acp_bbcodes  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher; -		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; +		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher, $phpbb_container; +		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_log;  		$user->add_lang('acp/posting');  		// Set up general vars -		$action	= request_var('action', ''); -		$bbcode_id = request_var('bbcode', 0); +		$action	= $request->variable('action', ''); +		$bbcode_id = $request->variable('bbcode', 0);  		$this->tpl_name = 'acp_bbcodes';  		$this->page_title = 'ACP_BBCODES'; @@ -83,11 +83,11 @@ class acp_bbcodes  			// No break here  			case 'create': -				$display_on_posting = request_var('display_on_posting', 0); +				$display_on_posting = $request->variable('display_on_posting', 0); -				$bbcode_match = request_var('bbcode_match', ''); -				$bbcode_tpl = htmlspecialchars_decode(utf8_normalize_nfc(request_var('bbcode_tpl', '', true))); -				$bbcode_helpline = utf8_normalize_nfc(request_var('bbcode_helpline', '', true)); +				$bbcode_match = $request->variable('bbcode_match', ''); +				$bbcode_tpl = htmlspecialchars_decode($request->variable('bbcode_tpl', '', true)); +				$bbcode_helpline = $request->variable('bbcode_helpline', '', true);  			break;  		} @@ -269,6 +269,7 @@ class acp_bbcodes  						$db->sql_query('INSERT INTO ' . BBCODES_TABLE . $db->sql_build_array('INSERT', $sql_ary));  						$cache->destroy('sql', BBCODES_TABLE); +						$phpbb_container->get('text_formatter.cache')->invalidate();  						$lang = 'BBCODE_ADDED';  						$log_action = 'LOG_BBCODE_ADD'; @@ -280,12 +281,13 @@ class acp_bbcodes  							WHERE bbcode_id = ' . $bbcode_id;  						$db->sql_query($sql);  						$cache->destroy('sql', BBCODES_TABLE); +						$phpbb_container->get('text_formatter.cache')->invalidate();  						$lang = 'BBCODE_EDITED';  						$log_action = 'LOG_BBCODE_EDIT';  					} -					add_log('admin', $log_action, $data['bbcode_tag']); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($data['bbcode_tag']));  					trigger_error($user->lang[$lang] . adm_back_link($this->u_action));  				} @@ -319,7 +321,8 @@ class acp_bbcodes  					{  						$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");  						$cache->destroy('sql', BBCODES_TABLE); -						add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']); +						$phpbb_container->get('text_formatter.cache')->invalidate(); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($row['bbcode_tag']));  						if ($request->is_ajax())  						{ @@ -413,8 +416,6 @@ class acp_bbcodes  		// Allow unicode characters for URL|LOCAL_URL|RELATIVE_URL|INTTEXT tokens  		$utf8 = preg_match('/(URL|LOCAL_URL|RELATIVE_URL|INTTEXT)/', $bbcode_match); -		$utf8_pcre_properties = phpbb_pcre_utf8_support(); -  		$fp_match = preg_quote($bbcode_match, '!');  		$fp_replace = preg_replace('#^\[(.*?)\]#', '[$1:$uid]', $bbcode_match);  		$fp_replace = preg_replace('#\[/(.*?)\]$#', '[/$1:$uid]', $fp_replace); @@ -445,7 +446,7 @@ class acp_bbcodes  				'!([a-zA-Z0-9-+.,_ ]+)!'	 =>	"$1"  			),  			'INTTEXT' => array( -				($utf8_pcre_properties) ? '!([\p{L}\p{N}\-+,_. ]+)!u' : '!([a-zA-Z0-9\-+,_. ]+)!u'	 =>	"$1" +				'!([\p{L}\p{N}\-+,_. ]+)!u'	 =>	"$1"  			),  			'IDENTIFIER' => array(  				'!([a-zA-Z0-9-_]+)!'	 =>	"$1" @@ -465,7 +466,7 @@ class acp_bbcodes  			'EMAIL' => '(' . get_preg_expression('email') . ')',  			'TEXT' => '(.*?)',  			'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)', -			'INTTEXT' => ($utf8_pcre_properties) ? '([\p{L}\p{N}\-+,_. ]+)' : '([a-zA-Z0-9\-+,_. ]+)', +			'INTTEXT' => '([\p{L}\p{N}\-+,_. ]+)',  			'IDENTIFIER' => '([a-zA-Z0-9-_]+)',  			'COLOR' => '([a-zA-Z]+|#[0-9abcdefABCDEF]+)',  			'NUMBER' => '([0-9]+)', @@ -473,7 +474,7 @@ class acp_bbcodes  		$pad = 0;  		$modifiers = 'i'; -		$modifiers .= ($utf8 && $utf8_pcre_properties) ? 'u' : ''; +		$modifiers .= ($utf8) ? 'u' : '';  		if (preg_match_all('/\{(' . implode('|', array_keys($tokens)) . ')[0-9]*\}/i', $bbcode_match, $m))  		{ @@ -488,7 +489,9 @@ class acp_bbcodes  				if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))  				{  					$repad = $pad + sizeof(array_unique($repad[0])); -					$replace = preg_replace('/(?<!\\\\)\$([0-9]+)/e', "'\${' . (\$1 + \$pad) . '}'", $replace); +					$replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) { +						return '${' . ($match[1] + $pad) . '}'; +					}, $replace);  					$pad = $repad;  				} @@ -553,10 +556,18 @@ class acp_bbcodes  			trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);  		} -		$fp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_match); -		$fp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_replace); -		$sp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_match); -		$sp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_replace); +		$fp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { +			return strtolower($match[0]); +		}, $fp_match); +		$fp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { +			return strtolower($match[0]); +		}, $fp_replace); +		$sp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { +			return strtolower($match[0]); +		}, $sp_match); +		$sp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { +			return strtolower($match[0]); +		}, $sp_replace);  		return array(  			'bbcode_tag'				=> $bbcode_tag, diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php index 4a1c74fd77..6e636d2f7d 100644 --- a/phpBB/includes/acp/acp_board.php +++ b/phpBB/includes/acp/acp_board.php @@ -30,13 +30,13 @@ class acp_board  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template; +		global $db, $user, $auth, $template, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; -		global $cache, $phpbb_container, $phpbb_dispatcher; +		global $cache, $phpbb_container, $phpbb_dispatcher, $phpbb_log;  		$user->add_lang('acp/board'); -		$action	= request_var('action', ''); +		$action	= $request->variable('action', '');  		$submit = (isset($_POST['submit']) || isset($_POST['allow_quick_reply_enable'])) ? true : false;  		$form_key = 'acp_board'; @@ -94,6 +94,7 @@ class acp_board  						'allow_bbcode'			=> array('lang' => 'ALLOW_BBCODE',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'allow_smilies'			=> array('lang' => 'ALLOW_SMILIES',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'allow_sig'				=> array('lang' => 'ALLOW_SIG',				'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), +						'allow_board_notifications'		=> array('lang' => 'ALLOW_BOARD_NOTIFICATIONS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'allow_nocensors'		=> array('lang' => 'ALLOW_NO_CENSORS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),  						'allow_bookmarks'		=> array('lang' => 'ALLOW_BOOKMARKS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),  						'allow_birthdays'		=> array('lang' => 'ALLOW_BIRTHDAYS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), @@ -115,6 +116,7 @@ class acp_board  			break;  			case 'avatar': +				/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  				$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  				$avatar_drivers = $phpbb_avatar_manager->get_all_drivers(); @@ -483,7 +485,7 @@ class acp_board  		}  		$this->new_config = $config; -		$cfg_array = (isset($_REQUEST['config'])) ? utf8_normalize_nfc(request_var('config', array('' => ''), true)) : $this->new_config; +		$cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => ''), true) : $this->new_config;  		$error = array();  		// We validate the complete config if wished @@ -539,7 +541,7 @@ class acp_board  					// send the password to the output  					continue;  				} -				set_config($config_name, $config_value); +				$config->set($config_name, $config_value);  				if ($config_name == 'allow_quick_reply' && isset($_POST['allow_quick_reply_enable']))  				{ @@ -561,6 +563,7 @@ class acp_board  		if ($mode == 'auth')  		{  			// Retrieve a list of auth plugins and check their config values +			/* @var $auth_providers \phpbb\auth\provider_collection */  			$auth_providers = $phpbb_container->get('auth.provider_collection');  			$updated_auth_settings = false; @@ -575,7 +578,7 @@ class acp_board  					{  						if (!isset($config[$field]))  						{ -							set_config($field, ''); +							$config->set($field, '');  						}  						if (!isset($cfg_array[$field]) || strpos($field, 'legend') !== false) @@ -598,7 +601,7 @@ class acp_board  						if ($submit)  						{  							$updated_auth_settings = true; -							set_config($field, $config_value); +							$config->set($field, $config_value);  						}  					}  				} @@ -615,11 +618,11 @@ class acp_board  					{  						foreach ($old_auth_config as $config_name => $config_value)  						{ -							set_config($config_name, $config_value); +							$config->set($config_name, $config_value);  						}  						trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);  					} -					set_config('auth_method', basename($cfg_array['auth_method'])); +					$config->set('auth_method', basename($cfg_array['auth_method']));  				}  				else  				{ @@ -630,7 +633,7 @@ class acp_board  		if ($submit)  		{ -			add_log('admin', 'LOG_CONFIG_' . strtoupper($mode)); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_' . strtoupper($mode));  			$message = $user->lang('CONFIG_UPDATED');  			$message_type = E_USER_NOTICE; @@ -737,8 +740,9 @@ class acp_board  	{  		global $phpbb_root_path, $phpEx, $phpbb_container; -		$auth_plugins = array(); +		/* @var $auth_providers \phpbb\auth\provider_collection */  		$auth_providers = $phpbb_container->get('auth.provider_collection'); +		$auth_plugins = array();  		foreach ($auth_providers as $key => $value)  		{ @@ -1063,10 +1067,10 @@ class acp_board  	function store_feed_forums($option, $key)  	{ -		global $db, $cache; +		global $db, $cache, $request;  		// Get key -		$values = request_var($key, array(0 => 0)); +		$values = $request->variable($key, array(0 => 0));  		// Empty option bit for all forums  		$sql = 'UPDATE ' . FORUMS_TABLE . ' diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php index 1ea320e674..e0220ad0c3 100644 --- a/phpBB/includes/acp/acp_bots.php +++ b/phpBB/includes/acp/acp_bots.php @@ -25,13 +25,13 @@ class acp_bots  	function main($id, $mode)  	{ -		global $config, $db, $user, $auth, $template, $cache, $request; +		global $config, $db, $user, $auth, $template, $cache, $request, $phpbb_log;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix; -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$submit = (isset($_POST['submit'])) ? true : false; -		$mark	= request_var('mark', array(0)); -		$bot_id	= request_var('id', 0); +		$mark	= $request->variable('mark', array(0)); +		$bot_id	= $request->variable('id', 0);  		if (isset($_POST['add']))  		{ @@ -124,7 +124,7 @@ class acp_bots  						$cache->destroy('_bots'); -						add_log('admin', 'LOG_BOT_DELETE', implode(', ', $bot_name_ary)); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BOT_DELETE', false, array(implode(', ', $bot_name_ary)));  						trigger_error($user->lang['BOT_DELETED'] . adm_back_link($this->u_action));  					}  					else @@ -144,12 +144,12 @@ class acp_bots  				include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);  				$bot_row = array( -					'bot_name'		=> utf8_normalize_nfc(request_var('bot_name', '', true)), -					'bot_agent'		=> request_var('bot_agent', ''), -					'bot_ip'		=> request_var('bot_ip', ''), -					'bot_active'	=> request_var('bot_active', true), -					'bot_lang'		=> request_var('bot_lang', $config['default_lang']), -					'bot_style'		=> request_var('bot_style' , $config['default_style']), +					'bot_name'		=> $request->variable('bot_name', '', true), +					'bot_agent'		=> $request->variable('bot_agent', ''), +					'bot_ip'		=> $request->variable('bot_ip', ''), +					'bot_active'	=> $request->variable('bot_active', true), +					'bot_lang'		=> $request->variable('bot_lang', $config['default_lang']), +					'bot_style'		=> $request->variable('bot_style' , $config['default_style']),  				);  				if ($submit) @@ -292,7 +292,7 @@ class acp_bots  						$cache->destroy('_bots'); -						add_log('admin', 'LOG_BOT_' . $log, $bot_row['bot_name']); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BOT_' . $log, false, array($bot_row['bot_name']));  						trigger_error($user->lang['BOT_' . $log] . adm_back_link($this->u_action));  					} diff --git a/phpBB/includes/acp/acp_captcha.php b/phpBB/includes/acp/acp_captcha.php index fa8d8fb6a9..1f6fbc2cae 100644 --- a/phpBB/includes/acp/acp_captcha.php +++ b/phpBB/includes/acp/acp_captcha.php @@ -25,17 +25,18 @@ class acp_captcha  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template; +		global $db, $user, $auth, $template, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container;  		$user->add_lang('acp/board'); +		/* @var $factory \phpbb\captcha\factory */  		$factory = $phpbb_container->get('captcha.factory');  		$captchas = $factory->get_captcha_types(); -		$selected = request_var('select_captcha', $config['captcha_plugin']); +		$selected = $request->variable('select_captcha', $config['captcha_plugin']);  		$selected = (isset($captchas['available'][$selected]) || isset($captchas['unavailable'][$selected])) ? $selected : $config['captcha_plugin']; -		$configure = request_var('configure', false); +		$configure = $request->variable('configure', false);  		// Oh, they are just here for the view  		if (isset($_GET['captcha_demo'])) @@ -64,13 +65,13 @@ class acp_captcha  			$form_key = 'acp_captcha';  			add_form_key($form_key); -			$submit = request_var('main_submit', false); +			$submit = $request->variable('main_submit', false);  			if ($submit && check_form_key($form_key))  			{  				foreach ($config_vars as $config_var => $options)  				{ -					set_config($config_var, request_var($config_var, $options['default'])); +					$config->set($config_var, $request->variable($config_var, $options['default']));  				}  				if ($selected !== $config['captcha_plugin']) @@ -81,11 +82,11 @@ class acp_captcha  						$old_captcha = $factory->get_instance($config['captcha_plugin']);  						$old_captcha->uninstall(); -						set_config('captcha_plugin', $selected); +						$config->set('captcha_plugin', $selected);  						$new_captcha = $factory->get_instance($config['captcha_plugin']);  						$new_captcha->install(); -						add_log('admin', 'LOG_CONFIG_VISUAL'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');  					}  					else  					{ @@ -117,7 +118,7 @@ class acp_captcha  				foreach ($config_vars as $config_var => $options)  				{ -					$template->assign_var($options['tpl'], (isset($_POST[$config_var])) ? request_var($config_var, $options['default']) : $config[$config_var]) ; +					$template->assign_var($options['tpl'], (isset($_POST[$config_var])) ? $request->variable($config_var, $options['default']) : $config[$config_var]) ;  				}  				$template->assign_vars(array( diff --git a/phpBB/includes/acp/acp_contact.php b/phpBB/includes/acp/acp_contact.php index 4e46df21e0..1a4d5b95a3 100644 --- a/phpBB/includes/acp/acp_contact.php +++ b/phpBB/includes/acp/acp_contact.php @@ -48,6 +48,7 @@ class acp_contact  			include($phpbb_root_path . 'includes/message_parser.' . $phpEx);  		} +		/* @var $config_text \phpbb\config\db_text */  		$config_text = $phpbb_container->get('config_text');  		$contact_admin_data			= $config_text->get_array(array( @@ -104,6 +105,9 @@ class acp_contact  		$contact_admin_edit = generate_text_for_edit($contact_admin_info, $contact_admin_info_uid, $contact_admin_info_flags); +		/** @var \phpbb\controller\helper $controller_helper */ +		$controller_helper = $phpbb_container->get('controller.helper'); +  		$template->assign_vars(array(  			'ERRORS'			=> $error,  			'CONTACT_ENABLED'	=> $config['contact_admin_form_enable'], @@ -115,7 +119,7 @@ class acp_contact  			'S_SMILIES_DISABLE_CHECKED'		=> !$contact_admin_edit['allow_smilies'],  			'S_MAGIC_URL_DISABLE_CHECKED'	=> !$contact_admin_edit['allow_urls'], -			'BBCODE_STATUS'			=> $user->lang('BBCODE_IS_ON', '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'), +			'BBCODE_STATUS'			=> $user->lang('BBCODE_IS_ON', '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),  			'SMILIES_STATUS'		=> $user->lang['SMILIES_ARE_ON'],  			'IMG_STATUS'			=> $user->lang['IMAGES_ARE_ON'],  			'FLASH_STATUS'			=> $user->lang['FLASH_IS_ON'], diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php index 9666ac5b6e..984301a38f 100644 --- a/phpBB/includes/acp/acp_database.php +++ b/phpBB/includes/acp/acp_database.php @@ -26,17 +26,17 @@ class acp_database  	function main($id, $mode)  	{ -		global $cache, $db, $user, $auth, $template, $table_prefix; -		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; +		global $cache, $db, $user, $template, $table_prefix, $request; +		global $phpbb_root_path, $phpbb_container, $phpbb_log; -		$this->db_tools = new \phpbb\db\tools($db); +		$this->db_tools = $phpbb_container->get('dbal.tools');  		$user->add_lang('acp/database');  		$this->tpl_name = 'acp_database';  		$this->page_title = 'ACP_DATABASE'; -		$action	= request_var('action', ''); +		$action	= $request->variable('action', '');  		$submit = (isset($_POST['submit'])) ? true : false;  		$template->assign_vars(array( @@ -52,10 +52,10 @@ class acp_database  				switch ($action)  				{  					case 'download': -						$type	= request_var('type', ''); -						$table	= array_intersect($this->db_tools->sql_list_tables(), request_var('table', array(''))); -						$format	= request_var('method', ''); -						$where	= request_var('where', ''); +						$type	= $request->variable('type', ''); +						$table	= array_intersect($this->db_tools->sql_list_tables(), $request->variable('table', array(''))); +						$format	= $request->variable('method', ''); +						$where	= $request->variable('where', '');  						if (!sizeof($table))  						{ @@ -90,36 +90,9 @@ class acp_database  						$time = time();  						$filename = 'backup_' . $time . '_' . unique_id(); -						switch ($db->get_sql_layer()) -						{ -							case 'mysqli': -							case 'mysql4': -							case 'mysql': -								$extractor = new mysql_extractor($format, $filename, $time, $download, $store); -							break; - -							case 'sqlite': -								$extractor = new sqlite_extractor($format, $filename, $time, $download, $store); -							break; -							case 'sqlite3': -								$extractor = new sqlite3_extractor($format, $filename, $time, $download, $store); -							break; - -							case 'postgres': -								$extractor = new postgres_extractor($format, $filename, $time, $download, $store); -							break; - -							case 'oracle': -								$extractor = new oracle_extractor($format, $filename, $time, $download, $store); -							break; - -							case 'mssql': -							case 'mssql_odbc': -							case 'mssqlnative': -								$extractor = new mssql_extractor($format, $filename, $time, $download, $store); -							break; -						} +						$extractor = $phpbb_container->get('dbal.extractor'); +						$extractor->init_extractor($format, $filename, $time, $download, $store);  						$extractor->write_start($table_prefix); @@ -165,7 +138,7 @@ class acp_database  						$extractor->write_end(); -						add_log('admin', 'LOG_DB_BACKUP'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_BACKUP');  						if ($download == true)  						{ @@ -221,9 +194,9 @@ class acp_database  				switch ($action)  				{  					case 'submit': -						$delete = request_var('delete', ''); -						$file = request_var('file', ''); -						$download = request_var('download', ''); +						$delete = $request->variable('delete', ''); +						$file = $request->variable('file', ''); +						$download = $request->variable('download', '');  						if (!preg_match('#^backup_\d{10,}_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))  						{ @@ -242,7 +215,7 @@ class acp_database  							if (confirm_box(true))  							{  								unlink($file_name); -								add_log('admin', 'LOG_DB_DELETE'); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_DELETE');  								trigger_error($user->lang['BACKUP_DELETE'] . adm_back_link($this->u_action));  							}  							else @@ -395,7 +368,7 @@ class acp_database  							// Purge the cache due to updated data  							$cache->purge(); -							add_log('admin', 'LOG_DB_RESTORE'); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_RESTORE');  							trigger_error($user->lang['RESTORE_SUCCESS'] . adm_back_link($this->u_action));  							break;  						} @@ -461,1637 +434,6 @@ class acp_database  	}  } -class base_extractor -{ -	var $fh; -	var $fp; -	var $write; -	var $close; -	var $store; -	var $download; -	var $time; -	var $format; -	var $run_comp = false; - -	function base_extractor($format, $filename, $time, $download = false, $store = false) -	{ -		global $request; - -		$this->download = $download; -		$this->store = $store; -		$this->time = $time; -		$this->format = $format; - -		switch ($format) -		{ -			case 'text': -				$ext = '.sql'; -				$open = 'fopen'; -				$this->write = 'fwrite'; -				$this->close = 'fclose'; -				$mimetype = 'text/x-sql'; -			break; -			case 'bzip2': -				$ext = '.sql.bz2'; -				$open = 'bzopen'; -				$this->write = 'bzwrite'; -				$this->close = 'bzclose'; -				$mimetype = 'application/x-bzip2'; -			break; -			case 'gzip': -				$ext = '.sql.gz'; -				$open = 'gzopen'; -				$this->write = 'gzwrite'; -				$this->close = 'gzclose'; -				$mimetype = 'application/x-gzip'; -			break; -		} - -		if ($download == true) -		{ -			$name = $filename . $ext; -			header('Cache-Control: private, no-cache'); -			header("Content-Type: $mimetype; name=\"$name\""); -			header("Content-disposition: attachment; filename=$name"); - -			switch ($format) -			{ -				case 'bzip2': -					ob_start(); -				break; - -				case 'gzip': -					if (strpos($request->header('Accept-Encoding'), 'gzip') !== false && strpos(strtolower($request->header('User-Agent')), 'msie') === false) -					{ -						ob_start('ob_gzhandler'); -					} -					else -					{ -						$this->run_comp = true; -					} -				break; -			} -		} - -		if ($store == true) -		{ -			global $phpbb_root_path; -			$file = $phpbb_root_path . 'store/' . $filename . $ext; - -			$this->fp = $open($file, 'w'); - -			if (!$this->fp) -			{ -				trigger_error('FILE_WRITE_FAIL', E_USER_ERROR); -			} -		} -	} - -	function write_end() -	{ -		static $close; - -		if ($this->store) -		{ -			if ($close === null) -			{ -				$close = $this->close; -			} -			$close($this->fp); -		} - -		// bzip2 must be written all the way at the end -		if ($this->download && $this->format === 'bzip2') -		{ -			$c = ob_get_clean(); -			echo bzcompress($c); -		} -	} - -	function flush($data) -	{ -		static $write; -		if ($this->store === true) -		{ -			if ($write === null) -			{ -				$write = $this->write; -			} -			$write($this->fp, $data); -		} - -		if ($this->download === true) -		{ -			if ($this->format === 'bzip2' || $this->format === 'text' || ($this->format === 'gzip' && !$this->run_comp)) -			{ -				echo $data; -			} - -			// we can write the gzip data as soon as we get it -			if ($this->format === 'gzip') -			{ -				if ($this->run_comp) -				{ -					echo gzencode($data); -				} -				else -				{ -					ob_flush(); -					flush(); -				} -			} -		} -	} -} - -class mysql_extractor extends base_extractor -{ -	function write_start($table_prefix) -	{ -		$sql_data = "#\n"; -		$sql_data .= "# phpBB Backup Script\n"; -		$sql_data .= "# Dump of tables for $table_prefix\n"; -		$sql_data .= "# DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n"; -		$sql_data .= "#\n"; -		$this->flush($sql_data); -	} - -	function write_table($table_name) -	{ -		global $db; -		static $new_extract; - -		if ($new_extract === null) -		{ -			if ($db->get_sql_layer() === 'mysqli' || version_compare($db->sql_server_info(true), '3.23.20', '>=')) -			{ -				$new_extract = true; -			} -			else -			{ -				$new_extract = false; -			} -		} - -		if ($new_extract) -		{ -			$this->new_write_table($table_name); -		} -		else -		{ -			$this->old_write_table($table_name); -		} -	} - -	function write_data($table_name) -	{ -		global $db; -		if ($db->get_sql_layer() === 'mysqli') -		{ -			$this->write_data_mysqli($table_name); -		} -		else -		{ -			$this->write_data_mysql($table_name); -		} -	} - -	function write_data_mysqli($table_name) -	{ -		global $db; -		$sql = "SELECT * -			FROM $table_name"; -		$result = mysqli_query($db->get_db_connect_id(), $sql, MYSQLI_USE_RESULT); -		if ($result != false) -		{ -			$fields_cnt = mysqli_num_fields($result); - -			// Get field information -			$field = mysqli_fetch_fields($result); -			$field_set = array(); - -			for ($j = 0; $j < $fields_cnt; $j++) -			{ -				$field_set[] = $field[$j]->name; -			} - -			$search			= array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"'); -			$replace		= array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"'); -			$fields			= implode(', ', $field_set); -			$sql_data		= 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES '; -			$first_set		= true; -			$query_len		= 0; -			$max_len		= get_usable_memory(); - -			while ($row = mysqli_fetch_row($result)) -			{ -				$values	= array(); -				if ($first_set) -				{ -					$query = $sql_data . '('; -				} -				else -				{ -					$query  .= ',('; -				} - -				for ($j = 0; $j < $fields_cnt; $j++) -				{ -					if (!isset($row[$j]) || is_null($row[$j])) -					{ -						$values[$j] = 'NULL'; -					} -					else if (($field[$j]->flags & 32768) && !($field[$j]->flags & 1024)) -					{ -						$values[$j] = $row[$j]; -					} -					else -					{ -						$values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'"; -					} -				} -				$query .= implode(', ', $values) . ')'; - -				$query_len += strlen($query); -				if ($query_len > $max_len) -				{ -					$this->flush($query . ";\n\n"); -					$query = ''; -					$query_len = 0; -					$first_set = true; -				} -				else -				{ -					$first_set = false; -				} -			} -			mysqli_free_result($result); - -			// check to make sure we have nothing left to flush -			if (!$first_set && $query) -			{ -				$this->flush($query . ";\n\n"); -			} -		} -	} - -	function write_data_mysql($table_name) -	{ -		global $db; -		$sql = "SELECT * -			FROM $table_name"; -		$result = mysql_unbuffered_query($sql, $db->get_db_connect_id()); - -		if ($result != false) -		{ -			$fields_cnt = mysql_num_fields($result); - -			// Get field information -			$field = array(); -			for ($i = 0; $i < $fields_cnt; $i++) -			{ -				$field[] = mysql_fetch_field($result, $i); -			} -			$field_set = array(); - -			for ($j = 0; $j < $fields_cnt; $j++) -			{ -				$field_set[] = $field[$j]->name; -			} - -			$search			= array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"'); -			$replace		= array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"'); -			$fields			= implode(', ', $field_set); -			$sql_data		= 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES '; -			$first_set		= true; -			$query_len		= 0; -			$max_len		= get_usable_memory(); - -			while ($row = mysql_fetch_row($result)) -			{ -				$values = array(); -				if ($first_set) -				{ -					$query = $sql_data . '('; -				} -				else -				{ -					$query  .= ',('; -				} - -				for ($j = 0; $j < $fields_cnt; $j++) -				{ -					if (!isset($row[$j]) || is_null($row[$j])) -					{ -						$values[$j] = 'NULL'; -					} -					else if ($field[$j]->numeric && ($field[$j]->type !== 'timestamp')) -					{ -						$values[$j] = $row[$j]; -					} -					else -					{ -						$values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'"; -					} -				} -				$query .= implode(', ', $values) . ')'; - -				$query_len += strlen($query); -				if ($query_len > $max_len) -				{ -					$this->flush($query . ";\n\n"); -					$query = ''; -					$query_len = 0; -					$first_set = true; -				} -				else -				{ -					$first_set = false; -				} -			} -			mysql_free_result($result); - -			// check to make sure we have nothing left to flush -			if (!$first_set && $query) -			{ -				$this->flush($query . ";\n\n"); -			} -		} -	} - -	function new_write_table($table_name) -	{ -		global $db; - -		$sql = 'SHOW CREATE TABLE ' . $table_name; -		$result = $db->sql_query($sql); -		$row = $db->sql_fetchrow($result); - -		$sql_data = '# Table: ' . $table_name . "\n"; -		$sql_data .= "DROP TABLE IF EXISTS $table_name;\n"; -		$this->flush($sql_data . $row['Create Table'] . ";\n\n"); - -		$db->sql_freeresult($result); -	} - -	function old_write_table($table_name) -	{ -		global $db; - -		$sql_data = '# Table: ' . $table_name . "\n"; -		$sql_data .= "DROP TABLE IF EXISTS $table_name;\n"; -		$sql_data .= "CREATE TABLE $table_name(\n"; -		$rows = array(); - -		$sql = "SHOW FIELDS -			FROM $table_name"; -		$result = $db->sql_query($sql); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$line = '   ' . $row['Field'] . ' ' . $row['Type']; - -			if (!is_null($row['Default'])) -			{ -				$line .= " DEFAULT '{$row['Default']}'"; -			} - -			if ($row['Null'] != 'YES') -			{ -				$line .= ' NOT NULL'; -			} - -			if ($row['Extra'] != '') -			{ -				$line .= ' ' . $row['Extra']; -			} - -			$rows[] = $line; -		} -		$db->sql_freeresult($result); - -		$sql = "SHOW KEYS -			FROM $table_name"; - -		$result = $db->sql_query($sql); - -		$index = array(); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$kname = $row['Key_name']; - -			if ($kname != 'PRIMARY') -			{ -				if ($row['Non_unique'] == 0) -				{ -					$kname = "UNIQUE|$kname"; -				} -			} - -			if ($row['Sub_part']) -			{ -				$row['Column_name'] .= '(' . $row['Sub_part'] . ')'; -			} -			$index[$kname][] = $row['Column_name']; -		} -		$db->sql_freeresult($result); - -		foreach ($index as $key => $columns) -		{ -			$line = '   '; - -			if ($key == 'PRIMARY') -			{ -				$line .= 'PRIMARY KEY (' . implode(', ', $columns) . ')'; -			} -			else if (strpos($key, 'UNIQUE') === 0) -			{ -				$line .= 'UNIQUE ' . substr($key, 7) . ' (' . implode(', ', $columns) . ')'; -			} -			else if (strpos($key, 'FULLTEXT') === 0) -			{ -				$line .= 'FULLTEXT ' . substr($key, 9) . ' (' . implode(', ', $columns) . ')'; -			} -			else -			{ -				$line .= "KEY $key (" . implode(', ', $columns) . ')'; -			} - -			$rows[] = $line; -		} - -		$sql_data .= implode(",\n", $rows); -		$sql_data .= "\n);\n\n"; - -		$this->flush($sql_data); -	} -} - -class sqlite_extractor extends base_extractor -{ -	function write_start($prefix) -	{ -		$sql_data = "--\n"; -		$sql_data .= "-- phpBB Backup Script\n"; -		$sql_data .= "-- Dump of tables for $prefix\n"; -		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n"; -		$sql_data .= "--\n"; -		$sql_data .= "BEGIN TRANSACTION;\n"; -		$this->flush($sql_data); -	} - -	function write_table($table_name) -	{ -		global $db; -		$sql_data = '-- Table: ' . $table_name . "\n"; -		$sql_data .= "DROP TABLE $table_name;\n"; - -		$sql = "SELECT sql -			FROM sqlite_master -			WHERE type = 'table' -				AND name = '" . $db->sql_escape($table_name) . "' -			ORDER BY type DESC, name;"; -		$result = $db->sql_query($sql); -		$row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		// Create Table -		$sql_data .= $row['sql'] . ";\n"; - -		$result = $db->sql_query("PRAGMA index_list('" . $db->sql_escape($table_name) . "');"); - -		$ar = array(); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$ar[] = $row; -		} -		$db->sql_freeresult($result); - -		foreach ($ar as $value) -		{ -			if (strpos($value['name'], 'autoindex') !== false) -			{ -				continue; -			} - -			$result = $db->sql_query("PRAGMA index_info('" . $db->sql_escape($value['name']) . "');"); - -			$fields = array(); -			while ($row = $db->sql_fetchrow($result)) -			{ -				$fields[] = $row['name']; -			} -			$db->sql_freeresult($result); - -			$sql_data .= 'CREATE ' . ($value['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $value['name'] . ' on ' . $table_name . ' (' . implode(', ', $fields) . ");\n"; -		} - -		$this->flush($sql_data . "\n"); -	} - -	function write_data($table_name) -	{ -		global $db; - -		$col_types = sqlite_fetch_column_types($db->get_db_connect_id(), $table_name); - -		$sql = "SELECT * -			FROM $table_name"; -		$result = sqlite_unbuffered_query($db->get_db_connect_id(), $sql); -		$rows = sqlite_fetch_all($result, SQLITE_ASSOC); -		$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES ('; -		foreach ($rows as $row) -		{ -			foreach ($row as $column_name => $column_data) -			{ -				if (is_null($column_data)) -				{ -					$row[$column_name] = 'NULL'; -				} -				else if ($column_data == '') -				{ -					$row[$column_name] = "''"; -				} -				else if (strpos($col_types[$column_name], 'text') !== false || strpos($col_types[$column_name], 'char') !== false || strpos($col_types[$column_name], 'blob') !== false) -				{ -					$row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data)); -				} -			} -			$this->flush($sql_insert . implode(', ', $row) . ");\n"); -		} -	} - -	function write_end() -	{ -		$this->flush("COMMIT;\n"); -		parent::write_end(); -	} -} - -class sqlite3_extractor extends base_extractor -{ -	function write_start($prefix) -	{ -		$sql_data = "--\n"; -		$sql_data .= "-- phpBB Backup Script\n"; -		$sql_data .= "-- Dump of tables for $prefix\n"; -		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n"; -		$sql_data .= "--\n"; -		$sql_data .= "BEGIN TRANSACTION;\n"; -		$this->flush($sql_data); -	} - -	function write_table($table_name) -	{ -		global $db; -		$sql_data = '-- Table: ' . $table_name . "\n"; -		$sql_data .= "DROP TABLE $table_name;\n"; - -		$sql = "SELECT sql -			FROM sqlite_master -			WHERE type = 'table' -				AND name = '" . $db->sql_escape($table_name) . "' -			ORDER BY name ASC;"; -		$result = $db->sql_query($sql); -		$row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		// Create Table -		$sql_data .= $row['sql'] . ";\n"; - -		$result = $db->sql_query("PRAGMA index_list('" . $db->sql_escape($table_name) . "');"); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			if (strpos($row['name'], 'autoindex') !== false) -			{ -				continue; -			} - -			$result2 = $db->sql_query("PRAGMA index_info('" . $db->sql_escape($row['name']) . "');"); - -			$fields = array(); -			while ($row2 = $db->sql_fetchrow($result2)) -			{ -				$fields[] = $row2['name']; -			} -			$db->sql_freeresult($result2); - -			$sql_data .= 'CREATE ' . ($row['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $row['name'] . ' ON ' . $table_name . ' (' . implode(', ', $fields) . ");\n"; -		} -		$db->sql_freeresult($result); - -		$this->flush($sql_data . "\n"); -	} - -	function write_data($table_name) -	{ -		global $db; - -		$result = $db->sql_query("PRAGMA table_info('" . $db->sql_escape($table_name) . "');"); - -		$col_types = array(); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$col_types[$row['name']] = $row['type']; -		} -		$db->sql_freeresult($result); - -		$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES ('; - -		$sql = "SELECT * -			FROM $table_name"; -		$result = $db->sql_query($sql); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			foreach ($row as $column_name => $column_data) -			{ -				if (is_null($column_data)) -				{ -					$row[$column_name] = 'NULL'; -				} -				else if ($column_data === '') -				{ -					$row[$column_name] = "''"; -				} -				else if (stripos($col_types[$column_name], 'text') !== false || stripos($col_types[$column_name], 'char') !== false || stripos($col_types[$column_name], 'blob') !== false) -				{ -					$row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data)); -				} -			} -			$this->flush($sql_insert . implode(', ', $row) . ");\n"); -		} -	} - -	function write_end() -	{ -		$this->flush("COMMIT;\n"); -		parent::write_end(); -	} -} - -class postgres_extractor extends base_extractor -{ -	function write_start($prefix) -	{ -		$sql_data = "--\n"; -		$sql_data .= "-- phpBB Backup Script\n"; -		$sql_data .= "-- Dump of tables for $prefix\n"; -		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n"; -		$sql_data .= "--\n"; -		$sql_data .= "BEGIN TRANSACTION;\n"; -		$this->flush($sql_data); -	} - -	function write_table($table_name) -	{ -		global $db; -		static $domains_created = array(); - -		$sql = "SELECT a.domain_name, a.data_type, a.character_maximum_length, a.domain_default -			FROM INFORMATION_SCHEMA.domains a, INFORMATION_SCHEMA.column_domain_usage b -			WHERE a.domain_name = b.domain_name -				AND b.table_name = '{$table_name}'"; -		$result = $db->sql_query($sql); -		while ($row = $db->sql_fetchrow($result)) -		{ -			if (empty($domains_created[$row['domain_name']])) -			{ -				$domains_created[$row['domain_name']] = true; -				//$sql_data = "DROP DOMAIN {$row['domain_name']};\n"; -				$sql_data = "CREATE DOMAIN {$row['domain_name']} as {$row['data_type']}"; -				if (!empty($row['character_maximum_length'])) -				{ -					$sql_data .= '(' . $row['character_maximum_length'] . ')'; -				} -				$sql_data .= ' NOT NULL'; -				if (!empty($row['domain_default'])) -				{ -					$sql_data .= ' DEFAULT ' . $row['domain_default']; -				} -				$this->flush($sql_data . ";\n"); -			} -		} -		$db->sql_freeresult($result); - -		$sql_data = '-- Table: ' . $table_name . "\n"; -		$sql_data .= "DROP TABLE $table_name;\n"; -		// PGSQL does not "tightly" bind sequences and tables, we must guess... -		$sql = "SELECT relname -			FROM pg_class -			WHERE relkind = 'S' -				AND relname = '{$table_name}_seq'"; -		$result = $db->sql_query($sql); -		// We don't even care about storing the results. We already know the answer if we get rows back. -		if ($db->sql_fetchrow($result)) -		{ -			$sql_data .= "DROP SEQUENCE {$table_name}_seq;\n"; -			$sql_data .= "CREATE SEQUENCE {$table_name}_seq;\n"; -		} -		$db->sql_freeresult($result); - -		$field_query = "SELECT a.attnum, a.attname as field, t.typname as type, a.attlen as length, a.atttypmod as lengthvar, a.attnotnull as notnull -			FROM pg_class c, pg_attribute a, pg_type t -			WHERE c.relname = '" . $db->sql_escape($table_name) . "' -				AND a.attnum > 0 -				AND a.attrelid = c.oid -				AND a.atttypid = t.oid -			ORDER BY a.attnum"; -		$result = $db->sql_query($field_query); - -		$sql_data .= "CREATE TABLE $table_name(\n"; -		$lines = array(); -		while ($row = $db->sql_fetchrow($result)) -		{ -			// Get the data from the table -			$sql_get_default = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault -				FROM pg_attrdef d, pg_class c -				WHERE (c.relname = '" . $db->sql_escape($table_name) . "') -					AND (c.oid = d.adrelid) -					AND d.adnum = " . $row['attnum']; -			$def_res = $db->sql_query($sql_get_default); -			$def_row = $db->sql_fetchrow($def_res); -			$db->sql_freeresult($def_res); - -			if (empty($def_row)) -			{ -				unset($row['rowdefault']); -			} -			else -			{ -				$row['rowdefault'] = $def_row['rowdefault']; -			} - -			if ($row['type'] == 'bpchar') -			{ -				// Internally stored as bpchar, but isn't accepted in a CREATE TABLE statement. -				$row['type'] = 'char'; -			} - -			$line = '  ' . $row['field'] . ' ' . $row['type']; - -			if (strpos($row['type'], 'char') !== false) -			{ -				if ($row['lengthvar'] > 0) -				{ -					$line .= '(' . ($row['lengthvar'] - 4) . ')'; -				} -			} - -			if (strpos($row['type'], 'numeric') !== false) -			{ -				$line .= '('; -				$line .= sprintf("%s,%s", (($row['lengthvar'] >> 16) & 0xffff), (($row['lengthvar'] - 4) & 0xffff)); -				$line .= ')'; -			} - -			if (isset($row['rowdefault'])) -			{ -				$line .= ' DEFAULT ' . $row['rowdefault']; -			} - -			if ($row['notnull'] == 't') -			{ -				$line .= ' NOT NULL'; -			} - -			$lines[] = $line; -		} -		$db->sql_freeresult($result); - -		// Get the listing of primary keys. -		$sql_pri_keys = "SELECT ic.relname as index_name, bc.relname as tab_name, ta.attname as column_name, i.indisunique as unique_key, i.indisprimary as primary_key -			FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia -			WHERE (bc.oid = i.indrelid) -				AND (ic.oid = i.indexrelid) -				AND (ia.attrelid = i.indexrelid) -				AND	(ta.attrelid = bc.oid) -				AND (bc.relname = '" . $db->sql_escape($table_name) . "') -				AND (ta.attrelid = i.indrelid) -				AND (ta.attnum = i.indkey[ia.attnum-1]) -			ORDER BY index_name, tab_name, column_name"; - -		$result = $db->sql_query($sql_pri_keys); - -		$index_create = $index_rows = $primary_key = array(); - -		// We do this in two steps. It makes placing the comma easier -		while ($row = $db->sql_fetchrow($result)) -		{ -			if ($row['primary_key'] == 't') -			{ -				$primary_key[] = $row['column_name']; -				$primary_key_name = $row['index_name']; -			} -			else -			{ -				// We have to store this all this info because it is possible to have a multi-column key... -				// we can loop through it again and build the statement -				$index_rows[$row['index_name']]['table'] = $table_name; -				$index_rows[$row['index_name']]['unique'] = ($row['unique_key'] == 't') ? true : false; -				$index_rows[$row['index_name']]['column_names'][] = $row['column_name']; -			} -		} -		$db->sql_freeresult($result); - -		if (!empty($index_rows)) -		{ -			foreach ($index_rows as $idx_name => $props) -			{ -				$index_create[] = 'CREATE ' . ($props['unique'] ? 'UNIQUE ' : '') . "INDEX $idx_name ON $table_name (" . implode(', ', $props['column_names']) . ");"; -			} -		} - -		if (!empty($primary_key)) -		{ -			$lines[] = "  CONSTRAINT $primary_key_name PRIMARY KEY (" . implode(', ', $primary_key) . ")"; -		} - -		// Generate constraint clauses for CHECK constraints -		$sql_checks = "SELECT conname as index_name, consrc -			FROM pg_constraint, pg_class bc -			WHERE conrelid = bc.oid -				AND bc.relname = '" . $db->sql_escape($table_name) . "' -				AND NOT EXISTS ( -					SELECT * -						FROM pg_constraint as c, pg_inherits as i -						WHERE i.inhrelid = pg_constraint.conrelid -							AND c.conname = pg_constraint.conname -							AND c.consrc = pg_constraint.consrc -							AND c.conrelid = i.inhparent -				)"; -		$result = $db->sql_query($sql_checks); - -		// Add the constraints to the sql file. -		while ($row = $db->sql_fetchrow($result)) -		{ -			if (!is_null($row['consrc'])) -			{ -				$lines[] = '  CONSTRAINT ' . $row['index_name'] . ' CHECK ' . $row['consrc']; -			} -		} -		$db->sql_freeresult($result); - -		$sql_data .= implode(", \n", $lines); -		$sql_data .= "\n);\n"; - -		if (!empty($index_create)) -		{ -			$sql_data .= implode("\n", $index_create) . "\n\n"; -		} -		$this->flush($sql_data); -	} - -	function write_data($table_name) -	{ -		global $db; -		// Grab all of the data from current table. -		$sql = "SELECT * -			FROM $table_name"; -		$result = $db->sql_query($sql); - -		$i_num_fields = pg_num_fields($result); -		$seq = ''; - -		for ($i = 0; $i < $i_num_fields; $i++) -		{ -			$ary_type[] = pg_field_type($result, $i); -			$ary_name[] = pg_field_name($result, $i); - -			$sql = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault -				FROM pg_attrdef d, pg_class c -				WHERE (c.relname = '{$table_name}') -					AND (c.oid = d.adrelid) -					AND d.adnum = " . strval($i + 1); -			$result2 = $db->sql_query($sql); -			if ($row = $db->sql_fetchrow($result2)) -			{ -				// Determine if we must reset the sequences -				if (strpos($row['rowdefault'], "nextval('") === 0) -				{ -					$seq .= "SELECT SETVAL('{$table_name}_seq',(select case when max({$ary_name[$i]})>0 then max({$ary_name[$i]})+1 else 1 end FROM {$table_name}));\n"; -				} -			} -		} - -		$this->flush("COPY $table_name (" . implode(', ', $ary_name) . ') FROM stdin;' . "\n"); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$schema_vals = array(); - -			// Build the SQL statement to recreate the data. -			for ($i = 0; $i < $i_num_fields; $i++) -			{ -				$str_val = $row[$ary_name[$i]]; - -				if (preg_match('#char|text|bool|bytea#i', $ary_type[$i])) -				{ -					$str_val = str_replace(array("\n", "\t", "\r", "\b", "\f", "\v"), array('\n', '\t', '\r', '\b', '\f', '\v'), addslashes($str_val)); -					$str_empty = ''; -				} -				else -				{ -					$str_empty = '\N'; -				} - -				if (empty($str_val) && $str_val !== '0') -				{ -					$str_val = $str_empty; -				} - -				$schema_vals[] = $str_val; -			} - -			// Take the ordered fields and their associated data and build it -			// into a valid sql statement to recreate that field in the data. -			$this->flush(implode("\t", $schema_vals) . "\n"); -		} -		$db->sql_freeresult($result); -		$this->flush("\\.\n"); - -		// Write out the sequence statements -		$this->flush($seq); -	} - -	function write_end() -	{ -		$this->flush("COMMIT;\n"); -		parent::write_end(); -	} -} - -class mssql_extractor extends base_extractor -{ -	function write_end() -	{ -		$this->flush("COMMIT\nGO\n"); -		parent::write_end(); -	} - -	function write_start($prefix) -	{ -		$sql_data = "--\n"; -		$sql_data .= "-- phpBB Backup Script\n"; -		$sql_data .= "-- Dump of tables for $prefix\n"; -		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n"; -		$sql_data .= "--\n"; -		$sql_data .= "BEGIN TRANSACTION\n"; -		$sql_data .= "GO\n"; -		$this->flush($sql_data); -	} - -	function write_table($table_name) -	{ -		global $db; -		$sql_data = '-- Table: ' . $table_name . "\n"; -		$sql_data .= "IF OBJECT_ID(N'$table_name', N'U') IS NOT NULL\n"; -		$sql_data .= "DROP TABLE $table_name;\n"; -		$sql_data .= "GO\n"; -		$sql_data .= "\nCREATE TABLE [$table_name] (\n"; -		$rows = array(); - -		$text_flag = false; - -		$sql = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') as IS_IDENTITY -			FROM INFORMATION_SCHEMA.COLUMNS -			WHERE TABLE_NAME = '$table_name'"; -		$result = $db->sql_query($sql); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$line = "\t[{$row['COLUMN_NAME']}] [{$row['DATA_TYPE']}]"; - -			if ($row['DATA_TYPE'] == 'text') -			{ -				$text_flag = true; -			} - -			if ($row['IS_IDENTITY']) -			{ -				$line .= ' IDENTITY (1 , 1)'; -			} - -			if ($row['CHARACTER_MAXIMUM_LENGTH'] && $row['DATA_TYPE'] !== 'text') -			{ -				$line .= ' (' . $row['CHARACTER_MAXIMUM_LENGTH'] . ')'; -			} - -			if ($row['IS_NULLABLE'] == 'YES') -			{ -				$line .= ' NULL'; -			} -			else -			{ -				$line .= ' NOT NULL'; -			} - -			if ($row['COLUMN_DEFAULT']) -			{ -				$line .= ' DEFAULT ' . $row['COLUMN_DEFAULT']; -			} - -			$rows[] = $line; -		} -		$db->sql_freeresult($result); - -		$sql_data .= implode(",\n", $rows); -		$sql_data .= "\n) ON [PRIMARY]"; - -		if ($text_flag) -		{ -			$sql_data .= " TEXTIMAGE_ON [PRIMARY]"; -		} - -		$sql_data .= "\nGO\n\n"; -		$rows = array(); - -		$sql = "SELECT CONSTRAINT_NAME, COLUMN_NAME -			FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE -			WHERE TABLE_NAME = '$table_name'"; -		$result = $db->sql_query($sql); -		while ($row = $db->sql_fetchrow($result)) -		{ -			if (!sizeof($rows)) -			{ -				$sql_data .= "ALTER TABLE [$table_name] WITH NOCHECK ADD\n"; -				$sql_data .= "\tCONSTRAINT [{$row['CONSTRAINT_NAME']}] PRIMARY KEY  CLUSTERED \n\t(\n"; -			} -			$rows[] = "\t\t[{$row['COLUMN_NAME']}]"; -		} -		if (sizeof($rows)) -		{ -			$sql_data .= implode(",\n", $rows); -			$sql_data .= "\n\t)  ON [PRIMARY] \nGO\n"; -		} -		$db->sql_freeresult($result); - -		$index = array(); -		$sql = "EXEC sp_statistics '$table_name'"; -		$result = $db->sql_query($sql); -		while ($row = $db->sql_fetchrow($result)) -		{ -			if ($row['TYPE'] == 3) -			{ -				$index[$row['INDEX_NAME']][] = '[' . $row['COLUMN_NAME'] . ']'; -			} -		} -		$db->sql_freeresult($result); - -		foreach ($index as $index_name => $column_name) -		{ -			$index[$index_name] = implode(', ', $column_name); -		} - -		foreach ($index as $index_name => $columns) -		{ -			$sql_data .= "\nCREATE  INDEX [$index_name] ON [$table_name]($columns) ON [PRIMARY]\nGO\n"; -		} -		$this->flush($sql_data); -	} - -	function write_data($table_name) -	{ -		global $db; - -		if ($db->get_sql_layer() === 'mssql') -		{ -			$this->write_data_mssql($table_name); -		} -		else if ($db->get_sql_layer() === 'mssqlnative') -		{ -			$this->write_data_mssqlnative($table_name); -		} -		else -		{ -			$this->write_data_odbc($table_name); -		} -	} - -	function write_data_mssql($table_name) -	{ -		global $db; -		$ary_type = $ary_name = array(); -		$ident_set = false; -		$sql_data = ''; - -		// Grab all of the data from current table. -		$sql = "SELECT * -			FROM $table_name"; -		$result = $db->sql_query($sql); - -		$retrieved_data = mssql_num_rows($result); - -		$i_num_fields = mssql_num_fields($result); - -		for ($i = 0; $i < $i_num_fields; $i++) -		{ -			$ary_type[$i] = mssql_field_type($result, $i); -			$ary_name[$i] = mssql_field_name($result, $i); -		} - -		if ($retrieved_data) -		{ -			$sql = "SELECT 1 as has_identity -				FROM INFORMATION_SCHEMA.COLUMNS -				WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1"; -			$result2 = $db->sql_query($sql); -			$row2 = $db->sql_fetchrow($result2); -			if (!empty($row2['has_identity'])) -			{ -				$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n"; -				$ident_set = true; -			} -			$db->sql_freeresult($result2); -		} - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$schema_vals = $schema_fields = array(); - -			// Build the SQL statement to recreate the data. -			for ($i = 0; $i < $i_num_fields; $i++) -			{ -				$str_val = $row[$ary_name[$i]]; - -				if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i])) -				{ -					$str_quote = ''; -					$str_empty = "''"; -					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val)); -				} -				else if (preg_match('#date|timestamp#i', $ary_type[$i])) -				{ -					if (empty($str_val)) -					{ -						$str_quote = ''; -					} -					else -					{ -						$str_quote = "'"; -					} -				} -				else -				{ -					$str_quote = ''; -					$str_empty = 'NULL'; -				} - -				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val))) -				{ -					$str_val = $str_empty; -				} - -				$schema_vals[$i] = $str_quote . $str_val . $str_quote; -				$schema_fields[$i] = $ary_name[$i]; -			} - -			// Take the ordered fields and their associated data and build it -			// into a valid sql statement to recreate that field in the data. -			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n"; - -			$this->flush($sql_data); -			$sql_data = ''; -		} -		$db->sql_freeresult($result); - -		if ($retrieved_data && $ident_set) -		{ -			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n"; -		} -		$this->flush($sql_data); -	} - -	function write_data_mssqlnative($table_name) -	{ -		global $db; -		$ary_type = $ary_name = array(); -		$ident_set = false; -		$sql_data = ''; - -		// Grab all of the data from current table. -		$sql = "SELECT * FROM $table_name"; -		$db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC)); -		$result = $db->sql_query($sql); - -		$retrieved_data = $db->mssqlnative_num_rows($result); - -		if (!$retrieved_data) -		{ -			$db->sql_freeresult($result); -			return; -		} - -		$sql = "SELECT COLUMN_NAME, DATA_TYPE -			FROM INFORMATION_SCHEMA.COLUMNS -			WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = '" . $db->sql_escape($table_name) . "'"; -		$result_fields = $db->sql_query($sql); - -		$i_num_fields = 0; -		while ($row = $db->sql_fetchrow($result_fields)) -		{ -			$ary_type[$i_num_fields] = $row['DATA_TYPE']; -			$ary_name[$i_num_fields] = $row['COLUMN_NAME']; -			$i_num_fields++; -		} -		$db->sql_freeresult($result_fields); - -		$sql = "SELECT 1 as has_identity -			FROM INFORMATION_SCHEMA.COLUMNS -			WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1"; -		$result2 = $db->sql_query($sql); -		$row2 = $db->sql_fetchrow($result2); - -		if (!empty($row2['has_identity'])) -		{ -			$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n"; -			$ident_set = true; -		} -		$db->sql_freeresult($result2); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$schema_vals = $schema_fields = array(); - -			// Build the SQL statement to recreate the data. -			for ($i = 0; $i < $i_num_fields; $i++) -			{ -				$str_val = $row[$ary_name[$i]]; - -				// defaults to type number - better quote just to be safe, so check for is_int too -				if (is_int($ary_type[$i]) || preg_match('#char|text|bool|varbinary#i', $ary_type[$i])) -				{ -					$str_quote = ''; -					$str_empty = "''"; -					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val)); -				} -				else if (preg_match('#date|timestamp#i', $ary_type[$i])) -				{ -					if (empty($str_val)) -					{ -						$str_quote = ''; -					} -					else -					{ -						$str_quote = "'"; -					} -				} -				else -				{ -					$str_quote = ''; -					$str_empty = 'NULL'; -				} - -				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val))) -				{ -					$str_val = $str_empty; -				} - -				$schema_vals[$i] = $str_quote . $str_val . $str_quote; -				$schema_fields[$i] = $ary_name[$i]; -			} - -			// Take the ordered fields and their associated data and build it -			// into a valid sql statement to recreate that field in the data. -			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n"; - -			$this->flush($sql_data); -			$sql_data = ''; -		} -		$db->sql_freeresult($result); - -		if ($ident_set) -		{ -			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n"; -		} -		$this->flush($sql_data); -	} - -	function write_data_odbc($table_name) -	{ -		global $db; -		$ary_type = $ary_name = array(); -		$ident_set = false; -		$sql_data = ''; - -		// Grab all of the data from current table. -		$sql = "SELECT * -			FROM $table_name"; -		$result = $db->sql_query($sql); - -		$retrieved_data = odbc_num_rows($result); - -		if ($retrieved_data) -		{ -			$sql = "SELECT 1 as has_identity -				FROM INFORMATION_SCHEMA.COLUMNS -				WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1"; -			$result2 = $db->sql_query($sql); -			$row2 = $db->sql_fetchrow($result2); -			if (!empty($row2['has_identity'])) -			{ -				$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n"; -				$ident_set = true; -			} -			$db->sql_freeresult($result2); -		} - -		$i_num_fields = odbc_num_fields($result); - -		for ($i = 0; $i < $i_num_fields; $i++) -		{ -			$ary_type[$i] = odbc_field_type($result, $i + 1); -			$ary_name[$i] = odbc_field_name($result, $i + 1); -		} - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$schema_vals = $schema_fields = array(); - -			// Build the SQL statement to recreate the data. -			for ($i = 0; $i < $i_num_fields; $i++) -			{ -				$str_val = $row[$ary_name[$i]]; - -				if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i])) -				{ -					$str_quote = ''; -					$str_empty = "''"; -					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val)); -				} -				else if (preg_match('#date|timestamp#i', $ary_type[$i])) -				{ -					if (empty($str_val)) -					{ -						$str_quote = ''; -					} -					else -					{ -						$str_quote = "'"; -					} -				} -				else -				{ -					$str_quote = ''; -					$str_empty = 'NULL'; -				} - -				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val))) -				{ -					$str_val = $str_empty; -				} - -				$schema_vals[$i] = $str_quote . $str_val . $str_quote; -				$schema_fields[$i] = $ary_name[$i]; -			} - -			// Take the ordered fields and their associated data and build it -			// into a valid sql statement to recreate that field in the data. -			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n"; - -			$this->flush($sql_data); - -			$sql_data = ''; - -		} -		$db->sql_freeresult($result); - -		if ($retrieved_data && $ident_set) -		{ -			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n"; -		} -		$this->flush($sql_data); -	} - -} - -class oracle_extractor extends base_extractor -{ -	function write_table($table_name) -	{ -		global $db; -		$sql_data = '-- Table: ' . $table_name . "\n"; -		$sql_data .= "DROP TABLE $table_name\n/\n"; -		$sql_data .= "\nCREATE TABLE $table_name (\n"; - -		$sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_PRECISION, DATA_LENGTH, NULLABLE, DATA_DEFAULT -			FROM ALL_TAB_COLS -			WHERE table_name = '{$table_name}'"; -		$result = $db->sql_query($sql); - -		$rows = array(); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$line = '  "' . $row['column_name'] . '" ' . $row['data_type']; - -			if ($row['data_type'] !== 'CLOB') -			{ -				if ($row['data_type'] !== 'VARCHAR2' && $row['data_type'] !== 'CHAR') -				{ -					$line .= '(' . $row['data_precision'] . ')'; -				} -				else -				{ -					$line .= '(' . $row['data_length'] . ')'; -				} -			} - -			if (!empty($row['data_default'])) -			{ -				$line .= ' DEFAULT ' . $row['data_default']; -			} - -			if ($row['nullable'] == 'N') -			{ -				$line .= ' NOT NULL'; -			} -			$rows[] = $line; -		} -		$db->sql_freeresult($result); - -		$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME -			FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B -			WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME -				AND B.CONSTRAINT_TYPE = 'P' -				AND A.TABLE_NAME = '{$table_name}'"; -		$result = $db->sql_query($sql); - -		$primary_key = array(); -		$contraint_name = ''; -		while ($row = $db->sql_fetchrow($result)) -		{ -			$constraint_name = '"' . $row['constraint_name'] . '"'; -			$primary_key[] = '"' . $row['column_name'] . '"'; -		} -		$db->sql_freeresult($result); - -		if (sizeof($primary_key)) -		{ -			$rows[] = "  CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')'; -		} - -		$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME -			FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B -			WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME -				AND B.CONSTRAINT_TYPE = 'U' -				AND A.TABLE_NAME = '{$table_name}'"; -		$result = $db->sql_query($sql); - -		$unique = array(); -		$contraint_name = ''; -		while ($row = $db->sql_fetchrow($result)) -		{ -			$constraint_name = '"' . $row['constraint_name'] . '"'; -			$unique[] = '"' . $row['column_name'] . '"'; -		} -		$db->sql_freeresult($result); - -		if (sizeof($unique)) -		{ -			$rows[] = "  CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')'; -		} - -		$sql_data .= implode(",\n", $rows); -		$sql_data .= "\n)\n/\n"; - -		$sql = "SELECT A.REFERENCED_NAME, C.* -			FROM USER_DEPENDENCIES A, USER_TRIGGERS B, USER_SEQUENCES C -			WHERE A.REFERENCED_TYPE = 'SEQUENCE' -				AND A.NAME = B.TRIGGER_NAME -				AND B.TABLE_NAME = '{$table_name}' -				AND C.SEQUENCE_NAME = A.REFERENCED_NAME"; -		$result = $db->sql_query($sql); - -		$type = request_var('type', ''); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$sql_data .= "\nDROP SEQUENCE \"{$row['referenced_name']}\"\n/\n"; -			$sql_data .= "\nCREATE SEQUENCE \"{$row['referenced_name']}\""; - -			if ($type == 'full') -			{ -				$sql_data .= ' START WITH ' . $row['last_number']; -			} - -			$sql_data .= "\n/\n"; -		} -		$db->sql_freeresult($result); - -		$sql = "SELECT DESCRIPTION, WHEN_CLAUSE, TRIGGER_BODY -			FROM USER_TRIGGERS -			WHERE TABLE_NAME = '{$table_name}'"; -		$result = $db->sql_query($sql); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$sql_data .= "\nCREATE OR REPLACE TRIGGER {$row['description']}WHEN ({$row['when_clause']})\n{$row['trigger_body']}\n/\n"; -		} -		$db->sql_freeresult($result); - -		$sql = "SELECT A.INDEX_NAME, B.COLUMN_NAME -			FROM USER_INDEXES A, USER_IND_COLUMNS B -			WHERE A.UNIQUENESS = 'NONUNIQUE' -				AND A.INDEX_NAME = B.INDEX_NAME -				AND B.TABLE_NAME = '{$table_name}'"; -		$result = $db->sql_query($sql); - -		$index = array(); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$index[$row['index_name']][] = $row['column_name']; -		} - -		foreach ($index as $index_name => $column_names) -		{ -			$sql_data .= "\nCREATE INDEX $index_name ON $table_name(" . implode(', ', $column_names) . ")\n/\n"; -		} -		$db->sql_freeresult($result); -		$this->flush($sql_data); -	} - -	function write_data($table_name) -	{ -		global $db; -		$ary_type = $ary_name = array(); - -		// Grab all of the data from current table. -		$sql = "SELECT * -			FROM $table_name"; -		$result = $db->sql_query($sql); - -		$i_num_fields = ocinumcols($result); - -		for ($i = 0; $i < $i_num_fields; $i++) -		{ -			$ary_type[$i] = ocicolumntype($result, $i + 1); -			$ary_name[$i] = ocicolumnname($result, $i + 1); -		} - -		$sql_data = ''; - -		while ($row = $db->sql_fetchrow($result)) -		{ -			$schema_vals = $schema_fields = array(); - -			// Build the SQL statement to recreate the data. -			for ($i = 0; $i < $i_num_fields; $i++) -			{ -				// Oracle uses uppercase - we use lowercase -				$str_val = $row[strtolower($ary_name[$i])]; - -				if (preg_match('#char|text|bool|raw|clob#i', $ary_type[$i])) -				{ -					$str_quote = ''; -					$str_empty = "''"; -					$str_val = sanitize_data_oracle($str_val); -				} -				else if (preg_match('#date|timestamp#i', $ary_type[$i])) -				{ -					if (empty($str_val)) -					{ -						$str_quote = ''; -					} -					else -					{ -						$str_quote = "'"; -					} -				} -				else -				{ -					$str_quote = ''; -					$str_empty = 'NULL'; -				} - -				if (empty($str_val) && $str_val !== '0') -				{ -					$str_val = $str_empty; -				} - -				$schema_vals[$i] = $str_quote . $str_val . $str_quote; -				$schema_fields[$i] = '"' . $ary_name[$i] . '"'; -			} - -			// Take the ordered fields and their associated data and build it -			// into a valid sql statement to recreate that field in the data. -			$sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ")\n/\n"; - -			$this->flush($sql_data); -		} -		$db->sql_freeresult($result); -	} - -	function write_start($prefix) -	{ -		$sql_data = "--\n"; -		$sql_data .= "-- phpBB Backup Script\n"; -		$sql_data .= "-- Dump of tables for $prefix\n"; -		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n"; -		$sql_data .= "--\n"; -		$this->flush($sql_data); -	} -} -  // get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P)  function get_usable_memory()  { diff --git a/phpBB/includes/acp/acp_disallow.php b/phpBB/includes/acp/acp_disallow.php index 4c8f3cc65b..2c27616748 100644 --- a/phpBB/includes/acp/acp_disallow.php +++ b/phpBB/includes/acp/acp_disallow.php @@ -25,7 +25,7 @@ class acp_disallow  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		include($phpbb_root_path . 'includes/functions_user.' . $phpEx); @@ -49,7 +49,7 @@ class acp_disallow  		if ($disallow)  		{ -			$disallowed_user = str_replace('*', '%', utf8_normalize_nfc(request_var('disallowed_user', '', true))); +			$disallowed_user = str_replace('*', '%', $request->variable('disallowed_user', '', true));  			if (!$disallowed_user)  			{ @@ -74,13 +74,13 @@ class acp_disallow  			$cache->destroy('_disallowed_usernames');  			$message = $user->lang['DISALLOW_SUCCESSFUL']; -			add_log('admin', 'LOG_DISALLOW_ADD', str_replace('%', '*', $disallowed_user)); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DISALLOW_ADD', false, array(str_replace('%', '*', $disallowed_user)));  			trigger_error($message . adm_back_link($this->u_action));  		}  		else if ($allow)  		{ -			$disallowed_id = request_var('disallowed_id', 0); +			$disallowed_id = $request->variable('disallowed_id', 0);  			if (!$disallowed_id)  			{ @@ -93,7 +93,7 @@ class acp_disallow  			$cache->destroy('_disallowed_usernames'); -			add_log('admin', 'LOG_DISALLOW_DELETE'); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DISALLOW_DELETE');  			trigger_error($user->lang['DISALLOWED_DELETED'] . adm_back_link($this->u_action));  		} diff --git a/phpBB/includes/acp/acp_email.php b/phpBB/includes/acp/acp_email.php index fda9d50779..ebc4a86de3 100644 --- a/phpBB/includes/acp/acp_email.php +++ b/phpBB/includes/acp/acp_email.php @@ -25,7 +25,7 @@ class acp_email  	function main($id, $mode)  	{ -		global $config, $db, $user, $auth, $template, $cache; +		global $config, $db, $user, $auth, $template, $cache, $phpbb_log, $request;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $phpbb_dispatcher;  		$user->add_lang('acp/email'); @@ -39,11 +39,11 @@ class acp_email  		$submit = (isset($_POST['submit'])) ? true : false;  		$error = array(); -		$usernames	= request_var('usernames', '', true); +		$usernames	= $request->variable('usernames', '', true);  		$usernames	= (!empty($usernames)) ? explode("\n", $usernames) : array(); -		$group_id	= request_var('g', 0); -		$subject	= utf8_normalize_nfc(request_var('subject', '', true)); -		$message	= utf8_normalize_nfc(request_var('message', '', true)); +		$group_id	= $request->variable('g', 0); +		$subject	= $request->variable('subject', '', true); +		$message	= $request->variable('message', '', true);  		// Do the job ...  		if ($submit) @@ -51,7 +51,7 @@ class acp_email  			// Error checking needs to go here ... if no subject and/or no message then skip  			// over the send and return to the form  			$use_queue		= (isset($_POST['send_immediately'])) ? false : true; -			$priority		= request_var('mail_priority_flag', MAIL_NORMAL_PRIORITY); +			$priority		= $request->variable('mail_priority_flag', MAIL_NORMAL_PRIORITY);  			if (!check_form_key($form_key))  			{ @@ -263,7 +263,7 @@ class acp_email  				{  					if (!empty($usernames))  					{ -						add_log('admin', 'LOG_MASS_EMAIL', implode(', ', utf8_normalize_nfc($usernames))); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MASS_EMAIL', false, array(implode(', ', utf8_normalize_nfc($usernames))));  					}  					else  					{ @@ -277,7 +277,7 @@ class acp_email  							$group_name = $user->lang['ALL_USERS'];  						} -						add_log('admin', 'LOG_MASS_EMAIL', $group_name); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MASS_EMAIL', false, array($group_name));  					}  				} diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php index 193483050c..0373a3b115 100644 --- a/phpBB/includes/acp/acp_extensions.php +++ b/phpBB/includes/acp/acp_extensions.php @@ -70,7 +70,7 @@ class acp_extensions  		// If they've specified an extension, let's load the metadata manager and validate it.  		if ($ext_name)  		{ -			$md_manager = new \phpbb\extension\metadata_manager($ext_name, $config, $phpbb_extension_manager, $template, $user, $phpbb_root_path); +			$md_manager = new \phpbb\extension\metadata_manager($ext_name, $config, $phpbb_extension_manager, $template, $phpbb_root_path);  			try  			{ @@ -78,7 +78,8 @@ class acp_extensions  			}  			catch (\phpbb\extension\exception $e)  			{ -				trigger_error($e, E_USER_WARNING); +				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters())); +				trigger_error($message, E_USER_WARNING);  			}  		} @@ -354,8 +355,9 @@ class acp_extensions  			}  			catch (\phpbb\extension\exception $e)  			{ +				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));  				$this->template->assign_block_vars('disabled', array( -					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $e), +					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),  					'S_VERSIONCHECK'		=> false,  				));  			} @@ -410,8 +412,9 @@ class acp_extensions  			}  			catch (\phpbb\extension\exception $e)  			{ +				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));  				$this->template->assign_block_vars('disabled', array( -					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $e), +					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),  					'S_VERSIONCHECK'		=> false,  				));  			} @@ -469,8 +472,9 @@ class acp_extensions  			}  			catch (\phpbb\extension\exception $e)  			{ +				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));  				$this->template->assign_block_vars('disabled', array( -					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $e), +					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),  					'S_VERSIONCHECK'		=> false,  				));  			} diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php index 7e664c6263..f252f2a594 100644 --- a/phpBB/includes/acp/acp_forums.php +++ b/phpBB/includes/acp/acp_forums.php @@ -27,7 +27,7 @@ class acp_forums  	function main($id, $mode)  	{  		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher; -		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx; +		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx, $phpbb_log;  		$user->add_lang('acp/forums');  		$this->tpl_name = 'acp_forums'; @@ -36,11 +36,11 @@ class acp_forums  		$form_key = 'acp_forums';  		add_form_key($form_key); -		$action		= request_var('action', ''); +		$action		= $request->variable('action', '');  		$update		= (isset($_POST['update'])) ? true : false; -		$forum_id	= request_var('f', 0); +		$forum_id	= $request->variable('f', 0); -		$this->parent_id	= request_var('parent_id', 0); +		$this->parent_id	= $request->variable('parent_id', 0);  		$forum_data = $errors = array();  		if ($update && !check_form_key($form_key))  		{ @@ -52,8 +52,8 @@ class acp_forums  		switch ($action)  		{  			case 'progress_bar': -				$start = request_var('start', 0); -				$total = request_var('total', 0); +				$start = $request->variable('start', 0); +				$total = $request->variable('total', 0);  				$this->display_progress_bar($start, $total);  			break; @@ -83,10 +83,10 @@ class acp_forums  			switch ($action)  			{  				case 'delete': -					$action_subforums	= request_var('action_subforums', ''); -					$subforums_to_id	= request_var('subforums_to_id', 0); -					$action_posts		= request_var('action_posts', ''); -					$posts_to_id		= request_var('posts_to_id', 0); +					$action_subforums	= $request->variable('action_subforums', ''); +					$subforums_to_id	= $request->variable('subforums_to_id', 0); +					$action_posts		= $request->variable('action_posts', ''); +					$posts_to_id		= $request->variable('posts_to_id', 0);  					$errors = $this->delete_forum($forum_id, $action_posts, $action_subforums, $posts_to_id, $subforums_to_id); @@ -112,45 +112,45 @@ class acp_forums  				case 'add':  					$forum_data += array( -						'parent_id'				=> request_var('forum_parent_id', $this->parent_id), -						'forum_type'			=> request_var('forum_type', FORUM_POST), -						'type_action'			=> request_var('type_action', ''), -						'forum_status'			=> request_var('forum_status', ITEM_UNLOCKED), +						'parent_id'				=> $request->variable('forum_parent_id', $this->parent_id), +						'forum_type'			=> $request->variable('forum_type', FORUM_POST), +						'type_action'			=> $request->variable('type_action', ''), +						'forum_status'			=> $request->variable('forum_status', ITEM_UNLOCKED),  						'forum_parents'			=> '', -						'forum_name'			=> utf8_normalize_nfc(request_var('forum_name', '', true)), -						'forum_link'			=> request_var('forum_link', ''), -						'forum_link_track'		=> request_var('forum_link_track', false), -						'forum_desc'			=> utf8_normalize_nfc(request_var('forum_desc', '', true)), +						'forum_name'			=> $request->variable('forum_name', '', true), +						'forum_link'			=> $request->variable('forum_link', ''), +						'forum_link_track'		=> $request->variable('forum_link_track', false), +						'forum_desc'			=> $request->variable('forum_desc', '', true),  						'forum_desc_uid'		=> '',  						'forum_desc_options'	=> 7,  						'forum_desc_bitfield'	=> '', -						'forum_rules'			=> utf8_normalize_nfc(request_var('forum_rules', '', true)), +						'forum_rules'			=> $request->variable('forum_rules', '', true),  						'forum_rules_uid'		=> '',  						'forum_rules_options'	=> 7,  						'forum_rules_bitfield'	=> '', -						'forum_rules_link'		=> request_var('forum_rules_link', ''), -						'forum_image'			=> request_var('forum_image', ''), -						'forum_style'			=> request_var('forum_style', 0), -						'display_subforum_list'	=> request_var('display_subforum_list', false), -						'display_on_index'		=> request_var('display_on_index', false), -						'forum_topics_per_page'	=> request_var('topics_per_page', 0), -						'enable_indexing'		=> request_var('enable_indexing', true), -						'enable_icons'			=> request_var('enable_icons', false), -						'enable_prune'			=> request_var('enable_prune', false), -						'enable_post_review'	=> request_var('enable_post_review', true), -						'enable_quick_reply'	=> request_var('enable_quick_reply', false), -						'enable_shadow_prune'		=> request_var('enable_shadow_prune', false), -						'prune_days'			=> request_var('prune_days', 7), -						'prune_viewed'			=> request_var('prune_viewed', 7), -						'prune_freq'			=> request_var('prune_freq', 1), -						'prune_old_polls'		=> request_var('prune_old_polls', false), -						'prune_announce'		=> request_var('prune_announce', false), -						'prune_sticky'			=> request_var('prune_sticky', false), -						'prune_shadow_days'		=> request_var('prune_shadow_days', 7), -						'prune_shadow_freq'		=> request_var('prune_shadow_freq', 1), -						'forum_password'		=> request_var('forum_password', '', true), -						'forum_password_confirm'=> request_var('forum_password_confirm', '', true), -						'forum_password_unset'	=> request_var('forum_password_unset', false), +						'forum_rules_link'		=> $request->variable('forum_rules_link', ''), +						'forum_image'			=> $request->variable('forum_image', ''), +						'forum_style'			=> $request->variable('forum_style', 0), +						'display_subforum_list'	=> $request->variable('display_subforum_list', false), +						'display_on_index'		=> $request->variable('display_on_index', false), +						'forum_topics_per_page'	=> $request->variable('topics_per_page', 0), +						'enable_indexing'		=> $request->variable('enable_indexing', true), +						'enable_icons'			=> $request->variable('enable_icons', false), +						'enable_prune'			=> $request->variable('enable_prune', false), +						'enable_post_review'	=> $request->variable('enable_post_review', true), +						'enable_quick_reply'	=> $request->variable('enable_quick_reply', false), +						'enable_shadow_prune'	=> $request->variable('enable_shadow_prune', false), +						'prune_days'			=> $request->variable('prune_days', 7), +						'prune_viewed'			=> $request->variable('prune_viewed', 7), +						'prune_freq'			=> $request->variable('prune_freq', 1), +						'prune_old_polls'		=> $request->variable('prune_old_polls', false), +						'prune_announce'		=> $request->variable('prune_announce', false), +						'prune_sticky'			=> $request->variable('prune_sticky', false), +						'prune_shadow_days'		=> $request->variable('prune_shadow_days', 7), +						'prune_shadow_freq'		=> $request->variable('prune_shadow_freq', 1), +						'forum_password'		=> $request->variable('forum_password', '', true), +						'forum_password_confirm'=> $request->variable('forum_password_confirm', '', true), +						'forum_password_unset'	=> $request->variable('forum_password_unset', false),  					);  					/** @@ -173,7 +173,7 @@ class acp_forums  					// Use link_display_on_index setting if forum type is link  					if ($forum_data['forum_type'] == FORUM_LINK)  					{ -						$forum_data['display_on_index'] = request_var('link_display_on_index', false); +						$forum_data['display_on_index'] = $request->variable('link_display_on_index', false);  					}  					// Linked forums and categories are not able to be locked... @@ -182,25 +182,25 @@ class acp_forums  						$forum_data['forum_status'] = ITEM_UNLOCKED;  					} -					$forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? request_var('display_recent', true) : request_var('display_active', false); +					$forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? $request->variable('display_recent', true) : $request->variable('display_active', false);  					// Get data for forum rules if specified...  					if ($forum_data['forum_rules'])  					{ -						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_parse_bbcode', false), request_var('rules_parse_urls', false), request_var('rules_parse_smilies', false)); +						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], $request->variable('rules_parse_bbcode', false), $request->variable('rules_parse_urls', false), $request->variable('rules_parse_smilies', false));  					}  					// Get data for forum description if specified  					if ($forum_data['forum_desc'])  					{ -						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_parse_bbcode', false), request_var('desc_parse_urls', false), request_var('desc_parse_smilies', false)); +						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], $request->variable('desc_parse_bbcode', false), $request->variable('desc_parse_urls', false), $request->variable('desc_parse_smilies', false));  					}  					$errors = $this->update_forum_data($forum_data);  					if (!sizeof($errors))  					{ -						$forum_perm_from = request_var('forum_perm_from', 0); +						$forum_perm_from = $request->variable('forum_perm_from', 0);  						$cache->destroy('sql', FORUMS_TABLE);  						$copied_permissions = false; @@ -266,7 +266,7 @@ class acp_forums  				if ($move_forum_name !== false)  				{ -					add_log('admin', 'LOG_FORUM_' . strtoupper($action), $row['forum_name'], $move_forum_name); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_' . strtoupper($action), false, array($row['forum_name'], $move_forum_name));  					$cache->destroy('sql', FORUMS_TABLE);  				} @@ -311,7 +311,7 @@ class acp_forums  					$row2['min_topic_id'] = (int) $row2['min_topic_id'];  					$row2['max_topic_id'] = (int) $row2['max_topic_id']; -					$start = request_var('start', $row2['min_topic_id']); +					$start = $request->variable('start', $row2['min_topic_id']);  					$batch_size = 2000;  					$end = $start + $batch_size; @@ -327,7 +327,7 @@ class acp_forums  							WHERE forum_id = ' . $forum_id . '  								AND topic_id BETWEEN ' . $start . ' AND ' . $end;  						$result = $db->sql_query($sql); -						$topics_done = request_var('topics_done', 0) + (int) $db->sql_fetchfield('num_topics'); +						$topics_done = $request->variable('topics_done', 0) + (int) $db->sql_fetchfield('num_topics');  						$db->sql_freeresult($result);  						$start += $batch_size; @@ -377,7 +377,8 @@ class acp_forums  				sync('forum', 'forum_id', $forum_id, false, true); -				add_log('admin', 'LOG_FORUM_SYNC', $row['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_SYNC', false, array($row['forum_name'])); +  				$cache->destroy('sql', FORUMS_TABLE);  				$template->assign_var('L_FORUM_RESYNCED', sprintf($user->lang['FORUM_RESYNCED'], $row['forum_name'])); @@ -390,13 +391,13 @@ class acp_forums  				if ($update)  				{  					$forum_data['forum_flags'] = 0; -					$forum_data['forum_flags'] += (request_var('forum_link_track', false)) ? FORUM_FLAG_LINK_TRACK : 0; -					$forum_data['forum_flags'] += (request_var('prune_old_polls', false)) ? FORUM_FLAG_PRUNE_POLL : 0; -					$forum_data['forum_flags'] += (request_var('prune_announce', false)) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0; -					$forum_data['forum_flags'] += (request_var('prune_sticky', false)) ? FORUM_FLAG_PRUNE_STICKY : 0; +					$forum_data['forum_flags'] += ($request->variable('forum_link_track', false)) ? FORUM_FLAG_LINK_TRACK : 0; +					$forum_data['forum_flags'] += ($request->variable('prune_old_polls', false)) ? FORUM_FLAG_PRUNE_POLL : 0; +					$forum_data['forum_flags'] += ($request->variable('prune_announce', false)) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0; +					$forum_data['forum_flags'] += ($request->variable('prune_sticky', false)) ? FORUM_FLAG_PRUNE_STICKY : 0;  					$forum_data['forum_flags'] += ($forum_data['show_active']) ? FORUM_FLAG_ACTIVE_TOPICS : 0; -					$forum_data['forum_flags'] += (request_var('enable_post_review', true)) ? FORUM_FLAG_POST_REVIEW : 0; -					$forum_data['forum_flags'] += (request_var('enable_quick_reply', false)) ? FORUM_FLAG_QUICK_REPLY : 0; +					$forum_data['forum_flags'] += ($request->variable('enable_post_review', true)) ? FORUM_FLAG_POST_REVIEW : 0; +					$forum_data['forum_flags'] += ($request->variable('enable_quick_reply', false)) ? FORUM_FLAG_QUICK_REPLY : 0;  				}  				// Initialise $row, so we always have it in the event @@ -444,7 +445,7 @@ class acp_forums  							'parent_id'				=> $this->parent_id,  							'forum_type'			=> FORUM_POST,  							'forum_status'			=> ITEM_UNLOCKED, -							'forum_name'			=> utf8_normalize_nfc(request_var('forum_name', '', true)), +							'forum_name'			=> $request->variable('forum_name', '', true),  							'forum_link'			=> '',  							'forum_link_track'		=> false,  							'forum_desc'			=> '', @@ -511,12 +512,12 @@ class acp_forums  				{  					if (!isset($forum_data['forum_rules_uid']))  					{ -						// Before we are able to display the preview and plane text, we need to parse our request_var()'d value... +						// Before we are able to display the preview and plane text, we need to parse our $request->variable()'d value...  						$forum_data['forum_rules_uid'] = '';  						$forum_data['forum_rules_bitfield'] = '';  						$forum_data['forum_rules_options'] = 0; -						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_allow_bbcode', false), request_var('rules_allow_urls', false), request_var('rules_allow_smilies', false)); +						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], $request->variable('rules_allow_bbcode', false), $request->variable('rules_allow_urls', false), $request->variable('rules_allow_smilies', false));  					}  					// Generate preview content @@ -531,12 +532,12 @@ class acp_forums  				{  					if (!isset($forum_data['forum_desc_uid']))  					{ -						// Before we are able to display the preview and plane text, we need to parse our request_var()'d value... +						// Before we are able to display the preview and plane text, we need to parse our $request->variable()'d value...  						$forum_data['forum_desc_uid'] = '';  						$forum_data['forum_desc_bitfield'] = '';  						$forum_data['forum_desc_options'] = 0; -						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_allow_bbcode', false), request_var('desc_allow_urls', false), request_var('desc_allow_smilies', false)); +						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], $request->variable('desc_allow_bbcode', false), $request->variable('desc_allow_urls', false), $request->variable('desc_allow_smilies', false));  					}  					// decode... @@ -779,7 +780,7 @@ class acp_forums  			break;  			case 'copy_perm': -				$forum_perm_from = request_var('forum_perm_from', 0); +				$forum_perm_from = $request->variable('forum_perm_from', 0);  				// Copy permissions?  				if (!empty($forum_perm_from) && $forum_perm_from != $forum_id) @@ -945,7 +946,7 @@ class acp_forums  	*/  	function update_forum_data(&$forum_data)  	{ -		global $db, $user, $cache, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher; +		global $db, $user, $cache, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $phpbb_log, $request;  		$errors = array(); @@ -1050,6 +1051,7 @@ class acp_forums  		else  		{  			// Instantiate passwords manager +			/* @var $passwords_manager \phpbb\passwords\manager */  			$passwords_manager = $phpbb_container->get('passwords.manager');  			$forum_data_sql['forum_password'] = $passwords_manager->hash($forum_data_sql['forum_password']); @@ -1126,7 +1128,7 @@ class acp_forums  			$forum_data['forum_id'] = $db->sql_nextid(); -			add_log('admin', 'LOG_FORUM_ADD', $forum_data['forum_name']); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_ADD', false, array($forum_data['forum_name']));  		}  		else  		{ @@ -1144,7 +1146,7 @@ class acp_forums  				// we're turning a postable forum into a non-postable forum  				if ($forum_data_sql['type_action'] == 'move')  				{ -					$to_forum_id = request_var('to_forum_id', 0); +					$to_forum_id = $request->variable('to_forum_id', 0);  					if ($to_forum_id)  					{ @@ -1174,8 +1176,8 @@ class acp_forums  				if ($row['right_id'] - $row['left_id'] > 1)  				{  					// We are turning a category into a link - but need to decide what to do with the subforums. -					$action_subforums = request_var('action_subforums', ''); -					$subforums_to_id = request_var('subforums_to_id', 0); +					$action_subforums = $request->variable('action_subforums', ''); +					$subforums_to_id = $request->variable('subforums_to_id', 0);  					if ($action_subforums == 'delete')  					{ @@ -1343,7 +1345,7 @@ class acp_forums  			// Add it back  			$forum_data['forum_id'] = $forum_id; -			add_log('admin', 'LOG_FORUM_EDIT', $forum_data['forum_name']); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_EDIT', false, array($forum_data['forum_name']));  		}  		/** @@ -1545,7 +1547,7 @@ class acp_forums  	*/  	function delete_forum($forum_id, $action_posts = 'delete', $action_subforums = 'delete', $posts_to_id = 0, $subforums_to_id = 0)  	{ -		global $db, $user, $cache; +		global $db, $user, $cache, $phpbb_log;  		$forum_data = $this->get_forum_info($forum_id); @@ -1742,39 +1744,39 @@ class acp_forums  		switch ($log_action)  		{  			case 'MOVE_POSTS_MOVE_FORUMS': -				add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS_MOVE_FORUMS', $posts_to_name, $subforums_to_name, $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS_MOVE_FORUMS', false, array($posts_to_name, $subforums_to_name, $forum_data['forum_name']));  			break;  			case 'MOVE_POSTS_FORUMS': -				add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS_FORUMS', $posts_to_name, $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS_FORUMS', false, array($posts_to_name, $forum_data['forum_name']));  			break;  			case 'POSTS_MOVE_FORUMS': -				add_log('admin', 'LOG_FORUM_DEL_POSTS_MOVE_FORUMS', $subforums_to_name, $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS_MOVE_FORUMS', false, array($subforums_to_name, $forum_data['forum_name']));  			break;  			case '_MOVE_FORUMS': -				add_log('admin', 'LOG_FORUM_DEL_MOVE_FORUMS', $subforums_to_name, $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_FORUMS', false, array($subforums_to_name, $forum_data['forum_name']));  			break;  			case 'MOVE_POSTS_': -				add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS', $posts_to_name, $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS', false, array($posts_to_name, $forum_data['forum_name']));  			break;  			case 'POSTS_FORUMS': -				add_log('admin', 'LOG_FORUM_DEL_POSTS_FORUMS', $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS_FORUMS', false, array($forum_data['forum_name']));  			break;  			case '_FORUMS': -				add_log('admin', 'LOG_FORUM_DEL_FORUMS', $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_FORUMS', false, array($forum_data['forum_name']));  			break;  			case 'POSTS_': -				add_log('admin', 'LOG_FORUM_DEL_POSTS', $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS', false, array($forum_data['forum_name']));  			break;  			default: -				add_log('admin', 'LOG_FORUM_DEL_FORUM', $forum_data['forum_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_FORUM', false, array($forum_data['forum_name']));  			break;  		} @@ -1978,7 +1980,7 @@ class acp_forums  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		set_config('num_posts', (int) $row['stat'], true); +		$config->set('num_posts', (int) $row['stat'], false);  		$sql = 'SELECT COUNT(topic_id) AS stat  			FROM ' . TOPICS_TABLE . ' @@ -1987,7 +1989,7 @@ class acp_forums  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		set_config('num_topics', (int) $row['stat'], true); +		$config->set('num_topics', (int) $row['stat'], false);  		$sql = 'SELECT COUNT(attach_id) as stat  			FROM ' . ATTACHMENTS_TABLE; @@ -1995,7 +1997,7 @@ class acp_forums  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		set_config('num_files', (int) $row['stat'], true); +		$config->set('num_files', (int) $row['stat'], false);  		$sql = 'SELECT SUM(filesize) as stat  			FROM ' . ATTACHMENTS_TABLE; @@ -2003,7 +2005,7 @@ class acp_forums  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		set_config('upload_dir_size', (float) $row['stat'], true); +		$config->set('upload_dir_size', (float) $row['stat'], false);  		return array();  	} diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php index edfada1bf1..57fa52fba3 100644 --- a/phpBB/includes/acp/acp_groups.php +++ b/phpBB/includes/acp/acp_groups.php @@ -45,13 +45,13 @@ class acp_groups  		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);  		// Check and set some common vars -		$action		= (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : request_var('action', '')); -		$group_id	= request_var('g', 0); -		$mark_ary	= request_var('mark', array(0)); -		$name_ary	= request_var('usernames', '', true); -		$leader		= request_var('leader', 0); -		$default	= request_var('default', 0); -		$start		= request_var('start', 0); +		$action		= (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', '')); +		$group_id	= $request->variable('g', 0); +		$mark_ary	= $request->variable('mark', array(0)); +		$name_ary	= $request->variable('usernames', '', true); +		$leader		= $request->variable('leader', 0); +		$default	= $request->variable('default', 0); +		$start		= $request->variable('start', 0);  		$update		= (isset($_POST['update'])) ? true : false;  		// Clear some vars @@ -320,6 +320,7 @@ class acp_groups  				if ($config['allow_avatar'])  				{ +					/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  					$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  					$avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers(); @@ -361,24 +362,24 @@ class acp_groups  						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);  					} -					$group_name	= utf8_normalize_nfc(request_var('group_name', '', true)); -					$group_desc = utf8_normalize_nfc(request_var('group_desc', '', true)); -					$group_type	= request_var('group_type', GROUP_FREE); +					$group_name	= $request->variable('group_name', '', true); +					$group_desc = $request->variable('group_desc', '', true); +					$group_type	= $request->variable('group_type', GROUP_FREE); -					$allow_desc_bbcode	= request_var('desc_parse_bbcode', false); -					$allow_desc_urls	= request_var('desc_parse_urls', false); -					$allow_desc_smilies	= request_var('desc_parse_smilies', false); +					$allow_desc_bbcode	= $request->variable('desc_parse_bbcode', false); +					$allow_desc_urls	= $request->variable('desc_parse_urls', false); +					$allow_desc_smilies	= $request->variable('desc_parse_smilies', false);  					$submit_ary = array( -						'colour'			=> request_var('group_colour', ''), -						'rank'				=> request_var('group_rank', 0), +						'colour'			=> $request->variable('group_colour', ''), +						'rank'				=> $request->variable('group_rank', 0),  						'receive_pm'		=> isset($_REQUEST['group_receive_pm']) ? 1 : 0,  						'legend'			=> isset($_REQUEST['group_legend']) ? 1 : 0,  						'teampage'			=> isset($_REQUEST['group_teampage']) ? 1 : 0, -						'message_limit'		=> request_var('group_message_limit', 0), -						'max_recipients'	=> request_var('group_max_recipients', 0), +						'message_limit'		=> $request->variable('group_message_limit', 0), +						'max_recipients'	=> $request->variable('group_max_recipients', 0),  						'founder_manage'	=> 0, -						'skip_auth'			=> request_var('group_skip_auth', 0), +						'skip_auth'			=> $request->variable('group_skip_auth', 0),  					);  					if ($user->data['user_type'] == USER_FOUNDER) @@ -547,7 +548,7 @@ class acp_groups  						if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))  						{ -							$group_perm_from = request_var('group_perm_from', 0); +							$group_perm_from = $request->variable('group_perm_from', 0);  							// Copy permissions?  							// If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred. @@ -617,7 +618,7 @@ class acp_groups  				}  				else if (!$group_id)  				{ -					$group_name = utf8_normalize_nfc(request_var('group_name', '', true)); +					$group_name = $request->variable('group_name', '', true);  					$group_desc_data = array(  						'text'			=> '',  						'allow_bbcode'	=> true, @@ -695,12 +696,12 @@ class acp_groups  					$error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));  				} -				$back_link = request_var('back_link', ''); +				$back_link = $request->variable('back_link', '');  				switch ($back_link)  				{  					case 'acp_users_groups': -						$u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=groups&u=' . request_var('u', 0)); +						$u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=groups&u=' . $request->variable('u', 0));  					break;  					default: @@ -801,8 +802,9 @@ class acp_groups  					trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);  				} -				$this->page_title = 'GROUP_MEMBERS'; +				/* @var $pagination \phpbb\pagination */  				$pagination = $phpbb_container->get('pagination'); +				$this->page_title = 'GROUP_MEMBERS';  				// Grab the leaders - always, on every page...  				$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_colour, u.user_posts, u.group_id, ug.group_leader, ug.user_pending @@ -989,7 +991,7 @@ class acp_groups  		}  		else if ($field && in_array($field, array('legend', 'teampage')))  		{ - +			/* @var $group_position \phpbb\groupposition\groupposition_interface */  			$group_position = $phpbb_container->get('groupposition.' . $field);  		} diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php index 9265415dd1..5d1756de45 100644 --- a/phpBB/includes/acp/acp_icons.php +++ b/phpBB/includes/acp/acp_icons.php @@ -28,18 +28,18 @@ class acp_icons  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_container;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		global $request, $phpbb_container;  		$user->add_lang('acp/posting');  		// Set up general vars -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$action = (isset($_POST['add'])) ? 'add' : $action;  		$action = (isset($_POST['edit'])) ? 'edit' : $action;  		$action = (isset($_POST['import'])) ? 'import' : $action; -		$icon_id = request_var('id', 0); +		$icon_id = $request->variable('id', 0);  		$mode = ($mode == 'smilies') ? 'smilies' : 'icons'; @@ -326,24 +326,24 @@ class acp_icons  			case 'modify':  				// Get items to create/modify -				$images = (isset($_POST['image'])) ? array_keys(request_var('image', array('' => 0))) : array(); +				$images = (isset($_POST['image'])) ? array_keys($request->variable('image', array('' => 0))) : array();  				// Now really get the items -				$image_id		= (isset($_POST['id'])) ? request_var('id', array('' => 0)) : array(); -				$image_order	= (isset($_POST['order'])) ? request_var('order', array('' => 0)) : array(); -				$image_width	= (isset($_POST['width'])) ? request_var('width', array('' => 0)) : array(); -				$image_height	= (isset($_POST['height'])) ? request_var('height', array('' => 0)) : array(); -				$image_add		= (isset($_POST['add_img'])) ? request_var('add_img', array('' => 0)) : array(); -				$image_emotion	= utf8_normalize_nfc(request_var('emotion', array('' => ''), true)); -				$image_code		= utf8_normalize_nfc(request_var('code', array('' => ''), true)); -				$image_display_on_posting = (isset($_POST['display_on_posting'])) ? request_var('display_on_posting', array('' => 0)) : array(); +				$image_id		= (isset($_POST['id'])) ? $request->variable('id', array('' => 0)) : array(); +				$image_order	= (isset($_POST['order'])) ? $request->variable('order', array('' => 0)) : array(); +				$image_width	= (isset($_POST['width'])) ? $request->variable('width', array('' => 0)) : array(); +				$image_height	= (isset($_POST['height'])) ? $request->variable('height', array('' => 0)) : array(); +				$image_add		= (isset($_POST['add_img'])) ? $request->variable('add_img', array('' => 0)) : array(); +				$image_emotion	= $request->variable('emotion', array('' => ''), true); +				$image_code		= $request->variable('code', array('' => ''), true); +				$image_display_on_posting = (isset($_POST['display_on_posting'])) ? $request->variable('display_on_posting', array('' => 0)) : array();  				// Ok, add the relevant bits if we are adding new codes to existing emoticons...  				if ($request->variable('add_additional_code', false, false, \phpbb\request\request_interface::POST))  				{ -					$add_image			= request_var('add_image', ''); -					$add_code			= utf8_normalize_nfc(request_var('add_code', '', true)); -					$add_emotion		= utf8_normalize_nfc(request_var('add_emotion', '', true)); +					$add_image			= $request->variable('add_image', ''); +					$add_code			= $request->variable('add_code', '', true); +					$add_emotion		= $request->variable('add_emotion', '', true);  					if ($add_image && $add_emotion && $add_code)  					{ @@ -352,15 +352,15 @@ class acp_icons  						$image_code[$add_image] = $add_code;  						$image_emotion[$add_image] = $add_emotion; -						$image_width[$add_image] = request_var('add_width', 0); -						$image_height[$add_image] = request_var('add_height', 0); +						$image_width[$add_image] = $request->variable('add_width', 0); +						$image_height[$add_image] = $request->variable('add_height', 0);  						if ($request->variable('add_display_on_posting', false, false, \phpbb\request\request_interface::POST))  						{  							$image_display_on_posting[$add_image] = 1;  						} -						$image_order[$add_image] = request_var('add_order', 0); +						$image_order[$add_image] = $request->variable('add_order', 0);  					}  				} @@ -486,6 +486,7 @@ class acp_icons  				$cache->destroy('_icons');  				$cache->destroy('sql', $table); +				$phpbb_container->get('text_formatter.cache')->invalidate();  				$level = ($icons_updated) ? E_USER_NOTICE : E_USER_WARNING;  				$errormsgs = ''; @@ -506,8 +507,8 @@ class acp_icons  			case 'import': -				$pak = request_var('pak', ''); -				$current = request_var('current', ''); +				$pak = $request->variable('pak', ''); +				$current = $request->variable('current', '');  				if ($pak != '')  				{ @@ -661,6 +662,7 @@ class acp_icons  					$cache->destroy('_icons');  					$cache->destroy('sql', $table); +					$phpbb_container->get('text_formatter.cache')->invalidate();  					trigger_error($user->lang[$lang . '_IMPORT_SUCCESS'] . adm_back_link($this->u_action));  				} @@ -783,6 +785,7 @@ class acp_icons  					$cache->destroy('_icons');  					$cache->destroy('sql', $table); +					$phpbb_container->get('text_formatter.cache')->invalidate();  					if ($request->is_ajax())  					{ @@ -848,6 +851,7 @@ class acp_icons  				$cache->destroy('_icons');  				$cache->destroy('sql', $table); +				$phpbb_container->get('text_formatter.cache')->invalidate();  				if ($request->is_ajax())  				{ @@ -903,9 +907,10 @@ class acp_icons  			)  		); -		$spacer = false; +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination'); -		$pagination_start = request_var('start', 0); +		$pagination_start = $request->variable('start', 0); +		$spacer = false;  		$item_count = $this->item_count($table); diff --git a/phpBB/includes/acp/acp_inactive.php b/phpBB/includes/acp/acp_inactive.php index e96c42de05..3a72cf1fe6 100644 --- a/phpBB/includes/acp/acp_inactive.php +++ b/phpBB/includes/acp/acp_inactive.php @@ -31,31 +31,33 @@ class acp_inactive  	function main($id, $mode)  	{ -		global $config, $db, $user, $auth, $template, $phpbb_container; +		global $config, $db, $user, $auth, $template, $phpbb_container, $phpbb_log, $request;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;  		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);  		$user->add_lang('memberlist'); -		$action = request_var('action', ''); -		$mark	= (isset($_REQUEST['mark'])) ? request_var('mark', array(0)) : array(); -		$start	= request_var('start', 0); +		$action = $request->variable('action', ''); +		$mark	= (isset($_REQUEST['mark'])) ? $request->variable('mark', array(0)) : array(); +		$start	= $request->variable('start', 0);  		$submit = isset($_POST['submit']);  		// Sort keys -		$sort_days	= request_var('st', 0); -		$sort_key	= request_var('sk', 'i'); -		$sort_dir	= request_var('sd', 'd'); +		$sort_days	= $request->variable('st', 0); +		$sort_key	= $request->variable('sk', 'i'); +		$sort_dir	= $request->variable('sd', 'd');  		$form_key = 'acp_inactive';  		add_form_key($form_key); + +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination');  		// We build the sort key and per page settings here, because they may be needed later  		// Number of entries to display -		$per_page = request_var('users_per_page', (int) $config['topics_per_page']); +		$per_page = $request->variable('users_per_page', (int) $config['topics_per_page']);  		// Sorting  		$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']); @@ -135,8 +137,10 @@ class acp_inactive  						{  							foreach ($inactive_users as $row)  							{ -								add_log('admin', 'LOG_USER_ACTIVE', $row['username']); -								add_log('user', $row['user_id'], 'LOG_USER_ACTIVE_USER'); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE', false, array($row['username'])); +								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE_USER', false, array( +									'reportee_id' => $row['user_id'] +								));  							}  							trigger_error(sprintf($user->lang['LOG_INACTIVE_ACTIVATE'], implode($user->lang['COMMA_SEPARATOR'], $user_affected) . ' ' . adm_back_link($this->u_action))); @@ -159,7 +163,7 @@ class acp_inactive  							user_delete('retain', $mark, true); -							add_log('admin', 'LOG_INACTIVE_' . strtoupper($action), implode(', ', $user_affected)); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_INACTIVE_' . strtoupper($action), false, array(implode(', ', $user_affected)));  							trigger_error(sprintf($user->lang['LOG_INACTIVE_DELETE'], implode($user->lang['COMMA_SEPARATOR'], $user_affected) . ' ' . adm_back_link($this->u_action)));  						} @@ -231,7 +235,7 @@ class acp_inactive  							WHERE ' . $db->sql_in_set('user_id', $user_ids);  						$db->sql_query($sql); -						add_log('admin', 'LOG_INACTIVE_REMIND', implode(', ', $usernames)); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_INACTIVE_REMIND', false, array(implode(', ', $usernames)));  						trigger_error(sprintf($user->lang['LOG_INACTIVE_REMIND'], implode($user->lang['COMMA_SEPARATOR'], $usernames) . ' ' . adm_back_link($this->u_action)));  					} diff --git a/phpBB/includes/acp/acp_jabber.php b/phpBB/includes/acp/acp_jabber.php index 284543acd3..5058e9c769 100644 --- a/phpBB/includes/acp/acp_jabber.php +++ b/phpBB/includes/acp/acp_jabber.php @@ -29,14 +29,14 @@ class acp_jabber  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template; +		global $db, $user, $auth, $template, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		$user->add_lang('acp/board');  		include_once($phpbb_root_path . 'includes/functions_jabber.' . $phpEx); -		$action	= request_var('action', ''); +		$action	= $request->variable('action', '');  		$submit = (isset($_POST['submit'])) ? true : false;  		if ($mode != 'settings') @@ -47,13 +47,13 @@ class acp_jabber  		$this->tpl_name = 'acp_jabber';  		$this->page_title = 'ACP_JABBER_SETTINGS'; -		$jab_enable			= request_var('jab_enable',			(bool) $config['jab_enable']); -		$jab_host			= request_var('jab_host',			(string) $config['jab_host']); -		$jab_port			= request_var('jab_port',			(int) $config['jab_port']); -		$jab_username		= request_var('jab_username',		(string) $config['jab_username']); -		$jab_password		= request_var('jab_password',		(string) $config['jab_password']); -		$jab_package_size	= request_var('jab_package_size',	(int) $config['jab_package_size']); -		$jab_use_ssl		= request_var('jab_use_ssl',		(bool) $config['jab_use_ssl']); +		$jab_enable			= $request->variable('jab_enable',			(bool) $config['jab_enable']); +		$jab_host			= $request->variable('jab_host',			(string) $config['jab_host']); +		$jab_port			= $request->variable('jab_port',			(int) $config['jab_port']); +		$jab_username		= $request->variable('jab_username',		(string) $config['jab_username']); +		$jab_password		= $request->variable('jab_password',		(string) $config['jab_password']); +		$jab_package_size	= $request->variable('jab_package_size',	(int) $config['jab_package_size']); +		$jab_use_ssl		= $request->variable('jab_use_ssl',		(bool) $config['jab_use_ssl']);  		$form_name = 'acp_jabber';  		add_form_key($form_name); @@ -103,18 +103,18 @@ class acp_jabber  				$db->sql_query($sql);  			} -			set_config('jab_enable', $jab_enable); -			set_config('jab_host', $jab_host); -			set_config('jab_port', $jab_port); -			set_config('jab_username', $jab_username); +			$config->set('jab_enable', $jab_enable); +			$config->set('jab_host', $jab_host); +			$config->set('jab_port', $jab_port); +			$config->set('jab_username', $jab_username);  			if ($jab_password !== '********')  			{ -				set_config('jab_password', $jab_password); +				$config->set('jab_password', $jab_password);  			} -			set_config('jab_package_size', $jab_package_size); -			set_config('jab_use_ssl', $jab_use_ssl); +			$config->set('jab_package_size', $jab_package_size); +			$config->set('jab_use_ssl', $jab_use_ssl); -			add_log('admin', 'LOG_' . $log); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_' . $log);  			trigger_error($message . adm_back_link($this->u_action));  		} diff --git a/phpBB/includes/acp/acp_language.php b/phpBB/includes/acp/acp_language.php index 60e338ae7c..e7ee7f47d6 100644 --- a/phpBB/includes/acp/acp_language.php +++ b/phpBB/includes/acp/acp_language.php @@ -31,7 +31,7 @@ class acp_language  	function main($id, $mode)  	{ -		global $config, $db, $user, $template; +		global $config, $db, $user, $template, $phpbb_log, $phpbb_container;  		global $phpbb_root_path, $phpEx, $request;  		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx); @@ -41,14 +41,14 @@ class acp_language  		$action		= (isset($_POST['remove_store'])) ? 'details' : $action;  		$submit = (empty($action) && !isset($_POST['update']) && !isset($_POST['test_connection'])) ? false : true; -		$action = (empty($action)) ? request_var('action', '') : $action; +		$action = (empty($action)) ? $request->variable('action', '') : $action;  		$form_name = 'acp_lang';  		add_form_key('acp_lang'); -		$lang_id = request_var('id', 0); +		$lang_id = $request->variable('id', 0); -		$selected_lang_file = request_var('language_file', '|common.' . $phpEx); +		$selected_lang_file = $request->variable('language_file', '|common.' . $phpEx);  		list($this->language_directory, $this->language_file) = explode('|', $selected_lang_file); @@ -81,16 +81,16 @@ class acp_language  				$db->sql_freeresult($result);  				$sql_ary	= array( -					'lang_english_name'		=> request_var('lang_english_name', $row['lang_english_name']), -					'lang_local_name'		=> utf8_normalize_nfc(request_var('lang_local_name', $row['lang_local_name'], true)), -					'lang_author'			=> utf8_normalize_nfc(request_var('lang_author', $row['lang_author'], true)), +					'lang_english_name'		=> $request->variable('lang_english_name', $row['lang_english_name']), +					'lang_local_name'		=> $request->variable('lang_local_name', $row['lang_local_name'], true), +					'lang_author'			=> $request->variable('lang_author', $row['lang_author'], true),  				);  				$db->sql_query('UPDATE ' . LANG_TABLE . '  					SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '  					WHERE lang_id = ' . $lang_id); -				add_log('admin', 'LOG_LANGUAGE_PACK_UPDATED', $sql_ary['lang_english_name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_UPDATED', false, array($sql_ary['lang_english_name']));  				trigger_error($user->lang['LANGUAGE_DETAILS_UPDATED'] . adm_back_link($this->u_action));  			break; @@ -224,7 +224,7 @@ class acp_language  					$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . ' WHERE lang_id = ' . $lang_id;  					$db->sql_query($sql); -					add_log('admin', 'LOG_LANGUAGE_PACK_DELETED', $row['lang_english_name']); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_DELETED', false, array($row['lang_english_name']));  					trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action));  				} @@ -241,7 +241,7 @@ class acp_language  			break;  			case 'install': -				$lang_iso = request_var('iso', ''); +				$lang_iso = $request->variable('iso', '');  				$lang_iso = basename($lang_iso);  				if (!$lang_iso || !file_exists("{$phpbb_root_path}language/$lang_iso/iso.txt")) @@ -329,7 +329,7 @@ class acp_language  				}  				$db->sql_freeresult($result); -				add_log('admin', 'LOG_LANGUAGE_PACK_INSTALLED', $lang_pack['name']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_INSTALLED', false, array($lang_pack['name']));  				$message = sprintf($user->lang['LANGUAGE_PACK_INSTALLED'], $lang_pack['name']);  				$message .= ($notify_cpf_update) ? '<br /><br />' . $user->lang['LANGUAGE_PACK_CPF_UPDATE'] : ''; @@ -377,37 +377,19 @@ class acp_language  		$db->sql_freeresult($result);  		$new_ary = $iso = array(); -		$dp = @opendir("{$phpbb_root_path}language"); -		if ($dp) +		/** @var \phpbb\language\language_file_helper $language_helper */ +		$language_helper = $phpbb_container->get('language.helper.language_file'); +		$iso = $language_helper->get_available_languages(); + +		foreach ($iso as $lang_array)  		{ -			while (($file = readdir($dp)) !== false) -			{ -				if ($file[0] == '.' || !is_dir($phpbb_root_path . 'language/' . $file)) -				{ -					continue; -				} +			$lang_iso = $lang_array['iso']; -				if (file_exists("{$phpbb_root_path}language/$file/iso.txt")) -				{ -					if (!in_array($file, $installed)) -					{ -						if ($iso = file("{$phpbb_root_path}language/$file/iso.txt")) -						{ -							if (sizeof($iso) == 3) -							{ -								$new_ary[$file] = array( -									'iso'		=> $file, -									'name'		=> trim($iso[0]), -									'local_name'=> trim($iso[1]), -									'author'	=> trim($iso[2]) -								); -							} -						} -					} -				} +			if (!in_array($lang_iso, $installed)) +			{ +				$new_ary[$lang_iso] = $lang_array;  			} -			closedir($dp);  		}  		unset($installed); diff --git a/phpBB/includes/acp/acp_logs.php b/phpBB/includes/acp/acp_logs.php index 80dee1d620..56039ff302 100644 --- a/phpBB/includes/acp/acp_logs.php +++ b/phpBB/includes/acp/acp_logs.php @@ -32,21 +32,23 @@ class acp_logs  		$user->add_lang('mcp');  		// Set up general vars -		$action		= request_var('action', ''); -		$forum_id	= request_var('f', 0); -		$topic_id	= request_var('t', 0); -		$start		= request_var('start', 0); +		$action		= $request->variable('action', ''); +		$forum_id	= $request->variable('f', 0); +		$topic_id	= $request->variable('t', 0); +		$start		= $request->variable('start', 0);  		$deletemark = $request->variable('delmarked', false, false, \phpbb\request\request_interface::POST);  		$deleteall	= $request->variable('delall', false, false, \phpbb\request\request_interface::POST); -		$marked		= request_var('mark', array(0)); +		$marked		= $request->variable('mark', array(0));  		// Sort keys -		$sort_days	= request_var('st', 0); -		$sort_key	= request_var('sk', 't'); -		$sort_dir	= request_var('sd', 'd'); +		$sort_days	= $request->variable('st', 0); +		$sort_key	= $request->variable('sk', 't'); +		$sort_dir	= $request->variable('sd', 'd');  		$this->tpl_name = 'acp_logs';  		$this->log_type = constant('LOG_' . strtoupper($mode)); + +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination');  		// Delete entries if requested and able @@ -68,10 +70,11 @@ class acp_logs  						$conditions['log_time'] = array('>=', time() - ($sort_days * 86400));  					} -					$keywords = utf8_normalize_nfc(request_var('keywords', '', true)); +					$keywords = $request->variable('keywords', '', true);  					$conditions['keywords'] = $keywords;  				} +				/* @var $phpbb_log \phpbb\log\log_interface */  				$phpbb_log = $phpbb_container->get('log');  				$phpbb_log->delete($mode, $conditions);  			} @@ -105,7 +108,7 @@ class acp_logs  		$sql_where = ($sort_days) ? (time() - ($sort_days * 86400)) : 0;  		$sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); -		$keywords = utf8_normalize_nfc(request_var('keywords', '', true)); +		$keywords = $request->variable('keywords', '', true);  		$keywords_param = !empty($keywords) ? '&keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';  		$l_title = $user->lang['ACP_' . strtoupper($mode) . '_LOGS']; diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index f6d728ffed..8a53edb8ee 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -25,8 +25,8 @@ class acp_main  	function main($id, $mode)  	{ -		global $config, $db, $cache, $user, $auth, $template, $request; -		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container, $phpbb_dispatcher; +		global $config, $db, $cache, $user, $auth, $template, $request, $phpbb_log; +		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container, $phpbb_dispatcher, $phpbb_filesystem;  		// Show restore permissions notice  		if ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) @@ -53,7 +53,7 @@ class acp_main  			return;  		} -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		if ($action)  		{ @@ -121,9 +121,9 @@ class acp_main  							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);  						} -						set_config('record_online_users', 1, true); -						set_config('record_online_date', time(), true); -						add_log('admin', 'LOG_RESET_ONLINE'); +						$config->set('record_online_users', 1, false); +						$config->set('record_online_date', time(), false); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESET_ONLINE');  						if ($request->is_ajax())  						{ @@ -141,35 +141,35 @@ class acp_main  							FROM ' . POSTS_TABLE . '  							WHERE post_visibility = ' . ITEM_APPROVED;  						$result = $db->sql_query($sql); -						set_config('num_posts', (int) $db->sql_fetchfield('stat'), true); +						$config->set('num_posts', (int) $db->sql_fetchfield('stat'), false);  						$db->sql_freeresult($result);  						$sql = 'SELECT COUNT(topic_id) AS stat  							FROM ' . TOPICS_TABLE . '  							WHERE topic_visibility = ' . ITEM_APPROVED;  						$result = $db->sql_query($sql); -						set_config('num_topics', (int) $db->sql_fetchfield('stat'), true); +						$config->set('num_topics', (int) $db->sql_fetchfield('stat'), false);  						$db->sql_freeresult($result);  						$sql = 'SELECT COUNT(user_id) AS stat  							FROM ' . USERS_TABLE . '  							WHERE user_type IN (' . USER_NORMAL . ',' . USER_FOUNDER . ')';  						$result = $db->sql_query($sql); -						set_config('num_users', (int) $db->sql_fetchfield('stat'), true); +						$config->set('num_users', (int) $db->sql_fetchfield('stat'), false);  						$db->sql_freeresult($result);  						$sql = 'SELECT COUNT(attach_id) as stat  							FROM ' . ATTACHMENTS_TABLE . '  							WHERE is_orphan = 0';  						$result = $db->sql_query($sql); -						set_config('num_files', (int) $db->sql_fetchfield('stat'), true); +						$config->set('num_files', (int) $db->sql_fetchfield('stat'), false);  						$db->sql_freeresult($result);  						$sql = 'SELECT SUM(filesize) as stat  							FROM ' . ATTACHMENTS_TABLE . '  							WHERE is_orphan = 0';  						$result = $db->sql_query($sql); -						set_config('upload_dir_size', (float) $db->sql_fetchfield('stat'), true); +						$config->set('upload_dir_size', (float) $db->sql_fetchfield('stat'), false);  						$db->sql_freeresult($result);  						if (!function_exists('update_last_username')) @@ -178,7 +178,7 @@ class acp_main  						}  						update_last_username(); -						add_log('admin', 'LOG_RESYNC_STATS'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_STATS');  						if ($request->is_ajax())  						{ @@ -215,7 +215,7 @@ class acp_main  						// Still no maximum post id? Then we are finished  						if (!$max_post_id)  						{ -							add_log('admin', 'LOG_RESYNC_POSTCOUNTS'); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_POSTCOUNTS');  							break;  						} @@ -245,7 +245,7 @@ class acp_main  							$start += $step;  						} -						add_log('admin', 'LOG_RESYNC_POSTCOUNTS'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_POSTCOUNTS');  						if ($request->is_ajax())  						{ @@ -259,8 +259,8 @@ class acp_main  							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);  						} -						set_config('board_startdate', time() - 1); -						add_log('admin', 'LOG_RESET_DATE'); +						$config->set('board_startdate', time() - 1); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESET_DATE');  						if ($request->is_ajax())  						{ @@ -340,7 +340,7 @@ class acp_main  							}  						} -						add_log('admin', 'LOG_RESYNC_POST_MARKING'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_POST_MARKING');  						if ($request->is_ajax())  						{ @@ -352,11 +352,16 @@ class acp_main  						$config->increment('assets_version', 1);  						$cache->purge(); +						// Remove old renderers from the text_formatter service. Since this +						// operation is performed after the cache is purged, there is not "current" +						// renderer and in effect all renderers will be purged +						$phpbb_container->get('text_formatter.cache')->tidy(); +  						// Clear permissions  						$auth->acl_clear_prefetch();  						phpbb_cache_moderators($db, $cache, $auth); -						add_log('admin', 'LOG_PURGE_CACHE'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PURGE_CACHE');  						if ($request->is_ajax())  						{ @@ -407,7 +412,7 @@ class acp_main  						$sql = 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $reinsert_ary);  						$db->sql_query($sql); -						add_log('admin', 'LOG_PURGE_SESSIONS'); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PURGE_SESSIONS');  						if ($request->is_ajax())  						{ @@ -429,6 +434,7 @@ class acp_main  			));  		} +		/* @var $version_helper \phpbb\version_helper */  		$version_helper = $phpbb_container->get('version_helper');  		try  		{ @@ -643,7 +649,7 @@ class acp_main  			}  		} -		if (!defined('PHPBB_DISABLE_CONFIG_CHECK') && file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx)) +		if (!defined('PHPBB_DISABLE_CONFIG_CHECK') && file_exists($phpbb_root_path . 'config.' . $phpEx) && $phpbb_filesystem->is_writable($phpbb_root_path . 'config.' . $phpEx))  		{  			// World-Writable? (000x)  			$template->assign_var('S_WRITABLE_CONFIG', (bool) (@fileperms($phpbb_root_path . 'config.' . $phpEx) & 0x0002)); @@ -663,7 +669,7 @@ class acp_main  		// Fill dbms version if not yet filled  		if (empty($config['dbms_version']))  		{ -			set_config('dbms_version', $db->sql_server_info(true)); +			$config->set('dbms_version', $db->sql_server_info(true));  		}  		$this->tpl_name = 'acp_main'; diff --git a/phpBB/includes/acp/acp_modules.php b/phpBB/includes/acp/acp_modules.php index ea6b388328..c2407f15b4 100644 --- a/phpBB/includes/acp/acp_modules.php +++ b/phpBB/includes/acp/acp_modules.php @@ -19,6 +19,8 @@ if (!defined('IN_PHPBB'))  	exit;  } +use phpbb\module\exception\module_exception; +  /**  * - Able to check for new module versions (modes changed/adjusted/added/removed)  * Icons for: @@ -37,8 +39,10 @@ class acp_modules  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $module, $request; -		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx; +		global $db, $user, $template, $module, $request, $phpbb_log, $phpbb_container; + +		/** @var \phpbb\module\module_manager $module_manager */ +		$module_manager = $phpbb_container->get('module.manager');  		// Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant)  		define('MODULE_INCLUDE', true); @@ -65,9 +69,9 @@ class acp_modules  		$this->page_title = strtoupper($this->module_class); -		$this->parent_id = request_var('parent_id', 0); -		$module_id = request_var('m', 0); -		$action = request_var('action', ''); +		$this->parent_id = $request->variable('parent_id', 0); +		$module_id = $request->variable('m', 0); +		$action = $request->variable('action', '');  		$errors = array();  		switch ($action) @@ -91,13 +95,20 @@ class acp_modules  						$db->sql_freeresult($result);  					} -					$errors = $this->delete_module($module_id); - -					if (!sizeof($errors)) +					try  					{ -						$this->remove_cache_file(); -						trigger_error($user->lang['MODULE_DELETED'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id)); +						$row = $module_manager->get_module_row($module_id, $this->module_class); +						$module_manager->delete_module($module_id, $this->module_class); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_REMOVED', false, array($user->lang($row['module_langname'])));  					} +					catch (module_exception $e) +					{ +						$msg = $user->lang($e->getMessage()); +						trigger_error($msg . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); +					} + +					$module_manager->remove_cache_file($this->module_class); +					trigger_error($user->lang['MODULE_DELETED'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id));  				}  				else  				{ @@ -138,8 +149,8 @@ class acp_modules  						AND module_id = $module_id";  				$db->sql_query($sql); -				add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname'])); -				$this->remove_cache_file(); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_' . strtoupper($action), false, array($user->lang($row['module_langname']))); +				$module_manager->remove_cache_file($this->module_class);  			break; @@ -163,12 +174,16 @@ class acp_modules  					trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING);  				} -				$move_module_name = $this->move_module_by($row, $action, 1); +				try +				{ +					$move_module_name = $module_manager->move_module_by($row, $this->module_class, $action, 1); -				if ($move_module_name !== false) +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_' . strtoupper($action), false, array($user->lang($row['module_langname']), $move_module_name)); +					$module_manager->remove_cache_file($this->module_class); +				} +				catch (module_exception $e)  				{ -					add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']), $move_module_name); -					$this->remove_cache_file(); +					// Do nothing  				}  				if ($request->is_ajax()) @@ -182,7 +197,7 @@ class acp_modules  			break;  			case 'quickadd': -				$quick_install = request_var('quick_install', ''); +				$quick_install = $request->variable('quick_install', '');  				if (confirm_box(true))  				{ @@ -194,7 +209,7 @@ class acp_modules  					list($module_basename, $module_mode) = explode('::', $quick_install);  					// Check if module name and mode exist... -					$fileinfo = $this->get_module_infos($module_basename); +					$fileinfo = $module_manager->get_module_infos($this->module_class, $module_basename);  					$fileinfo = $fileinfo[$module_basename];  					if (isset($fileinfo['modes'][$module_mode])) @@ -210,11 +225,20 @@ class acp_modules  							'module_auth'		=> $fileinfo['modes'][$module_mode]['auth'],  						); -						$errors = $this->update_module_data($module_data); +						try +						{ +							$module_manager->update_module_data($module_data); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_ADD', false, array($user->lang($module_data['module_langname']))); +						} +						catch (\phpbb\module\exception\module_exception $e) +						{ +							$msg = $user->lang($e->getMessage()); +							trigger_error($msg . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); +						}  						if (!sizeof($errors))  						{ -							$this->remove_cache_file(); +							$module_manager->remove_cache_file($this->module_class);  							trigger_error($user->lang['MODULE_ADDED'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id));  						} @@ -240,7 +264,15 @@ class acp_modules  					trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING);  				} -				$module_row = $this->get_module_row($module_id); +				try +				{ +					$module_row = $module_manager->get_module_row($module_id, $this->module_class); +				} +				catch (\phpbb\module\exception\module_not_found_exception $e) +				{ +					$msg = $user->lang($e->getMessage()); +					trigger_error($msg . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); +				}  			// no break @@ -253,7 +285,7 @@ class acp_modules  						'module_enabled'	=> 0,  						'module_display'	=> 1,  						'parent_id'			=> 0, -						'module_langname'	=> utf8_normalize_nfc(request_var('module_langname', '', true)), +						'module_langname'	=> $request->variable('module_langname', '', true),  						'module_mode'		=> '',  						'module_auth'		=> '',  					); @@ -261,13 +293,13 @@ class acp_modules  				$module_data = array(); -				$module_data['module_basename'] = request_var('module_basename', (string) $module_row['module_basename']); -				$module_data['module_enabled'] = request_var('module_enabled', (int) $module_row['module_enabled']); -				$module_data['module_display'] = request_var('module_display', (int) $module_row['module_display']); -				$module_data['parent_id'] = request_var('module_parent_id', (int) $module_row['parent_id']); +				$module_data['module_basename'] = $request->variable('module_basename', (string) $module_row['module_basename']); +				$module_data['module_enabled'] = $request->variable('module_enabled', (int) $module_row['module_enabled']); +				$module_data['module_display'] = $request->variable('module_display', (int) $module_row['module_display']); +				$module_data['parent_id'] = $request->variable('module_parent_id', (int) $module_row['parent_id']);  				$module_data['module_class'] = $this->module_class; -				$module_data['module_langname'] = utf8_normalize_nfc(request_var('module_langname', (string) $module_row['module_langname'], true)); -				$module_data['module_mode'] = request_var('module_mode', (string) $module_row['module_mode']); +				$module_data['module_langname'] = $request->variable('module_langname', (string) $module_row['module_langname'], true); +				$module_data['module_mode'] = $request->variable('module_mode', (string) $module_row['module_mode']);  				$submit = (isset($_POST['submit'])) ? true : false; @@ -278,7 +310,7 @@ class acp_modules  						trigger_error($user->lang['NO_MODULE_LANGNAME'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING);  					} -					$module_type = request_var('module_type', 'category'); +					$module_type = $request->variable('module_type', 'category');  					if ($module_type == 'category')  					{ @@ -294,15 +326,29 @@ class acp_modules  					// Adjust auth row  					if ($module_data['module_basename'] && $module_data['module_mode'])  					{ -						$fileinfo = $this->get_module_infos($module_data['module_basename']); +						$fileinfo = $module_manager->get_module_infos($this->module_class, $module_data['module_basename']);  						$module_data['module_auth'] = $fileinfo[$module_data['module_basename']]['modes'][$module_data['module_mode']]['auth'];  					} -					$errors = $this->update_module_data($module_data); +					try +					{ +						$module_manager->update_module_data($module_data); +						$phpbb_log->add('admin', +							$user->data['user_id'], +							$user->ip, +							($action === 'edit') ? 'LOG_MODULE_EDIT' : 'LOG_MODULE_ADD', +							false, +							array($user->lang($module_data['module_langname'])) +						);					} +					catch (\phpbb\module\exception\module_exception $e) +					{ +						$msg = $user->lang($e->getMessage()); +						trigger_error($msg . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); +					}  					if (!sizeof($errors))  					{ -						$this->remove_cache_file(); +						$module_manager->remove_cache_file($this->module_class);  						trigger_error((($action == 'add') ? $user->lang['MODULE_ADDED'] : $user->lang['MODULE_EDITED']) . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id));  					} @@ -312,7 +358,7 @@ class acp_modules  				$is_cat = (!$module_data['module_basename']) ? true : false;  				// Get module information -				$module_infos = $this->get_module_infos(); +				$module_infos = $module_manager->get_module_infos($this->module_class);  				// Build name options  				$s_name_options = $s_mode_options = ''; @@ -324,7 +370,7 @@ class acp_modules  					}  					// Name options -					$s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $this->lang_name($values['title']) . ' [' . $option . ']</option>'; +					$s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $user->lang($values['title']) . ' [' . $option . ']</option>';  					$template->assign_block_vars('m_names', array('NAME' => $option, 'A_NAME' => addslashes($option))); @@ -333,14 +379,14 @@ class acp_modules  					{  						if ($option == $module_data['module_basename'])  						{ -							$s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $this->lang_name($m_values['title']) . '</option>'; +							$s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $user->lang($m_values['title']) . '</option>';  						}  						$template->assign_block_vars('m_names.modes', array(  							'OPTION'		=> $m_mode, -							'VALUE'			=> $this->lang_name($m_values['title']), +							'VALUE'			=> $user->lang($m_values['title']),  							'A_OPTION'		=> addslashes($m_mode), -							'A_VALUE'		=> addslashes($this->lang_name($m_values['title']))) +							'A_VALUE'		=> addslashes($user->lang($m_values['title'])))  						);  					}  				} @@ -358,7 +404,7 @@ class acp_modules  					'L_TITLE'			=> $user->lang[strtoupper($action) . '_MODULE'], -					'MODULENAME'		=> $this->lang_name($module_data['module_langname']), +					'MODULENAME'		=> $user->lang($module_data['module_langname']),  					'ACTION'			=> $action,  					'MODULE_ID'			=> $module_id, @@ -406,11 +452,11 @@ class acp_modules  		{  			$navigation = '<a href="' . $this->u_action . '">' . strtoupper($this->module_class) . '</a>'; -			$modules_nav = $this->get_module_branch($this->parent_id, 'parents', 'descending'); +			$modules_nav = $module_manager->get_module_branch($this->parent_id, $this->module_class, 'parents');  			foreach ($modules_nav as $row)  			{ -				$langname = $this->lang_name($row['module_langname']); +				$langname = $user->lang($row['module_langname']);  				if ($row['module_id'] == $this->parent_id)  				{ @@ -437,7 +483,7 @@ class acp_modules  		{  			do  			{ -				$langname = $this->lang_name($row['module_langname']); +				$langname = $user->lang($row['module_langname']);  				if (!$row['module_enabled'])  				{ @@ -472,7 +518,15 @@ class acp_modules  		}  		else if ($this->parent_id)  		{ -			$row = $this->get_module_row($this->parent_id); +			try +			{ +				$row = $module_manager->get_module_row($this->parent_id, $this->module_class); +			} +			catch (\phpbb\module\exception\module_not_found_exception $e) +			{ +				$msg = $user->lang($e->getMessage()); +				trigger_error($msg . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); +			}  			$url = $this->u_action . '&parent_id=' . $this->parent_id . '&m=' . $row['module_id']; @@ -491,19 +545,19 @@ class acp_modules  		$db->sql_freeresult($result);  		// Quick adding module -		$module_infos = $this->get_module_infos(); +		$module_infos = $module_manager->get_module_infos($this->module_class);  		// Build quick options  		$s_install_options = '';  		foreach ($module_infos as $option => $values)  		{  			// Name options -			$s_install_options .= '<optgroup label="' . $this->lang_name($values['title']) . ' [' . $option . ']">'; +			$s_install_options .= '<optgroup label="' . $user->lang($values['title']) . ' [' . $option . ']">';  			// Build module modes  			foreach ($values['modes'] as $m_mode => $m_values)  			{ -				$s_install_options .= '<option value="' . $option . '::' . $m_mode . '">   ' . $this->lang_name($m_values['title']) . '</option>'; +				$s_install_options .= '<option value="' . $option . '::' . $m_mode . '">   ' . $user->lang($m_values['title']) . '</option>';  			}  			$s_install_options .= '</optgroup>'; @@ -521,104 +575,6 @@ class acp_modules  	}  	/** -	* Get row for specified module -	*/ -	function get_module_row($module_id) -	{ -		global $db, $user; - -		$sql = 'SELECT * -			FROM ' . MODULES_TABLE . " -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND module_id = $module_id"; -		$result = $db->sql_query($sql); -		$row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if (!$row) -		{ -			trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); -		} - -		return $row; -	} - -	/** -	* Get available module information from module files -	* -	* @param string $module -	* @param bool|string $module_class -	* @param bool $use_all_available Use all available instead of just all -	* 						enabled extensions -	* @return array -	*/ -	function get_module_infos($module = '', $module_class = false, $use_all_available = false) -	{ -		global $phpbb_extension_manager, $phpbb_root_path, $phpEx; - -		$module_class = ($module_class === false) ? $this->module_class : $module_class; - -		$directory = $phpbb_root_path . 'includes/' . $module_class . '/info/'; -		$fileinfo = array(); - -		$finder = $phpbb_extension_manager->get_finder($use_all_available); - -		$modules = $finder -			->extension_suffix('_module') -			->extension_directory("/$module_class") -			->core_path("includes/$module_class/info/") -			->core_prefix($module_class . '_') -			->get_classes(true); - -		foreach ($modules as $cur_module) -		{ -			// Skip entries we do not need if we know the module we are -			// looking for -			if ($module && strpos(str_replace('\\', '_', $cur_module), $module) === false && $module !== $cur_module) -			{ -				continue; -			} - -			$info_class = preg_replace('/_module$/', '_info', $cur_module); - -			// If the class does not exist it might be following the old -			// format. phpbb_acp_info_acp_foo needs to be turned into -			// acp_foo_info and the respective file has to be included -			// manually because it does not support auto loading -			$old_info_class_file = str_replace("phpbb_{$module_class}_info_", '', $cur_module); -			$old_info_class = $old_info_class_file . '_info'; - -			if (class_exists($old_info_class)) -			{ -				$info_class = $old_info_class; -			} -			else if (!class_exists($info_class)) -			{ -				$info_class = $old_info_class; -				// need to check class exists again because previous checks triggered autoloading -				if (!class_exists($info_class) && file_exists($directory . $old_info_class_file . '.' . $phpEx)) -				{ -					include($directory . $old_info_class_file . '.' . $phpEx); -				} -			} - -			if (class_exists($info_class)) -			{ -				$info = new $info_class(); -				$module_info = $info->module(); - -				$main_class = (isset($module_info['filename'])) ? $module_info['filename'] : $cur_module; - -				$fileinfo[$main_class] = $module_info; -			} -		} - -		ksort($fileinfo); - -		return $fileinfo; -	} - -	/**  	* Simple version of jumpbox, just lists modules  	*/  	function make_module_select($select_id = false, $ignore_id = false, $ignore_acl = false, $ignore_nonpost = false, $ignore_emptycat = true, $ignore_noncat = false) @@ -678,7 +634,7 @@ class acp_modules  			$selected = (is_array($select_id)) ? ((in_array($row['module_id'], $select_id)) ? ' selected="selected"' : '') : (($row['module_id'] == $select_id) ? ' selected="selected"' : ''); -			$langname = $this->lang_name($row['module_langname']); +			$langname = $user->lang($row['module_langname']);  			$module_list .= '<option value="' . $row['module_id'] . '"' . $selected . ((!$row['module_enabled']) ? ' class="disabled"' : '') . '>' . $padding . $langname . '</option>';  			$iteration++; @@ -689,401 +645,4 @@ class acp_modules  		return $module_list;  	} - -	/** -	* Get module branch -	*/ -	function get_module_branch($module_id, $type = 'all', $order = 'descending', $include_module = true) -	{ -		global $db; - -		switch ($type) -		{ -			case 'parents': -				$condition = 'm1.left_id BETWEEN m2.left_id AND m2.right_id'; -			break; - -			case 'children': -				$condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id'; -			break; - -			default: -				$condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id OR m1.left_id BETWEEN m2.left_id AND m2.right_id'; -			break; -		} - -		$rows = array(); - -		$sql = 'SELECT m2.* -			FROM ' . MODULES_TABLE . ' m1 -			LEFT JOIN ' . MODULES_TABLE . " m2 ON ($condition) -			WHERE m1.module_class = '" . $db->sql_escape($this->module_class) . "' -				AND m2.module_class = '" . $db->sql_escape($this->module_class) . "' -				AND m1.module_id = $module_id -			ORDER BY m2.left_id " . (($order == 'descending') ? 'ASC' : 'DESC'); -		$result = $db->sql_query($sql); - -		while ($row = $db->sql_fetchrow($result)) -		{ -			if (!$include_module && $row['module_id'] == $module_id) -			{ -				continue; -			} - -			$rows[] = $row; -		} -		$db->sql_freeresult($result); - -		return $rows; -	} - -	/** -	* Remove modules cache file -	*/ -	function remove_cache_file() -	{ -		global $phpbb_container; - -		// Sanitise for future path use, it's escaped as appropriate for queries -		$p_class = str_replace(array('.', '/', '\\'), '', basename($this->module_class)); - -		$phpbb_container->get('cache.driver')->destroy('_modules_' . $p_class); - -		// Additionally remove sql cache -		$phpbb_container->get('cache.driver')->destroy('sql', MODULES_TABLE); -	} - -	/** -	* Return correct language name -	*/ -	function lang_name($module_langname) -	{ -		global $user; - -		return (!empty($user->lang[$module_langname])) ? $user->lang[$module_langname] : $module_langname; -	} - -	/** -	* Update/Add module -	* -	* @param array	&$module_data	The module data -	* @param bool	$run_inline 	if set to true errors will be returned and no logs being written -	*/ -	function update_module_data(&$module_data, $run_inline = false) -	{ -		global $db, $user; - -		if (!isset($module_data['module_id'])) -		{ -			// no module_id means we're creating a new category/module -			if ($module_data['parent_id']) -			{ -				$sql = 'SELECT left_id, right_id -					FROM ' . MODULES_TABLE . " -					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "' -						AND module_id = " . (int) $module_data['parent_id']; -				$result = $db->sql_query($sql); -				$row = $db->sql_fetchrow($result); -				$db->sql_freeresult($result); - -				if (!$row) -				{ -					if ($run_inline) -					{ -						return 'PARENT_NO_EXIST'; -					} - -					trigger_error($user->lang['PARENT_NO_EXIST'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); -				} - -				// Workaround -				$row['left_id'] = (int) $row['left_id']; -				$row['right_id'] = (int) $row['right_id']; - -				$sql = 'UPDATE ' . MODULES_TABLE . " -					SET left_id = left_id + 2, right_id = right_id + 2 -					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "' -						AND left_id > {$row['right_id']}"; -				$db->sql_query($sql); - -				$sql = 'UPDATE ' . MODULES_TABLE . " -					SET right_id = right_id + 2 -					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "' -						AND {$row['left_id']} BETWEEN left_id AND right_id"; -				$db->sql_query($sql); - -				$module_data['left_id'] = (int) $row['right_id']; -				$module_data['right_id'] = (int) $row['right_id'] + 1; -			} -			else -			{ -				$sql = 'SELECT MAX(right_id) AS right_id -					FROM ' . MODULES_TABLE . " -					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'"; -				$result = $db->sql_query($sql); -				$row = $db->sql_fetchrow($result); -				$db->sql_freeresult($result); - -				$module_data['left_id'] = (int) $row['right_id'] + 1; -				$module_data['right_id'] = (int) $row['right_id'] + 2; -			} - -			$sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data); -			$db->sql_query($sql); - -			$module_data['module_id'] = $db->sql_nextid(); - -			if (!$run_inline) -			{ -				add_log('admin', 'LOG_MODULE_ADD', $this->lang_name($module_data['module_langname'])); -			} -		} -		else -		{ -			$row = $this->get_module_row($module_data['module_id']); - -			if ($module_data['module_basename'] && !$row['module_basename']) -			{ -				// we're turning a category into a module -				$branch = $this->get_module_branch($module_data['module_id'], 'children', 'descending', false); - -				if (sizeof($branch)) -				{ -					return array($user->lang['NO_CATEGORY_TO_MODULE']); -				} -			} - -			if ($row['parent_id'] != $module_data['parent_id']) -			{ -				$this->move_module($module_data['module_id'], $module_data['parent_id']); -			} - -			$update_ary = $module_data; -			unset($update_ary['module_id']); - -			$sql = 'UPDATE ' . MODULES_TABLE . ' -				SET ' . $db->sql_build_array('UPDATE', $update_ary) . " -				WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "' -					AND module_id = " . (int) $module_data['module_id']; -			$db->sql_query($sql); - -			if (!$run_inline) -			{ -				add_log('admin', 'LOG_MODULE_EDIT', $this->lang_name($module_data['module_langname'])); -			} -		} - -		return array(); -	} - -	/** -	* Move module around the tree -	*/ -	function move_module($from_module_id, $to_parent_id) -	{ -		global $db; - -		$moved_modules = $this->get_module_branch($from_module_id, 'children', 'descending'); -		$from_data = $moved_modules[0]; -		$diff = sizeof($moved_modules) * 2; - -		$moved_ids = array(); -		for ($i = 0; $i < sizeof($moved_modules); ++$i) -		{ -			$moved_ids[] = $moved_modules[$i]['module_id']; -		} - -		// Resync parents -		$sql = 'UPDATE ' . MODULES_TABLE . " -			SET right_id = right_id - $diff -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND left_id < " . (int) $from_data['right_id'] . ' -				AND right_id > ' . (int) $from_data['right_id']; -		$db->sql_query($sql); - -		// Resync righthand side of tree -		$sql = 'UPDATE ' . MODULES_TABLE . " -			SET left_id = left_id - $diff, right_id = right_id - $diff -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND left_id > " . (int) $from_data['right_id']; -		$db->sql_query($sql); - -		if ($to_parent_id > 0) -		{ -			$to_data = $this->get_module_row($to_parent_id); - -			// Resync new parents -			$sql = 'UPDATE ' . MODULES_TABLE . " -				SET right_id = right_id + $diff -				WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -					AND " . (int) $to_data['right_id'] . ' BETWEEN left_id AND right_id -					AND ' . $db->sql_in_set('module_id', $moved_ids, true); -			$db->sql_query($sql); - -			// Resync the righthand side of the tree -			$sql = 'UPDATE ' . MODULES_TABLE . " -				SET left_id = left_id + $diff, right_id = right_id + $diff -				WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -					AND left_id > " . (int) $to_data['right_id'] . ' -					AND ' . $db->sql_in_set('module_id', $moved_ids, true); -			$db->sql_query($sql); - -			// Resync moved branch -			$to_data['right_id'] += $diff; -			if ($to_data['right_id'] > $from_data['right_id']) -			{ -				$diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1); -			} -			else -			{ -				$diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1); -			} -		} -		else -		{ -			$sql = 'SELECT MAX(right_id) AS right_id -				FROM ' . MODULES_TABLE . " -				WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -					AND " . $db->sql_in_set('module_id', $moved_ids, true); -			$result = $db->sql_query($sql); -			$row = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); - -			$diff = '+ ' . (int) ($row['right_id'] - $from_data['left_id'] + 1); -		} - -		$sql = 'UPDATE ' . MODULES_TABLE . " -			SET left_id = left_id $diff, right_id = right_id $diff -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND " . $db->sql_in_set('module_id', $moved_ids); -		$db->sql_query($sql); -	} - -	/** -	* Remove module from tree -	*/ -	function delete_module($module_id) -	{ -		global $db, $user; - -		$row = $this->get_module_row($module_id); - -		$branch = $this->get_module_branch($module_id, 'children', 'descending', false); - -		if (sizeof($branch)) -		{ -			return array($user->lang['CANNOT_REMOVE_MODULE']); -		} - -		// If not move -		$diff = 2; -		$sql = 'DELETE FROM ' . MODULES_TABLE . " -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND module_id = $module_id"; -		$db->sql_query($sql); - -		$row['right_id'] = (int) $row['right_id']; -		$row['left_id'] = (int) $row['left_id']; - -		// Resync tree -		$sql = 'UPDATE ' . MODULES_TABLE . " -			SET right_id = right_id - $diff -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND left_id < {$row['right_id']} AND right_id > {$row['right_id']}"; -		$db->sql_query($sql); - -		$sql = 'UPDATE ' . MODULES_TABLE . " -			SET left_id = left_id - $diff, right_id = right_id - $diff -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND left_id > {$row['right_id']}"; -		$db->sql_query($sql); - -		add_log('admin', 'LOG_MODULE_REMOVED', $this->lang_name($row['module_langname'])); - -		return array(); - -	} - -	/** -	* Move module position by $steps up/down -	*/ -	function move_module_by($module_row, $action = 'move_up', $steps = 1) -	{ -		global $db; - -		/** -		* Fetch all the siblings between the module's current spot -		* and where we want to move it to. If there are less than $steps -		* siblings between the current spot and the target then the -		* module will move as far as possible -		*/ -		$sql = 'SELECT module_id, left_id, right_id, module_langname -			FROM ' . MODULES_TABLE . " -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND parent_id = " . (int) $module_row['parent_id'] . ' -				AND ' . (($action == 'move_up') ? 'right_id < ' . (int) $module_row['right_id'] . ' ORDER BY right_id DESC' : 'left_id > ' . (int) $module_row['left_id'] . ' ORDER BY left_id ASC'); -		$result = $db->sql_query_limit($sql, $steps); - -		$target = array(); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$target = $row; -		} -		$db->sql_freeresult($result); - -		if (!sizeof($target)) -		{ -			// The module is already on top or bottom -			return false; -		} - -		/** -		* $left_id and $right_id define the scope of the nodes that are affected by the move. -		* $diff_up and $diff_down are the values to substract or add to each node's left_id -		* and right_id in order to move them up or down. -		* $move_up_left and $move_up_right define the scope of the nodes that are moving -		* up. Other nodes in the scope of ($left_id, $right_id) are considered to move down. -		*/ -		if ($action == 'move_up') -		{ -			$left_id = (int) $target['left_id']; -			$right_id = (int) $module_row['right_id']; - -			$diff_up = (int) ($module_row['left_id'] - $target['left_id']); -			$diff_down = (int) ($module_row['right_id'] + 1 - $module_row['left_id']); - -			$move_up_left = (int) $module_row['left_id']; -			$move_up_right = (int) $module_row['right_id']; -		} -		else -		{ -			$left_id = (int) $module_row['left_id']; -			$right_id = (int) $target['right_id']; - -			$diff_up = (int) ($module_row['right_id'] + 1 - $module_row['left_id']); -			$diff_down = (int) ($target['right_id'] - $module_row['right_id']); - -			$move_up_left = (int) ($module_row['right_id'] + 1); -			$move_up_right = (int) $target['right_id']; -		} - -		// Now do the dirty job -		$sql = 'UPDATE ' . MODULES_TABLE . " -			SET left_id = left_id + CASE -				WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up} -				ELSE {$diff_down} -			END, -			right_id = right_id + CASE -				WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up} -				ELSE {$diff_down} -			END -			WHERE module_class = '" . $db->sql_escape($this->module_class) . "' -				AND left_id BETWEEN {$left_id} AND {$right_id} -				AND right_id BETWEEN {$left_id} AND {$right_id}"; -		$db->sql_query($sql); - -		$this->remove_cache_file(); - -		return $this->lang_name($target['module_langname']); -	}  } diff --git a/phpBB/includes/acp/acp_permission_roles.php b/phpBB/includes/acp/acp_permission_roles.php index cd3616208d..21c751b61a 100644 --- a/phpBB/includes/acp/acp_permission_roles.php +++ b/phpBB/includes/acp/acp_permission_roles.php @@ -28,7 +28,7 @@ class acp_permission_roles  	{  		global $db, $user, $auth, $template, $cache, $phpbb_container;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; -		global $request; +		global $request, $phpbb_log;  		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);  		include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx); @@ -41,8 +41,8 @@ class acp_permission_roles  		$this->tpl_name = 'acp_permission_roles';  		$submit = (isset($_POST['submit'])) ? true : false; -		$role_id = request_var('role_id', 0); -		$action = request_var('action', ''); +		$role_id = $request->variable('role_id', 0); +		$action = $request->variable('action', '');  		$action = (isset($_POST['add'])) ? 'add' : $action;  		$form_name = 'acp_permissions'; @@ -109,7 +109,7 @@ class acp_permission_roles  						$this->remove_role($role_id, $permission_type);  						$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name']; -						add_log('admin', 'LOG_' . strtoupper($permission_type) . 'ROLE_REMOVED', $role_name); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_' . strtoupper($permission_type) . 'ROLE_REMOVED', false, array($role_name));  						trigger_error($user->lang['ROLE_DELETED'] . adm_back_link($this->u_action));  					}  					else @@ -148,9 +148,9 @@ class acp_permission_roles  						trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);  					} -					$role_name = utf8_normalize_nfc(request_var('role_name', '', true)); -					$role_description = utf8_normalize_nfc(request_var('role_description', '', true)); -					$auth_settings = request_var('setting', array('' => 0)); +					$role_name = $request->variable('role_name', '', true); +					$role_description = $request->variable('role_description', '', true); +					$auth_settings = $request->variable('setting', array('' => 0));  					if (!$role_name)  					{ @@ -212,7 +212,7 @@ class acp_permission_roles  					$this->auth_admin->acl_set_role($role_id, $auth_settings);  					$role_name = (!empty($user->lang[$role_name])) ? $user->lang[$role_name] : $role_name; -					add_log('admin', 'LOG_' . strtoupper($permission_type) . 'ROLE_' . strtoupper($action), $role_name); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_' . strtoupper($permission_type) . 'ROLE_' . strtoupper($action), false, array($role_name));  					trigger_error($user->lang['ROLE_' . strtoupper($action) . '_SUCCESS'] . adm_back_link($this->u_action)); @@ -225,11 +225,11 @@ class acp_permission_roles  		{  			case 'add': -				$options_from = request_var('options_from', 0); +				$options_from = $request->variable('options_from', 0);  				$role_row = array( -					'role_name'			=> utf8_normalize_nfc(request_var('role_name', '', true)), -					'role_description'	=> utf8_normalize_nfc(request_var('role_description', '', true)), +					'role_name'			=> $request->variable('role_name', '', true), +					'role_description'	=> $request->variable('role_description', '', true),  					'role_type'			=> $permission_type,  				); @@ -299,6 +299,7 @@ class acp_permission_roles  					trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);  				} +				/* @var $phpbb_permissions \phpbb\permissions */  				$phpbb_permissions = $phpbb_container->get('acl.permissions');  				$template->assign_vars(array( @@ -413,7 +414,7 @@ class acp_permission_roles  		$db->sql_freeresult($result);  		// Display assigned items? -		$display_item = request_var('display_item', 0); +		$display_item = $request->variable('display_item', 0);  		// Select existing roles  		$sql = 'SELECT * @@ -471,6 +472,7 @@ class acp_permission_roles  	{  		global $template, $user, $phpbb_container; +		/* @var $phpbb_permissions \phpbb\permissions */  		$phpbb_permissions = $phpbb_container->get('acl.permissions');  		$content_array = $categories = array(); diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php index cb408e304f..b36eae0f93 100644 --- a/phpBB/includes/acp/acp_permissions.php +++ b/phpBB/includes/acp/acp_permissions.php @@ -23,11 +23,15 @@ class acp_permissions  {  	var $u_action;  	var $permission_dropdown; + +	/** +	 * @var $phpbb_permissions \phpbb\permissions +	 */  	protected $permissions;  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache, $phpbb_container; +		global $db, $user, $auth, $template, $cache, $phpbb_container, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx); @@ -45,9 +49,9 @@ class acp_permissions  		// Trace has other vars  		if ($mode == 'trace')  		{ -			$user_id = request_var('u', 0); -			$forum_id = request_var('f', 0); -			$permission = request_var('auth', ''); +			$user_id = $request->variable('u', 0); +			$forum_id = $request->variable('f', 0); +			$permission = $request->variable('auth', '');  			$this->tpl_name = 'permission_trace'; @@ -76,20 +80,20 @@ class acp_permissions  		}  		// Set some vars -		$action = request_var('action', array('' => 0)); +		$action = $request->variable('action', array('' => 0));  		$action = key($action);  		$action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action; -		$all_forums = request_var('all_forums', 0); -		$subforum_id = request_var('subforum_id', 0); -		$forum_id = request_var('forum_id', array(0)); +		$all_forums = $request->variable('all_forums', 0); +		$subforum_id = $request->variable('subforum_id', 0); +		$forum_id = $request->variable('forum_id', array(0)); -		$username = request_var('username', array(''), true); -		$usernames = request_var('usernames', '', true); -		$user_id = request_var('user_id', array(0)); +		$username = $request->variable('username', array(''), true); +		$usernames = $request->variable('usernames', '', true); +		$user_id = $request->variable('user_id', array(0)); -		$group_id = request_var('group_id', array(0)); -		$select_all_groups = request_var('select_all_groups', 0); +		$group_id = $request->variable('group_id', array(0)); +		$select_all_groups = $request->variable('select_all_groups', 0);  		$form_name = 'acp_permissions';  		add_form_key($form_name); @@ -228,7 +232,7 @@ class acp_permissions  		);  		// Get permission type -		$permission_type = request_var('type', $this->permission_dropdown[0]); +		$permission_type = $request->variable('type', $this->permission_dropdown[0]);  		if (!in_array($permission_type, $this->permission_dropdown))  		{ @@ -670,7 +674,7 @@ class acp_permissions  		global $db, $cache, $user, $auth;  		global $request; -		$psubmit = request_var('psubmit', array(0 => array(0 => 0))); +		$psubmit = $request->variable('psubmit', array(0 => array(0 => 0)));  		// User or group to be set?  		$ug_type = (sizeof($user_id)) ? 'user' : 'group'; @@ -700,7 +704,7 @@ class acp_permissions  		$assigned_role = (isset($roles[$ug_id][$forum_id])) ? (int) $roles[$ug_id][$forum_id] : 0;  		// Do the admin want to set these permissions to other items too? -		$inherit = request_var('inherit', array(0 => array(0))); +		$inherit = $request->variable('inherit', array(0 => array(0)));  		$ug_id = array($ug_id);  		$forum_id = array($forum_id); @@ -905,7 +909,7 @@ class acp_permissions  	*/  	function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)  	{ -		global $db, $user; +		global $db, $user, $phpbb_log;  		if (!is_array($ug_id))  		{ @@ -933,7 +937,7 @@ class acp_permissions  		if ($forum_id[0] == 0)  		{ -			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), false, array($l_ug_list));  		}  		else  		{ @@ -950,7 +954,7 @@ class acp_permissions  			}  			$db->sql_freeresult($result); -			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), false, array($l_forum_list, $l_ug_list));  		}  	} @@ -959,7 +963,7 @@ class acp_permissions  	*/  	function permission_trace($user_id, $forum_id, $permission)  	{ -		global $db, $template, $user, $auth; +		global $db, $template, $user, $auth, $request;  		if ($user_id != $user->data['user_id'])  		{ @@ -987,7 +991,7 @@ class acp_permissions  			$db->sql_freeresult($result);  		} -		$back = request_var('back', 0); +		$back = $request->variable('back', 0);  		$template->assign_vars(array(  			'PERMISSION'			=> $this->permissions->get_permission_lang($permission), @@ -1178,7 +1182,7 @@ class acp_permissions  	*/  	function copy_forum_permissions()  	{ -		global $db, $auth, $cache, $template, $user; +		global $db, $auth, $cache, $template, $user, $request;  		$user->add_lang('acp/forums'); @@ -1186,8 +1190,8 @@ class acp_permissions  		if ($submit)  		{ -			$src = request_var('src_forum_id', 0); -			$dest = request_var('dest_forum_ids', array(0)); +			$src = $request->variable('src_forum_id', 0); +			$dest = $request->variable('dest_forum_ids', array(0));  			if (confirm_box(true))  			{ diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php index 43668b8ad5..9b4fdaf993 100644 --- a/phpBB/includes/acp/acp_profile.php +++ b/phpBB/includes/acp/acp_profile.php @@ -25,13 +25,17 @@ class acp_profile  	var $edit_lang_id;  	var $lang_defs; + +	/** +	 * @var \phpbb\di\service_collection +	 */  	protected $type_collection;  	function main($id, $mode)  	{  		global $config, $db, $user, $auth, $template, $cache;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix; -		global $request, $phpbb_container, $phpbb_dispatcher; +		global $request, $phpbb_container, $phpbb_log, $phpbb_dispatcher;  		include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);  		include($phpbb_root_path . 'includes/functions_user.' . $phpEx); @@ -41,7 +45,7 @@ class acp_profile  		$this->page_title = 'ACP_CUSTOM_PROFILE_FIELDS';  		$field_id = $request->variable('field_id', 0); -		$action = (isset($_POST['create'])) ? 'create' : request_var('action', ''); +		$action = (isset($_POST['create'])) ? 'create' : $request->variable('action', '');  		$error = array();  		$s_hidden_fields = ''; @@ -51,6 +55,7 @@ class acp_profile  			trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);  		} +		/* @var $cp \phpbb\profilefields\manager */  		$cp = $phpbb_container->get('profilefields.manager');  		$this->type_collection = $phpbb_container->get('profilefields.type_collection'); @@ -112,6 +117,7 @@ class acp_profile  					$db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");  					$db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id"); +					/* @var $db_tools \phpbb\db\tools\tools_interface */  					$db_tools = $phpbb_container->get('dbal.tools');  					$db_tools->sql_column_remove(PROFILE_FIELDS_DATA_TABLE, 'pf_' . $field_ident); @@ -137,7 +143,7 @@ class acp_profile  					$db->sql_transaction('commit'); -					add_log('admin', 'LOG_PROFILE_FIELD_REMOVED', $field_ident); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_REMOVED', false, array($field_ident));  					trigger_error($user->lang['REMOVED_PROFILE_FIELD'] . adm_back_link($this->u_action));  				}  				else @@ -178,7 +184,7 @@ class acp_profile  				$field_ident = (string) $db->sql_fetchfield('field_ident');  				$db->sql_freeresult($result); -				add_log('admin', 'LOG_PROFILE_FIELD_ACTIVATE', $field_ident); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_ACTIVATE', false, array($field_ident));  				if ($request->is_ajax())  				{ @@ -214,7 +220,7 @@ class acp_profile  					));  				} -				add_log('admin', 'LOG_PROFILE_FIELD_DEACTIVATE', $field_ident); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_DEACTIVATE', false, array($field_ident));  				trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action)); @@ -255,7 +261,7 @@ class acp_profile  			case 'create':  			case 'edit': -				$step = request_var('step', 1); +				$step = $request->variable('step', 1);  				$submit = (isset($_REQUEST['next']) || isset($_REQUEST['prev'])) ? true : false;  				$save = (isset($_REQUEST['save'])) ? true : false; @@ -319,7 +325,7 @@ class acp_profile  					// We are adding a new field, define basic params  					$lang_options = $field_row = array(); -					$field_type = request_var('field_type', ''); +					$field_type = $request->variable('field_type', '');  					if (!isset($this->type_collection[$field_type]))  					{ @@ -328,7 +334,7 @@ class acp_profile  					$profile_field = $this->type_collection[$field_type];  					$field_row = array_merge($profile_field->get_default_option_values(), array( -						'field_ident'		=> str_replace(' ', '_', utf8_clean_string(request_var('field_ident', '', true))), +						'field_ident'		=> str_replace(' ', '_', utf8_clean_string($request->variable('field_ident', '', true))),  						'field_required'	=> 0,  						'field_show_novalue'=> 0,  						'field_hide'		=> 0, @@ -341,7 +347,7 @@ class acp_profile  						'field_is_contact'	=> 0,  						'field_contact_desc'=> '',  						'field_contact_url'	=> '', -						'lang_name'			=> utf8_normalize_nfc(request_var('field_ident', '', true)), +						'lang_name'			=> $request->variable('field_ident', '', true),  						'lang_explain'		=> '',  						'lang_default_value'=> '')  					); @@ -397,7 +403,7 @@ class acp_profile  				$options = $profile_field->prepare_options_form($exclude, $visibility_ary); -				$cp->vars['field_ident']		= ($action == 'create' && $step == 1) ? utf8_clean_string(request_var('field_ident', $field_row['field_ident'], true)) : request_var('field_ident', $field_row['field_ident']); +				$cp->vars['field_ident']		= ($action == 'create' && $step == 1) ? utf8_clean_string($request->variable('field_ident', $field_row['field_ident'], true)) : $request->variable('field_ident', $field_row['field_ident']);  				$cp->vars['lang_name']			= $request->variable('lang_name', $field_row['lang_name'], true);  				$cp->vars['lang_explain']		= $request->variable('lang_explain', $field_row['lang_explain'], true);  				$cp->vars['lang_default_value']	= $request->variable('lang_default_value', $field_row['lang_default_value'], true); @@ -436,7 +442,7 @@ class acp_profile  				// step 2  				foreach ($exclude[2] as $key)  				{ -					$var = utf8_normalize_nfc(request_var($key, $field_row[$key], true)); +					$var = $request->variable($key, $field_row[$key], true);  					$field_data = $cp->vars;  					$var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 2); @@ -482,7 +488,7 @@ class acp_profile  				foreach ($exclude[3] as $key)  				{ -					$cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => ''), true)); +					$cp->vars[$key] = $request->variable($key, array(0 => ''), true);  					if (!$cp->vars[$key] && $action == 'edit')  					{ @@ -766,7 +772,7 @@ class acp_profile  	*/  	function build_language_options(&$cp, $field_type, $action = 'create')  	{ -		global $user, $config, $db, $phpbb_container; +		global $user, $config, $db, $phpbb_container, $request;  		$default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']]; @@ -807,7 +813,7 @@ class acp_profile  			$lang_options[$lang_id]['lang_iso'] = $lang_iso;  			foreach ($options as $field => $field_type)  			{ -				$value = ($action == 'create') ? utf8_normalize_nfc(request_var('l_' . $field, array(0 => ''), true)) : $cp->vars['l_' . $field]; +				$value = ($action == 'create') ? $request->variable('l_' . $field, array(0 => ''), true) : $cp->vars['l_' . $field];  				if ($field == 'lang_options')  				{  					$var = (!isset($cp->vars['l_lang_options'][$lang_id]) || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['l_lang_options'][$lang_id]; @@ -863,9 +869,9 @@ class acp_profile  	*/  	function save_profile_field(&$cp, $field_type, $action = 'create')  	{ -		global $db, $config, $user, $phpbb_container, $phpbb_dispatcher; +		global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher; -		$field_id = request_var('field_id', 0); +		$field_id = $request->variable('field_id', 0);  		// Collect all information, if something is going wrong, abort the operation  		$profile_sql = $profile_lang = $empty_lang = $profile_lang_fields = array(); @@ -952,7 +958,7 @@ class acp_profile  		if ($action == 'create')  		{  			$field_ident = 'pf_' . $field_ident; - +			/* @var $db_tools \phpbb\db\tools\tools_interface */  			$db_tools = $phpbb_container->get('dbal.tools');  			$db_tools->sql_column_add(PROFILE_FIELDS_DATA_TABLE, $field_ident, array($profile_field->get_database_column_type(), null));  		} @@ -1151,12 +1157,12 @@ class acp_profile  		if ($action == 'edit')  		{ -			add_log('admin', 'LOG_PROFILE_FIELD_EDIT', $cp->vars['field_ident'] . ':' . $cp->vars['lang_name']); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_EDIT', false, array($cp->vars['field_ident'] . ':' . $cp->vars['lang_name']));  			trigger_error($user->lang['CHANGED_PROFILE_FIELD'] . adm_back_link($this->u_action));  		}  		else  		{ -			add_log('admin', 'LOG_PROFILE_FIELD_CREATE', substr($field_ident, 3) . ':' . $cp->vars['lang_name']); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_CREATE', false, array(substr($field_ident, 3) . ':' . $cp->vars['lang_name']));  			trigger_error($user->lang['ADDED_PROFILE_FIELD'] . adm_back_link($this->u_action));  		}  	} diff --git a/phpBB/includes/acp/acp_prune.php b/phpBB/includes/acp/acp_prune.php index e17399e3d9..ed40b0d424 100644 --- a/phpBB/includes/acp/acp_prune.php +++ b/phpBB/includes/acp/acp_prune.php @@ -51,11 +51,11 @@ class acp_prune  	*/  	function prune_forums($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; -		$all_forums = request_var('all_forums', 0); -		$forum_id = request_var('f', array(0)); +		$all_forums = $request->variable('all_forums', 0); +		$forum_id = $request->variable('f', array(0));  		$submit = (isset($_POST['submit'])) ? true : false;  		if ($all_forums) @@ -77,14 +77,14 @@ class acp_prune  		{  			if (confirm_box(true))  			{ -				$prune_posted = request_var('prune_days', 0); -				$prune_viewed = request_var('prune_vieweddays', 0); +				$prune_posted = $request->variable('prune_days', 0); +				$prune_viewed = $request->variable('prune_vieweddays', 0);  				$prune_all = (!$prune_posted && !$prune_viewed) ? true : false;  				$prune_flags = 0; -				$prune_flags += (request_var('prune_old_polls', 0)) ? 2 : 0; -				$prune_flags += (request_var('prune_announce', 0)) ? 4 : 0; -				$prune_flags += (request_var('prune_sticky', 0)) ? 8 : 0; +				$prune_flags += ($request->variable('prune_old_polls', 0)) ? 2 : 0; +				$prune_flags += ($request->variable('prune_announce', 0)) ? 4 : 0; +				$prune_flags += ($request->variable('prune_sticky', 0)) ? 8 : 0;  				// Convert days to seconds for timestamp functions...  				$prunedate_posted = time() - ($prune_posted * 86400); @@ -153,7 +153,8 @@ class acp_prune  					// Sync all pruned forums at once  					sync('forum', 'forum_id', $prune_ids, true, true); -					add_log('admin', 'LOG_PRUNE', $log_data); + +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PRUNE', false, array($log_data));  				}  				$db->sql_freeresult($result); @@ -168,11 +169,11 @@ class acp_prune  					'all_forums'	=> $all_forums,  					'f'				=> $forum_id, -					'prune_days'		=> request_var('prune_days', 0), -					'prune_vieweddays'	=> request_var('prune_vieweddays', 0), -					'prune_old_polls'	=> request_var('prune_old_polls', 0), -					'prune_announce'	=> request_var('prune_announce', 0), -					'prune_sticky'		=> request_var('prune_sticky', 0), +					'prune_days'		=> $request->variable('prune_days', 0), +					'prune_vieweddays'	=> $request->variable('prune_vieweddays', 0), +					'prune_old_polls'	=> $request->variable('prune_old_polls', 0), +					'prune_announce'	=> $request->variable('prune_announce', 0), +					'prune_sticky'		=> $request->variable('prune_sticky', 0),  				)));  			}  		} @@ -228,7 +229,7 @@ class acp_prune  	*/  	function prune_users($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		$user->add_lang('memberlist'); @@ -237,8 +238,8 @@ class acp_prune  		if ($prune)  		{ -			$action = request_var('action', 'deactivate'); -			$deleteposts = request_var('deleteposts', 0); +			$action = $request->variable('action', 'deactivate'); +			$deleteposts = $request->variable('deleteposts', 0);  			if (confirm_box(true))  			{ @@ -268,7 +269,7 @@ class acp_prune  						}  					} -					add_log('admin', $l_log, implode(', ', $usernames)); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $l_log, false, array(implode(', ', $usernames)));  					$msg = $user->lang['USER_' . strtoupper($action) . '_SUCCESS'];  				}  				else @@ -310,8 +311,8 @@ class acp_prune  					'mode'			=> $mode,  					'prune'			=> 1, -					'deleteposts'	=> request_var('deleteposts', 0), -					'action'		=> request_var('action', ''), +					'deleteposts'	=> $request->variable('deleteposts', 0), +					'action'		=> $request->variable('action', ''),  				)), 'confirm_body_prune.html');  			}  		} @@ -368,9 +369,9 @@ class acp_prune  	{  		global $user, $db, $request; -		$users_by_name = request_var('users', '', true); -		$users_by_id = request_var('user_ids', array(0)); -		$group_id = request_var('group_id', 0); +		$users_by_name = $request->variable('users', '', true); +		$users_by_id = $request->variable('user_ids', array(0)); +		$group_id = $request->variable('group_id', 0);  		$posts_on_queue = (trim($request->variable('posts_on_queue', '')) === '') ? false : $request->variable('posts_on_queue', 0);  		if ($users_by_name) @@ -387,15 +388,15 @@ class acp_prune  		}  		else  		{ -			$username = request_var('username', '', true); -			$email = request_var('email', ''); - -			$active_select = request_var('active_select', 'lt'); -			$count_select = request_var('count_select', 'eq'); -			$queue_select = request_var('queue_select', 'gt'); -			$joined_before = request_var('joined_before', ''); -			$joined_after = request_var('joined_after', ''); -			$active = request_var('active', ''); +			$username = $request->variable('username', '', true); +			$email = $request->variable('email', ''); + +			$active_select = $request->variable('active_select', 'lt'); +			$count_select = $request->variable('count_select', 'eq'); +			$queue_select = $request->variable('queue_select', 'gt'); +			$joined_before = $request->variable('joined_before', ''); +			$joined_after = $request->variable('joined_after', ''); +			$active = $request->variable('active', '');  			$count = ($request->variable('count', '') === '') ? false : $request->variable('count', 0); diff --git a/phpBB/includes/acp/acp_ranks.php b/phpBB/includes/acp/acp_ranks.php index 5885de57ec..2921d6500b 100644 --- a/phpBB/includes/acp/acp_ranks.php +++ b/phpBB/includes/acp/acp_ranks.php @@ -26,15 +26,15 @@ class acp_ranks  	function main($id, $mode)  	{  		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher; -		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; +		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_log;  		$user->add_lang('acp/posting');  		// Set up general vars -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$action = (isset($_POST['add'])) ? 'add' : $action;  		$action = (isset($_POST['save'])) ? 'save' : $action; -		$rank_id = request_var('id', 0); +		$rank_id = $request->variable('id', 0);  		$this->tpl_name = 'acp_ranks';  		$this->page_title = 'ACP_MANAGE_RANKS'; @@ -50,10 +50,10 @@ class acp_ranks  				{  					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);  				} -				$rank_title = utf8_normalize_nfc(request_var('title', '', true)); -				$special_rank = request_var('special_rank', 0); -				$min_posts = ($special_rank) ? 0 : max(0, request_var('min_posts', 0)); -				$rank_image = request_var('rank_image', ''); +				$rank_title = $request->variable('title', '', true); +				$special_rank = $request->variable('special_rank', 0); +				$min_posts = ($special_rank) ? 0 : max(0, $request->variable('min_posts', 0)); +				$rank_image = $request->variable('rank_image', '');  				// The rank image has to be a jpg, gif or png  				if ($rank_image != '' && !preg_match('#(\.gif|\.png|\.jpg|\.jpeg)$#i', $rank_image)) @@ -89,14 +89,14 @@ class acp_ranks  					$sql = 'UPDATE ' . RANKS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE rank_id = $rank_id";  					$message = $user->lang['RANK_UPDATED']; -					add_log('admin', 'LOG_RANK_UPDATED', $rank_title); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RANK_UPDATED', false, array($rank_title));  				}  				else  				{  					$sql = 'INSERT INTO ' . RANKS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);  					$message = $user->lang['RANK_ADDED']; -					add_log('admin', 'LOG_RANK_ADDED', $rank_title); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RANK_ADDED', false, array($rank_title));  				}  				$db->sql_query($sql); @@ -133,7 +133,7 @@ class acp_ranks  					$cache->destroy('_ranks'); -					add_log('admin', 'LOG_RANK_REMOVED', $rank_title); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RANK_REMOVED', false, array($rank_title));  					if ($request->is_ajax())  					{ diff --git a/phpBB/includes/acp/acp_reasons.php b/phpBB/includes/acp/acp_reasons.php index 3d7ccf422c..56f0296423 100644 --- a/phpBB/includes/acp/acp_reasons.php +++ b/phpBB/includes/acp/acp_reasons.php @@ -27,14 +27,14 @@ class acp_reasons  	{  		global $db, $user, $auth, $template, $cache;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; -		global $request; +		global $request, $phpbb_log;  		$user->add_lang(array('mcp', 'acp/posting'));  		// Set up general vars -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$submit = (isset($_POST['submit'])) ? true : false; -		$reason_id = request_var('id', 0); +		$reason_id = $request->variable('id', 0);  		$this->tpl_name = 'acp_reasons';  		$this->page_title = 'ACP_REASONS'; @@ -50,8 +50,8 @@ class acp_reasons  			case 'edit':  				$reason_row = array( -					'reason_title'			=> utf8_normalize_nfc(request_var('reason_title', '', true)), -					'reason_description'	=> utf8_normalize_nfc(request_var('reason_description', '', true)), +					'reason_title'			=> $request->variable('reason_title', '', true), +					'reason_description'	=> $request->variable('reason_description', '', true),  				);  				if ($submit) @@ -139,7 +139,7 @@ class acp_reasons  							$log = 'UPDATED';  						} -						add_log('admin', 'LOG_REASON_' . $log, $reason_row['reason_title']); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_' . $log, false, array($reason_row['reason_title']));  						trigger_error($user->lang['REASON_' . $log] . adm_back_link($this->u_action));  					}  				} @@ -264,7 +264,7 @@ class acp_reasons  					$db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . $reason_id); -					add_log('admin', 'LOG_REASON_REMOVED', $reason_row['reason_title']); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_REMOVED', false, array($reason_row['reason_title']));  					trigger_error($user->lang['REASON_REMOVED'] . adm_back_link($this->u_action));  				}  				else diff --git a/phpBB/includes/acp/acp_search.php b/phpBB/includes/acp/acp_search.php index abb8301507..25fc1ed8dc 100644 --- a/phpBB/includes/acp/acp_search.php +++ b/phpBB/includes/acp/acp_search.php @@ -50,7 +50,7 @@ class acp_search  	function settings($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		$submit = (isset($_POST['submit'])) ? true : false; @@ -104,8 +104,8 @@ class acp_search  		unset($search);  		unset($error); -		$cfg_array = (isset($_REQUEST['config'])) ? request_var('config', array('' => ''), true) : array(); -		$updated = request_var('updated', false); +		$cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => ''), true) : array(); +		$updated = $request->variable('updated', false);  		foreach ($settings as $config_name => $var_type)  		{ @@ -133,7 +133,7 @@ class acp_search  			// only change config if anything was actually changed  			if ($submit && ($config[$config_name] != $config_value))  			{ -				set_config($config_name, $config_value); +				$config->set($config_name, $config_value);  				$updated = true;  			}  		} @@ -143,7 +143,7 @@ class acp_search  			$extra_message = '';  			if ($updated)  			{ -				add_log('admin', 'LOG_CONFIG_SEARCH'); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_SEARCH');  			}  			if (isset($cfg_array['search_type']) && in_array($cfg_array['search_type'], $search_types, true) && ($cfg_array['search_type'] != $config['search_type'])) @@ -157,11 +157,11 @@ class acp_search  					{  						if (!method_exists($search, 'init') || !($error = $search->init()))  						{ -							set_config('search_type', $cfg_array['search_type']); +							$config->set('search_type', $cfg_array['search_type']);  							if (!$updated)  							{ -								add_log('admin', 'LOG_CONFIG_SEARCH'); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_SEARCH');  							}  							$extra_message = '<br />' . $user->lang['SWITCHED_SEARCH_BACKEND'] . '<br /><a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=search&mode=index') . '">» ' . $user->lang['GO_TO_SEARCH_INDEX'] . '</a>';  						} @@ -232,10 +232,10 @@ class acp_search  	function index($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_log, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$this->state = explode(',', $config['search_indexing_state']);  		if (isset($_POST['cancel'])) @@ -250,7 +250,7 @@ class acp_search  			switch ($action)  			{  				case 'progress_bar': -					$type = request_var('type', ''); +					$type = $request->variable('type', '');  					$this->display_progress_bar($type);  				break; @@ -269,7 +269,7 @@ class acp_search  			if (empty($this->state[0]))  			{ -				$this->state[0] = request_var('search_type', ''); +				$this->state[0] = $request->variable('search_type', '');  			}  			$this->search = null; @@ -303,8 +303,7 @@ class acp_search  					}  					else  					{ -						$starttime = explode(' ', microtime()); -						$starttime = $starttime[1] + $starttime[0]; +						$starttime = microtime(true);  						$row_count = 0;  						while (still_on_time() && $post_counter <= $this->max_post_id)  						{ @@ -336,8 +335,7 @@ class acp_search  						if ($post_counter <= $this->max_post_id)  						{ -							$mtime = explode(' ', microtime()); -							$totaltime = $mtime[0] + $mtime[1] - $starttime; +							$totaltime = microtime(true) - $starttime;  							$rows_per_second = $row_count / $totaltime;  							meta_refresh(1, append_sid($this->u_action . '&action=delete&skip_rows=' . $post_counter));  							trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter, $rows_per_second)); @@ -349,7 +347,7 @@ class acp_search  					$this->state = array('');  					$this->save_state(); -					add_log('admin', 'LOG_SEARCH_INDEX_REMOVED', $name); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_SEARCH_INDEX_REMOVED', false, array($name));  					trigger_error($user->lang['SEARCH_INDEX_REMOVED'] . adm_back_link($this->u_action) . $this->close_popup_js());  				break; @@ -376,8 +374,7 @@ class acp_search  						}  						$db->sql_freeresult($result); -						$starttime = explode(' ', microtime()); -						$starttime = $starttime[1] + $starttime[0]; +						$starttime = microtime(true);  						$row_count = 0;  						while (still_on_time() && $post_counter <= $this->max_post_id)  						{ @@ -426,8 +423,7 @@ class acp_search  						if ($post_counter <= $this->max_post_id)  						{ -							$mtime = explode(' ', microtime()); -							$totaltime = $mtime[0] + $mtime[1] - $starttime; +							$totaltime = microtime(true) - $starttime;  							$rows_per_second = $row_count / $totaltime;  							meta_refresh(1, append_sid($this->u_action . '&action=create&skip_rows=' . $post_counter));  							trigger_error($user->lang('SEARCH_INDEX_CREATE_REDIRECT', (int) $row_count, $post_counter) . $user->lang('SEARCH_INDEX_CREATE_REDIRECT_RATE', $rows_per_second)); @@ -439,7 +435,7 @@ class acp_search  					$this->state = array('');  					$this->save_state(); -					add_log('admin', 'LOG_SEARCH_INDEX_CREATED', $name); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_SEARCH_INDEX_CREATED', false, array($name));  					trigger_error($user->lang['SEARCH_INDEX_CREATED'] . adm_back_link($this->u_action) . $this->close_popup_js());  				break;  			} @@ -581,6 +577,8 @@ class acp_search  	function save_state($state = false)  	{ +		global $config; +  		if ($state)  		{  			$this->state = $state; @@ -588,7 +586,7 @@ class acp_search  		ksort($this->state); -		set_config('search_indexing_state', implode(',', $this->state), true); +		$config->set('search_indexing_state', implode(',', $this->state), true);  	}  	/** diff --git a/phpBB/includes/acp/acp_send_statistics.php b/phpBB/includes/acp/acp_send_statistics.php index d178be2fb0..4c5786dbe9 100644 --- a/phpBB/includes/acp/acp_send_statistics.php +++ b/phpBB/includes/acp/acp_send_statistics.php @@ -38,7 +38,7 @@ class acp_send_statistics  		if (!isset($config['questionnaire_unique_id']))  		{  			$install_id = unique_id(); -			set_config('questionnaire_unique_id', $install_id); +			$config->set('questionnaire_unique_id', $install_id);  		}  		else  		{ diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index a36a6c1ecd..de3ca5f787 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -32,6 +32,9 @@ class acp_styles  	protected $styles_list_cols = 0;  	protected $reserved_style_names = array('adm', 'admin', 'all'); +	/** @var \phpbb\config\config */ +	protected $config; +  	/** @var \phpbb\db\driver\driver_interface */  	protected $db; @@ -50,6 +53,9 @@ class acp_styles  	/** @var \phpbb\auth\auth */  	protected $auth; +	/** @var \phpbb\textformatter\cache_interface */ +	protected $text_formatter_cache; +  	/** @var string */  	protected $phpbb_root_path; @@ -58,7 +64,7 @@ class acp_styles  	public function main($id, $mode)  	{ -		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config; +		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config, $phpbb_container;  		$this->db = $db;  		$this->user = $user; @@ -66,6 +72,7 @@ class acp_styles  		$this->request = $request;  		$this->cache = $cache;  		$this->auth = $auth; +		$this->text_formatter_cache = $phpbb_container->get('text_formatter.cache');  		$this->config = $config;  		$this->phpbb_root_path = $phpbb_root_path;  		$this->php_ext = $phpEx; @@ -213,6 +220,12 @@ class acp_styles  			}  		} +		// Invalidate the text formatter's cache for the new styles to take effect +		if (!empty($installed_names)) +		{ +			$this->text_formatter_cache->invalidate(); +		} +  		// Show message  		if (!count($messages))  		{ @@ -260,6 +273,8 @@ class acp_styles  	*/  	protected function action_uninstall_confirmed($ids, $delete_files)  	{ +		global $user, $phpbb_log; +  		$default = $this->default_style;  		$uninstalled = array();  		$messages = array(); @@ -319,7 +334,7 @@ class acp_styles  		// Log action  		if (count($uninstalled))  		{ -			add_log('admin', 'LOG_STYLE_DELETE', implode(', ', $uninstalled)); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_STYLE_DELETE', false, array(implode(', ', $uninstalled)));  		}  		// Clear cache @@ -391,6 +406,8 @@ class acp_styles  	*/  	protected function action_details()  	{ +		global $user, $phpbb_log; +  		$id = $this->request->variable('id', 0);  		if (!$id)  		{ @@ -522,7 +539,8 @@ class acp_styles  						$this->cache->purge();  					}  				} -				add_log('admin', 'LOG_STYLE_EDIT_DETAILS', $style['style_name']); + +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_STYLE_EDIT_DETAILS', false, array($style['style_name']));  			}  			// Update default style @@ -533,7 +551,7 @@ class acp_styles  				{  					trigger_error($this->user->lang['STYLE_DEFAULT_CHANGE_INACTIVE'] . adm_back_link($update_action), E_USER_WARNING);  				} -				set_config('default_style', $id); +				$this->config->set('default_style', $id);  				$this->cache->purge();  			} @@ -1119,6 +1137,8 @@ class acp_styles  	*/  	protected function install_style($style)  	{ +		global $user, $phpbb_log; +  		// Generate row  		$sql_ary = array();  		foreach ($style as $key => $value) @@ -1140,7 +1160,7 @@ class acp_styles  		$this->db->sql_transaction('commit'); -		add_log('admin', 'LOG_STYLE_ADD', $sql_ary['style_name']); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_STYLE_ADD', false, array($sql_ary['style_name']));  		return $id;  	} diff --git a/phpBB/includes/acp/acp_update.php b/phpBB/includes/acp/acp_update.php index 0167a06dbb..83604b8261 100644 --- a/phpBB/includes/acp/acp_update.php +++ b/phpBB/includes/acp/acp_update.php @@ -33,6 +33,7 @@ class acp_update  		$this->tpl_name = 'acp_update';  		$this->page_title = 'ACP_VERSION_CHECK'; +		/* @var $version_helper \phpbb\version_helper */  		$version_helper = $phpbb_container->get('version_helper');  		try  		{ diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 8c17fb6311..0ec17ccf0c 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -34,15 +34,15 @@ class acp_users  		global $config, $db, $user, $auth, $template, $cache;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads;  		global $phpbb_dispatcher, $request; -		global $phpbb_container; +		global $phpbb_container, $phpbb_log;  		$user->add_lang(array('posting', 'ucp', 'acp/users'));  		$this->tpl_name = 'acp_users';  		$error		= array(); -		$username	= utf8_normalize_nfc(request_var('username', '', true)); -		$user_id	= request_var('u', 0); -		$action		= request_var('action', ''); +		$username	= $request->variable('username', '', true); +		$user_id	= $request->variable('u', 0); +		$action		= $request->variable('action', '');  		$submit		= (isset($_POST['update']) && !isset($_POST['cancel'])) ? true : false; @@ -57,7 +57,7 @@ class acp_users  			$this->page_title = 'WHOIS';  			$this->tpl_name = 'simple_body'; -			$user_ip = phpbb_ip_normalise(request_var('user_ip', '')); +			$user_ip = phpbb_ip_normalise($request->variable('user_ip', ''));  			$domain = gethostbyaddr($user_ip);  			$ipwhois = user_ipwhois($user_ip); @@ -169,9 +169,9 @@ class acp_users  				$user->add_lang('acp/ban'); -				$delete			= request_var('delete', 0); -				$delete_type	= request_var('delete_type', ''); -				$ip				= request_var('ip', 'ip'); +				$delete			= $request->variable('delete', 0); +				$delete_type	= $request->variable('delete_type', ''); +				$ip				= $request->variable('ip', 'ip');  				/**  				 * Run code at beginning of ACP users overview @@ -220,7 +220,7 @@ class acp_users  							{  								user_delete($delete_type, $user_id, $user_row['username']); -								add_log('admin', 'LOG_USER_DELETED', $user_row['username']); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DELETED', false, array($user_row['username']));  								trigger_error($user->lang['USER_DELETED'] . adm_back_link($this->u_action));  							}  							else @@ -304,8 +304,8 @@ class acp_users  								break;  							} -							$ban_reason = utf8_normalize_nfc(request_var('ban_reason', $user->lang[$reason], true)); -							$ban_give_reason = utf8_normalize_nfc(request_var('ban_give_reason', '', true)); +							$ban_reason = $request->variable('ban_reason', $user->lang[$reason], true); +							$ban_give_reason = $request->variable('ban_give_reason', '', true);  							// Log not used at the moment, we simply utilize the ban function.  							$result = user_ban(substr($action, 3), $ban, 0, 0, 0, $ban_reason, $ban_give_reason); @@ -381,8 +381,10 @@ class acp_users  								$messenger->send(NOTIFY_EMAIL); -								add_log('admin', 'LOG_USER_REACTIVATE', $user_row['username']); -								add_log('user', $user_id, 'LOG_USER_REACTIVATE_USER'); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_REACTIVATE', false, array($user_row['username'])); +								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_REACTIVATE_USER', false, array( +									'reportee_id' => $user_id +								));  								trigger_error($user->lang['FORCE_REACTIVATION_SUCCESS'] . adm_back_link($this->u_action . '&u=' . $user_id));  							} @@ -418,6 +420,7 @@ class acp_users  							{  								if ($config['require_activation'] == USER_ACTIVATION_ADMIN)  								{ +									/* @var $phpbb_notifications \phpbb\notification\manager */  									$phpbb_notifications = $phpbb_container->get('notification_manager');  									$phpbb_notifications->delete_notifications('notification.type.admin_activate_user', $user_row['user_id']); @@ -442,8 +445,10 @@ class acp_users  							$message = ($user_row['user_type'] == USER_INACTIVE) ? 'USER_ADMIN_ACTIVATED' : 'USER_ADMIN_DEACTIVED';  							$log = ($user_row['user_type'] == USER_INACTIVE) ? 'LOG_USER_ACTIVE' : 'LOG_USER_INACTIVE'; -							add_log('admin', $log, $user_row['username']); -							add_log('user', $user_id, $log . '_USER'); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($user_row['username'])); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, $log . '_USER', false, array( +								'reportee_id' => $user_id +							));  							trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&u=' . $user_id)); @@ -466,8 +471,10 @@ class acp_users  								WHERE user_id = $user_id";  							$db->sql_query($sql); -							add_log('admin', 'LOG_USER_DEL_SIG', $user_row['username']); -							add_log('user', $user_id, 'LOG_USER_DEL_SIG_USER'); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_SIG', false, array($user_row['username'])); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_SIG_USER', false, array( +								'reportee_id' => $user_id +							));  							trigger_error($user->lang['USER_ADMIN_SIG_REMOVED'] . adm_back_link($this->u_action . '&u=' . $user_id)); @@ -481,11 +488,14 @@ class acp_users  							}  							// Delete old avatar if present +							/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  							$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  							$phpbb_avatar_manager->handle_avatar_delete($db, $user, $phpbb_avatar_manager->clean_row($user_row, 'user'), USERS_TABLE, 'user_'); -							add_log('admin', 'LOG_USER_DEL_AVATAR', $user_row['username']); -							add_log('user', $user_id, 'LOG_USER_DEL_AVATAR_USER'); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_AVATAR', false, array($user_row['username'])); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_AVATAR_USER', false, array( +								'reportee_id' => $user_id +							));  							trigger_error($user->lang['USER_ADMIN_AVATAR_REMOVED'] . adm_back_link($this->u_action . '&u=' . $user_id));  						break; @@ -497,7 +507,7 @@ class acp_users  								// Delete posts, attachments, etc.  								delete_posts('poster_id', $user_id); -								add_log('admin', 'LOG_USER_DEL_POSTS', $user_row['username']); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_POSTS', false, array($user_row['username']));  								trigger_error($user->lang['USER_POSTS_DELETED'] . adm_back_link($this->u_action . '&u=' . $user_id));  							}  							else @@ -519,7 +529,7 @@ class acp_users  							{  								delete_attachments('user', $user_id); -								add_log('admin', 'LOG_USER_DEL_ATTACH', $user_row['username']); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_ATTACH', false, array($user_row['username']));  								trigger_error($user->lang['USER_ATTACHMENTS_REMOVED'] . adm_back_link($this->u_action . '&u=' . $user_id));  							}  							else @@ -565,7 +575,7 @@ class acp_users  									delete_pm($user_id, $msg_ids, PRIVMSGS_OUTBOX); -									add_log('admin', 'LOG_USER_DEL_OUTBOX', $user_row['username']); +									$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_OUTBOX', false, array($user_row['username']));  									$lang = 'EMPTIED';  								} @@ -594,7 +604,7 @@ class acp_users  							$user->add_lang('acp/forums'); -							$new_forum_id = request_var('new_f', 0); +							$new_forum_id = $request->variable('new_f', 0);  							if (!$new_forum_id)  							{ @@ -736,8 +746,11 @@ class acp_users  								sync('forum', 'forum_id', $forum_id_ary, false, true);  							} -							add_log('admin', 'LOG_USER_MOVE_POSTS', $user_row['username'], $forum_info['forum_name']); -							add_log('user', $user_id, 'LOG_USER_MOVE_POSTS_USER', $forum_info['forum_name']); +							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_MOVE_POSTS', false, array($user_row['username'], $forum_info['forum_name'])); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_MOVE_POSTS_USER', false, array( +								'reportee_id' => $user_id, +								$forum_info['forum_name'] +							));  							trigger_error($user->lang['USER_POSTS_MOVED'] . adm_back_link($this->u_action . '&u=' . $user_id)); @@ -749,7 +762,7 @@ class acp_users  							{  								remove_newly_registered($user_id, $user_row); -								add_log('admin', 'LOG_USER_REMOVED_NR', $user_row['username']); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_REMOVED_NR', false, array($user_row['username']));  								trigger_error($user->lang['USER_LIFTED_NR'] . adm_back_link($this->u_action . '&u=' . $user_id));  							}  							else @@ -781,9 +794,9 @@ class acp_users  					// Handle registration info updates  					$data = array( -						'username'			=> utf8_normalize_nfc(request_var('user', $user_row['username'], true)), -						'user_founder'		=> request_var('user_founder', ($user_row['user_type'] == USER_FOUNDER) ? 1 : 0), -						'email'				=> strtolower(request_var('user_email', $user_row['user_email'])), +						'username'			=> $request->variable('user', $user_row['username'], true), +						'user_founder'		=> $request->variable('user_founder', ($user_row['user_type'] == USER_FOUNDER) ? 1 : 0), +						'email'				=> strtolower($request->variable('user_email', $user_row['user_email'])),  						'new_password'		=> $request->variable('new_password', '', true),  						'password_confirm'	=> $request->variable('password_confirm', '', true),  					); @@ -831,6 +844,7 @@ class acp_users  					}  					// Instantiate passwords manager +					/* @var $passwords_manager \phpbb\passwords\manager */  					$passwords_manager = $phpbb_container->get('passwords.manager');  					// Which updates do we need to do? @@ -903,7 +917,11 @@ class acp_users  							$sql_ary['username'] = $update_username;  							$sql_ary['username_clean'] = utf8_clean_string($update_username); -							add_log('user', $user_id, 'LOG_USER_UPDATE_NAME', $user_row['username'], $update_username); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_NAME', false, array( +								'reportee_id' => $user_id, +								$user_row['username'], +								$update_username +							));  						}  						if ($update_email !== false) @@ -913,7 +931,12 @@ class acp_users  								'user_email_hash'	=> phpbb_email_hash($update_email),  							); -							add_log('user', $user_id, 'LOG_USER_UPDATE_EMAIL', $user_row['username'], $user_row['user_email'], $update_email); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_EMAIL', false, array( +								'reportee_id' => $user_id, +								$user_row['username'], +								$user_row['user_email'], +								$update_email +							));  						}  						if ($update_password) @@ -924,7 +947,11 @@ class acp_users  							);  							$user->reset_login_keys($user_id); -							add_log('user', $user_id, 'LOG_USER_NEW_PASSWORD', $user_row['username']); + +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array( +								'reportee_id' => $user_id, +								$user_row['username'] +							));  						}  						if (sizeof($sql_ary)) @@ -943,7 +970,7 @@ class acp_users  						// Let the users permissions being updated  						$auth->acl_clear_prefetch($user_id); -						add_log('admin', 'LOG_USER_USER_UPDATE', $data['username']); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_USER_UPDATE', false, array($data['username']));  						trigger_error($user->lang['USER_OVERVIEW_UPDATED'] . adm_back_link($this->u_action . '&u=' . $user_id));  					} @@ -1100,17 +1127,19 @@ class acp_users  				$user->add_lang('mcp');  				// Set up general vars -				$start		= request_var('start', 0); +				$start		= $request->variable('start', 0);  				$deletemark = (isset($_POST['delmarked'])) ? true : false;  				$deleteall	= (isset($_POST['delall'])) ? true : false; -				$marked		= request_var('mark', array(0)); -				$message	= utf8_normalize_nfc(request_var('message', '', true)); +				$marked		= $request->variable('mark', array(0)); +				$message	= $request->variable('message', '', true); + +				/* @var $pagination \phpbb\pagination */  				$pagination = $phpbb_container->get('pagination');  				// Sort keys -				$sort_days	= request_var('st', 0); -				$sort_key	= request_var('sk', 't'); -				$sort_dir	= request_var('sd', 'd'); +				$sort_days	= $request->variable('st', 0); +				$sort_key	= $request->variable('sk', 't'); +				$sort_dir	= $request->variable('sd', 'd');  				// Delete entries if requested and able  				if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs')) @@ -1140,7 +1169,7 @@ class acp_users  							$where_sql";  						$db->sql_query($sql); -						add_log('admin', 'LOG_CLEAR_USER', $user_row['username']); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CLEAR_USER', false, array($user_row['username']));  					}  				} @@ -1151,9 +1180,16 @@ class acp_users  						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action . '&u=' . $user_id), E_USER_WARNING);  					} -					add_log('admin', 'LOG_USER_FEEDBACK', $user_row['username']); -					add_log('mod', 0, 0, 'LOG_USER_FEEDBACK', $user_row['username']); -					add_log('user', $user_id, 'LOG_USER_GENERAL', $message); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array($user_row['username'])); +					$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array( +						'forum_id' => 0, +						'topic_id' => 0, +						$user_row['username'] +					)); +					$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GENERAL', false, array( +						'reportee_id' => $user_id, +						$message +					));  					trigger_error($user->lang['USER_FEEDBACK_ADDED'] . adm_back_link($this->u_action . '&u=' . $user_id));  				} @@ -1204,17 +1240,17 @@ class acp_users  				$user->add_lang('mcp');  				// Set up general vars -				$start		= request_var('start', 0); +				$start		= $request->variable('start', 0);  				$deletemark	= (isset($_POST['delmarked'])) ? true : false;  				$deleteall	= (isset($_POST['delall'])) ? true : false;  				$confirm	= (isset($_POST['confirm'])) ? true : false; -				$marked		= request_var('mark', array(0)); -				$message	= utf8_normalize_nfc(request_var('message', '', true)); +				$marked		= $request->variable('mark', array(0)); +				$message	= $request->variable('message', '', true);  				// Sort keys -				$sort_days	= request_var('st', 0); -				$sort_key	= request_var('sk', 't'); -				$sort_dir	= request_var('sd', 'd'); +				$sort_days	= $request->variable('st', 0); +				$sort_key	= $request->variable('sk', 't'); +				$sort_dir	= $request->variable('sd', 'd');  				// Delete entries if requested and able  				if ($deletemark || $deleteall || $confirm) @@ -1222,8 +1258,8 @@ class acp_users  					if (confirm_box(true))  					{  						$where_sql = ''; -						$deletemark = request_var('delmarked', 0); -						$deleteall = request_var('delall', 0); +						$deletemark = $request->variable('delmarked', 0); +						$deleteall = $request->variable('delall', 0);  						if ($deletemark && $marked)  						{  							$where_sql = ' AND ' . $db->sql_in_set('warning_id', array_values($marked)); @@ -1254,11 +1290,11 @@ class acp_users  							if ($log_warnings)  							{ -								add_log('admin', 'LOG_WARNINGS_DELETED', $user_row['username'], $num_warnings); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_WARNINGS_DELETED', false, array($user_row['username'], $num_warnings));  							}  							else  							{ -								add_log('admin', 'LOG_WARNINGS_DELETED_ALL', $user_row['username']); +								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_WARNINGS_DELETED_ALL', false, array($user_row['username']));  							}  						}  					} @@ -1347,6 +1383,7 @@ class acp_users  				include($phpbb_root_path . 'includes/functions_user.' . $phpEx); +				/* @var $cp \phpbb\profilefields\manager */  				$cp = $phpbb_container->get('profilefields.manager');  				$cp_data = $cp_error = array(); @@ -1361,7 +1398,7 @@ class acp_users  				$user_row['iso_lang_id'] = $row['lang_id'];  				$data = array( -					'jabber'		=> utf8_normalize_nfc(request_var('jabber', $user_row['user_jabber'], true)), +					'jabber'		=> $request->variable('jabber', $user_row['user_jabber'], true),  					'bday_day'		=> 0,  					'bday_month'	=> 0,  					'bday_year'		=> 0, @@ -1372,9 +1409,9 @@ class acp_users  					list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user_row['user_birthday']);  				} -				$data['bday_day']		= request_var('bday_day', $data['bday_day']); -				$data['bday_month']		= request_var('bday_month', $data['bday_month']); -				$data['bday_year']		= request_var('bday_year', $data['bday_year']); +				$data['bday_day']		= $request->variable('bday_day', $data['bday_day']); +				$data['bday_month']		= $request->variable('bday_month', $data['bday_month']); +				$data['bday_year']		= $request->variable('bday_year', $data['bday_year']);  				$data['user_birthday']	= sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);  				/** @@ -1507,36 +1544,36 @@ class acp_users  				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);  				$data = array( -					'dateformat'		=> utf8_normalize_nfc(request_var('dateformat', $user_row['user_dateformat'], true)), -					'lang'				=> basename(request_var('lang', $user_row['user_lang'])), -					'tz'				=> request_var('tz', $user_row['user_timezone']), -					'style'				=> request_var('style', $user_row['user_style']), -					'viewemail'			=> request_var('viewemail', $user_row['user_allow_viewemail']), -					'massemail'			=> request_var('massemail', $user_row['user_allow_massemail']), -					'hideonline'		=> request_var('hideonline', !$user_row['user_allow_viewonline']), -					'notifymethod'		=> request_var('notifymethod', $user_row['user_notify_type']), -					'notifypm'			=> request_var('notifypm', $user_row['user_notify_pm']), -					'allowpm'			=> request_var('allowpm', $user_row['user_allow_pm']), - -					'topic_sk'			=> request_var('topic_sk', ($user_row['user_topic_sortby_type']) ? $user_row['user_topic_sortby_type'] : 't'), -					'topic_sd'			=> request_var('topic_sd', ($user_row['user_topic_sortby_dir']) ? $user_row['user_topic_sortby_dir'] : 'd'), -					'topic_st'			=> request_var('topic_st', ($user_row['user_topic_show_days']) ? $user_row['user_topic_show_days'] : 0), - -					'post_sk'			=> request_var('post_sk', ($user_row['user_post_sortby_type']) ? $user_row['user_post_sortby_type'] : 't'), -					'post_sd'			=> request_var('post_sd', ($user_row['user_post_sortby_dir']) ? $user_row['user_post_sortby_dir'] : 'a'), -					'post_st'			=> request_var('post_st', ($user_row['user_post_show_days']) ? $user_row['user_post_show_days'] : 0), - -					'view_images'		=> request_var('view_images', $this->optionget($user_row, 'viewimg')), -					'view_flash'		=> request_var('view_flash', $this->optionget($user_row, 'viewflash')), -					'view_smilies'		=> request_var('view_smilies', $this->optionget($user_row, 'viewsmilies')), -					'view_sigs'			=> request_var('view_sigs', $this->optionget($user_row, 'viewsigs')), -					'view_avatars'		=> request_var('view_avatars', $this->optionget($user_row, 'viewavatars')), -					'view_wordcensor'	=> request_var('view_wordcensor', $this->optionget($user_row, 'viewcensors')), - -					'bbcode'	=> request_var('bbcode', $this->optionget($user_row, 'bbcode')), -					'smilies'	=> request_var('smilies', $this->optionget($user_row, 'smilies')), -					'sig'		=> request_var('sig', $this->optionget($user_row, 'attachsig')), -					'notify'	=> request_var('notify', $user_row['user_notify']), +					'dateformat'		=> $request->variable('dateformat', $user_row['user_dateformat'], true), +					'lang'				=> basename($request->variable('lang', $user_row['user_lang'])), +					'tz'				=> $request->variable('tz', $user_row['user_timezone']), +					'style'				=> $request->variable('style', $user_row['user_style']), +					'viewemail'			=> $request->variable('viewemail', $user_row['user_allow_viewemail']), +					'massemail'			=> $request->variable('massemail', $user_row['user_allow_massemail']), +					'hideonline'		=> $request->variable('hideonline', !$user_row['user_allow_viewonline']), +					'notifymethod'		=> $request->variable('notifymethod', $user_row['user_notify_type']), +					'notifypm'			=> $request->variable('notifypm', $user_row['user_notify_pm']), +					'allowpm'			=> $request->variable('allowpm', $user_row['user_allow_pm']), + +					'topic_sk'			=> $request->variable('topic_sk', ($user_row['user_topic_sortby_type']) ? $user_row['user_topic_sortby_type'] : 't'), +					'topic_sd'			=> $request->variable('topic_sd', ($user_row['user_topic_sortby_dir']) ? $user_row['user_topic_sortby_dir'] : 'd'), +					'topic_st'			=> $request->variable('topic_st', ($user_row['user_topic_show_days']) ? $user_row['user_topic_show_days'] : 0), + +					'post_sk'			=> $request->variable('post_sk', ($user_row['user_post_sortby_type']) ? $user_row['user_post_sortby_type'] : 't'), +					'post_sd'			=> $request->variable('post_sd', ($user_row['user_post_sortby_dir']) ? $user_row['user_post_sortby_dir'] : 'a'), +					'post_st'			=> $request->variable('post_st', ($user_row['user_post_show_days']) ? $user_row['user_post_show_days'] : 0), + +					'view_images'		=> $request->variable('view_images', $this->optionget($user_row, 'viewimg')), +					'view_flash'		=> $request->variable('view_flash', $this->optionget($user_row, 'viewflash')), +					'view_smilies'		=> $request->variable('view_smilies', $this->optionget($user_row, 'viewsmilies')), +					'view_sigs'			=> $request->variable('view_sigs', $this->optionget($user_row, 'viewsigs')), +					'view_avatars'		=> $request->variable('view_avatars', $this->optionget($user_row, 'viewavatars')), +					'view_wordcensor'	=> $request->variable('view_wordcensor', $this->optionget($user_row, 'viewcensors')), + +					'bbcode'	=> $request->variable('bbcode', $this->optionget($user_row, 'bbcode')), +					'smilies'	=> $request->variable('smilies', $this->optionget($user_row, 'smilies')), +					'sig'		=> $request->variable('sig', $this->optionget($user_row, 'attachsig')), +					'notify'	=> $request->variable('notify', $user_row['user_notify']),  				);  				/** @@ -1780,6 +1817,7 @@ class acp_users  				if ($config['allow_avatar'])  				{ +					/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  					$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  					$avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers(); @@ -1896,7 +1934,7 @@ class acp_users  						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action . '&u=' . $user_id), E_USER_WARNING);  					} -					$rank_id = request_var('user_rank', 0); +					$rank_id = $request->variable('user_rank', 0);  					$sql = 'UPDATE ' . USERS_TABLE . "  						SET user_rank = $rank_id @@ -1930,50 +1968,54 @@ class acp_users  			case 'sig': -				include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);  				include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx); -				$enable_bbcode	= ($config['allow_sig_bbcode']) ? (bool) $this->optionget($user_row, 'sig_bbcode') : false; -				$enable_smilies	= ($config['allow_sig_smilies']) ? (bool) $this->optionget($user_row, 'sig_smilies') : false; -				$enable_urls	= ($config['allow_sig_links']) ? (bool) $this->optionget($user_row, 'sig_links') : false; -				$signature		= utf8_normalize_nfc(request_var('signature', (string) $user_row['user_sig'], true)); +				$enable_bbcode	= ($config['allow_sig_bbcode']) ? $this->optionget($user_row, 'sig_bbcode') : false; +				$enable_smilies	= ($config['allow_sig_smilies']) ? $this->optionget($user_row, 'sig_smilies') : false; +				$enable_urls	= ($config['allow_sig_links']) ? $this->optionget($user_row, 'sig_links') : false; -				$preview		= (isset($_POST['preview'])) ? true : false; +				$decoded_message	= generate_text_for_edit($user_row['user_sig'], $user_row['user_sig_bbcode_uid'], $user_row['user_sig_bbcode_bitfield']); +				$signature			= $request->variable('signature', $decoded_message['text'], true); +				$signature_preview	= ''; -				if ($submit || $preview) +				if ($submit || $request->is_set_post('preview'))  				{ -					include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx); - -					$enable_bbcode	= ($config['allow_sig_bbcode']) ? ((request_var('disable_bbcode', false)) ? false : true) : false; -					$enable_smilies	= ($config['allow_sig_smilies']) ? ((request_var('disable_smilies', false)) ? false : true) : false; -					$enable_urls	= ($config['allow_sig_links']) ? ((request_var('disable_magic_url', false)) ? false : true) : false; - -					$message_parser = new parse_message($signature); - -					// Allowing Quote BBCode -					$message_parser->parse($enable_bbcode, $enable_urls, $enable_smilies, $config['allow_sig_img'], $config['allow_sig_flash'], true, $config['allow_sig_links'], true, 'sig'); - -					if (sizeof($message_parser->warn_msg)) -					{ -						$error[] = implode('<br />', $message_parser->warn_msg); -					} +					$enable_bbcode	= ($config['allow_sig_bbcode']) ? !$request->variable('disable_bbcode', false) : false; +					$enable_smilies	= ($config['allow_sig_smilies']) ? !$request->variable('disable_smilies', false) : false; +					$enable_urls	= ($config['allow_sig_links']) ? !$request->variable('disable_magic_url', false) : false;  					if (!check_form_key($form_name))  					{ -						$error = 'FORM_INVALID'; +						$error[] = 'FORM_INVALID';  					} +				} + +				$bbcode_uid = $bbcode_bitfield = $bbcode_flags = ''; +				$warn_msg = generate_text_for_storage($signature, $bbcode_uid, $bbcode_bitfield, $bbcode_flags, $enable_bbcode, $enable_urls, $enable_smilies); + +				if (sizeof($warn_msg)) +				{ +					$error += $warn_msg; +				} -					if (!sizeof($error) && $submit) +				if (!$submit) +				{ +					// Parse it for displaying +					$signature_preview = generate_text_for_display($signature, $bbcode_uid, $bbcode_bitfield, $bbcode_flags); +				} +				else +				{ +					if (!sizeof($error))  					{  						$this->optionset($user_row, 'sig_bbcode', $enable_bbcode);  						$this->optionset($user_row, 'sig_smilies', $enable_smilies);  						$this->optionset($user_row, 'sig_links', $enable_urls);  						$sql_ary = array( -							'user_sig'					=> (string) $message_parser->message, +							'user_sig'					=> $signature,  							'user_options'				=> $user_row['user_options'], -							'user_sig_bbcode_uid'		=> (string) $message_parser->bbcode_uid, -							'user_sig_bbcode_bitfield'	=> (string) $message_parser->bbcode_bitfield +							'user_sig_bbcode_uid'		=> $bbcode_uid, +							'user_sig_bbcode_bitfield'	=> $bbcode_bitfield,  						);  						$sql = 'UPDATE ' . USERS_TABLE . ' @@ -1983,33 +2025,27 @@ class acp_users  						trigger_error($user->lang['USER_SIG_UPDATED'] . adm_back_link($this->u_action . '&u=' . $user_id));  					} - -					// Replace "error" strings with their real, localised form -					$error = array_map(array($user, 'lang'), $error);  				} -				$signature_preview = ''; +				// Replace "error" strings with their real, localised form +				$error = array_map(array($user, 'lang'), $error); -				if ($preview) -				{ -					// Now parse it for displaying -					$signature_preview = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false); -					unset($message_parser); -				} +				$decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_bitfield); -				decode_message($signature, $user_row['user_sig_bbcode_uid']); +				/** @var \phpbb\controller\helper $controller_helper */ +				$controller_helper = $phpbb_container->get('controller.helper');  				$template->assign_vars(array(  					'S_SIGNATURE'		=> true, -					'SIGNATURE'			=> $signature, +					'SIGNATURE'			=> $decoded_message['text'],  					'SIGNATURE_PREVIEW'	=> $signature_preview,  					'S_BBCODE_CHECKED'		=> (!$enable_bbcode) ? ' checked="checked"' : '',  					'S_SMILIES_CHECKED'		=> (!$enable_smilies) ? ' checked="checked"' : '',  					'S_MAGIC_URL_CHECKED'	=> (!$enable_urls) ? ' checked="checked"' : '', -					'BBCODE_STATUS'			=> ($config['allow_sig_bbcode']) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'), +					'BBCODE_STATUS'			=> $user->lang(($config['allow_sig_bbcode'] ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),  					'SMILIES_STATUS'		=> ($config['allow_sig_smilies']) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],  					'IMG_STATUS'			=> ($config['allow_sig_img']) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],  					'FLASH_STATUS'			=> ($config['allow_sig_flash']) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'], @@ -2030,15 +2066,16 @@ class acp_users  			break;  			case 'attach': +				/* @var $pagination \phpbb\pagination */ +				$pagination = $phpbb_container->get('pagination'); -				$start		= request_var('start', 0); +				$start		= $request->variable('start', 0);  				$deletemark = (isset($_POST['delmarked'])) ? true : false; -				$marked		= request_var('mark', array(0)); -				$pagination = $phpbb_container->get('pagination'); +				$marked		= $request->variable('mark', array(0));  				// Sort keys -				$sort_key	= request_var('sk', 'a'); -				$sort_dir	= request_var('sd', 'd'); +				$sort_key	= $request->variable('sk', 'a'); +				$sort_dir	= $request->variable('sd', 'd');  				if ($deletemark && sizeof($marked))  				{ @@ -2077,7 +2114,7 @@ class acp_users  						$message = (sizeof($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED']; -						add_log('admin', 'LOG_ATTACHMENTS_DELETED', implode($user->lang['COMMA_SEPARATOR'], $log_attachments)); +						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode($user->lang['COMMA_SEPARATOR'], $log_attachments)));  						trigger_error($message . adm_back_link($this->u_action . '&u=' . $user_id));  					}  					else @@ -2186,7 +2223,7 @@ class acp_users  				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);  				$user->add_lang(array('groups', 'acp/groups')); -				$group_id = request_var('g', 0); +				$group_id = $request->variable('g', 0);  				if ($group_id)  				{ @@ -2406,7 +2443,7 @@ class acp_users  				$user->add_lang('acp/permissions');  				add_permission_language(); -				$forum_id = request_var('f', 0); +				$forum_id = $request->variable('f', 0);  				// Global Permissions  				if (!$forum_id) diff --git a/phpBB/includes/acp/acp_words.php b/phpBB/includes/acp/acp_words.php index 272d38bcc8..ea8d47a109 100644 --- a/phpBB/includes/acp/acp_words.php +++ b/phpBB/includes/acp/acp_words.php @@ -28,13 +28,13 @@ class acp_words  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $phpbb_log, $request, $phpbb_container;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		$user->add_lang('acp/posting');  		// Set up general vars -		$action = request_var('action', ''); +		$action = $request->variable('action', '');  		$action = (isset($_POST['add'])) ? 'add' : ((isset($_POST['save'])) ? 'save' : $action);  		$s_hidden_fields = ''; @@ -50,7 +50,7 @@ class acp_words  		{  			case 'edit': -				$word_id = request_var('id', 0); +				$word_id = $request->variable('id', 0);  				if (!$word_id)  				{ @@ -88,9 +88,9 @@ class acp_words  					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);  				} -				$word_id		= request_var('id', 0); -				$word			= utf8_normalize_nfc(request_var('word', '', true)); -				$replacement	= utf8_normalize_nfc(request_var('replacement', '', true)); +				$word_id		= $request->variable('id', 0); +				$word			= $request->variable('word', '', true); +				$replacement	= $request->variable('replacement', '', true);  				if ($word === '' || $replacement === '')  				{ @@ -115,9 +115,11 @@ class acp_words  				}  				$cache->destroy('_word_censors'); +				$phpbb_container->get('text_formatter.cache')->invalidate();  				$log_action = ($word_id) ? 'LOG_WORD_EDIT' : 'LOG_WORD_ADD'; -				add_log('admin', $log_action, $word); + +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($word));  				$message = ($word_id) ? $user->lang['WORD_UPDATED'] : $user->lang['WORD_ADDED'];  				trigger_error($message . adm_back_link($this->u_action)); @@ -126,7 +128,7 @@ class acp_words  			case 'delete': -				$word_id = request_var('id', 0); +				$word_id = $request->variable('id', 0);  				if (!$word_id)  				{ @@ -147,8 +149,9 @@ class acp_words  					$db->sql_query($sql);  					$cache->destroy('_word_censors'); +					$phpbb_container->get('text_formatter.cache')->invalidate(); -					add_log('admin', 'LOG_WORD_DELETE', $deleted_word); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_WORD_DELETE', false, array($deleted_word));  					trigger_error($user->lang['WORD_REMOVED'] . adm_back_link($this->u_action));  				} diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php index 905e981cdc..b13b1ee040 100644 --- a/phpBB/includes/acp/auth.php +++ b/phpBB/includes/acp/auth.php @@ -267,6 +267,8 @@ class auth_admin extends \phpbb\auth\auth  	function display_mask($mode, $permission_type, &$hold_ary, $user_mode = 'user', $local = false, $group_display = true)  	{  		global $template, $user, $db, $phpbb_root_path, $phpEx, $phpbb_container; + +		/* @var $phpbb_permissions \phpbb\permissions */  		$phpbb_permissions = $phpbb_container->get('acl.permissions');  		// Define names for template loops, might be able to be set @@ -468,7 +470,8 @@ class auth_admin extends \phpbb\auth\auth  					// Build role dropdown options  					$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0; -					$s_role_options = ''; +					// Output current role id to template +					$template->assign_var('S_ROLE_ID', $current_role_id);  					@reset($roles);  					while (list($role_id, $role_row) = each($roles)) @@ -476,13 +479,12 @@ class auth_admin extends \phpbb\auth\auth  						$role_description = (!empty($user->lang[$role_row['role_description']])) ? $user->lang[$role_row['role_description']] : nl2br($role_row['role_description']);  						$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name']; -						$title = ($role_description) ? ' title="' . $role_description . '"' : ''; -						$s_role_options .= '<option value="' . $role_id . '"' . (($role_id == $current_role_id) ? ' selected="selected"' : '') . $title . '>' . $role_name . '</option>'; -					} - -					if ($s_role_options) -					{ -						$s_role_options = '<option value="0"' . ((!$current_role_id) ? ' selected="selected"' : '') . ' title="' . htmlspecialchars($user->lang['NO_ROLE_ASSIGNED_EXPLAIN']) . '">' . $user->lang['NO_ROLE_ASSIGNED'] . '</option>' . $s_role_options; +						$template->assign_block_vars('role_options', array( +							'ID'	=> $role_id, +							'ROLE_NAME'	=> $role_name, +							'TITLE'		=> $role_description, +							'SELECTED'	=> $role_id == $current_role_id, +						));  					}  					if (!$current_role_id && $mode != 'view') @@ -505,7 +507,6 @@ class auth_admin extends \phpbb\auth\auth  					$template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(  						'NAME'				=> $ug_names_ary[$ug_id], -						'S_ROLE_OPTIONS'	=> $s_role_options,  						'UG_ID'				=> $ug_id,  						'S_CUSTOM'			=> $s_custom_permissions,  						'FORUM_ID'			=> $forum_id) @@ -554,7 +555,8 @@ class auth_admin extends \phpbb\auth\auth  					// Build role dropdown options  					$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0; -					$s_role_options = ''; +					// Output current role id to template +					$template->assign_var('S_ROLE_ID', $current_role_id);  					@reset($roles);  					while (list($role_id, $role_row) = each($roles)) @@ -562,13 +564,12 @@ class auth_admin extends \phpbb\auth\auth  						$role_description = (!empty($user->lang[$role_row['role_description']])) ? $user->lang[$role_row['role_description']] : nl2br($role_row['role_description']);  						$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name']; -						$title = ($role_description) ? ' title="' . $role_description . '"' : ''; -						$s_role_options .= '<option value="' . $role_id . '"' . (($role_id == $current_role_id) ? ' selected="selected"' : '') . $title . '>' . $role_name . '</option>'; -					} - -					if ($s_role_options) -					{ -						$s_role_options = '<option value="0"' . ((!$current_role_id) ? ' selected="selected"' : '') . ' title="' . htmlspecialchars($user->lang['NO_ROLE_ASSIGNED_EXPLAIN']) . '">' . $user->lang['NO_ROLE_ASSIGNED'] . '</option>' . $s_role_options; +						$template->assign_block_vars('role_options', array( +							'ID'	=> $role_id, +							'ROLE_NAME'	=> $role_name, +							'TITLE'		=> $role_description, +							'SELECTED'	=> $role_id == $current_role_id, +						));  					}  					if (!$current_role_id && $mode != 'view') @@ -592,7 +593,6 @@ class auth_admin extends \phpbb\auth\auth  					$template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(  						'NAME'				=> ($forum_id == 0) ? $forum_names_ary[0] : $forum_names_ary[$forum_id]['forum_name'],  						'PADDING'			=> ($forum_id == 0) ? '' : $forum_names_ary[$forum_id]['padding'], -						'S_ROLE_OPTIONS'	=> $s_role_options,  						'S_CUSTOM'			=> $s_custom_permissions,  						'UG_ID'				=> $ug_id,  						'FORUM_ID'			=> $forum_id) @@ -1108,6 +1108,7 @@ class auth_admin extends \phpbb\auth\auth  	{  		global $template, $user, $phpbb_admin_path, $phpEx, $phpbb_container; +		/* @var $phpbb_permissions \phpbb\permissions */  		$phpbb_permissions = $phpbb_container->get('acl.permissions');  		@reset($category_array); @@ -1186,6 +1187,7 @@ class auth_admin extends \phpbb\auth\auth  	{  		global $user, $phpbb_container; +		/* @var $phpbb_permissions \phpbb\permissions */  		$phpbb_permissions = $phpbb_container->get('acl.permissions');  		foreach ($key_sort_array as $forum_id) diff --git a/phpBB/includes/acp/info/acp_attachments.php b/phpBB/includes/acp/info/acp_attachments.php index ff6e342f77..057f08201e 100644 --- a/phpBB/includes/acp/info/acp_attachments.php +++ b/phpBB/includes/acp/info/acp_attachments.php @@ -18,7 +18,6 @@ class acp_attachments_info  		return array(  			'filename'	=> 'acp_attachments',  			'title'		=> 'ACP_ATTACHMENTS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'attach'		=> array('title' => 'ACP_ATTACHMENT_SETTINGS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_BOARD_CONFIGURATION', 'ACP_ATTACHMENTS')),  				'extensions'	=> array('title' => 'ACP_MANAGE_EXTENSIONS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')), diff --git a/phpBB/includes/acp/info/acp_ban.php b/phpBB/includes/acp/info/acp_ban.php index 4959f4da41..c88f4c2ebb 100644 --- a/phpBB/includes/acp/info/acp_ban.php +++ b/phpBB/includes/acp/info/acp_ban.php @@ -18,7 +18,6 @@ class acp_ban_info  		return array(  			'filename'	=> 'acp_ban',  			'title'		=> 'ACP_BAN', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'email'		=> array('title' => 'ACP_BAN_EMAILS', 'auth' => 'acl_a_ban', 'cat' => array('ACP_USER_SECURITY')),  				'ip'		=> array('title' => 'ACP_BAN_IPS', 'auth' => 'acl_a_ban', 'cat' => array('ACP_USER_SECURITY')), diff --git a/phpBB/includes/acp/info/acp_bbcodes.php b/phpBB/includes/acp/info/acp_bbcodes.php index 2bca319cc3..dfcd43a8ac 100644 --- a/phpBB/includes/acp/info/acp_bbcodes.php +++ b/phpBB/includes/acp/info/acp_bbcodes.php @@ -18,7 +18,6 @@ class acp_bbcodes_info  		return array(  			'filename'	=> 'acp_bbcodes',  			'title'		=> 'ACP_BBCODES', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'bbcodes'		=> array('title' => 'ACP_BBCODES', 'auth' => 'acl_a_bbcode', 'cat' => array('ACP_MESSAGES')),  			), diff --git a/phpBB/includes/acp/info/acp_board.php b/phpBB/includes/acp/info/acp_board.php index 6838b4f8ba..1a3ee7b6be 100644 --- a/phpBB/includes/acp/info/acp_board.php +++ b/phpBB/includes/acp/info/acp_board.php @@ -18,7 +18,6 @@ class acp_board_info  		return array(  			'filename'	=> 'acp_board',  			'title'		=> 'ACP_BOARD_MANAGEMENT', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'settings'		=> array('title' => 'ACP_BOARD_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),  				'features'		=> array('title' => 'ACP_BOARD_FEATURES', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')), diff --git a/phpBB/includes/acp/info/acp_bots.php b/phpBB/includes/acp/info/acp_bots.php index 9aa24927af..26782d8c0b 100644 --- a/phpBB/includes/acp/info/acp_bots.php +++ b/phpBB/includes/acp/info/acp_bots.php @@ -18,7 +18,6 @@ class acp_bots_info  		return array(  			'filename'	=> 'acp_bots',  			'title'		=> 'ACP_BOTS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'bots'		=> array('title' => 'ACP_BOTS', 'auth' => 'acl_a_bots', 'cat' => array('ACP_GENERAL_TASKS')),  			), diff --git a/phpBB/includes/acp/info/acp_captcha.php b/phpBB/includes/acp/info/acp_captcha.php index 99dc5ce0e5..3f7bf0351d 100644 --- a/phpBB/includes/acp/info/acp_captcha.php +++ b/phpBB/includes/acp/info/acp_captcha.php @@ -18,7 +18,6 @@ class acp_captcha_info  		return array(  			'filename'	=> 'acp_captcha',  			'title'		=> 'ACP_CAPTCHA', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'visual'		=> array('title' => 'ACP_VC_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),  				'img'			=> array('title' => 'ACP_VC_CAPTCHA_DISPLAY', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION'), 'display' => false) diff --git a/phpBB/includes/acp/info/acp_database.php b/phpBB/includes/acp/info/acp_database.php index 5cf9da24fb..815db53b67 100644 --- a/phpBB/includes/acp/info/acp_database.php +++ b/phpBB/includes/acp/info/acp_database.php @@ -18,7 +18,6 @@ class acp_database_info  		return array(  			'filename'	=> 'acp_database',  			'title'		=> 'ACP_DATABASE', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'backup'	=> array('title' => 'ACP_BACKUP', 'auth' => 'acl_a_backup', 'cat' => array('ACP_CAT_DATABASE')),  				'restore'	=> array('title' => 'ACP_RESTORE', 'auth' => 'acl_a_backup', 'cat' => array('ACP_CAT_DATABASE')), diff --git a/phpBB/includes/acp/info/acp_disallow.php b/phpBB/includes/acp/info/acp_disallow.php index ebd44b515c..df4765b6bb 100644 --- a/phpBB/includes/acp/info/acp_disallow.php +++ b/phpBB/includes/acp/info/acp_disallow.php @@ -18,7 +18,6 @@ class acp_disallow_info  		return array(  			'filename'	=> 'acp_disallow',  			'title'		=> 'ACP_DISALLOW', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'usernames'		=> array('title' => 'ACP_DISALLOW_USERNAMES', 'auth' => 'acl_a_names', 'cat' => array('ACP_USER_SECURITY')),  			), diff --git a/phpBB/includes/acp/info/acp_email.php b/phpBB/includes/acp/info/acp_email.php index 2f77fc617c..e85ef0923a 100644 --- a/phpBB/includes/acp/info/acp_email.php +++ b/phpBB/includes/acp/info/acp_email.php @@ -18,7 +18,6 @@ class acp_email_info  		return array(  			'filename'	=> 'acp_email',  			'title'		=> 'ACP_MASS_EMAIL', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'email'		=> array('title' => 'ACP_MASS_EMAIL', 'auth' => 'acl_a_email && cfg_email_enable', 'cat' => array('ACP_GENERAL_TASKS')),  			), diff --git a/phpBB/includes/acp/info/acp_extensions.php b/phpBB/includes/acp/info/acp_extensions.php index d4cf1b0ed5..9adcd543b9 100644 --- a/phpBB/includes/acp/info/acp_extensions.php +++ b/phpBB/includes/acp/info/acp_extensions.php @@ -18,7 +18,6 @@ class acp_extensions_info  		return array(  			'filename'	=> 'acp_extensions',  			'title'		=> 'ACP_EXTENSION_MANAGEMENT', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'main'		=> array('title' => 'ACP_EXTENSIONS', 'auth' => 'acl_a_extensions', 'cat' => array('ACP_EXTENSION_MANAGEMENT')),  			), diff --git a/phpBB/includes/acp/info/acp_forums.php b/phpBB/includes/acp/info/acp_forums.php index 647090c8c3..8b5ce7edc2 100644 --- a/phpBB/includes/acp/info/acp_forums.php +++ b/phpBB/includes/acp/info/acp_forums.php @@ -18,7 +18,6 @@ class acp_forums_info  		return array(  			'filename'	=> 'acp_forums',  			'title'		=> 'ACP_FORUM_MANAGEMENT', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'manage'	=> array('title' => 'ACP_MANAGE_FORUMS', 'auth' => 'acl_a_forum', 'cat' => array('ACP_MANAGE_FORUMS')),  			), diff --git a/phpBB/includes/acp/info/acp_groups.php b/phpBB/includes/acp/info/acp_groups.php index 6c5ad70d97..e0aafeca0d 100644 --- a/phpBB/includes/acp/info/acp_groups.php +++ b/phpBB/includes/acp/info/acp_groups.php @@ -18,7 +18,6 @@ class acp_groups_info  		return array(  			'filename'	=> 'acp_groups',  			'title'		=> 'ACP_GROUPS_MANAGEMENT', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'manage'		=> array('title' => 'ACP_GROUPS_MANAGE', 'auth' => 'acl_a_group', 'cat' => array('ACP_GROUPS')),  				'position'		=> array('title' => 'ACP_GROUPS_POSITION', 'auth' => 'acl_a_group', 'cat' => array('ACP_GROUPS')), diff --git a/phpBB/includes/acp/info/acp_icons.php b/phpBB/includes/acp/info/acp_icons.php index 001d6cb402..87eadddd8d 100644 --- a/phpBB/includes/acp/info/acp_icons.php +++ b/phpBB/includes/acp/info/acp_icons.php @@ -18,7 +18,6 @@ class acp_icons_info  		return array(  			'filename'	=> 'acp_icons',  			'title'		=> 'ACP_ICONS_SMILIES', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'icons'		=> array('title' => 'ACP_ICONS', 'auth' => 'acl_a_icons', 'cat' => array('ACP_MESSAGES')),  				'smilies'	=> array('title' => 'ACP_SMILIES', 'auth' => 'acl_a_icons', 'cat' => array('ACP_MESSAGES')), diff --git a/phpBB/includes/acp/info/acp_inactive.php b/phpBB/includes/acp/info/acp_inactive.php index 442eb13c30..38cb964735 100644 --- a/phpBB/includes/acp/info/acp_inactive.php +++ b/phpBB/includes/acp/info/acp_inactive.php @@ -18,7 +18,6 @@ class acp_inactive_info  		return array(  			'filename'	=> 'acp_inactive',  			'title'		=> 'ACP_INACTIVE_USERS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'list'		=> array('title' => 'ACP_INACTIVE_USERS', 'auth' => 'acl_a_user', 'cat' => array('ACP_CAT_USERS')),  			), diff --git a/phpBB/includes/acp/info/acp_jabber.php b/phpBB/includes/acp/info/acp_jabber.php index c1dfb2aca7..660299a12d 100644 --- a/phpBB/includes/acp/info/acp_jabber.php +++ b/phpBB/includes/acp/info/acp_jabber.php @@ -18,7 +18,6 @@ class acp_jabber_info  		return array(  			'filename'	=> 'acp_jabber',  			'title'		=> 'ACP_JABBER_SETTINGS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'settings'		=> array('title' => 'ACP_JABBER_SETTINGS', 'auth' => 'acl_a_jabber', 'cat' => array('ACP_CLIENT_COMMUNICATION')),  			), diff --git a/phpBB/includes/acp/info/acp_language.php b/phpBB/includes/acp/info/acp_language.php index b9efbbbd9a..1a5a2b6ba8 100644 --- a/phpBB/includes/acp/info/acp_language.php +++ b/phpBB/includes/acp/info/acp_language.php @@ -18,7 +18,6 @@ class acp_language_info  		return array(  			'filename'	=> 'acp_language',  			'title'		=> 'ACP_LANGUAGE', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'lang_packs'		=> array('title' => 'ACP_LANGUAGE_PACKS', 'auth' => 'acl_a_language', 'cat' => array('ACP_LANGUAGE')),  			), diff --git a/phpBB/includes/acp/info/acp_logs.php b/phpBB/includes/acp/info/acp_logs.php index e9e6034cd4..efa35b2118 100644 --- a/phpBB/includes/acp/info/acp_logs.php +++ b/phpBB/includes/acp/info/acp_logs.php @@ -18,7 +18,6 @@ class acp_logs_info  		return array(  			'filename'	=> 'acp_logs',  			'title'		=> 'ACP_LOGGING', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'admin'		=> array('title' => 'ACP_ADMIN_LOGS', 'auth' => 'acl_a_viewlogs', 'cat' => array('ACP_FORUM_LOGS')),  				'mod'		=> array('title' => 'ACP_MOD_LOGS', 'auth' => 'acl_a_viewlogs', 'cat' => array('ACP_FORUM_LOGS')), diff --git a/phpBB/includes/acp/info/acp_main.php b/phpBB/includes/acp/info/acp_main.php index 51259e3bd9..48d35da585 100644 --- a/phpBB/includes/acp/info/acp_main.php +++ b/phpBB/includes/acp/info/acp_main.php @@ -18,7 +18,6 @@ class acp_main_info  		return array(  			'filename'	=> 'acp_main',  			'title'		=> 'ACP_INDEX', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'main'		=> array('title' => 'ACP_INDEX', 'auth' => '', 'cat' => array('ACP_CAT_GENERAL')),  			), diff --git a/phpBB/includes/acp/info/acp_modules.php b/phpBB/includes/acp/info/acp_modules.php index a47cd4ad83..073e69c6a8 100644 --- a/phpBB/includes/acp/info/acp_modules.php +++ b/phpBB/includes/acp/info/acp_modules.php @@ -18,7 +18,6 @@ class acp_modules_info  		return array(  			'filename'	=> 'acp_modules',  			'title'		=> 'ACP_MODULE_MANAGEMENT', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'acp'		=> array('title' => 'ACP', 'auth' => 'acl_a_modules', 'cat' => array('ACP_MODULE_MANAGEMENT')),  				'ucp'		=> array('title' => 'UCP', 'auth' => 'acl_a_modules', 'cat' => array('ACP_MODULE_MANAGEMENT')), diff --git a/phpBB/includes/acp/info/acp_permission_roles.php b/phpBB/includes/acp/info/acp_permission_roles.php index e8aa13375d..34af693b7b 100644 --- a/phpBB/includes/acp/info/acp_permission_roles.php +++ b/phpBB/includes/acp/info/acp_permission_roles.php @@ -18,7 +18,6 @@ class acp_permission_roles_info  		return array(  			'filename'	=> 'acp_permission_roles',  			'title'		=> 'ACP_PERMISSION_ROLES', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'admin_roles'		=> array('title' => 'ACP_ADMIN_ROLES', 'auth' => 'acl_a_roles && acl_a_aauth', 'cat' => array('ACP_PERMISSION_ROLES')),  				'user_roles'		=> array('title' => 'ACP_USER_ROLES', 'auth' => 'acl_a_roles && acl_a_uauth', 'cat' => array('ACP_PERMISSION_ROLES')), diff --git a/phpBB/includes/acp/info/acp_permissions.php b/phpBB/includes/acp/info/acp_permissions.php index 3ec592a300..3d415f2b72 100644 --- a/phpBB/includes/acp/info/acp_permissions.php +++ b/phpBB/includes/acp/info/acp_permissions.php @@ -18,7 +18,6 @@ class acp_permissions_info  		return array(  			'filename'	=> 'acp_permissions',  			'title'		=> 'ACP_PERMISSIONS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'intro'					=> array('title' => 'ACP_PERMISSIONS', 'auth' => 'acl_a_authusers || acl_a_authgroups || acl_a_viewauth', 'cat' => array('ACP_CAT_PERMISSIONS')),  				'trace'					=> array('title' => 'ACP_PERMISSION_TRACE', 'auth' => 'acl_a_viewauth', 'display' => false, 'cat' => array('ACP_PERMISSION_MASKS')), diff --git a/phpBB/includes/acp/info/acp_php_info.php b/phpBB/includes/acp/info/acp_php_info.php index af978e0daa..c5e60c7e66 100644 --- a/phpBB/includes/acp/info/acp_php_info.php +++ b/phpBB/includes/acp/info/acp_php_info.php @@ -18,7 +18,6 @@ class acp_php_info_info  		return array(  			'filename'	=> 'acp_php_info',  			'title'		=> 'ACP_PHP_INFO', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'info'		=> array('title' => 'ACP_PHP_INFO', 'auth' => 'acl_a_phpinfo', 'cat' => array('ACP_GENERAL_TASKS')),  			), diff --git a/phpBB/includes/acp/info/acp_profile.php b/phpBB/includes/acp/info/acp_profile.php index 307e711eee..ede34204b4 100644 --- a/phpBB/includes/acp/info/acp_profile.php +++ b/phpBB/includes/acp/info/acp_profile.php @@ -18,7 +18,6 @@ class acp_profile_info  		return array(  			'filename'	=> 'acp_profile',  			'title'		=> 'ACP_CUSTOM_PROFILE_FIELDS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'profile'	=> array('title' => 'ACP_CUSTOM_PROFILE_FIELDS', 'auth' => 'acl_a_profile', 'cat' => array('ACP_CAT_USERS')),  			), diff --git a/phpBB/includes/acp/info/acp_prune.php b/phpBB/includes/acp/info/acp_prune.php index 58cb1ba9ab..74e5248aa9 100644 --- a/phpBB/includes/acp/info/acp_prune.php +++ b/phpBB/includes/acp/info/acp_prune.php @@ -18,7 +18,6 @@ class acp_prune_info  		return array(  			'filename'	=> 'acp_prune',  			'title'		=> 'ACP_PRUNING', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'forums'	=> array('title' => 'ACP_PRUNE_FORUMS', 'auth' => 'acl_a_prune', 'cat' => array('ACP_MANAGE_FORUMS')),  				'users'		=> array('title' => 'ACP_PRUNE_USERS', 'auth' => 'acl_a_userdel', 'cat' => array('ACP_CAT_USERS')), diff --git a/phpBB/includes/acp/info/acp_ranks.php b/phpBB/includes/acp/info/acp_ranks.php index 3cc9b4a428..9bf51eba3c 100644 --- a/phpBB/includes/acp/info/acp_ranks.php +++ b/phpBB/includes/acp/info/acp_ranks.php @@ -18,7 +18,6 @@ class acp_ranks_info  		return array(  			'filename'	=> 'acp_ranks',  			'title'		=> 'ACP_RANKS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'ranks'		=> array('title' => 'ACP_MANAGE_RANKS', 'auth' => 'acl_a_ranks', 'cat' => array('ACP_CAT_USERS')),  			), diff --git a/phpBB/includes/acp/info/acp_reasons.php b/phpBB/includes/acp/info/acp_reasons.php index c48fd1aacd..55a0495d0f 100644 --- a/phpBB/includes/acp/info/acp_reasons.php +++ b/phpBB/includes/acp/info/acp_reasons.php @@ -18,7 +18,6 @@ class acp_reasons_info  		return array(  			'filename'	=> 'acp_reasons',  			'title'		=> 'ACP_REASONS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'main'		=> array('title' => 'ACP_MANAGE_REASONS', 'auth' => 'acl_a_reasons', 'cat' => array('ACP_GENERAL_TASKS')),  			), diff --git a/phpBB/includes/acp/info/acp_search.php b/phpBB/includes/acp/info/acp_search.php index 5d681a7174..0635dd9edd 100644 --- a/phpBB/includes/acp/info/acp_search.php +++ b/phpBB/includes/acp/info/acp_search.php @@ -18,7 +18,6 @@ class acp_search_info  		return array(  			'filename'	=> 'acp_search',  			'title'		=> 'ACP_SEARCH', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'settings'	=> array('title' => 'ACP_SEARCH_SETTINGS', 'auth' => 'acl_a_search', 'cat' => array('ACP_SERVER_CONFIGURATION')),  				'index'		=> array('title' => 'ACP_SEARCH_INDEX', 'auth' => 'acl_a_search', 'cat' => array('ACP_CAT_DATABASE')), diff --git a/phpBB/includes/acp/info/acp_send_statistics.php b/phpBB/includes/acp/info/acp_send_statistics.php index a4f2ddc420..a0db1a48c4 100644 --- a/phpBB/includes/acp/info/acp_send_statistics.php +++ b/phpBB/includes/acp/info/acp_send_statistics.php @@ -18,7 +18,6 @@ class acp_send_statistics_info  		return array(  			'filename'	=> 'acp_send_statistics',  			'title'		=> 'ACP_SEND_STATISTICS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'send_statistics'		=> array('title' => 'ACP_SEND_STATISTICS', 'auth' => 'acl_a_server', 'cat' => array('ACP_SERVER_CONFIGURATION')),  			), diff --git a/phpBB/includes/acp/info/acp_styles.php b/phpBB/includes/acp/info/acp_styles.php index c0ab005502..59b0a64899 100644 --- a/phpBB/includes/acp/info/acp_styles.php +++ b/phpBB/includes/acp/info/acp_styles.php @@ -18,7 +18,6 @@ class acp_styles_info  		return array(  			'filename'	=> 'acp_styles',  			'title'		=> 'ACP_CAT_STYLES', -			'version'	=> '2.0.0',  			'modes'		=> array(  				'style'		=> array('title' => 'ACP_STYLES', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')),  				'install'	=> array('title' => 'ACP_STYLES_INSTALL', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')), diff --git a/phpBB/includes/acp/info/acp_update.php b/phpBB/includes/acp/info/acp_update.php index ca00f6d305..7806fb4891 100644 --- a/phpBB/includes/acp/info/acp_update.php +++ b/phpBB/includes/acp/info/acp_update.php @@ -18,7 +18,6 @@ class acp_update_info  		return array(  			'filename'	=> 'acp_update',  			'title'		=> 'ACP_UPDATE', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'version_check'		=> array('title' => 'ACP_VERSION_CHECK', 'auth' => 'acl_a_board', 'cat' => array('ACP_AUTOMATION')),  			), diff --git a/phpBB/includes/acp/info/acp_users.php b/phpBB/includes/acp/info/acp_users.php index ab69523cde..cb59d24293 100644 --- a/phpBB/includes/acp/info/acp_users.php +++ b/phpBB/includes/acp/info/acp_users.php @@ -18,7 +18,6 @@ class acp_users_info  		return array(  			'filename'	=> 'acp_users',  			'title'		=> 'ACP_USER_MANAGEMENT', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'overview'		=> array('title' => 'ACP_MANAGE_USERS', 'auth' => 'acl_a_user', 'cat' => array('ACP_CAT_USERS')),  				'feedback'		=> array('title' => 'ACP_USER_FEEDBACK', 'auth' => 'acl_a_user', 'display' => false, 'cat' => array('ACP_CAT_USERS')), diff --git a/phpBB/includes/acp/info/acp_words.php b/phpBB/includes/acp/info/acp_words.php index 3c8c79f25f..8a6d0d7f20 100644 --- a/phpBB/includes/acp/info/acp_words.php +++ b/phpBB/includes/acp/info/acp_words.php @@ -18,7 +18,6 @@ class acp_words_info  		return array(  			'filename'	=> 'acp_words',  			'title'		=> 'ACP_WORDS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'words'		=> array('title' => 'ACP_WORDS', 'auth' => 'acl_a_words', 'cat' => array('ACP_MESSAGES')),  			), diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index 86390c0901..41d4ec40fe 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -110,7 +110,18 @@ class bbcode  							$undid_bbcode_specialchars = true;  						} -						$message = preg_replace($preg['search'], $preg['replace'], $message); +						foreach ($preg['search'] as $key => $search) +						{ +							if (is_callable($preg['replace'][$key])) +							{ +								$message = preg_replace_callback($search, $preg['replace'][$key], $message); +							} +							else +							{ +								$message = preg_replace($search, $preg['replace'][$key], $message); +							} +						} +  						$preg = array('search' => array(), 'replace' => array());  					}  				} @@ -129,13 +140,33 @@ class bbcode  	*/  	function bbcode_cache_init()  	{ -		global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper; +		global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper, $phpbb_container, $phpbb_filesystem;  		if (empty($this->template_filename))  		{  			$this->template_bitfield = new bitfield($user->style['bbcode_bitfield']); -			$template = new phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new phpbb\template\context(), $phpbb_extension_manager); +			$template = new \phpbb\template\twig\twig( +				$phpbb_container->get('path_helper'), +				$phpbb_container->get('config'), +				new \phpbb\template\context(), +				new \phpbb\template\twig\environment( +					$phpbb_container->get('config'), +					$phpbb_container->get('filesystem'), +					$phpbb_container->get('path_helper'), +					$phpbb_container, +					$phpbb_container->getParameter('core.root_path') . 'cache/', +					$phpbb_container->get('ext.manager'), +					new \phpbb\template\twig\loader( +						$phpbb_filesystem +					) +				), +				$phpbb_container->getParameter('core.root_path') . 'cache/', +				$phpbb_container->get('user'), +				$phpbb_container->get('template.twig.extensions.collection'), +				$phpbb_extension_manager +			); +  			$template->set_style();  			$template->set_filenames(array('bbcode.html' => 'bbcode.html'));  			$this->template_filename = $template->get_source_file_for_handle('bbcode.html'); @@ -194,7 +225,9 @@ class bbcode  							'[/quote:$uid]'	=> $this->bbcode_tpl('quote_close', $bbcode_id)  						),  						'preg' => array( -							'#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#ise'	=> "\$this->bbcode_second_pass_quote('\$1', '\$2')" +							'#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#is'	=> function ($match) { +								return $this->bbcode_second_pass_quote($match[1], $match[2]); +							},  						)  					);  				break; @@ -273,7 +306,9 @@ class bbcode  				case 8:  					$this->bbcode_cache[$bbcode_id] = array(  						'preg' => array( -							'#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#ise'	=> "\$this->bbcode_second_pass_code('\$1', '\$2')", +							'#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#is'	=> function ($match) { +								return $this->bbcode_second_pass_code($match[1], $match[2]); +							},  						)  					);  				break; @@ -283,7 +318,9 @@ class bbcode  						'preg' => array(  							'#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#'	=> "\$1",  							'#(\[list=([^\[]+):$uid\])[\n]{1}#'			=> "\$1", -							'#\[list=([^\[]+):$uid\]#e'					=> "\$this->bbcode_list('\$1')", +							'#\[list=([^\[]+):$uid\]#'					=> function ($match) { +								return $this->bbcode_list($match[1]); +							},  						),  						'str' => array(  							'[list:$uid]'		=> $this->bbcode_tpl('ulist_open_default', $bbcode_id), @@ -367,7 +404,9 @@ class bbcode  						}  						// Replace {L_*} lang strings -						$bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl); +						$bbcode_tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) { +							return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1]))); +						}, $bbcode_tpl);  						if (!empty($rowset[$bbcode_id]['second_pass_replace']))  						{ @@ -491,7 +530,9 @@ class bbcode  			'email'					=> array('{EMAIL}'		=> '$1', '{DESCRIPTION}'	=> '$2')  		); -		$tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl); +		$tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) { +			return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1]))); +		}, $tpl);  		if (!empty($replacements[$tpl_name]))  		{ diff --git a/phpBB/includes/compatibility_globals.php b/phpBB/includes/compatibility_globals.php index 54c9287c96..ae532c0f13 100644 --- a/phpBB/includes/compatibility_globals.php +++ b/phpBB/includes/compatibility_globals.php @@ -18,30 +18,62 @@ if (!defined('IN_PHPBB'))  	exit;  } -// set up caching -$cache = $phpbb_container->get('cache'); +/** + * Sets compatibility globals in the global scope + * + * This function registers compatibility variables to the global + * variable scope. This is required to make it possible to include this file + * in a service. + */ +function register_compatibility_globals() +{ +	global $phpbb_container; + +	global $cache, $phpbb_dispatcher, $request, $user, $auth, $db, $config, $phpbb_log; +	global $symfony_request, $phpbb_filesystem, $phpbb_path_helper, $phpbb_extension_manager, $template; + +	// set up caching +	/* @var $cache \phpbb\cache\service */ +	$cache = $phpbb_container->get('cache'); + +	// Instantiate some basic classes +	/* @var $phpbb_dispatcher \phpbb\event\dispatcher */ +	$phpbb_dispatcher = $phpbb_container->get('dispatcher'); + +	/* @var $request \phpbb\request\request_interface */ +	$request = $phpbb_container->get('request'); -// Instantiate some basic classes -$phpbb_dispatcher = $phpbb_container->get('dispatcher'); -$request	= $phpbb_container->get('request'); -$user		= $phpbb_container->get('user'); -$auth		= $phpbb_container->get('auth'); -$db			= $phpbb_container->get('dbal.conn'); +	/* @var $user \phpbb\user */ +	$user = $phpbb_container->get('user'); -// make sure request_var uses this request instance -request_var('', 0, false, false, $request); // "dependency injection" for a function +	/* @var $auth \phpbb\auth\auth */ +	$auth = $phpbb_container->get('auth'); -// Grab global variables, re-cache if necessary -$config = $phpbb_container->get('config'); -set_config(null, null, null, $config); -set_config_count(null, null, null, $config); +	/* @var $db \phpbb\db\driver\driver_interface */ +	$db = $phpbb_container->get('dbal.conn'); -$phpbb_log = $phpbb_container->get('log'); -$symfony_request = $phpbb_container->get('symfony_request'); -$phpbb_filesystem = $phpbb_container->get('filesystem'); -$phpbb_path_helper = $phpbb_container->get('path_helper'); +	// Grab global variables, re-cache if necessary +	/* @var $config phpbb\config\db */ +	$config = $phpbb_container->get('config'); -// load extensions -$phpbb_extension_manager = $phpbb_container->get('ext.manager'); +	/* @var $phpbb_log \phpbb\log\log_interface */ +	$phpbb_log = $phpbb_container->get('log'); + +	/* @var $symfony_request \phpbb\symfony_request */ +	$symfony_request = $phpbb_container->get('symfony_request'); + +	/* @var $phpbb_filesystem \phpbb\filesystem\filesystem_interface */ +	$phpbb_filesystem = $phpbb_container->get('filesystem'); + +	/* @var $phpbb_path_helper \phpbb\path_helper */ +	$phpbb_path_helper = $phpbb_container->get('path_helper'); + +	// load extensions +	/* @var $phpbb_extension_manager \phpbb\extension\manager */ +	$phpbb_extension_manager = $phpbb_container->get('ext.manager'); + +	/* @var $template \phpbb\template\template */ +	$template = $phpbb_container->get('template'); +} -$template = $phpbb_container->get('template'); +register_compatibility_globals(); diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php index 62e5fe7a0a..126cf44842 100644 --- a/phpBB/includes/constants.php +++ b/phpBB/includes/constants.php @@ -28,7 +28,7 @@ if (!defined('IN_PHPBB'))  */  // phpBB Version -define('PHPBB_VERSION', '3.1.6-dev'); +define('PHPBB_VERSION', '3.2.0-a1-dev');  // QA-related  // define('PHPBB_QA', 1); diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index fff55d993e..c6d63e13f4 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -64,135 +64,6 @@ function set_var(&$result, $var, $type, $multibyte = false)  }  /** -* Wrapper function of \phpbb\request\request::variable which exists for backwards compatability. -* See {@link \phpbb\request\request_interface::variable \phpbb\request\request_interface::variable} for -* documentation of this function's use. -* -* @deprecated -* @param	mixed			$var_name	The form variable's name from which data shall be retrieved. -* 										If the value is an array this may be an array of indizes which will give -* 										direct access to a value at any depth. E.g. if the value of "var" is array(1 => "a") -* 										then specifying array("var", 1) as the name will return "a". -* 										If you pass an instance of {@link \phpbb\request\request_interface phpbb_request_interface} -* 										as this parameter it will overwrite the current request class instance. If you do -* 										not do so, it will create its own instance (but leave superglobals enabled). -* @param	mixed			$default	A default value that is returned if the variable was not set. -* 										This function will always return a value of the same type as the default. -* @param	bool			$multibyte	If $default is a string this paramater has to be true if the variable may contain any UTF-8 characters -*										Default is false, causing all bytes outside the ASCII range (0-127) to be replaced with question marks -* @param	bool			$cookie		This param is mapped to \phpbb\request\request_interface::COOKIE as the last param for -* 										\phpbb\request\request_interface::variable for backwards compatability reasons. -* @param	\phpbb\request\request_interface|null|false	If an instance of \phpbb\request\request_interface is given the instance is stored in -*										a static variable and used for all further calls where this parameters is null. Until -*										the function is called with an instance it automatically creates a new \phpbb\request\request -*										instance on every call. By passing false this per-call instantiation can be restored -*										after having passed in a \phpbb\request\request_interface instance. -* -* @return	mixed	The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the -* 					the same as that of $default. If the variable is not set $default is returned. -*/ -function request_var($var_name, $default, $multibyte = false, $cookie = false, $request = null) -{ -	// This is all just an ugly hack to add "Dependency Injection" to a function -	// the only real code is the function call which maps this function to a method. -	static $static_request = null; - -	if ($request instanceof \phpbb\request\request_interface) -	{ -		$static_request = $request; - -		if (empty($var_name)) -		{ -			return; -		} -	} -	else if ($request === false) -	{ -		$static_request = null; - -		if (empty($var_name)) -		{ -			return; -		} -	} - -	$tmp_request = $static_request; - -	// no request class set, create a temporary one ourselves to keep backwards compatability -	if ($tmp_request === null) -	{ -		// false param: enable super globals, so the created request class does not -		// make super globals inaccessible everywhere outside this function. -		$tmp_request = new \phpbb\request\request(new \phpbb\request\type_cast_helper(), false); -	} - -	return $tmp_request->variable($var_name, $default, $multibyte, ($cookie) ? \phpbb\request\request_interface::COOKIE : \phpbb\request\request_interface::REQUEST); -} - -/** -* Sets a configuration option's value. -* -* Please note that this function does not update the is_dynamic value for -* an already existing config option. -* -* @param string $config_name   The configuration option's name -* @param string $config_value  New configuration value -* @param bool   $is_dynamic    Whether this variable should be cached (false) or -*                              if it changes too frequently (true) to be -*                              efficiently cached. -* -* @return null -* -* @deprecated -*/ -function set_config($config_name, $config_value, $is_dynamic = false, \phpbb\config\config $set_config = null) -{ -	static $config = null; - -	if ($set_config !== null) -	{ -		$config = $set_config; - -		if (empty($config_name)) -		{ -			return; -		} -	} - -	$config->set($config_name, $config_value, !$is_dynamic); -} - -/** -* Increments an integer config value directly in the database. -* -* @param string $config_name   The configuration option's name -* @param int    $increment     Amount to increment by -* @param bool   $is_dynamic    Whether this variable should be cached (false) or -*                              if it changes too frequently (true) to be -*                              efficiently cached. -* -* @return null -* -* @deprecated -*/ -function set_config_count($config_name, $increment, $is_dynamic = false, \phpbb\config\config $set_config = null) -{ -	static $config = null; - -	if ($set_config !== null) -	{ -		$config = $set_config; - -		if (empty($config_name)) -		{ -			return; -		} -	} - -	$config->increment($config_name, $increment, !$is_dynamic); -} - -/**  * Generates an alphanumeric random string of given length  *  * @return string @@ -235,8 +106,8 @@ function unique_id($extra = 'c')  	if ($dss_seeded !== true && ($config['rand_seed_last_update'] < time() - rand(1,10)))  	{ -		set_config('rand_seed_last_update', time(), true); -		set_config('rand_seed', $config['rand_seed'], true); +		$config->set('rand_seed_last_update', time(), false); +		$config->set('rand_seed', $config['rand_seed'], false);  		$dss_seeded = true;  	} @@ -376,8 +247,7 @@ function still_on_time($extra_time = 15)  {  	static $max_execution_time, $start_time; -	$time = explode(' ', microtime()); -	$current_time = $time[0] + $time[1]; +	$current_time = microtime(true);  	if (empty($max_execution_time))  	{ @@ -441,448 +311,6 @@ function phpbb_version_compare($version1, $version2, $operator = null)  	}  } -/** -* Global function for chmodding directories and files for internal use -* -* This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions. -* The function determines owner and group from common.php file and sets the same to the provided file. -* The function uses bit fields to build the permissions. -* The function sets the appropiate execute bit on directories. -* -* Supported constants representing bit fields are: -* -* CHMOD_ALL - all permissions (7) -* CHMOD_READ - read permission (4) -* CHMOD_WRITE - write permission (2) -* CHMOD_EXECUTE - execute permission (1) -* -* NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions. -* -* @param string	$filename	The file/directory to be chmodded -* @param int	$perms		Permissions to set -* -* @return bool	true on success, otherwise false -*/ -function phpbb_chmod($filename, $perms = CHMOD_READ) -{ -	static $_chmod_info; - -	// Return if the file no longer exists. -	if (!file_exists($filename)) -	{ -		return false; -	} - -	// Determine some common vars -	if (empty($_chmod_info)) -	{ -		if (!function_exists('fileowner') || !function_exists('filegroup')) -		{ -			// No need to further determine owner/group - it is unknown -			$_chmod_info['process'] = false; -		} -		else -		{ -			global $phpbb_root_path, $phpEx; - -			// Determine owner/group of common.php file and the filename we want to change here -			$common_php_owner = @fileowner($phpbb_root_path . 'common.' . $phpEx); -			$common_php_group = @filegroup($phpbb_root_path . 'common.' . $phpEx); - -			// And the owner and the groups PHP is running under. -			$php_uid = (function_exists('posix_getuid')) ? @posix_getuid() : false; -			$php_gids = (function_exists('posix_getgroups')) ? @posix_getgroups() : false; - -			// If we are unable to get owner/group, then do not try to set them by guessing -			if (!$php_uid || empty($php_gids) || !$common_php_owner || !$common_php_group) -			{ -				$_chmod_info['process'] = false; -			} -			else -			{ -				$_chmod_info = array( -					'process'		=> true, -					'common_owner'	=> $common_php_owner, -					'common_group'	=> $common_php_group, -					'php_uid'		=> $php_uid, -					'php_gids'		=> $php_gids, -				); -			} -		} -	} - -	if ($_chmod_info['process']) -	{ -		$file_uid = @fileowner($filename); -		$file_gid = @filegroup($filename); - -		// Change owner -		if (@chown($filename, $_chmod_info['common_owner'])) -		{ -			clearstatcache(); -			$file_uid = @fileowner($filename); -		} - -		// Change group -		if (@chgrp($filename, $_chmod_info['common_group'])) -		{ -			clearstatcache(); -			$file_gid = @filegroup($filename); -		} - -		// If the file_uid/gid now match the one from common.php we can process further, else we are not able to change something -		if ($file_uid != $_chmod_info['common_owner'] || $file_gid != $_chmod_info['common_group']) -		{ -			$_chmod_info['process'] = false; -		} -	} - -	// Still able to process? -	if ($_chmod_info['process']) -	{ -		if ($file_uid == $_chmod_info['php_uid']) -		{ -			$php = 'owner'; -		} -		else if (in_array($file_gid, $_chmod_info['php_gids'])) -		{ -			$php = 'group'; -		} -		else -		{ -			// Since we are setting the everyone bit anyway, no need to do expensive operations -			$_chmod_info['process'] = false; -		} -	} - -	// We are not able to determine or change something -	if (!$_chmod_info['process']) -	{ -		$php = 'other'; -	} - -	// Owner always has read/write permission -	$owner = CHMOD_READ | CHMOD_WRITE; -	if (is_dir($filename)) -	{ -		$owner |= CHMOD_EXECUTE; - -		// Only add execute bit to the permission if the dir needs to be readable -		if ($perms & CHMOD_READ) -		{ -			$perms |= CHMOD_EXECUTE; -		} -	} - -	switch ($php) -	{ -		case 'owner': -			$result = @chmod($filename, ($owner << 6) + (0 << 3) + (0 << 0)); - -			clearstatcache(); - -			if (is_readable($filename) && phpbb_is_writable($filename)) -			{ -				break; -			} - -		case 'group': -			$result = @chmod($filename, ($owner << 6) + ($perms << 3) + (0 << 0)); - -			clearstatcache(); - -			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename))) -			{ -				break; -			} - -		case 'other': -			$result = @chmod($filename, ($owner << 6) + ($perms << 3) + ($perms << 0)); - -			clearstatcache(); - -			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename))) -			{ -				break; -			} - -		default: -			return false; -		break; -	} - -	return $result; -} - -/** -* Test if a file/directory is writable -* -* This function calls the native is_writable() when not running under -* Windows and it is not disabled. -* -* @param string $file Path to perform write test on -* @return bool True when the path is writable, otherwise false. -*/ -function phpbb_is_writable($file) -{ -	if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || !function_exists('is_writable')) -	{ -		if (file_exists($file)) -		{ -			// Canonicalise path to absolute path -			$file = phpbb_realpath($file); - -			if (is_dir($file)) -			{ -				// Test directory by creating a file inside the directory -				$result = @tempnam($file, 'i_w'); - -				if (is_string($result) && file_exists($result)) -				{ -					unlink($result); - -					// Ensure the file is actually in the directory (returned realpathed) -					return (strpos($result, $file) === 0) ? true : false; -				} -			} -			else -			{ -				$handle = @fopen($file, 'r+'); - -				if (is_resource($handle)) -				{ -					fclose($handle); -					return true; -				} -			} -		} -		else -		{ -			// file does not exist test if we can write to the directory -			$dir = dirname($file); - -			if (file_exists($dir) && is_dir($dir) && phpbb_is_writable($dir)) -			{ -				return true; -			} -		} - -		return false; -	} -	else -	{ -		return is_writable($file); -	} -} - -/** -* Checks if a path ($path) is absolute or relative -* -* @param string $path Path to check absoluteness of -* @return boolean -*/ -function phpbb_is_absolute($path) -{ -	return (isset($path[0]) && $path[0] == '/' || preg_match('#^[a-z]:[/\\\]#i', $path)) ? true : false; -} - -/** -* @author Chris Smith <chris@project-minerva.org> -* @copyright 2006 Project Minerva Team -* @param string $path The path which we should attempt to resolve. -* @return mixed -*/ -function phpbb_own_realpath($path) -{ -	global $request; - -	// Now to perform funky shizzle - -	// Switch to use UNIX slashes -	$path = str_replace(DIRECTORY_SEPARATOR, '/', $path); -	$path_prefix = ''; - -	// Determine what sort of path we have -	if (phpbb_is_absolute($path)) -	{ -		$absolute = true; - -		if ($path[0] == '/') -		{ -			// Absolute path, *NIX style -			$path_prefix = ''; -		} -		else -		{ -			// Absolute path, Windows style -			// Remove the drive letter and colon -			$path_prefix = $path[0] . ':'; -			$path = substr($path, 2); -		} -	} -	else -	{ -		// Relative Path -		// Prepend the current working directory -		if (function_exists('getcwd')) -		{ -			// This is the best method, hopefully it is enabled! -			$path = str_replace(DIRECTORY_SEPARATOR, '/', getcwd()) . '/' . $path; -			$absolute = true; -			if (preg_match('#^[a-z]:#i', $path)) -			{ -				$path_prefix = $path[0] . ':'; -				$path = substr($path, 2); -			} -			else -			{ -				$path_prefix = ''; -			} -		} -		else if ($request->server('SCRIPT_FILENAME')) -		{ -			// Warning: If chdir() has been used this will lie! -			// Warning: This has some problems sometime (CLI can create them easily) -			$filename = htmlspecialchars_decode($request->server('SCRIPT_FILENAME')); -			$path = str_replace(DIRECTORY_SEPARATOR, '/', dirname($filename)) . '/' . $path; -			$absolute = true; -			$path_prefix = ''; -		} -		else -		{ -			// We have no way of getting the absolute path, just run on using relative ones. -			$absolute = false; -			$path_prefix = '.'; -		} -	} - -	// Remove any repeated slashes -	$path = preg_replace('#/{2,}#', '/', $path); - -	// Remove the slashes from the start and end of the path -	$path = trim($path, '/'); - -	// Break the string into little bits for us to nibble on -	$bits = explode('/', $path); - -	// Remove any . in the path, renumber array for the loop below -	$bits = array_values(array_diff($bits, array('.'))); - -	// Lets get looping, run over and resolve any .. (up directory) -	for ($i = 0, $max = sizeof($bits); $i < $max; $i++) -	{ -		// @todo Optimise -		if ($bits[$i] == '..' ) -		{ -			if (isset($bits[$i - 1])) -			{ -				if ($bits[$i - 1] != '..') -				{ -					// We found a .. and we are able to traverse upwards, lets do it! -					unset($bits[$i]); -					unset($bits[$i - 1]); -					$i -= 2; -					$max -= 2; -					$bits = array_values($bits); -				} -			} -			else if ($absolute) // ie. !isset($bits[$i - 1]) && $absolute -			{ -				// We have an absolute path trying to descend above the root of the filesystem -				// ... Error! -				return false; -			} -		} -	} - -	// Prepend the path prefix -	array_unshift($bits, $path_prefix); - -	$resolved = ''; - -	$max = sizeof($bits) - 1; - -	// Check if we are able to resolve symlinks, Windows cannot. -	$symlink_resolve = (function_exists('readlink')) ? true : false; - -	foreach ($bits as $i => $bit) -	{ -		if (@is_dir("$resolved/$bit") || ($i == $max && @is_file("$resolved/$bit"))) -		{ -			// Path Exists -			if ($symlink_resolve && is_link("$resolved/$bit") && ($link = readlink("$resolved/$bit"))) -			{ -				// Resolved a symlink. -				$resolved = $link . (($i == $max) ? '' : '/'); -				continue; -			} -		} -		else -		{ -			// Something doesn't exist here! -			// This is correct realpath() behaviour but sadly open_basedir and safe_mode make this problematic -			// return false; -		} -		$resolved .= $bit . (($i == $max) ? '' : '/'); -	} - -	// @todo If the file exists fine and open_basedir only has one path we should be able to prepend it -	// because we must be inside that basedir, the question is where... -	// @internal The slash in is_dir() gets around an open_basedir restriction -	if (!@file_exists($resolved) || (!@is_dir($resolved . '/') && !is_file($resolved))) -	{ -		return false; -	} - -	// Put the slashes back to the native operating systems slashes -	$resolved = str_replace('/', DIRECTORY_SEPARATOR, $resolved); - -	// Check for DIRECTORY_SEPARATOR at the end (and remove it!) -	if (substr($resolved, -1) == DIRECTORY_SEPARATOR) -	{ -		return substr($resolved, 0, -1); -	} - -	return $resolved; // We got here, in the end! -} - -if (!function_exists('realpath')) -{ -	/** -	* A wrapper for realpath -	* @ignore -	*/ -	function phpbb_realpath($path) -	{ -		return phpbb_own_realpath($path); -	} -} -else -{ -	/** -	* A wrapper for realpath -	*/ -	function phpbb_realpath($path) -	{ -		$realpath = realpath($path); - -		// Strangely there are provider not disabling realpath but returning strange values. :o -		// We at least try to cope with them. -		if ($realpath === $path || $realpath === false) -		{ -			return phpbb_own_realpath($path); -		} - -		// Check for DIRECTORY_SEPARATOR at the end (and remove it!) -		if (substr($realpath, -1) == DIRECTORY_SEPARATOR) -		{ -			$realpath = substr($realpath, 0, -1); -		} - -		return $realpath; -	} -} -  // functions used for building option fields  /** @@ -1192,11 +620,11 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $  		if ($forum_id === false || !sizeof($forum_id))  		{  			// Mark all forums read (index page) - +			/* @var $phpbb_notifications \phpbb\notification\manager */  			$phpbb_notifications = $phpbb_container->get('notification_manager');  			// Mark all topic notifications read for this user -			$phpbb_notifications->mark_notifications_read(array( +			$phpbb_notifications->mark_notifications(array(  				'notification.type.topic',  				'notification.type.quote',  				'notification.type.bookmark', @@ -1263,9 +691,10 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $  			$forum_id = array_unique($forum_id);  		} +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager'); -		$phpbb_notifications->mark_notifications_read_by_parent(array( +		$phpbb_notifications->mark_notifications_by_parent(array(  			'notification.type.topic',  			'notification.type.approve_topic',  		), $forum_id, $user->data['user_id'], $post_time); @@ -1282,7 +711,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $  		}  		$db->sql_freeresult($result); -		$phpbb_notifications->mark_notifications_read_by_parent(array( +		$phpbb_notifications->mark_notifications_by_parent(array(  			'notification.type.quote',  			'notification.type.bookmark',  			'notification.type.post', @@ -1385,15 +814,16 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $  			return;  		} +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager');  		// Mark post notifications read for this user in this topic -		$phpbb_notifications->mark_notifications_read(array( +		$phpbb_notifications->mark_notifications(array(  			'notification.type.topic',  			'notification.type.approve_topic',  		), $topic_id, $user->data['user_id'], $post_time); -		$phpbb_notifications->mark_notifications_read_by_parent(array( +		$phpbb_notifications->mark_notifications_by_parent(array(  			'notification.type.quote',  			'notification.type.bookmark',  			'notification.type.post', @@ -1684,7 +1114,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis  */  function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $sql_limit = 1001, $sql_limit_offset = 0)  { -	global $config, $db, $user; +	global $config, $db, $user, $request;  	global $phpbb_dispatcher;  	$user_id = ($user_id === false) ? (int) $user->data['user_id'] : (int) $user_id; @@ -1763,7 +1193,7 @@ function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $s  		if (empty($tracking_topics))  		{ -			$tracking_topics = request_var($config['cookie_name'] . '_track', '', false, true); +			$tracking_topics = $request->variable($config['cookie_name'] . '_track', '', false, \phpbb\request\request_interface::COOKIE);  			$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();  		} @@ -1855,6 +1285,7 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti  	// Handle update of unapproved topics info.  	// Only update for moderators having m_approve permission for the forum. +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	// Check the forum for any left unread topics. @@ -2292,7 +1723,7 @@ function redirect($url, $return = false, $disable_cd_check = false)  	$failover_flag = false; -	if (empty($user->lang)) +	if (!$user->is_setup())  	{  		$user->add_lang('common');  	} @@ -2711,9 +2142,9 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo  	if ($check && $confirm)  	{ -		$user_id = request_var('confirm_uid', 0); -		$session_id = request_var('sess', ''); -		$confirm_key = request_var('confirm_key', ''); +		$user_id = $request->variable('confirm_uid', 0); +		$session_id = $request->variable('sess', ''); +		$confirm_key = $request->variable('confirm_key', '');  		if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key || !$user->data['user_last_confirm_key'] || $confirm_key != $user->data['user_last_confirm_key'])  		{ @@ -2755,7 +2186,7 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo  	);  	// If activation key already exist, we better do not re-use the key (something very strange is going on...) -	if (request_var('confirm_key', '')) +	if ($request->variable('confirm_key', ''))  	{  		// This should not occur, therefore we cancel the operation to safe the user  		return false; @@ -2811,12 +2242,12 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo  function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = false, $s_display = true)  {  	global $db, $user, $template, $auth, $phpEx, $phpbb_root_path, $config; -	global $request, $phpbb_container, $phpbb_dispatcher; +	global $request, $phpbb_container, $phpbb_dispatcher, $phpbb_log;  	$err = '';  	// Make sure user->setup() has been called -	if (empty($user->lang)) +	if (!$user->is_setup())  	{  		$user->setup();  	} @@ -2828,7 +2259,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  		// anonymous/inactive users are never able to go to the ACP even if they have the relevant permissions  		if ($user->data['is_registered'])  		{ -			add_log('admin', 'LOG_ADMIN_AUTH_FAIL'); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');  		}  		trigger_error('NO_AUTH_ADMIN');  	} @@ -2838,13 +2269,13 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  		// Get credential  		if ($admin)  		{ -			$credential = request_var('credential', ''); +			$credential = $request->variable('credential', '');  			if (strspn($credential, 'abcdef0123456789') !== strlen($credential) || strlen($credential) != 32)  			{  				if ($user->data['is_registered'])  				{ -					add_log('admin', 'LOG_ADMIN_AUTH_FAIL'); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');  				}  				trigger_error('NO_AUTH_ADMIN');  			} @@ -2856,7 +2287,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  			$password	= $request->untrimmed_variable('password', '', true);  		} -		$username	= request_var('username', '', true); +		$username	= $request->variable('username', '', true);  		$autologin	= $request->is_set_post('autologin');  		$viewonline = (int) !$request->is_set_post('viewonline');  		$admin 		= ($admin) ? 1 : 0; @@ -2866,7 +2297,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  		if ($admin && utf8_clean_string($username) != utf8_clean_string($user->data['username']))  		{  			// We log the attempt to use a different username... -			add_log('admin', 'LOG_ADMIN_AUTH_FAIL'); +			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');  			trigger_error('NO_AUTH_ADMIN_USER_DIFFER');  		} @@ -2879,7 +2310,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  		{  			if ($result['status'] == LOGIN_SUCCESS)  			{ -				add_log('admin', 'LOG_ADMIN_AUTH_SUCCESS'); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_SUCCESS');  			}  			else  			{ @@ -2887,7 +2318,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  				// anonymous/inactive users are never able to go to the ACP even if they have the relevant permissions  				if ($user->data['is_registered'])  				{ -					add_log('admin', 'LOG_ADMIN_AUTH_FAIL'); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');  				}  			}  		} @@ -2895,7 +2326,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  		// The result parameter is always an array, holding the relevant information...  		if ($result['status'] == LOGIN_SUCCESS)  		{ -			$redirect = request_var('redirect', "{$phpbb_root_path}index.$phpEx"); +			$redirect = $request->variable('redirect', "{$phpbb_root_path}index.$phpEx");  			/**  			* This event allows an extension to modify the redirection when a user successfully logs in @@ -2995,6 +2426,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  		$s_hidden_fields['credential'] = $credential;  	} +	/* @var $provider_collection \phpbb\auth\provider_collection */  	$provider_collection = $phpbb_container->get('auth.provider_collection');  	$auth_provider = $provider_collection->get_provider(); @@ -3098,6 +2530,7 @@ function login_forum_box($forum_data)  		}  		$db->sql_freeresult($result); +		/* @var $passwords_manager \phpbb\passwords\manager */  		$passwords_manager = $phpbb_container->get('passwords.manager');  		if ($passwords_manager->check($password, $forum_data['forum_password'])) @@ -3254,52 +2687,6 @@ function parse_cfg_file($filename, $lines = false)  }  /** -* Add log entry -* -* @param	string	$mode				The mode defines which log_type is used and from which log the entry is retrieved -* @param	int		$forum_id			Mode 'mod' ONLY: forum id of the related item, NOT INCLUDED otherwise -* @param	int		$topic_id			Mode 'mod' ONLY: topic id of the related item, NOT INCLUDED otherwise -* @param	int		$reportee_id		Mode 'user' ONLY: user id of the reportee, NOT INCLUDED otherwise -* @param	string	$log_operation		Name of the operation -* @param	array	$additional_data	More arguments can be added, depending on the log_type -* -* @return	int|bool		Returns the log_id, if the entry was added to the database, false otherwise. -* -* @deprecated	Use $phpbb_log->add() instead -*/ -function add_log() -{ -	global $phpbb_log, $user; - -	$args = func_get_args(); -	$mode = array_shift($args); - -	// This looks kind of dirty, but add_log has some additional data before the log_operation -	$additional_data = array(); -	switch ($mode) -	{ -		case 'admin': -		case 'critical': -		break; -		case 'mod': -			$additional_data['forum_id'] = array_shift($args); -			$additional_data['topic_id'] = array_shift($args); -		break; -		case 'user': -			$additional_data['reportee_id'] = array_shift($args); -		break; -	} - -	$log_operation = array_shift($args); -	$additional_data = array_merge($additional_data, $args); - -	$user_id = (empty($user->data)) ? ANONYMOUS : $user->data['user_id']; -	$user_ip = (empty($user->ip)) ? '' : $user->ip; - -	return $phpbb_log->add($mode, $user_id, $user_ip, $log_operation, time(), $additional_data); -} - -/**  * Return a nicely formatted backtrace.  *  * Turns the array returned by debug_backtrace() into HTML markup. @@ -3362,7 +2749,7 @@ function get_preg_expression($mode)  			return array(  				'#<!\-\- e \-\-><a href="mailto:(.*?)">.*?</a><!\-\- e \-\->#',  				'#<!\-\- l \-\-><a (?:class="[\w-]+" )?href="(.*?)(?:(&|\?)sid=[0-9a-f]{32})?">.*?</a><!\-\- l \-\->#', -				'#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="(.*?)">.*?</a><!\-\- \1 \-\->#', +				'#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="(.*?)">(.*?)</a><!\-\- \1 \-\->#',  				'#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/.*? \/><!\-\- s\1 \-\->#',  				'#<!\-\- .*? \-\->#s',  				'#<.*?>#s', @@ -3428,31 +2815,19 @@ function get_preg_expression($mode)  * Depends on whether installed PHP version supports unicode properties  *  * @param string	$word			word template to be replaced -* @param bool	$use_unicode	whether or not to take advantage of PCRE supporting unicode  *  * @return string $preg_expr		regex to use with word censor  */ -function get_censor_preg_expression($word, $use_unicode = true) +function get_censor_preg_expression($word)  {  	// Unescape the asterisk to simplify further conversions  	$word = str_replace('\*', '*', preg_quote($word, '#')); -	if ($use_unicode && phpbb_pcre_utf8_support()) -	{ -		// Replace asterisk(s) inside the pattern, at the start and at the end of it with regexes -		$word = preg_replace(array('#(?<=[\p{Nd}\p{L}_])\*+(?=[\p{Nd}\p{L}_])#iu', '#^\*+#', '#\*+$#'), array('([\x20]*?|[\p{Nd}\p{L}_-]*?)', '[\p{Nd}\p{L}_-]*?', '[\p{Nd}\p{L}_-]*?'), $word); +	// Replace asterisk(s) inside the pattern, at the start and at the end of it with regexes +	$word = preg_replace(array('#(?<=[\p{Nd}\p{L}_])\*+(?=[\p{Nd}\p{L}_])#iu', '#^\*+#', '#\*+$#'), array('([\x20]*?|[\p{Nd}\p{L}_-]*?)', '[\p{Nd}\p{L}_-]*?', '[\p{Nd}\p{L}_-]*?'), $word); -		// Generate the final substitution -		$preg_expr = '#(?<![\p{Nd}\p{L}_-])(' . $word . ')(?![\p{Nd}\p{L}_-])#iu'; -	} -	else -	{ -		// Replace the asterisk inside the pattern, at the start and at the end of it with regexes -		$word = preg_replace(array('#(?<=\S)\*+(?=\S)#iu', '#^\*+#', '#\*+$#'), array('(\x20*?\S*?)', '\S*?', '\S*?'), $word); - -		// Generate the final substitution -		$preg_expr = '#(?<!\S)(' . $word . ')(?!\S)#iu'; -	} +	// Generate the final substitution +	$preg_expr = '#(?<![\p{Nd}\p{L}_-])(' . $word . ')(?![\p{Nd}\p{L}_-])#iu';  	return $preg_expr;  } @@ -3700,38 +3075,12 @@ function phpbb_checkdnsrr($host, $type = 'MX')  		return (@gethostbyname($host_fqdn) == $host_fqdn) ? false : true;  	} -	// checkdnsrr() is available on Windows since PHP 5.3, -	// but until 5.3.3 it only works for MX records -	// See: http://bugs.php.net/bug.php?id=51844 - -	// Call checkdnsrr() if -	// we're looking for an MX record or -	// we're not on Windows or -	// we're running a PHP version where #51844 has been fixed - -	// checkdnsrr() supports AAAA since 5.0.0 -	// checkdnsrr() supports TXT since 5.2.4 -	if ( -		($type == 'MX' || DIRECTORY_SEPARATOR != '\\' || version_compare(PHP_VERSION, '5.3.3', '>=')) && -		($type != 'AAAA' || version_compare(PHP_VERSION, '5.0.0', '>=')) && -		($type != 'TXT' || version_compare(PHP_VERSION, '5.2.4', '>=')) && -		function_exists('checkdnsrr') -	) +	if (function_exists('checkdnsrr'))  	{  		return checkdnsrr($host_fqdn, $type);  	} -	// dns_get_record() is available since PHP 5; since PHP 5.3 also on Windows, -	// but on Windows it does not work reliable for AAAA records before PHP 5.3.1 - -	// Call dns_get_record() if -	// we're not looking for an AAAA record or -	// we're not on Windows or -	// we're running a PHP version where AAAA lookups work reliable -	if ( -		($type != 'AAAA' || DIRECTORY_SEPARATOR != '\\' || version_compare(PHP_VERSION, '5.3.1', '>=')) && -		function_exists('dns_get_record') -	) +	if (function_exists('dns_get_record'))  	{  		// dns_get_record() expects an integer as second parameter  		// We have to convert the string $type to the corresponding integer constant. @@ -3864,7 +3213,7 @@ function phpbb_checkdnsrr($host, $type = 'MX')  function msg_handler($errno, $msg_text, $errfile, $errline)  {  	global $cache, $db, $auth, $template, $config, $user, $request; -	global $phpEx, $phpbb_root_path, $msg_title, $msg_long_text; +	global $phpEx, $phpbb_root_path, $msg_title, $msg_long_text, $phpbb_log;  	// Do not display notices if we suppress them via @  	if (error_reporting() == 0 && $errno != E_USER_ERROR && $errno != E_USER_WARNING && $errno != E_USER_NOTICE) @@ -3878,11 +3227,6 @@ function msg_handler($errno, $msg_text, $errfile, $errline)  		$msg_text = $msg_long_text;  	} -	if (!defined('E_DEPRECATED')) -	{ -		define('E_DEPRECATED', 8192); -	} -  	switch ($errno)  	{  		case E_NOTICE: @@ -3905,7 +3249,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)  				// we are writing an image - the user won't see the debug, so let's place it in the log  				if (defined('IMAGE_OUTPUT') || defined('IN_CRON'))  				{ -					add_log('critical', 'LOG_IMAGE_GENERATION_ERROR', $errfile, $errline, $msg_text); +					$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_IMAGE_GENERATION_ERROR', false, array($errfile, $errline, $msg_text));  				}  				// echo '<br /><br />BACKTRACE<br />' . get_backtrace() . '<br />' . "\n";  			} @@ -3916,7 +3260,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)  		case E_USER_ERROR: -			if (!empty($user) && !empty($user->lang)) +			if (!empty($user) && $user->is_setup())  			{  				$msg_text = (!empty($user->lang[$msg_text])) ? $user->lang[$msg_text] : $msg_text;  				$msg_title = (!isset($msg_title)) ? $user->lang['GENERAL_ERROR'] : ((!empty($user->lang[$msg_title])) ? $user->lang[$msg_title] : $msg_title); @@ -3967,7 +3311,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)  			{  				// let's avoid loops  				$db->sql_return_on_error(true); -				add_log('critical', 'LOG_GENERAL_ERROR', $msg_title, $log_text); +				$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_GENERAL_ERROR', false, array($msg_title, $log_text));  				$db->sql_return_on_error(false);  			} @@ -4036,7 +3380,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)  			// We re-init the auth array to get correct results on login/logout  			$auth->acl($user->data); -			if (empty($user->lang)) +			if (!$user->is_setup())  			{  				$user->setup();  			} @@ -4125,11 +3469,13 @@ function msg_handler($errno, $msg_text, $errfile, $errline)  */  function phpbb_filter_root_path($errfile)  { +	global $phpbb_filesystem; +  	static $root_path;  	if (empty($root_path))  	{ -		$root_path = phpbb_realpath(dirname(__FILE__) . '/../'); +		$root_path = $phpbb_filesystem->realpath(dirname(__FILE__) . '/../');  	}  	return str_replace(array($root_path, '\\'), array('[ROOT]', '/'), $errfile); @@ -4408,178 +3754,6 @@ function phpbb_optionset($bit, $set, $data)  }  /** -* Determine which plural form we should use. -* For some languages this is not as simple as for English. -* -* @param $rule		int			ID of the plural rule we want to use, see http://wiki.phpbb.com/Plural_Rules#Plural_Rules -* @param $number	int|float	The number we want to get the plural case for. Float numbers are floored. -* @return	int		The plural-case we need to use for the number plural-rule combination -*/ -function phpbb_get_plural_form($rule, $number) -{ -	$number = (int) $number; - -	if ($rule > 15 || $rule < 0) -	{ -		trigger_error('INVALID_PLURAL_RULE'); -	} - -	/** -	* The following plural rules are based on a list published by the Mozilla Developer Network -	* https://developer.mozilla.org/en/Localization_and_Plurals -	*/ -	switch ($rule) -	{ -		case 0: -			/** -			* Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao -			* 1 - everything: 0, 1, 2, ... -			*/ -			return 1; - -		case 1: -			/** -			* Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan) -			* 1 - 1 -			* 2 - everything else: 0, 2, 3, ... -			*/ -			return ($number == 1) ? 1 : 2; - -		case 2: -			/** -			* Families: Romanic (French, Brazilian Portuguese) -			* 1 - 0, 1 -			* 2 - everything else: 2, 3, ... -			*/ -			return (($number == 0) || ($number == 1)) ? 1 : 2; - -		case 3: -			/** -			* Families: Baltic (Latvian) -			* 1 - 0 -			* 2 - ends in 1, not 11: 1, 21, ... 101, 121, ... -			* 3 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... -			*/ -			return ($number == 0) ? 1 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 2 : 3); - -		case 4: -			/** -			* Families: Celtic (Scottish Gaelic) -			* 1 - is 1 or 11: 1, 11 -			* 2 - is 2 or 12: 2, 12 -			* 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19 -			* 4 - everything else: 0, 20, 21, ... -			*/ -			return ($number == 1 || $number == 11) ? 1 : (($number == 2 || $number == 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4)); - -		case 5: -			/** -			* Families: Romanic (Romanian) -			* 1 - 1 -			* 2 - is 0 or ends in 01-19: 0, 2, 3, ... 19, 101, 102, ... 119, 201, ... -			* 3 - everything else: 20, 21, ... -			*/ -			return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3); - -		case 6: -			/** -			* Families: Baltic (Lithuanian) -			* 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... -			* 2 - ends in 0 or ends in 10-20: 0, 10, 11, 12, ... 19, 20, 30, 40, ... -			* 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ... -			*/ -			return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3); - -		case 7: -			/** -			* Families: Slavic (Croatian, Serbian, Russian, Ukrainian) -			* 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... -			* 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... -			* 3 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ... -			*/ -			return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3); - -		case 8: -			/** -			* Families: Slavic (Slovak, Czech) -			* 1 - 1 -			* 2 - 2, 3, 4 -			* 3 - everything else: 0, 5, 6, 7, ... -			*/ -			return ($number == 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3); - -		case 9: -			/** -			* Families: Slavic (Polish) -			* 1 - 1 -			* 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ... -			* 3 - everything else: 0, 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ... -			*/ -			return ($number == 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3); - -		case 10: -			/** -			* Families: Slavic (Slovenian, Sorbian) -			* 1 - ends in 01: 1, 101, 201, ... -			* 2 - ends in 02: 2, 102, 202, ... -			* 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ... -			* 4 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, ... -			*/ -			return ($number % 100 == 1) ? 1 : (($number % 100 == 2) ? 2 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 3 : 4)); - -		case 11: -			/** -			* Families: Celtic (Irish Gaeilge) -			* 1 - 1 -			* 2 - 2 -			* 3 - is 3-6: 3, 4, 5, 6 -			* 4 - is 7-10: 7, 8, 9, 10 -			* 5 - everything else: 0, 11, 12, ... -			*/ -			return ($number == 1) ? 1 : (($number == 2) ? 2 : (($number >= 3 && $number <= 6) ? 3 : (($number >= 7 && $number <= 10) ? 4 : 5))); - -		case 12: -			/** -			* Families: Semitic (Arabic) -			* 1 - 1 -			* 2 - 2 -			* 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ... -			* 4 - ends in 11-99: 11, ... 99, 111, 112, ... -			* 5 - everything else: 100, 101, 102, 200, 201, 202, ... -			* 6 - 0 -			*/ -			return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : (($number != 0) ? 5 : 6)))); - -		case 13: -			/** -			* Families: Semitic (Maltese) -			* 1 - 1 -			* 2 - is 0 or ends in 01-10: 0, 2, 3, ... 9, 10, 101, 102, ... -			* 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ... -			* 4 - everything else: 20, 21, ... -			*/ -			return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 2 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 3 : 4)); - -		case 14: -			/** -			* Families: Slavic (Macedonian) -			* 1 - ends in 1: 1, 11, 21, ... -			* 2 - ends in 2: 2, 12, 22, ... -			* 3 - everything else: 0, 3, 4, ... 10, 13, 14, ... 20, 23, ... -			*/ -			return ($number % 10 == 1) ? 1 : (($number % 10 == 2) ? 2 : 3); - -		case 15: -			/** -			* Families: Icelandic -			* 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ... -			* 2 - everything else: 0, 2, 3, ... 10, 11, 12, ... 20, 22, ... -			*/ -			return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; -	} -} - -/**  * Login using http authenticate.  *  * @param array	$param		Parameter array, see $param_defaults array. @@ -4836,6 +4010,7 @@ function phpbb_get_avatar($row, $alt, $ignore_config = false, $lazy = false)  		'height' => $row['avatar_height'],  	); +	/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  	$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  	$driver = $phpbb_avatar_manager->get_driver($row['avatar_type'], $ignore_config);  	$html = ''; @@ -4999,8 +4174,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  		if ($total_online_users > $config['record_online_users'])  		{ -			set_config('record_online_users', $total_online_users, true); -			set_config('record_online_date', time(), true); +			$config->set('record_online_users', $total_online_users, false); +			$config->set('record_online_date', time(), false);  		}  		$l_online_record = $user->lang('RECORD_ONLINE_USERS', (int) $config['record_online_users'], $user->format_date($config['record_online_date'], false, true)); @@ -5035,8 +4210,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  		}  	} -	$forum_id = request_var('f', 0); -	$topic_id = request_var('t', 0); +	$forum_id = $request->variable('f', 0); +	$topic_id = $request->variable('t', 0);  	$s_feed_news = false; @@ -5056,6 +4231,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  	// This path is sent with the base template paths in the assign_vars()  	// call below. We need to correct it in case we are accessing from a  	// controller because the web paths will be incorrect otherwise. +	/* @var $phpbb_path_helper \phpbb\path_helper */  	$phpbb_path_helper = $phpbb_container->get('path_helper');  	$corrected_path = $phpbb_path_helper->get_web_root_path();  	$web_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? $board_url : $corrected_path; @@ -5092,11 +4268,12 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  	// Output the notifications  	$notifications = false; -	if ($config['load_notifications'] && $user->data['user_id'] != ANONYMOUS && $user->data['user_type'] != USER_IGNORE) +	if ($config['load_notifications'] && $config['allow_board_notifications'] && $user->data['user_id'] != ANONYMOUS && $user->data['user_type'] != USER_IGNORE)  	{ +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager'); -		$notifications = $phpbb_notifications->load_notifications(array( +		$notifications = $phpbb_notifications->load_notifications('notification.method.board', array(  			'all_unread'	=> true,  			'limit'			=> 5,  		)); @@ -5107,6 +4284,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  		}  	} +	/** @var \phpbb\controller\helper $controller_helper */ +	$controller_helper = $phpbb_container->get('controller.helper');  	$notification_mark_hash = generate_link_hash('mark_all_notifications_read');  	// The following assigns all _common_ variables that may be used at any point in a template. @@ -5131,7 +4310,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  		'U_VIEW_ALL_NOTIFICATIONS'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications'),  		'U_MARK_ALL_NOTIFICATIONS'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications&mode=notification_list&mark=all&token=' . $notification_mark_hash),  		'U_NOTIFICATION_SETTINGS'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications&mode=notification_options'), -		'S_NOTIFICATIONS_DISPLAY'		=> $config['load_notifications'], +		'S_NOTIFICATIONS_DISPLAY'		=> $config['load_notifications'] && $config['allow_board_notifications'],  		'S_USER_NEW_PRIVMSG'			=> $user->data['user_new_privmsg'],  		'S_USER_UNREAD_PRIVMSG'			=> $user->data['user_unread_privmsg'], @@ -5160,7 +4339,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  		'U_PROFILE'				=> append_sid("{$phpbb_root_path}ucp.$phpEx"),  		'U_USER_PROFILE'		=> get_username_string('profile', $user->data['user_id'], $user->data['username'], $user->data['user_colour']),  		'U_MODCP'				=> append_sid("{$phpbb_root_path}mcp.$phpEx", false, true, $user->session_id), -		'U_FAQ'					=> append_sid("{$phpbb_root_path}faq.$phpEx"), +		'U_FAQ'					=> $controller_helper->route('phpbb_help_faq_controller'),  		'U_SEARCH_SELF'			=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=egosearch'),  		'U_SEARCH_NEW'			=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=newposts'),  		'U_SEARCH_UNANSWERED'	=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unanswered'), @@ -5424,6 +4603,8 @@ function page_footer($run_cron = true, $display_template = true, $exit_handler =  	if ($call_cron)  	{  		global $phpbb_container; + +		/* @var $cron \phpbb\cron\manager */  		$cron = $phpbb_container->get('cron.manager');  		$task = $cron->find_one_ready_task(); @@ -5540,22 +4721,6 @@ function phpbb_user_session_handler()  }  /** -* Check if PCRE has UTF-8 support -* PHP may not be linked with the bundled PCRE lib and instead with an older version -* -* @return bool	Returns true if PCRE (the regular expressions library) supports UTF-8 encoding -*/ -function phpbb_pcre_utf8_support() -{ -	static $utf8_pcre_properties = null; -	if (is_null($utf8_pcre_properties)) -	{ -		$utf8_pcre_properties = (@preg_match('/\p{L}/u', 'a') !== false); -	} -	return $utf8_pcre_properties; -} - -/**  * Casts a numeric string $input to an appropriate numeric type (i.e. integer or float)  *  * @param string $input		A numeric string. diff --git a/phpBB/includes/functions_acp.php b/phpBB/includes/functions_acp.php index d566336d26..eea18a0c47 100644 --- a/phpBB/includes/functions_acp.php +++ b/phpBB/includes/functions_acp.php @@ -410,7 +410,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)  */  function validate_config_vars($config_vars, &$cfg_array, &$error)  { -	global $phpbb_root_path, $user, $phpbb_dispatcher; +	global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem;  	$type	= 0;  	$min	= 1; @@ -591,7 +591,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)  				// Check if the path is writable  				if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath' || $config_definition['validate'] === 'absolute_path_writable')  				{ -					if (file_exists($path) && !phpbb_is_writable($path)) +					if (file_exists($path) && !$phpbb_filesystem->is_writable($path))  					{  						$error[] = sprintf($user->lang['DIRECTORY_NOT_WRITABLE'], $cfg_array[$config_name]);  					} diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index afd3dce730..7ca1f621ff 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -316,7 +316,7 @@ function get_forum_branch($forum_id, $type = 'all', $order = 'descending', $incl  */  function copy_forum_permissions($src_forum_id, $dest_forum_ids, $clear_dest_perms = true, $add_log = true)  { -	global $db; +	global $db, $user, $phpbb_log;  	// Only one forum id specified  	if (!is_array($dest_forum_ids)) @@ -439,7 +439,7 @@ function copy_forum_permissions($src_forum_id, $dest_forum_ids, $clear_dest_perm  	if ($add_log)  	{ -		add_log('admin', 'LOG_FORUM_COPIED_PERMISSIONS', $src_forum_name, implode(', ', $dest_forum_names)); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_COPIED_PERMISSIONS', false, array($src_forum_name, implode(', ', $dest_forum_names)));  	}  	$db->sql_transaction('commit'); @@ -759,9 +759,10 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s  	if ($approved_topics)  	{ -		set_config_count('num_topics', $approved_topics * (-1), true); +		$config->increment('num_topics', $approved_topics * (-1), false);  	} +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	$phpbb_notifications->delete_notifications(array( @@ -1017,7 +1018,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =  	if ($approved_posts && $post_count_sync)  	{ -		set_config_count('num_posts', $approved_posts * (-1), true); +		$config->increment('num_posts', $approved_posts * (-1), false);  	}  	// We actually remove topics now to not be inconsistent (the delete_topics function calls this function too) @@ -1026,6 +1027,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =  		delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false);  	} +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	$phpbb_notifications->delete_notifications($delete_notifications_types, $post_ids); @@ -1149,8 +1151,8 @@ function delete_attachments($mode, $ids, $resync = true)  	if ($space_removed || $files_removed)  	{ -		set_config_count('upload_dir_size', $space_removed * (-1), true); -		set_config_count('num_files', $files_removed * (-1), true); +		$config->increment('upload_dir_size', $space_removed * (-1), false); +		$config->increment('num_files', $files_removed * (-1), false);  	}  	// If we do not resync, we do not need to adjust any message, post, topic or user entries @@ -2454,7 +2456,7 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync  */  function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_freq)  { -	global $db; +	global $db, $user, $phpbb_log;  	$sql = 'SELECT forum_name  		FROM ' . FORUMS_TABLE . " @@ -2475,7 +2477,7 @@ function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_fr  			WHERE forum_id = $forum_id";  		$db->sql_query($sql); -		add_log('admin', 'LOG_AUTO_PRUNE', $row['forum_name']); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_AUTO_PRUNE', false, array($row['forum_name']));  	}  	return; @@ -3042,25 +3044,6 @@ function get_database_size()  	return $database_size;  } -/** -* Retrieve contents from remotely stored file -* -* @deprecated	3.1.2	Use file_downloader instead -*/ -function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6) -{ -	global $phpbb_container; - -	// Get file downloader and assign $errstr and $errno -	$file_downloader = $phpbb_container->get('file_downloader'); - -	$file_data = $file_downloader->get($host, $directory, $filename, $port, $timeout); -	$errstr = $file_downloader->get_error_string(); -	$errno = $file_downloader->get_error_number(); - -	return $file_data; -} -  /*  * Tidy Warnings  * Remove all warnings which have now expired from the database @@ -3104,7 +3087,7 @@ function tidy_warnings()  		$db->sql_transaction('commit');  	} -	set_config('warnings_last_gc', time(), true); +	$config->set('warnings_last_gc', time(), false);  }  /** @@ -3112,7 +3095,7 @@ function tidy_warnings()  */  function tidy_database()  { -	global $db; +	global $config, $db;  	// Here we check permission consistency @@ -3137,7 +3120,7 @@ function tidy_database()  		WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);  	$db->sql_query($sql); -	set_config('database_last_gc', time(), true); +	$config->set('database_last_gc', time(), false);  }  /** diff --git a/phpBB/includes/functions_compatibility.php b/phpBB/includes/functions_compatibility.php index b59c7376e9..4b085a6050 100644 --- a/phpBB/includes/functions_compatibility.php +++ b/phpBB/includes/functions_compatibility.php @@ -60,6 +60,7 @@ function phpbb_hash($password)  {  	global $phpbb_container; +	/* @var $passwords_manager \phpbb\passwords\manager */  	$passwords_manager = $phpbb_container->get('passwords.manager');  	return $passwords_manager->hash($password);  } @@ -78,6 +79,7 @@ function phpbb_check_hash($password, $hash)  {  	global $phpbb_container; +	/* @var $passwords_manager \phpbb\passwords\manager */  	$passwords_manager = $phpbb_container->get('passwords.manager');  	return $passwords_manager->check($password, $hash);  } @@ -90,7 +92,7 @@ function phpbb_check_hash($password, $hash)  * @param string $path Path to clean  * @return string Cleaned path  * -* @deprecated +* @deprecated 3.1.0 (To be removed: 3.3.0)  */  function phpbb_clean_path($path)  { @@ -98,6 +100,7 @@ function phpbb_clean_path($path)  	if (!$phpbb_path_helper && $phpbb_container)  	{ +		/* @var $phpbb_path_helper \phpbb\path_helper */  		$phpbb_path_helper = $phpbb_container->get('path_helper');  	}  	else if (!$phpbb_path_helper) @@ -115,7 +118,7 @@ function phpbb_clean_path($path)  			new phpbb\symfony_request(  				$request  			), -			new phpbb\filesystem(), +			new phpbb\filesystem\filesystem(),  			$request,  			$phpbb_root_path,  			$phpEx @@ -133,7 +136,7 @@ function phpbb_clean_path($path)  *  * @return		string		Returns the options for timezone selector only  * -* @deprecated +* @deprecated 3.1.0 (To be removed: 3.3.0)  */  function tz_select($default = '', $truncate = false)  { @@ -147,7 +150,7 @@ function tz_select($default = '', $truncate = false)  * via admin_permissions. Changes of usernames and group names  * must be carried through for the moderators table.  * -* @deprecated 3.1 +* @deprecated 3.1.0 (To be removed: 3.3.0)  * @return null  */  function cache_moderators() @@ -159,7 +162,7 @@ function cache_moderators()  /**  * Removes moderators and administrators from foe lists.  * -* @deprecated 3.1 +* @deprecated 3.1.0 (To be removed: 3.3.0)  * @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore  * @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore  * @return null @@ -196,3 +199,315 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank  	$rank_img = $rank_data['img'];  	$rank_img_src = $rank_data['img_src'];  } + +/** + * Retrieve contents from remotely stored file + * + * @deprecated	3.1.2	Use file_downloader instead + */ +function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6) +{ +	global $phpbb_container; + +	// Get file downloader and assign $errstr and $errno +	/* @var $file_downloader \phpbb\file_downloader */ +	$file_downloader = $phpbb_container->get('file_downloader'); + +	$file_data = $file_downloader->get($host, $directory, $filename, $port, $timeout); +	$errstr = $file_downloader->get_error_string(); +	$errno = $file_downloader->get_error_number(); + +	return $file_data; +} + +/** + * Add log entry + * + * @param	string	$mode				The mode defines which log_type is used and from which log the entry is retrieved + * @param	int		$forum_id			Mode 'mod' ONLY: forum id of the related item, NOT INCLUDED otherwise + * @param	int		$topic_id			Mode 'mod' ONLY: topic id of the related item, NOT INCLUDED otherwise + * @param	int		$reportee_id		Mode 'user' ONLY: user id of the reportee, NOT INCLUDED otherwise + * @param	string	$log_operation		Name of the operation + * @param	array	$additional_data	More arguments can be added, depending on the log_type + * + * @return	int|bool		Returns the log_id, if the entry was added to the database, false otherwise. + * + * @deprecated	3.1.0 (To be removed: 3.3.0) + */ +function add_log() +{ +	global $phpbb_log, $user; + +	$args = func_get_args(); +	$mode = array_shift($args); + +	// This looks kind of dirty, but add_log has some additional data before the log_operation +	$additional_data = array(); +	switch ($mode) +	{ +		case 'admin': +		case 'critical': +			break; +		case 'mod': +			$additional_data['forum_id'] = array_shift($args); +			$additional_data['topic_id'] = array_shift($args); +			break; +		case 'user': +			$additional_data['reportee_id'] = array_shift($args); +			break; +	} + +	$log_operation = array_shift($args); +	$additional_data = array_merge($additional_data, $args); + +	$user_id = (empty($user->data)) ? ANONYMOUS : $user->data['user_id']; +	$user_ip = (empty($user->ip)) ? '' : $user->ip; + +	return $phpbb_log->add($mode, $user_id, $user_ip, $log_operation, time(), $additional_data); +} + +/** + * Sets a configuration option's value. + * + * Please note that this function does not update the is_dynamic value for + * an already existing config option. + * + * @param string $config_name   The configuration option's name + * @param string $config_value  New configuration value + * @param bool   $is_dynamic    Whether this variable should be cached (false) or + *                              if it changes too frequently (true) to be + *                              efficiently cached. + * + * @return null + * + * @deprecated 3.1.0 (To be removed: 3.3.0) + */ +function set_config($config_name, $config_value, $is_dynamic = false, \phpbb\config\config $set_config = null) +{ +	static $config = null; + +	if ($set_config !== null) +	{ +		$config = $set_config; + +		if (empty($config_name)) +		{ +			return; +		} +	} + +	$config->set($config_name, $config_value, !$is_dynamic); +} + +/** + * Increments an integer config value directly in the database. + * + * @param string $config_name   The configuration option's name + * @param int    $increment     Amount to increment by + * @param bool   $is_dynamic    Whether this variable should be cached (false) or + *                              if it changes too frequently (true) to be + *                              efficiently cached. + * + * @return null + * + * @deprecated 3.1.0 (To be removed: 3.3.0) + */ +function set_config_count($config_name, $increment, $is_dynamic = false, \phpbb\config\config $set_config = null) +{ +	static $config = null; +	if ($set_config !== null) +	{ +		$config = $set_config; +		if (empty($config_name)) +		{ +			return; +		} +	} +	$config->increment($config_name, $increment, !$is_dynamic); +} + +/** + * Wrapper function of \phpbb\request\request::variable which exists for backwards compatability. + * See {@link \phpbb\request\request_interface::variable \phpbb\request\request_interface::variable} for + * documentation of this function's use. + * + * @deprecated 3.1.0 (To be removed: 3.3.0) + * @param	mixed			$var_name	The form variable's name from which data shall be retrieved. + * 										If the value is an array this may be an array of indizes which will give + * 										direct access to a value at any depth. E.g. if the value of "var" is array(1 => "a") + * 										then specifying array("var", 1) as the name will return "a". + * 										If you pass an instance of {@link \phpbb\request\request_interface phpbb_request_interface} + * 										as this parameter it will overwrite the current request class instance. If you do + * 										not do so, it will create its own instance (but leave superglobals enabled). + * @param	mixed			$default	A default value that is returned if the variable was not set. + * 										This function will always return a value of the same type as the default. + * @param	bool			$multibyte	If $default is a string this paramater has to be true if the variable may contain any UTF-8 characters + *										Default is false, causing all bytes outside the ASCII range (0-127) to be replaced with question marks + * @param	bool			$cookie		This param is mapped to \phpbb\request\request_interface::COOKIE as the last param for + * 										\phpbb\request\request_interface::variable for backwards compatability reasons. + * @param	\phpbb\request\request_interface|null|false	If an instance of \phpbb\request\request_interface is given the instance is stored in + *										a static variable and used for all further calls where this parameters is null. Until + *										the function is called with an instance it automatically creates a new \phpbb\request\request + *										instance on every call. By passing false this per-call instantiation can be restored + *										after having passed in a \phpbb\request\request_interface instance. + * + * @return	mixed	The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the + * 					the same as that of $default. If the variable is not set $default is returned. + */ +function request_var($var_name, $default, $multibyte = false, $cookie = false, $request = null) +{ +	// This is all just an ugly hack to add "Dependency Injection" to a function +	// the only real code is the function call which maps this function to a method. +	static $static_request = null; +	if ($request instanceof \phpbb\request\request_interface) +	{ +		$static_request = $request; +		if (empty($var_name)) +		{ +			return; +		} +	} +	else if ($request === false) +	{ +		$static_request = null; +		if (empty($var_name)) +		{ +			return; +		} +	} +	$tmp_request = $static_request; +	// no request class set, create a temporary one ourselves to keep backwards compatibility +	if ($tmp_request === null) +	{ +		// false param: enable super globals, so the created request class does not +		// make super globals inaccessible everywhere outside this function. +		$tmp_request = new \phpbb\request\request(new \phpbb\request\type_cast_helper(), false); +	} +	return $tmp_request->variable($var_name, $default, $multibyte, ($cookie) ? \phpbb\request\request_interface::COOKIE : \phpbb\request\request_interface::REQUEST); +} + +/** + * Get tables of a database + * + * @deprecated 3.1.0 (To be removed: 3.3.0) + */ +function get_tables(&$db) +{ +	$db_tools_factory = new \phpbb\db\tools\factory(); +	$db_tools = $db_tools_factory->get($db); + +	return $db_tools->sql_list_tables(); +} + +/** + * Global function for chmodding directories and files for internal use + * + * This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions. + * The function determines owner and group from common.php file and sets the same to the provided file. + * The function uses bit fields to build the permissions. + * The function sets the appropiate execute bit on directories. + * + * Supported constants representing bit fields are: + * + * CHMOD_ALL - all permissions (7) + * CHMOD_READ - read permission (4) + * CHMOD_WRITE - write permission (2) + * CHMOD_EXECUTE - execute permission (1) + * + * NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions. + * + * @param string	$filename	The file/directory to be chmodded + * @param int	$perms		Permissions to set + * + * @return bool	true on success, otherwise false + * + * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::phpbb_chmod() instead + */ +function phpbb_chmod($filename, $perms = CHMOD_READ) +{ +	global $phpbb_filesystem; + +	try +	{ +		$phpbb_filesystem->phpbb_chmod($filename, $perms); +	} +	catch (\phpbb\filesystem\exception\filesystem_exception $e) +	{ +		return false; +	} + +	return true; +} + +/** + * Test if a file/directory is writable + * + * This function calls the native is_writable() when not running under + * Windows and it is not disabled. + * + * @param string $file Path to perform write test on + * @return bool True when the path is writable, otherwise false. + * + * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::is_writable() instead + */ +function phpbb_is_writable($file) +{ +	global $phpbb_filesystem; + +	return $phpbb_filesystem->is_writable($file); +} + +/** + * Checks if a path ($path) is absolute or relative + * + * @param string $path Path to check absoluteness of + * @return boolean + * + * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::is_absolute_path() instead + */ +function phpbb_is_absolute($path) +{ +	global $phpbb_filesystem; + +	return $phpbb_filesystem->is_absolute_path($path); +} + +/** + * A wrapper for realpath + * + * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::realpath() instead + */ +function phpbb_realpath($path) +{ +	global $phpbb_filesystem; + +	return $phpbb_filesystem->realpath($path); +} + +/** + * Determine which plural form we should use. + * For some languages this is not as simple as for English. + * + * @param $rule		int			ID of the plural rule we want to use, see http://wiki.phpbb.com/Plural_Rules#Plural_Rules + * @param $number	int|float	The number we want to get the plural case for. Float numbers are floored. + * @return	int		The plural-case we need to use for the number plural-rule combination + * + * @deprecated 3.2.0-dev (To be removed: 3.3.0) + */ +function phpbb_get_plural_form($rule, $number) +{ +	global $phpbb_container; + +	/** @var \phpbb\language\language $language */ +	$language = $phpbb_container->get('language'); +	return $language->get_plural_form($number, $rule); +} + +/** +* @return bool Always true +* @deprecated 3.2.0-dev +*/ +function phpbb_pcre_utf8_support() +{ +	return true; +} diff --git a/phpBB/includes/functions_compress.php b/phpBB/includes/functions_compress.php index a7ee29dd91..e768a0f47b 100644 --- a/phpBB/includes/functions_compress.php +++ b/phpBB/includes/functions_compress.php @@ -184,7 +184,7 @@ class compress  }  /** -* Zip creation class from phpMyAdmin 2.3.0 (c) Tobias Ratschiller, Olivier Müller, Loïc Chapeaux, +* Zip creation class from phpMyAdmin 2.3.0 (c) Tobias Ratschiller, Olivier Müller, Loïc Chapeaux,  * Marc Delisle, http://www.phpmyadmin.net/  *  * Zip extraction function by Alexandre Tedeschi, alexandrebr at gmail dot com @@ -204,11 +204,19 @@ class compress_zip extends compress  	var $datasec_len = 0;  	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/**  	* Constructor  	*/  	function compress_zip($mode, $file)  	{ +		global $phpbb_filesystem; +  		$this->fp = @fopen($file, $mode . 'b'); +		$this->filesystem = ($phpbb_filesystem instanceof \phpbb\filesystem\filesystem_interface) ? $phpbb_filesystem : new \phpbb\filesystem\filesystem();  		if (!$this->fp)  		{ @@ -286,7 +294,15 @@ class compress_zip extends compress  									{  										trigger_error("Could not create directory $folder");  									} -									phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); + +									try +									{ +										$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); +									} +									catch (\phpbb\filesystem\exception\filesystem_exception $e) +									{ +										// Do nothing +									}  								}  							}  						} @@ -315,7 +331,15 @@ class compress_zip extends compress  								{  									trigger_error("Could not create directory $folder");  								} -								phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); + +								try +								{ +									$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); +								} +								catch (\phpbb\filesystem\exception\filesystem_exception $e) +								{ +									// Do nothing +								}  							}  						}  					} @@ -539,10 +563,17 @@ class compress_tar extends compress  	var $wrote = false;  	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/**  	* Constructor  	*/  	function compress_tar($mode, $file, $type = '')  	{ +		global $phpbb_filesystem; +  		$type = (!$type) ? $file : $type;  		$this->isgz = preg_match('#(\.tar\.gz|\.tgz)$#', $type);  		$this->isbz = preg_match('#\.tar\.bz2$#', $type); @@ -551,6 +582,8 @@ class compress_tar extends compress  		$this->file = &$file;  		$this->type = &$type;  		$this->open(); + +		$this->filesystem = ($phpbb_filesystem instanceof \phpbb\filesystem\filesystem_interface) ? $phpbb_filesystem : new \phpbb\filesystem\filesystem();  	}  	/** @@ -601,7 +634,15 @@ class compress_tar extends compress  								{  									trigger_error("Could not create directory $folder");  								} -								phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); + +								try +								{ +									$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); +								} +								catch (\phpbb\filesystem\exception\filesystem_exception $e) +								{ +									// Do nothing +								}  							}  						}  					} @@ -628,7 +669,15 @@ class compress_tar extends compress  							{  								trigger_error("Could not create directory $folder");  							} -							phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); + +							try +							{ +								$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE); +							} +							catch (\phpbb\filesystem\exception\filesystem_exception $e) +							{ +								// Do nothing +							}  						}  					} @@ -637,7 +686,15 @@ class compress_tar extends compress  					{  						trigger_error("Couldn't create file $filename");  					} -					phpbb_chmod($target_filename, CHMOD_READ); + +					try +					{ +						$this->filesystem->phpbb_chmod($target_filename, CHMOD_READ); +					} +					catch (\phpbb\filesystem\exception\filesystem_exception $e) +					{ +						// Do nothing +					}  					// Grab the file contents  					fwrite($fp, ($filesize) ? $fzread($this->fp, ($filesize + 511) &~ 511) : '', $filesize); diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 6f861b8607..fd39c61b14 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -389,46 +389,68 @@ function phpbb_clean_search_string($search_string)  /**  * Decode text whereby text is coming from the db and expected to be pre-parsed content  * We are placing this outside of the message parser because we are often in need of it... +* +* NOTE: special chars are kept encoded +* +* @param string &$message Original message, passed by reference +* @param string $bbcode_uid BBCode UID +* @return null  */  function decode_message(&$message, $bbcode_uid = '')  { -	global $config; +	global $phpbb_container; -	if ($bbcode_uid) +	if (preg_match('#^<[rt][ >]#', $message))  	{ -		$match = array('<br />', "[/*:m:$bbcode_uid]", ":u:$bbcode_uid", ":o:$bbcode_uid", ":$bbcode_uid"); -		$replace = array("\n", '', '', '', ''); +		$message = htmlspecialchars($phpbb_container->get('text_formatter.utils')->unparse($message), ENT_COMPAT);  	}  	else  	{ -		$match = array('<br />'); -		$replace = array("\n"); -	} +		if ($bbcode_uid) +		{ +			$match = array('<br />', "[/*:m:$bbcode_uid]", ":u:$bbcode_uid", ":o:$bbcode_uid", ":$bbcode_uid"); +			$replace = array("\n", '', '', '', ''); +		} +		else +		{ +			$match = array('<br />'); +			$replace = array("\n"); +		} -	$message = str_replace($match, $replace, $message); +		$message = str_replace($match, $replace, $message); -	$match = get_preg_expression('bbcode_htm'); -	$replace = array('\1', '\1', '\2', '\1', '', ''); +		$match = get_preg_expression('bbcode_htm'); +		$replace = array('\1', '\1', '\3', '\1', '', ''); -	$message = preg_replace($match, $replace, $message); +		$message = preg_replace($match, $replace, $message); +	}  }  /** -* Strips all bbcode from a text and returns the plain content +* Strips all bbcode from a text in place  */  function strip_bbcode(&$text, $uid = '')  { -	if (!$uid) +	global $phpbb_container; + +	if (preg_match('#^<[rt][ >]#', $text))  	{ -		$uid = '[0-9a-z]{5,}'; +		$text = $phpbb_container->get('text_formatter.utils')->clean_formatting($text);  	} +	else +	{ +		if (!$uid) +		{ +			$uid = '[0-9a-z]{5,}'; +		} -	$text = preg_replace("#\[\/?[a-z0-9\*\+\-]+(?:=(?:".*"|[^\]]*))?(?::[a-z])?(\:$uid)\]#", ' ', $text); +		$text = preg_replace("#\[\/?[a-z0-9\*\+\-]+(?:=(?:".*"|[^\]]*))?(?::[a-z])?(\:$uid)\]#", ' ', $text); -	$match = get_preg_expression('bbcode_htm'); -	$replace = array('\1', '\1', '\2', '\1', '', ''); +		$match = get_preg_expression('bbcode_htm'); +		$replace = array('\1', '\1', '\2', '\1', '', ''); -	$text = preg_replace($match, $replace, $text); +		$text = preg_replace($match, $replace, $text); +	}  }  /** @@ -438,7 +460,7 @@ function strip_bbcode(&$text, $uid = '')  function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text = true)  {  	static $bbcode; -	global $phpbb_dispatcher; +	global $phpbb_dispatcher, $phpbb_container;  	if ($text === '')  	{ @@ -459,34 +481,56 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text  	$vars = array('text', 'uid', 'bitfield', 'flags', 'censor_text');  	extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_before', compact($vars))); -	if ($censor_text) +	if (preg_match('#^<[rt][ >]#', $text))  	{ -		$text = censor_text($text); -	} +		$renderer = $phpbb_container->get('text_formatter.renderer'); -	// Parse bbcode if bbcode uid stored and bbcode enabled -	if ($uid && ($flags & OPTION_FLAG_BBCODE)) -	{ -		if (!class_exists('bbcode')) +		// Temporarily switch off viewcensors if applicable +		$old_censor = $renderer->get_viewcensors(); +		if ($old_censor !== $censor_text)  		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/bbcode.' . $phpEx); +			$renderer->set_viewcensors($censor_text);  		} -		if (empty($bbcode)) +		$text = $renderer->render($text); + +		// Restore the previous value +		if ($old_censor !== $censor_text)  		{ -			$bbcode = new bbcode($bitfield); +			$renderer->set_viewcensors($old_censor);  		} -		else +	} +	else +	{ +		if ($censor_text)  		{ -			$bbcode->bbcode($bitfield); +			$text = censor_text($text);  		} -		$bbcode->bbcode_second_pass($text, $uid); -	} +		// Parse bbcode if bbcode uid stored and bbcode enabled +		if ($uid && ($flags & OPTION_FLAG_BBCODE)) +		{ +			if (!class_exists('bbcode')) +			{ +				global $phpbb_root_path, $phpEx; +				include($phpbb_root_path . 'includes/bbcode.' . $phpEx); +			} + +			if (empty($bbcode)) +			{ +				$bbcode = new bbcode($bitfield); +			} +			else +			{ +				$bbcode->bbcode($bitfield); +			} -	$text = bbcode_nl2br($text); -	$text = smiley_text($text, !($flags & OPTION_FLAG_SMILIES)); +			$bbcode->bbcode_second_pass($text, $uid); +		} + +		$text = bbcode_nl2br($text); +		$text = smiley_text($text, !($flags & OPTION_FLAG_SMILIES)); +	}  	/**  	* Use this event to modify the text after it is parsed @@ -507,7 +551,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text  /**  * For parsing custom parsed text to be stored within the database.  * This function additionally returns the uid and bitfield that needs to be stored. -* Expects $text to be the value directly from request_var() and in it's non-parsed form +* Expects $text to be the value directly from $request->variable() and in it's non-parsed form  *  * @param string $text The text to be replaced with the parsed one  * @param string $uid The BBCode uid for this parse @@ -516,10 +560,14 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text  * @param bool $allow_bbcode If BBCode is allowed (i.e. if BBCode is parsed)  * @param bool $allow_urls If urls is allowed  * @param bool $allow_smilies If smilies are allowed +* @param bool $allow_img_bbcode +* @param bool $allow_flash_bbcode +* @param bool $allow_quote_bbcode +* @param bool $allow_url_bbcode  *  * @return array	An array of string with the errors that occurred while parsing  */ -function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bbcode = false, $allow_urls = false, $allow_smilies = false) +function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bbcode = false, $allow_urls = false, $allow_smilies = false, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true)  {  	global $phpbb_root_path, $phpEx, $phpbb_dispatcher; @@ -534,6 +582,10 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb  	* @var bool		allow_bbcode	Whether or not to parse BBCode  	* @var bool		allow_urls		Whether or not to parse URLs  	* @var bool		allow_smilies	Whether or not to parse Smilies +	* @var bool		allow_img_bbcode	Whether or not to parse the [img] BBCode +	* @var bool		allow_flash_bbcode	Whether or not to parse the [flash] BBCode +	* @var bool		allow_quote_bbcode	Whether or not to parse the [quote] BBCode +	* @var bool		allow_url_bbcode	Whether or not to parse the [url] BBCode  	* @since 3.1.0-a1  	*/  	$vars = array( @@ -544,24 +596,23 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb  		'allow_bbcode',  		'allow_urls',  		'allow_smilies', +		'allow_img_bbcode', +		'allow_flash_bbcode', +		'allow_quote_bbcode', +		'allow_url_bbcode',  	);  	extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_before', compact($vars)));  	$uid = $bitfield = '';  	$flags = (($allow_bbcode) ? OPTION_FLAG_BBCODE : 0) + (($allow_smilies) ? OPTION_FLAG_SMILIES : 0) + (($allow_urls) ? OPTION_FLAG_LINKS : 0); -	if ($text === '') -	{ -		return; -	} -  	if (!class_exists('parse_message'))  	{  		include($phpbb_root_path . 'includes/message_parser.' . $phpEx);  	}  	$message_parser = new parse_message($text); -	$message_parser->parse($allow_bbcode, $allow_urls, $allow_smilies); +	$message_parser->parse($allow_bbcode, $allow_urls, $allow_smilies, $allow_img_bbcode, $allow_flash_bbcode, $allow_quote_bbcode, $allow_url_bbcode);  	$text = $message_parser->message;  	$uid = $message_parser->bbcode_uid; diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php index b380273f0c..0a25ae8c36 100644 --- a/phpBB/includes/functions_convert.php +++ b/phpBB/includes/functions_convert.php @@ -1312,7 +1312,7 @@ function restore_config($schema)  				$config_value = truncate_string(utf8_htmlspecialchars($config_value), 255, 255, false);  			} -			set_config($config_name, $config_value); +			$config->set($config_name, $config_value);  		}  	}  } @@ -1968,9 +1968,9 @@ function update_dynamic_config()  	if ($row)  	{ -		set_config('newest_user_id', $row['user_id'], true); -		set_config('newest_username', $row['username'], true); -		set_config('newest_user_colour', $row['user_colour'], true); +		$config->set('newest_user_id', $row['user_id'], false); +		$config->set('newest_username', $row['username'], false); +		$config->set('newest_user_colour', $row['user_colour'], false);  	}  //	Also do not reset record online user/date. There will be old data or the fresh data from the schema. @@ -1984,7 +1984,7 @@ function update_dynamic_config()  	$row = $db->sql_fetchrow($result);  	$db->sql_freeresult($result); -	set_config('num_posts', (int) $row['stat'], true); +	$config->set('num_posts', (int) $row['stat'], false);  	$sql = 'SELECT COUNT(topic_id) AS stat  		FROM ' . TOPICS_TABLE . ' @@ -1993,7 +1993,7 @@ function update_dynamic_config()  	$row = $db->sql_fetchrow($result);  	$db->sql_freeresult($result); -	set_config('num_topics', (int) $row['stat'], true); +	$config->set('num_topics', (int) $row['stat'], false);  	$sql = 'SELECT COUNT(user_id) AS stat  		FROM ' . USERS_TABLE . ' @@ -2002,20 +2002,20 @@ function update_dynamic_config()  	$row = $db->sql_fetchrow($result);  	$db->sql_freeresult($result); -	set_config('num_users', (int) $row['stat'], true); +	$config->set('num_users', (int) $row['stat'], false);  	$sql = 'SELECT COUNT(attach_id) as stat  		FROM ' . ATTACHMENTS_TABLE . '  		WHERE is_orphan = 0';  	$result = $db->sql_query($sql); -	set_config('num_files', (int) $db->sql_fetchfield('stat'), true); +	$config->set('num_files', (int) $db->sql_fetchfield('stat'), false);  	$db->sql_freeresult($result);  	$sql = 'SELECT SUM(filesize) as stat  		FROM ' . ATTACHMENTS_TABLE . '  		WHERE is_orphan = 0';  	$result = $db->sql_query($sql); -	set_config('upload_dir_size', (float) $db->sql_fetchfield('stat'), true); +	$config->set('upload_dir_size', (float) $db->sql_fetchfield('stat'), false);  	$db->sql_freeresult($result);  	/** @@ -2316,7 +2316,10 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals  function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $source_relative_path = true)  { -	global $convert, $phpbb_root_path, $config, $user, $db; +	global $convert, $phpbb_root_path, $config, $user, $db, $phpbb_filesystem; + +	/** @var \phpbb\filesystem\filesystem_interface $filesystem */ +	$filesystem = $phpbb_filesystem;  	if (substr($trg, -1) == '/')  	{ @@ -2349,7 +2352,7 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour  		}  	} -	if (!phpbb_is_writable($path)) +	if (!$filesystem->is_writable($path))  	{  		@chmod($path, 0777);  	} @@ -2370,7 +2373,10 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour  function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_failure = true, $source_relative_path = true)  { -	global $convert, $phpbb_root_path, $config, $user, $db; +	global $convert, $phpbb_root_path, $config, $user, $db, $phpbb_filesystem; + +	/** @var \phpbb\filesystem\filesystem_interface $filesystem */ +	$filesystem = $phpbb_filesystem;  	$dirlist = $filelist = $bad_dirs = array();  	$src = path($src, $source_relative_path); @@ -2384,7 +2390,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_  		@chmod($trg_path, 0777);  	} -	if (!phpbb_is_writable($trg_path)) +	if (!$filesystem->is_writable($trg_path))  	{  		$bad_dirs[] = path($config['script_path']) . $trg;  	} @@ -2451,7 +2457,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_  				@chmod($trg_path . $dir, 0777);  			} -			if (!phpbb_is_writable($trg_path . $dir)) +			if (!$filesystem->is_writable($trg_path . $dir))  			{  				$bad_dirs[] = $trg . $dir;  				$bad_dirs[] = $trg_path . $dir; diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 8aee80ba34..3a96119dbe 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -33,7 +33,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod  	$sql_from = '';  	// Mark forums read? -	$mark_read = request_var('mark', ''); +	$mark_read = $request->variable('mark', '');  	if ($mark_read == 'all')  	{ @@ -61,9 +61,9 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod  		$redirect = build_url(array('mark', 'hash', 'mark_time'));  		meta_refresh(3, $redirect); -		if (check_link_hash(request_var('hash', ''), 'global')) +		if (check_link_hash($request->variable('hash', ''), 'global'))  		{ -			markread('all', false, false, request_var('mark_time', 0)); +			markread('all', false, false, $request->variable('mark_time', 0));  			if ($request->is_ajax())  			{ @@ -153,6 +153,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod  	$forum_tracking_info = $valid_categories = array();  	$branch_root_id = $root_data['forum_id']; +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	while ($row = $db->sql_fetchrow($result)) @@ -341,10 +342,10 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod  	if ($mark_read == 'forums')  	{  		$redirect = build_url(array('mark', 'hash', 'mark_time')); -		$token = request_var('hash', ''); +		$token = $request->variable('hash', '');  		if (check_link_hash($token, 'global'))  		{ -			markread('topics', $forum_ids, false, request_var('mark_time', 0)); +			markread('topics', $forum_ids, false, $request->variable('mark_time', 0));  			$message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');  			meta_refresh(3, $redirect); @@ -1143,33 +1144,14 @@ function display_custom_bbcodes()  /**  * Display reasons +* +* @deprecated 3.2.0-dev  */  function display_reasons($reason_id = 0)  { -	global $db, $user, $template; - -	$sql = 'SELECT * -		FROM ' . REPORTS_REASONS_TABLE . ' -		ORDER BY reason_order ASC'; -	$result = $db->sql_query($sql); +	global $phpbb_container; -	while ($row = $db->sql_fetchrow($result)) -	{ -		// If the reason is defined within the language file, we will use the localized version, else just use the database entry... -		if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])])) -		{ -			$row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]; -			$row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]; -		} - -		$template->assign_block_vars('reason', array( -			'ID'			=> $row['reason_id'], -			'TITLE'			=> $row['reason_title'], -			'DESCRIPTION'	=> $row['reason_description'], -			'S_SELECTED'	=> ($row['reason_id'] == $reason_id) ? true : false) -		); -	} -	$db->sql_freeresult($result); +	$phpbb_container->get('phpbb.report.report_reason_list_provider')->display_reasons($reason_id);  }  /** @@ -1203,6 +1185,7 @@ function display_user_activity(&$userdata)  	$active_f_row = $active_t_row = array();  	if (!empty($forum_ary))  	{ +		/* @var $phpbb_content_visibility \phpbb\content_visibility */  		$phpbb_content_visibility = $phpbb_container->get('content.visibility');  		// Obtain active forum @@ -1334,8 +1317,8 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,  		{  			if (isset($_GET['unwatch']))  			{ -				$uid = request_var('uid', 0); -				$token = request_var('hash', ''); +				$uid = $request->variable('uid', 0); +				$token = $request->variable('hash', '');  				if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))  				{ @@ -1408,8 +1391,8 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,  		{  			if (isset($_GET['watch']))  			{ -				$uid = request_var('uid', 0); -				$token = request_var('hash', ''); +				$uid = $request->variable('uid', 0); +				$token = $request->variable('hash', '');  				if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))  				{ diff --git a/phpBB/includes/functions_download.php b/phpBB/includes/functions_download.php index 254e65ae3d..6aabfdf641 100644 --- a/phpBB/includes/functions_download.php +++ b/phpBB/includes/functions_download.php @@ -123,7 +123,7 @@ function wrap_img_in_html($src, $title)  */  function send_file_to_browser($attachment, $upload_dir, $category)  { -	global $user, $db, $config, $phpbb_root_path; +	global $user, $db, $config, $phpbb_root_path, $request;  	$filename = $phpbb_root_path . $upload_dir . '/' . $attachment['physical_filename']; @@ -185,7 +185,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)  		header('X-Content-Type-Options: nosniff');  	} -	if ($category == ATTACHMENT_CATEGORY_FLASH && request_var('view', 0) === 1) +	if ($category == ATTACHMENT_CATEGORY_FLASH && $request->variable('view', 0) === 1)  	{  		// We use content-disposition: inline for flash files and view=1 to let it correctly play with flash player 10 - any other disposition will fail to play inline  		header('Content-Disposition: inline'); diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 28cc603bdb..d9d073e984 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -182,18 +182,6 @@ function dbms_select($default = '', $only_20x_options = false)  }  /** -* Get tables of a database -* -* @deprecated -*/ -function get_tables(&$db) -{ -	$db_tools = new \phpbb\db\tools($db); - -	return $db_tools->sql_list_tables(); -} - -/**  * Used to test whether we are able to connect to the database the user has specified  * and identify any problems (eg there are already tables with the names we want to use  * @param	array	$dbms should be of the format of an element of the array returned by {@link get_available_dbms get_available_dbms()} @@ -201,7 +189,7 @@ function get_tables(&$db)  */  function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport, $prefix_may_exist = false, $load_dbal = true, $unicode_check = true)  { -	global $phpbb_root_path, $phpEx, $config, $lang; +	global $phpbb_root_path, $phpEx, $config, $lang, $phpbb_filesystem;  	$dbms = $dbms_details['DRIVER']; @@ -217,7 +205,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,  	}  	// Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea -	if (($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' || $dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite3') && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0) +	if (($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' || $dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite3') && stripos($phpbb_filesystem->realpath($dbhost), $phpbb_filesystem->realpath('../')) === 0)  	{  		$error[] = $lang['INST_ERR_DB_FORUM_PATH'];  		return false; @@ -276,7 +264,9 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,  			$temp_prefix = strtolower($table_prefix);  			$table_ary = array($temp_prefix . 'attachments', $temp_prefix . 'config', $temp_prefix . 'sessions', $temp_prefix . 'topics', $temp_prefix . 'users'); -			$tables = get_tables($db); +			$db_tools_factory = new \phpbb\db\tools\factory(); +			$db_tools = $db_tools_factory->get($db); +			$tables = $db_tools->sql_list_tables();  			$tables = array_map('strtolower', $tables);  			$table_intersect = array_intersect($tables, $table_ary); @@ -451,13 +441,17 @@ function phpbb_create_config_file_data($data, $dbms, $debug = false, $debug_cont  	$config_data .= "\n@define('PHPBB_INSTALLED', true);\n";  	$config_data .= "// @define('PHPBB_DISPLAY_LOAD_TIME', true);\n"; -	if ($debug) +	if ($debug_test) +	{ +		$config_data .= "@define('PHPBB_ENVIRONMENT', 'test');\n"; +	} +	else if ($debug)  	{ -		$config_data .= "@define('DEBUG', true);\n"; +		$config_data .= "@define('PHPBB_ENVIRONMENT', 'development');\n";  	}  	else  	{ -		$config_data .= "// @define('DEBUG', true);\n"; +		$config_data .= "@define('PHPBB_ENVIRONMENT', 'production');\n";  	}  	if ($debug_container) @@ -472,6 +466,7 @@ function phpbb_create_config_file_data($data, $dbms, $debug = false, $debug_cont  	if ($debug_test)  	{  		$config_data .= "@define('DEBUG_TEST', true);\n"; +		$config_data .= "@define('DEBUG', true);\n"; // Mandatory for the functional tests, will be removed by PHPBB3-12623  	}  	return $config_data; diff --git a/phpBB/includes/functions_jabber.php b/phpBB/includes/functions_jabber.php index bd2e9e93ac..a38888a861 100644 --- a/phpBB/includes/functions_jabber.php +++ b/phpBB/includes/functions_jabber.php @@ -87,8 +87,7 @@ class jabber  	*/  	static public function can_use_ssl()  	{ -		// Will not work with PHP >= 5.2.1 or < 5.2.3RC2 until timeout problem with ssl hasn't been fixed (http://bugs.php.net/41236) -		return ((version_compare(PHP_VERSION, '5.2.1', '<') || version_compare(PHP_VERSION, '5.2.3RC2', '>=')) && @extension_loaded('openssl')) ? true : false; +		return @extension_loaded('openssl');  	}  	/** diff --git a/phpBB/includes/functions_mcp.php b/phpBB/includes/functions_mcp.php index ed96dcf338..46e85c5674 100644 --- a/phpBB/includes/functions_mcp.php +++ b/phpBB/includes/functions_mcp.php @@ -301,6 +301,7 @@ function phpbb_get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking =  		WHERE " . $db->sql_in_set('f.forum_id', $forum_id);  	$result = $db->sql_query($sql); +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	while ($row = $db->sql_fetchrow($result)) @@ -368,9 +369,9 @@ function phpbb_get_pm_data($pm_ids)  */  function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by_sql, &$sort_order_sql, &$total, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')  { -	global $db, $user, $auth, $template, $phpbb_dispatcher; +	global $db, $user, $auth, $template, $request, $phpbb_dispatcher; -	$sort_days = request_var('st', 0); +	$sort_days = $request->variable('st', 0);  	$min_time = ($sort_days) ? time() - ($sort_days * 86400) : 0;  	switch ($mode) @@ -511,8 +512,8 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by  			break;  	} -	$sort_key = request_var('sk', $default_key); -	$sort_dir = request_var('sd', $default_dir); +	$sort_key = $request->variable('sk', $default_key); +	$sort_dir = $request->variable('sd', $default_dir);  	$sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);  	switch ($type) diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index fbac3e6f1d..6abfb40b01 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -33,8 +33,6 @@ class messenger  	/** @var \phpbb\template\template */  	protected $template; -	var $eol = "\n"; -  	/**  	* Constructor  	*/ @@ -44,10 +42,6 @@ class messenger  		$this->use_queue = (!$config['email_package_size']) ? false : $use_queue;  		$this->subject = ''; - -		// Determine EOL character (\n for UNIX, \r\n for Windows and \r for Mac) -		$this->eol = (!defined('PHP_EOL')) ? (($eol = strtolower(substr(PHP_OS, 0, 3))) == 'win') ? "\r\n" : (($eol == 'mac') ? "\r" : "\n") : PHP_EOL; -		$this->eol = (!$this->eol) ? "\n" : $this->eol;  	}  	/** @@ -355,7 +349,7 @@ class messenger  	*/  	function error($type, $msg)  	{ -		global $user, $phpEx, $phpbb_root_path, $config, $request; +		global $user, $phpEx, $phpbb_root_path, $config, $request, $phpbb_log;  		// Session doesn't exist, create it  		if (!isset($user->session_id) || $user->session_id === '') @@ -378,7 +372,7 @@ class messenger  		}  		$message .= '<br /><em>' . htmlspecialchars($calling_page) . '</em><br /><br />' . $msg . '<br />'; -		add_log('critical', 'LOG_ERROR_' . $type, $message); +		$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_ERROR_' . $type, false, array($message));  	}  	/** @@ -497,7 +491,7 @@ class messenger  			$this->from = $board_contact;  		} -		$encode_eol = ($config['smtp_delivery']) ? "\r\n" : $this->eol; +		$encode_eol = ($config['smtp_delivery']) ? "\r\n" : PHP_EOL;  		// Build to, cc and bcc strings  		$to = $cc = $bcc = ''; @@ -529,7 +523,7 @@ class messenger  			}  			else  			{ -				$result = phpbb_mail($mail_to, $this->subject, $this->msg, $headers, $this->eol, $err_msg); +				$result = phpbb_mail($mail_to, $this->subject, $this->msg, $headers, PHP_EOL, $err_msg);  			}  			if (!$result) @@ -629,14 +623,33 @@ class messenger  	*/  	protected function setup_template()  	{ -		global $config, $phpbb_path_helper, $user, $phpbb_extension_manager; +		global $config, $phpbb_path_helper, $user, $phpbb_extension_manager, $phpbb_container, $phpbb_filesystem;  		if ($this->template instanceof \phpbb\template\template)  		{  			return;  		} -		$this->template = new \phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new \phpbb\template\context(), $phpbb_extension_manager); +		$this->template = new \phpbb\template\twig\twig( +			$phpbb_container->get('path_helper'), +			$phpbb_container->get('config'), +			new \phpbb\template\context(), +			new \phpbb\template\twig\environment( +				$phpbb_container->get('config'), +				$phpbb_container->get('filesystem'), +				$phpbb_container->get('path_helper'), +				$phpbb_container, +				$phpbb_container->getParameter('core.root_path') . 'cache/', +				$phpbb_container->get('ext.manager'), +				new \phpbb\template\twig\loader( +					$phpbb_filesystem +				) +			), +			$phpbb_container->getParameter('core.root_path') . 'cache/', +			$phpbb_container->get('user'), +			$phpbb_container->get('template.twig.extensions.collection'), +			$phpbb_extension_manager +		);  	}  	/** @@ -662,18 +675,20 @@ class queue  	var $eol = "\n";  	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/**  	* constructor  	*/  	function queue()  	{ -		global $phpEx, $phpbb_root_path; +		global $phpEx, $phpbb_root_path, $phpbb_filesystem;  		$this->data = array();  		$this->cache_file = "{$phpbb_root_path}cache/queue.$phpEx"; - -		// Determine EOL character (\n for UNIX, \r\n for Windows and \r for Mac) -		$this->eol = (!defined('PHP_EOL')) ? (($eol = strtolower(substr(PHP_OS, 0, 3))) == 'win') ? "\r\n" : (($eol == 'mac') ? "\r" : "\n") : PHP_EOL; -		$this->eol = (!$this->eol) ? "\n" : $this->eol; +		$this->filesystem = $phpbb_filesystem;  	}  	/** @@ -711,14 +726,14 @@ class queue  		{  			if (!$have_cache_file)  			{ -				set_config('last_queue_run', time(), true); +				$config->set('last_queue_run', time(), false);  			}  			$lock->release();  			return;  		} -		set_config('last_queue_run', time(), true); +		$config->set('last_queue_run', time(), false);  		include($this->cache_file); @@ -806,7 +821,7 @@ class queue  						}  						else  						{ -							$result = phpbb_mail($to, $subject, $msg, $headers, $this->eol, $err_msg); +							$result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg);  						}  						if (!$result) @@ -859,7 +874,14 @@ class queue  				fwrite($fp, "<?php\nif (!defined('IN_PHPBB')) exit;\n\$this->queue_data = unserialize(" . var_export(serialize($this->queue_data), true) . ");\n\n?>");  				fclose($fp); -				phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE); +				try +				{ +					$this->filesystem->phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE); +				} +				catch (\phpbb\filesystem\exception\filesystem_exception $e) +				{ +					// Do nothing +				}  			}  		} @@ -901,7 +923,14 @@ class queue  			fwrite($fp, "<?php\nif (!defined('IN_PHPBB')) exit;\n\$this->queue_data = unserialize(" . var_export(serialize($this->data), true) . ");\n\n?>");  			fclose($fp); -			phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE); +			try +			{ +				$this->filesystem->phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE); +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing +			}  		}  		$lock->release(); diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php index 90d59cfd1e..144e6b4e7c 100644 --- a/phpBB/includes/functions_module.php +++ b/phpBB/includes/functions_module.php @@ -480,13 +480,15 @@ class p_master  	*/  	function set_active($id = false, $mode = false)  	{ +		global $request; +  		$icat = false;  		$this->active_module = false; -		if (request_var('icat', '')) +		if ($request->variable('icat', ''))  		{  			$icat = $id; -			$id = request_var('icat', ''); +			$id = $request->variable('icat', '');  		}  		// Restore the backslashes in class names @@ -553,10 +555,10 @@ class p_master  	*/  	function load_active($mode = false, $module_url = false, $execute_module = true)  	{ -		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template; +		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template, $request;  		$module_path = $this->include_path . $this->p_class; -		$icat = request_var('icat', ''); +		$icat = $request->variable('icat', '');  		if ($this->active_module === false)  		{ diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index ca8baecff8..e4520d7f03 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -24,12 +24,13 @@ if (!defined('IN_PHPBB'))  */  function generate_smilies($mode, $forum_id)  { -	global $db, $user, $config, $template, $phpbb_dispatcher; +	global $db, $user, $config, $template, $phpbb_dispatcher, $request;  	global $phpEx, $phpbb_root_path, $phpbb_container, $phpbb_path_helper; -	$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&f=' . $forum_id); +	/* @var $pagination \phpbb\pagination */  	$pagination = $phpbb_container->get('pagination'); -	$start = request_var('start', 0); +	$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&f=' . $forum_id); +	$start = $request->variable('start', 0);  	if ($mode == 'window')  	{ @@ -336,18 +337,15 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  	$toggle = false;  	$topic_types = array( -		'sticky'	=> array('const' => POST_STICKY, 'lang' => 'POST_STICKY'), -		'announce'	=> array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'), -		'global'	=> array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL') +		'sticky'			=> array('const' => POST_STICKY, 'lang' => 'POST_STICKY'), +		'announce'			=> array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'), +		'announce_global'	=> array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL')  	);  	$topic_type_array = array();  	foreach ($topic_types as $auth_key => $topic_value)  	{ -		// We do not have a special post global announcement permission -		$auth_key = ($auth_key == 'global') ? 'announce' : $auth_key; -  		if ($auth->acl_get('f_' . $auth_key, $forum_id))  		{  			$toggle = true; @@ -377,8 +375,8 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  		$template->assign_vars(array(  			'S_TOPIC_TYPE_STICKY'	=> ($auth->acl_get('f_sticky', $forum_id)), -			'S_TOPIC_TYPE_ANNOUNCE'	=> ($auth->acl_get('f_announce', $forum_id))) -		); +			'S_TOPIC_TYPE_ANNOUNCE'	=> ($auth->acl_gets('f_announce', 'f_announce_global', $forum_id)), +		));  	}  	return $toggle; @@ -406,14 +404,14 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)  {  	global $auth, $user, $config, $db, $cache; -	global $phpbb_root_path, $phpEx, $phpbb_dispatcher; +	global $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_filesystem;  	$filedata = array(  		'error'	=> array()  	);  	include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx); -	$upload = new fileupload(); +	$upload = new fileupload($phpbb_filesystem);  	if ($config['check_attachment_content'] && isset($config['mime_triggers']))  	{ @@ -667,7 +665,7 @@ function get_supported_image_types($type = false)  */  function create_thumbnail($source, $destination, $mimetype)  { -	global $config; +	global $config, $phpbb_filesystem;  	$min_filesize = (int) $config['img_min_thumb_filesize'];  	$img_filesize = (file_exists($source)) ? @filesize($source) : false; @@ -819,7 +817,14 @@ function create_thumbnail($source, $destination, $mimetype)  		return false;  	} -	phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE); +	try +	{ +		$phpbb_filesystem->phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE); +	} +	catch (\phpbb\filesystem\exception\filesystem_exception $e) +	{ +		// Do nothing +	}  	return true;  } @@ -1039,6 +1044,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  	global $user, $auth, $db, $template, $cache;  	global $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher; +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	$sql_sort = ($mode == 'post_review') ? 'ASC' : 'DESC'; @@ -1184,6 +1190,8 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  			'MESSAGE'			=> $message,  			'DECODED_MESSAGE'	=> $decoded_message,  			'POST_ID'			=> $row['post_id'], +			'POST_TIME'			=> $row['post_time'], +			'USER_ID'			=> $row['user_id'],  			'U_MINI_POST'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],  			'U_MCP_DETAILS'		=> ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&mode=post_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',  			'POSTER_QUOTE'		=> ($show_quote_button && $auth->acl_get('f_reply', $forum_id)) ? addslashes(get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '', @@ -1295,6 +1303,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  		$db->sql_freeresult($result);  	} +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	// (Soft) delete the post @@ -1508,7 +1517,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  */  function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true)  { -	global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher; +	global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $phpbb_log, $request;  	/**  	* Modify the data for post submitting @@ -1688,7 +1697,13 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			if ($user->data['user_id'] != $poster_id)  			{  				$log_subject = ($subject) ? $subject : $data['topic_title']; -				add_log('mod', $data['forum_id'], $data['topic_id'], 'LOG_POST_EDITED', $log_subject, (!empty($username)) ? $username : $user->lang['GUEST'], $data['post_edit_reason']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_POST_EDITED', false, array( +					'forum_id' => $data['forum_id'], +					'topic_id' => $data['topic_id'], +					$log_subject, +					(!empty($username)) ? $username : $user->lang['GUEST'], +					$data['post_edit_reason'] +				));  			}  			if (!isset($sql_data[POSTS_TABLE]['sql'])) @@ -1927,9 +1942,9 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		{  			if ($post_mode == 'post')  			{ -				set_config_count('num_topics', 1, true); +				$config->increment('num_topics', 1, false);  			} -			set_config_count('num_posts', 1, true); +			$config->increment('num_posts', 1, false);  			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data['post_id'];  			$sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'"; @@ -2102,8 +2117,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		if ($space_taken && $files_added)  		{ -			set_config_count('upload_dir_size', $space_taken, true); -			set_config_count('num_files', $files_added, true); +			$config->increment('upload_dir_size', $space_taken, false); +			$config->increment('num_files', $files_added, false);  		}  	} @@ -2121,6 +2136,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		$is_starter = ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED);  		$is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED); +		/* @var $phpbb_content_visibility \phpbb\content_visibility */  		$phpbb_content_visibility = $phpbb_container->get('content.visibility');  		$phpbb_content_visibility->set_post_visibility($post_visibility, $data['post_id'], $data['topic_id'], $data['forum_id'], $user->data['user_id'], time(), '', $is_starter, $is_latest);  	} @@ -2196,7 +2212,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	$db->sql_transaction('commit');  	// Delete draft if post was loaded... -	$draft_id = request_var('draft_loaded', 0); +	$draft_id = $request->variable('draft_loaded', 0);  	if ($draft_id)  	{  		$sql = 'DELETE FROM ' . DRAFTS_TABLE . " @@ -2299,6 +2315,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		'post_subject'		=> $subject,  	)); +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	if ($post_visibility == ITEM_APPROVED) @@ -2477,7 +2494,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  */  function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)  { -	global $config, $db, $user, $phpEx, $phpbb_root_path; +	global $config, $db, $user, $phpEx, $phpbb_root_path, $phpbb_log;  	if ($bump_time === false)  	{ @@ -2556,7 +2573,11 @@ function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)  		update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_time, false);  	} -	add_log('mod', $forum_id, $topic_id, 'LOG_BUMP_TOPIC', $post_data['topic_title']); +	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_BUMP_TOPIC', false, array( +		'forum_id' => $forum_id, +		'topic_id' => $topic_id, +		$post_data['topic_title'] +	));  	$url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&p={$post_data['topic_last_post_id']}") . "#p{$post_data['topic_last_post_id']}"; @@ -2594,7 +2615,7 @@ function phpbb_upload_popup($forum_style = 0)  function phpbb_handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft = false, $delete_reason = '')  {  	global $user, $auth, $config, $request; -	global $phpbb_root_path, $phpEx; +	global $phpbb_root_path, $phpEx, $phpbb_log;  	$perm_check = ($is_soft) ? 'softdelete' : 'delete'; @@ -2629,14 +2650,26 @@ function phpbb_handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $  			if ($next_post_id === false)  			{ -				add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), $post_data['topic_title'], $post_username, $delete_reason); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), false, array( +					'forum_id' => $forum_id, +					'topic_id' => $topic_id, +					$post_data['topic_title'], +					$post_username, +					$delete_reason +				));  				$meta_info = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id");  				$message = $user->lang['POST_DELETED'];  			}  			else  			{ -				add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), $post_data['post_subject'], $post_username, $delete_reason); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), false, array( +					'forum_id' => $forum_id, +					'topic_id' => $topic_id, +					$post_data['post_subject'], +					$post_username, +					$delete_reason +				));  				$meta_info = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&p=$next_post_id") . "#p$next_post_id";  				$message = $user->lang['POST_DELETED']; diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 8e1561b842..c8c2670986 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -881,9 +881,10 @@ function update_unread_status($unread, $msg_id, $user_id, $folder_id)  	global $db, $user, $phpbb_container; +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager'); -	$phpbb_notifications->mark_notifications_read('notification.type.pm', $msg_id, $user_id); +	$phpbb_notifications->mark_notifications('notification.type.pm', $msg_id, $user_id);  	$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . "  		SET pm_unread = 0 @@ -937,10 +938,10 @@ function mark_folder_read($user_id, $folder_id)  */  function handle_mark_actions($user_id, $mark_action)  { -	global $db, $user, $phpbb_root_path, $phpEx; +	global $db, $user, $phpbb_root_path, $phpEx, $request; -	$msg_ids		= request_var('marked_msg_id', array(0)); -	$cur_folder_id	= request_var('cur_folder_id', PRIVMSGS_NO_BOX); +	$msg_ids		= $request->variable('marked_msg_id', array(0)); +	$cur_folder_id	= $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);  	$confirm		= (isset($_POST['confirm'])) ? true : false;  	if (!sizeof($msg_ids)) @@ -1130,6 +1131,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)  		$user->data['user_unread_privmsg'] -= $num_unread;  	} +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	$phpbb_notifications->delete_notifications('notification.type.pm', array_keys($delete_rows)); @@ -1243,6 +1245,7 @@ function phpbb_delete_users_pms($user_ids)  	$db->sql_transaction('begin'); +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	if (!empty($undelivered_msg)) @@ -1608,7 +1611,7 @@ function get_folder_status($folder_id, $folder)  */  function submit_pm($mode, $subject, &$data, $put_in_outbox = true)  { -	global $db, $auth, $config, $phpEx, $template, $user, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher; +	global $db, $auth, $config, $phpEx, $template, $user, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $request;  	// We do not handle erasing pms here  	if ($mode == 'delete') @@ -1902,13 +1905,13 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)  		if ($space_taken && $files_added)  		{ -			set_config_count('upload_dir_size', $space_taken, true); -			set_config_count('num_files', $files_added, true); +			$config->increment('upload_dir_size', $space_taken, false); +			$config->increment('num_files', $files_added, false);  		}  	}  	// Delete draft if post was loaded... -	$draft_id = request_var('draft_loaded', 0); +	$draft_id = $request->variable('draft_loaded', 0);  	if ($draft_id)  	{  		$sql = 'DELETE FROM ' . DRAFTS_TABLE . " @@ -1925,6 +1928,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)  		'recipients'			=> $recipients,  	)); +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	if ($mode == 'edit') @@ -2096,6 +2100,8 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode  			'S_IN_POST_MODE'	=> $in_post_mode,  			'MSG_ID'			=> $row['msg_id'], +			'MESSAGE_TIME'		=> $row['message_time'], +			'USER_ID'			=> $row['user_id'],  			'U_VIEW_MESSAGE'	=> "$url&f=$folder_id&p=" . $row['msg_id'],  			'U_QUOTE'			=> (!$in_post_mode && $auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&mode=compose&action=quote&f=" . $folder_id . "&p=" . $row['msg_id'] : '',  			'U_POST_REPLY_PM'	=> ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&mode=compose&action=reply&f=$folder_id&p=" . $row['msg_id'] : '') @@ -2123,17 +2129,42 @@ function set_user_message_limit()  {  	global $user, $db, $config; -	// Get maximum about from user memberships - if it is 0, there is no limit set and we use the maximum value within the config. -	$sql = 'SELECT MAX(g.group_message_limit) as max_message_limit +	// Get maximum about from user memberships +	$message_limit = phpbb_get_max_setting_from_group($db, $user->data['user_id'], 'message_limit'); + +	// If it is 0, there is no limit set and we use the maximum value within the config. +	$user->data['message_limit'] = (!$message_limit) ? $config['pm_max_msgs'] : $message_limit; +} + +/** + * Get the maximum PM setting for the groups of the user + * + * @param \phpbb\db\driver\driver_interface $db + * @param int $user_id + * @param string $setting Only 'max_recipients' and 'message_limit' are supported + * @return int The maximum setting for all groups of the user, unless one group has '0' + * @throws \InvalidArgumentException If selected group setting is not supported + */ +function phpbb_get_max_setting_from_group(\phpbb\db\driver\driver_interface $db, $user_id, $setting) +{ +	if ($setting !== 'max_recipients' && $setting !== 'message_limit') +	{ +		throw new InvalidArgumentException('Setting "' . $setting . '" is not supported'); +	} + +	// Get maximum number of allowed recipients +	$sql = 'SELECT MIN(g.group_' . $setting . ') as min_setting, MAX(g.group_' . $setting . ') as max_setting  		FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug -		WHERE ug.user_id = ' . $user->data['user_id'] . ' +		WHERE ug.user_id = ' . (int) $user_id . '  			AND ug.user_pending = 0  			AND ug.group_id = g.group_id';  	$result = $db->sql_query($sql); -	$message_limit = (int) $db->sql_fetchfield('max_message_limit'); +	$row = $db->sql_fetchrow($result);  	$db->sql_freeresult($result); +	$max_setting = (int) $row['max_setting']; +	$min_setting = (int) $row['min_setting']; -	$user->data['message_limit'] = (!$message_limit) ? $config['pm_max_msgs'] : $message_limit; +	return ($min_setting > 0) ? $max_setting : 0;  }  /** diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php index 89bc31fa25..dcc9bc4874 100644 --- a/phpBB/includes/functions_upload.php +++ b/phpBB/includes/functions_upload.php @@ -47,6 +47,11 @@ class filespec  	var $upload = '';  	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/**  	 * The plupload object  	 * @var \phpbb\plupload\plupload  	 */ @@ -62,7 +67,7 @@ class filespec  	* File Class  	* @access private  	*/ -	function filespec($upload_ary, $upload_namespace, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null) +	function filespec($upload_ary, $upload_namespace, \phpbb\filesystem\filesystem_interface $phpbb_filesystem, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)  	{  		if (!isset($upload_ary))  		{ @@ -97,6 +102,7 @@ class filespec  		$this->upload = $upload_namespace;  		$this->plupload = $plupload;  		$this->mimetype_guesser = $mimetype_guesser; +		$this->filesystem = $phpbb_filesystem;  	}  	/** @@ -376,7 +382,14 @@ class filespec  				return false;  			} -			phpbb_chmod($this->destination_file, $chmod); +			try +			{ +				$this->filesystem->phpbb_chmod($this->destination_file, $chmod); +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing +			}  		}  		// Try to get real filesize from destination folder @@ -389,28 +402,28 @@ class filespec  		{  			$this->width = $this->height = 0; -			if (($this->image_info = @getimagesize($this->destination_file)) !== false) -			{ -				$this->width = $this->image_info[0]; -				$this->height = $this->image_info[1]; +			// Get imagesize class +			$imagesize = new \fastImageSize\fastImageSize(); -				if (!empty($this->image_info['mime'])) -				{ -					$this->mimetype = $this->image_info['mime']; -				} +			$this->image_info = $imagesize->getImageSize($this->destination_file, $this->mimetype); + +			if ($this->image_info !== false) +			{ +				$this->width = $this->image_info['width']; +				$this->height = $this->image_info['height'];  				// Check image type  				$types = fileupload::image_types(); -				if (!isset($types[$this->image_info[2]]) || !in_array($this->extension, $types[$this->image_info[2]])) +				if (!isset($types[$this->image_info['type']]) || !in_array($this->extension, $types[$this->image_info['type']]))  				{ -					if (!isset($types[$this->image_info[2]])) +					if (!isset($types[$this->image_info['type']]))  					{ -						$this->error[] = sprintf($user->lang['IMAGE_FILETYPE_INVALID'], $this->image_info[2], $this->mimetype); +						$this->error[] = $user->lang('IMAGE_FILETYPE_INVALID', $this->image_info['type'], $this->mimetype);  					}  					else  					{ -						$this->error[] = sprintf($user->lang['IMAGE_FILETYPE_MISMATCH'], $types[$this->image_info[2]][0], $this->extension); +						$this->error[] = $user->lang('IMAGE_FILETYPE_MISMATCH', $types[$this->image_info['type']][0], $this->extension);  					}  				} @@ -502,8 +515,14 @@ class fileupload  	var $upload_timeout = 6;  	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/**  	* Init file upload class.  	* +	* @param \phpbb\filesystem\filesystem_interface $filesystem  	* @param string $error_prefix Used error messages will get prefixed by this string  	* @param array $allowed_extensions Array of allowed extensions, for example array('jpg', 'jpeg', 'gif', 'png')  	* @param int $max_filesize Maximum filesize @@ -515,13 +534,14 @@ class fileupload  	*										contain any of its values. Defaults to false.  	*  	*/ -	function fileupload($error_prefix = '', $allowed_extensions = false, $max_filesize = false, $min_width = false, $min_height = false, $max_width = false, $max_height = false, $disallowed_content = false) +	function fileupload(\phpbb\filesystem\filesystem_interface $filesystem, $error_prefix = '', $allowed_extensions = false, $max_filesize = false, $min_width = false, $min_height = false, $max_width = false, $max_height = false, $disallowed_content = false)  	{  		$this->set_allowed_extensions($allowed_extensions);  		$this->set_max_filesize($max_filesize);  		$this->set_allowed_dimensions($min_width, $min_height, $max_width, $max_height);  		$this->set_error_prefix($error_prefix);  		$this->set_disallowed_content($disallowed_content); +		$this->filesystem = $filesystem;  	}  	/** @@ -615,7 +635,7 @@ class fileupload  			}  		} -		$file = new filespec($upload, $this, $mimetype_guesser, $plupload); +		$file = new filespec($upload, $this, $this->filesystem, $mimetype_guesser, $plupload);  		if ($file->init_error)  		{ @@ -696,7 +716,7 @@ class fileupload  			$upload['type'] = $filedata['type'];  		} -		$file = new filespec($upload, $this, $mimetype_guesser); +		$file = new filespec($upload, $this, $this->filesystem, $mimetype_guesser);  		if ($file->init_error)  		{ @@ -934,7 +954,7 @@ class fileupload  		$upload_ary['tmp_name'] = $filename; -		$file = new filespec($upload_ary, $this, $mimetype_guesser); +		$file = new filespec($upload_ary, $this, $this->filesystem, $mimetype_guesser);  		$this->common_checks($file);  		return $file; diff --git a/phpBB/includes/functions_url_matcher.php b/phpBB/includes/functions_url_matcher.php deleted file mode 100644 index b965046aad..0000000000 --- a/phpBB/includes/functions_url_matcher.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper; -use Symfony\Component\Routing\Matcher\UrlMatcher; -use Symfony\Component\Routing\RequestContext; - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* Create a new UrlMatcher class and dump it into the cache file -* -* @param \phpbb\extension\manager $manager Extension manager -* @param RequestContext $context Symfony RequestContext object -* @param string $root_path Root path -* @param string $php_ext PHP file extension -* @return null -*/ -function phpbb_get_url_matcher(\phpbb\extension\manager $manager, RequestContext $context, $root_path, $php_ext) -{ -	if (defined('DEBUG')) -	{ -		return phpbb_create_url_matcher($manager, $context, $root_path); -	} - -	if (!phpbb_url_matcher_dumped($root_path, $php_ext)) -	{ -		phpbb_create_dumped_url_matcher($manager, $root_path, $php_ext); -	} - -	return phpbb_load_url_matcher($context, $root_path, $php_ext); -} - -/** -* Create a new UrlMatcher class and dump it into the cache file -* -* @param \phpbb\extension\manager $manager Extension manager -* @param string $root_path Root path -* @param string $php_ext PHP file extension -* @return null -*/ -function phpbb_create_dumped_url_matcher(\phpbb\extension\manager $manager, $root_path, $php_ext) -{ -	$provider = new \phpbb\controller\provider(); -	$provider->find_routing_files($manager->get_finder()); -	$routes = $provider->find($root_path)->get_routes(); -	$dumper = new PhpMatcherDumper($routes); -	$cached_url_matcher_dump = $dumper->dump(array( -		'class'			=> 'phpbb_url_matcher', -	)); - -	file_put_contents($root_path . 'cache/url_matcher.' . $php_ext, $cached_url_matcher_dump); -} - -/** -* Create a non-cached UrlMatcher -* -* @param \phpbb\extension\manager $manager Extension manager -* @param RequestContext $context Symfony RequestContext object -* @return UrlMatcher -*/ -function phpbb_create_url_matcher(\phpbb\extension\manager $manager, RequestContext $context, $root_path) -{ -	$provider = new \phpbb\controller\provider(); -	$provider->find_routing_files($manager->get_finder()); -	$routes = $provider->find($root_path)->get_routes(); -	return new UrlMatcher($routes, $context); -} - -/** -* Load the cached phpbb_url_matcher class -* -* @param RequestContext $context Symfony RequestContext object -* @param string $root_path Root path -* @param string $php_ext PHP file extension -* @return phpbb_url_matcher -*/ -function phpbb_load_url_matcher(RequestContext $context, $root_path, $php_ext) -{ -	require($root_path . 'cache/url_matcher.' . $php_ext); -	return new phpbb_url_matcher($context); -} - -/** -* Determine whether we have our dumped URL matcher -* -* The class is automatically dumped to the cache directory -* -* @param string $root_path Root path -* @param string $php_ext PHP file extension -* @return bool True if it exists, false if not -*/ -function phpbb_url_matcher_dumped($root_path, $php_ext) -{ -	return file_exists($root_path . 'cache/url_matcher.' . $php_ext); -} diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index c46653db9e..45263ad018 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -89,7 +89,7 @@ function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false)  */  function update_last_username()  { -	global $db; +	global $config, $db;  	// Get latest username  	$sql = 'SELECT user_id, username, user_colour @@ -102,9 +102,9 @@ function update_last_username()  	if ($row)  	{ -		set_config('newest_user_id', $row['user_id'], true); -		set_config('newest_username', $row['username'], true); -		set_config('newest_user_colour', $row['user_colour'], true); +		$config->set('newest_user_id', $row['user_id'], false); +		$config->set('newest_username', $row['username'], false); +		$config->set('newest_user_colour', $row['user_colour'], false);  	}  } @@ -138,7 +138,7 @@ function user_update_name($old_name, $new_name)  	if ($config['newest_username'] == $old_name)  	{ -		set_config('newest_username', $new_name, true); +		$config->set('newest_username', $new_name, false);  	}  	/** @@ -281,6 +281,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)  	{  		$cp_data['user_id'] = (int) $user_id; +		/* @var $cp \phpbb\profilefields\manager */  		$cp = $phpbb_container->get('profilefields.manager');  		$sql = 'INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' ' .  			$db->sql_build_array('INSERT', $cp->build_insert_sql_array($cp_data)); @@ -313,7 +314,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)  		{  			global $phpbb_log; -			// Because these actions only fill the log unneccessarily we skip the add_log() entry. +			// Because these actions only fill the log unnecessarily, we disable it  			$phpbb_log->disable('admin');  			// Add user to "newly registered users" group and set to default group if admin specified so. @@ -334,9 +335,9 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)  	// set the newest user and adjust the user count if the user is a normal user and no activation mail is sent  	if ($user_row['user_type'] == USER_NORMAL || $user_row['user_type'] == USER_FOUNDER)  	{ -		set_config('newest_user_id', $user_id, true); -		set_config('newest_username', $user_row['username'], true); -		set_config_count('num_users', 1, true); +		$config->set('newest_user_id', $user_id, false); +		$config->set('newest_username', $user_row['username'], false); +		$config->increment('num_users', 1, false);  		$sql = 'SELECT group_colour  			FROM ' . GROUPS_TABLE . ' @@ -345,7 +346,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		set_config('newest_user_colour', $row['group_colour'], true); +		$config->set('newest_user_colour', $row['group_colour'], false);  	}  	// Use default notifications settings if notifications_data is not set @@ -366,6 +367,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)  	// Subscribe user to notifications if necessary  	if (!empty($notifications_data))  	{ +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager');  		foreach ($notifications_data as $subscription)  		{ @@ -606,7 +608,7 @@ function user_delete($mode, $user_ids, $retain_username = true)  	if ($num_users_delta != 0)  	{ -		set_config_count('num_users', $num_users_delta, true); +		$config->increment('num_users', $num_users_delta, false);  	}  	// Now do the invariant tasks @@ -839,12 +841,12 @@ function user_active_flip($mode, $user_id_ary, $reason = INACTIVE_MANUAL)  	if ($deactivated)  	{ -		set_config_count('num_users', $deactivated * (-1), true); +		$config->increment('num_users', $deactivated * (-1), false);  	}  	if ($activated)  	{ -		set_config_count('num_users', $activated, true); +		$config->increment('num_users', $activated, false);  	}  	// Update latest username @@ -864,7 +866,7 @@ function user_active_flip($mode, $user_id_ary, $reason = INACTIVE_MANUAL)  */  function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reason, $ban_give_reason = '')  { -	global $db, $user, $auth, $cache; +	global $db, $user, $auth, $cache, $phpbb_log;  	// Delete stale bans  	$sql = 'DELETE FROM ' . BANLIST_TABLE . ' @@ -1255,13 +1257,22 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas  		$log_entry = ($ban_exclude) ? 'LOG_BAN_EXCLUDE_' : 'LOG_BAN_';  		// Add to admin log, moderator log and user notes -		add_log('admin', $log_entry . strtoupper($mode), $ban_reason, $ban_list_log); -		add_log('mod', 0, 0, $log_entry . strtoupper($mode), $ban_reason, $ban_list_log); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_entry . strtoupper($mode), false, array($ban_reason, $ban_list_log)); +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, $log_entry . strtoupper($mode), false, array( +			'forum_id' => 0, +			'topic_id' => 0, +			$ban_reason, +			$ban_list_log +		));  		if ($mode == 'user')  		{  			foreach ($banlist_ary as $user_id)  			{ -				add_log('user', $user_id, $log_entry . strtoupper($mode), $ban_reason, $ban_list_log); +				$phpbb_log->add('user', $user->data['user_id'], $user->ip, $log_entry . strtoupper($mode), false, array( +					'reportee_id' => $user_id, +					$ban_reason, +					$ban_list_log +				));  			}  		} @@ -1281,7 +1292,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas  */  function user_unban($mode, $ban)  { -	global $db, $user, $auth, $cache; +	global $db, $user, $auth, $cache, $phpbb_log;  	// Delete stale bans  	$sql = 'DELETE FROM ' . BANLIST_TABLE . ' @@ -1339,13 +1350,20 @@ function user_unban($mode, $ban)  		$db->sql_query($sql);  		// Add to moderator log, admin log and user notes -		add_log('admin', 'LOG_UNBAN_' . strtoupper($mode), $l_unban_list); -		add_log('mod', 0, 0, 'LOG_UNBAN_' . strtoupper($mode), $l_unban_list); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_UNBAN_' . strtoupper($mode), false, array($l_unban_list)); +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_UNBAN_' . strtoupper($mode), false, array( +			'forum_id' => 0, +			'topic_id' => 0, +			$l_unban_list +		));  		if ($mode == 'user')  		{  			foreach ($user_ids_ary as $user_id)  			{ -				add_log('user', $user_id, 'LOG_UNBAN_' . strtoupper($mode), $l_unban_list); +				$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_UNBAN_' . strtoupper($mode), false, array( +					'reportee_id' => $user_id, +					$l_unban_list +				));  			}  		}  	} @@ -1664,89 +1682,37 @@ function validate_username($username, $allowed_username = false)  		return 'INVALID_CHARS';  	} -	$mbstring = $pcre = false; - -	// generic UTF-8 character types supported? -	if (phpbb_pcre_utf8_support()) -	{ -		$pcre = true; -	} -	else if (function_exists('mb_ereg_match')) -	{ -		mb_regex_encoding('UTF-8'); -		$mbstring = true; -	} -  	switch ($config['allow_name_chars'])  	{  		case 'USERNAME_CHARS_ANY': -			$pcre = true;  			$regex = '.+';  		break;  		case 'USERNAME_ALPHA_ONLY': -			$pcre = true;  			$regex = '[A-Za-z0-9]+';  		break;  		case 'USERNAME_ALPHA_SPACERS': -			$pcre = true;  			$regex = '[A-Za-z0-9-[\]_+ ]+';  		break;  		case 'USERNAME_LETTER_NUM': -			if ($pcre) -			{ -				$regex = '[\p{Lu}\p{Ll}\p{N}]+'; -			} -			else if ($mbstring) -			{ -				$regex = '[[:upper:][:lower:][:digit:]]+'; -			} -			else -			{ -				$pcre = true; -				$regex = '[a-zA-Z0-9]+'; -			} +			$regex = '[\p{Lu}\p{Ll}\p{N}]+';  		break;  		case 'USERNAME_LETTER_NUM_SPACERS': -			if ($pcre) -			{ -				$regex = '[-\]_+ [\p{Lu}\p{Ll}\p{N}]+'; -			} -			else if ($mbstring) -			{ -				$regex = '[-\]_+ \[[:upper:][:lower:][:digit:]]+'; -			} -			else -			{ -				$pcre = true; -				$regex = '[-\]_+ [a-zA-Z0-9]+'; -			} +			$regex = '[-\]_+ [\p{Lu}\p{Ll}\p{N}]+';  		break;  		case 'USERNAME_ASCII':  		default: -			$pcre = true;  			$regex = '[\x01-\x7F]+';  		break;  	} -	if ($pcre) +	if (!preg_match('#^' . $regex . '$#u', $username))  	{ -		if (!preg_match('#^' . $regex . '$#u', $username)) -		{ -			return 'INVALID_CHARS'; -		} -	} -	else if ($mbstring) -	{ -		mb_ereg_search_init($username, '^' . $regex . '$'); -		if (!mb_ereg_search()) -		{ -			return 'INVALID_CHARS'; -		} +		return 'INVALID_CHARS';  	}  	$sql = 'SELECT username @@ -1801,35 +1767,10 @@ function validate_password($password)  		return false;  	} -	$pcre = $mbstring = false; - -	// generic UTF-8 character types supported? -	if (phpbb_pcre_utf8_support()) -	{ -		$upp = '\p{Lu}'; -		$low = '\p{Ll}'; -		$num = '\p{N}'; -		$sym = '[^\p{Lu}\p{Ll}\p{N}]'; -		$pcre = true; -	} -	else if (function_exists('mb_ereg_match')) -	{ -		mb_regex_encoding('UTF-8'); -		$upp = '[[:upper:]]'; -		$low = '[[:lower:]]'; -		$num = '[[:digit:]]'; -		$sym = '[^[:upper:][:lower:][:digit:]]'; -		$mbstring = true; -	} -	else -	{ -		$upp = '[A-Z]'; -		$low = '[a-z]'; -		$num = '[0-9]'; -		$sym = '[^A-Za-z0-9]'; -		$pcre = true; -	} - +	$upp = '\p{Lu}'; +	$low = '\p{Ll}'; +	$num = '\p{N}'; +	$sym = '[^\p{Lu}\p{Ll}\p{N}]';  	$chars = array();  	switch ($config['pass_complex']) @@ -1852,24 +1793,11 @@ function validate_password($password)  			$chars[] = $upp;  	} -	if ($pcre) +	foreach ($chars as $char)  	{ -		foreach ($chars as $char) +		if (!preg_match('#' . $char . '#u', $password))  		{ -			if (!preg_match('#' . $char . '#u', $password)) -			{ -				return 'INVALID_CHARS'; -			} -		} -	} -	else if ($mbstring) -	{ -		foreach ($chars as $char) -		{ -			if (mb_ereg($char, $password) === false) -			{ -				return 'INVALID_CHARS'; -			} +			return 'INVALID_CHARS';  		}  	} @@ -2285,7 +2213,7 @@ function phpbb_avatar_explanation_string()  */  function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow_desc_bbcode = false, $allow_desc_urls = false, $allow_desc_smilies = false)  { -	global $phpbb_root_path, $config, $db, $user, $file_upload, $phpbb_container; +	global $phpbb_root_path, $config, $db, $user, $file_upload, $phpbb_container, $phpbb_log;  	$error = array(); @@ -2317,8 +2245,12 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow  		$current_legend = \phpbb\groupposition\legend::GROUP_DISABLED;  		$current_teampage = \phpbb\groupposition\teampage::GROUP_DISABLED; +		/* @var $legend \phpbb\groupposition\legend */  		$legend = $phpbb_container->get('groupposition.legend'); + +		/* @var $teampage \phpbb\groupposition\teampage */  		$teampage = $phpbb_container->get('groupposition.teampage'); +  		if ($group_id)  		{  			try @@ -2535,7 +2467,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow  		}  		$name = ($type == GROUP_SPECIAL) ? $user->lang['G_' . $name] : $name; -		add_log('admin', $log, $name); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($name));  		group_update_listings($group_id);  	} @@ -2588,7 +2520,7 @@ function avatar_remove_db($avatar_name)  */  function group_delete($group_id, $group_name = false)  { -	global $db, $cache, $auth, $user, $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_container; +	global $db, $cache, $auth, $user, $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_container, $phpbb_log;  	if (!$group_name)  	{ @@ -2632,6 +2564,7 @@ function group_delete($group_id, $group_name = false)  	// Delete group from legend and teampage  	try  	{ +		/* @var $legend \phpbb\groupposition\legend */  		$legend = $phpbb_container->get('groupposition.legend');  		$legend->delete_group($group_id);  		unset($legend); @@ -2645,6 +2578,7 @@ function group_delete($group_id, $group_name = false)  	try  	{ +		/* @var $teampage \phpbb\groupposition\teampage */  		$teampage = $phpbb_container->get('groupposition.teampage');  		$teampage->delete_group($group_id);  		unset($teampage); @@ -2685,7 +2619,7 @@ function group_delete($group_id, $group_name = false)  	phpbb_cache_moderators($db, $cache, $auth); -	add_log('admin', 'LOG_GROUP_DELETE', $group_name); +	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_GROUP_DELETE', false, array($group_name));  	// Return false - no error  	return false; @@ -2698,7 +2632,7 @@ function group_delete($group_id, $group_name = false)  */  function group_user_add($group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $default = false, $leader = 0, $pending = 0, $group_attributes = false)  { -	global $db, $auth, $phpbb_container; +	global $db, $auth, $user, $phpbb_container, $phpbb_log;  	// We need both username and user_id info  	$result = user_get_id_name($user_id_ary, $username_ary); @@ -2782,12 +2716,13 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,  	$log = ($leader) ? 'LOG_MODS_ADDED' : (($pending) ? 'LOG_USERS_PENDING' : 'LOG_USERS_ADDED'); -	add_log('admin', $log, $group_name, implode(', ', $username_ary)); +	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($group_name, implode(', ', $username_ary)));  	group_update_listings($group_id);  	if ($pending)  	{ +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager');  		foreach ($add_id_ary as $user_id) @@ -2813,7 +2748,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,  */  function group_user_del($group_id, $user_id_ary = false, $username_ary = false, $group_name = false)  { -	global $db, $auth, $config, $phpbb_dispatcher, $phpbb_container; +	global $db, $auth, $config, $user, $phpbb_dispatcher, $phpbb_container, $phpbb_log;  	if ($config['coppa_enable'])  	{ @@ -2942,11 +2877,12 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,  	if ($group_name)  	{ -		add_log('admin', $log, $group_name, implode(', ', $username_ary)); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($group_name, implode(', ', $username_ary)));  	}  	group_update_listings($group_id); +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	$phpbb_notifications->delete_notifications('notification.type.group_request', $user_id_ary, $group_id); @@ -3040,7 +2976,7 @@ function remove_default_rank($group_id, $user_ids)  */  function group_user_attributes($action, $group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $group_attributes = false)  { -	global $db, $auth, $phpbb_root_path, $phpEx, $config, $phpbb_container; +	global $db, $auth, $user, $phpbb_root_path, $phpEx, $config, $phpbb_container, $phpbb_log;  	// We need both username and user_id info  	$result = user_get_id_name($user_id_ary, $username_ary); @@ -3111,6 +3047,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna  					AND " . $db->sql_in_set('user_id', $user_id_ary);  			$db->sql_query($sql); +			/* @var $phpbb_notifications \phpbb\notification\manager */  			$phpbb_notifications = $phpbb_container->get('notification_manager');  			$phpbb_notifications->add_notifications('notification.type.group_request_approved', array( @@ -3174,7 +3111,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna  	// Clear permissions cache of relevant users  	$auth->acl_clear_prefetch($user_id_ary); -	add_log('admin', $log, $group_name, implode(', ', $username_ary)); +	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($group_name, implode(', ', $username_ary)));  	group_update_listings($group_id); @@ -3234,7 +3171,7 @@ function group_validate_groupname($group_id, $group_name)  */  function group_set_user_default($group_id, $user_id_ary, $group_attributes = false, $update_listing = false)  { -	global $phpbb_container, $db, $phpbb_dispatcher; +	global $config, $phpbb_container, $db, $phpbb_dispatcher;  	if (empty($user_id_ary))  	{ @@ -3304,8 +3241,8 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal  			if (isset($sql_ary[$avatar_option]))  			{  				$avatar_sql_ary[$avatar_option] = $sql_ary[$avatar_option]; -				}  			} +		}  		$sql = 'UPDATE ' . USERS_TABLE . '  			SET ' . $db->sql_build_array('UPDATE', $avatar_sql_ary) . " @@ -3346,11 +3283,9 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal  			WHERE " . $db->sql_in_set('topic_last_poster_id', $user_id_ary);  		$db->sql_query($sql); -		global $config; -  		if (in_array($config['newest_user_id'], $user_id_ary))  		{ -			set_config('newest_user_colour', $sql_ary['user_colour'], true); +			$config->set('newest_user_colour', $sql_ary['user_colour'], false);  		}  	} @@ -3394,7 +3329,7 @@ function get_group_name($group_id)  	$row = $db->sql_fetchrow($result);  	$db->sql_freeresult($result); -	if (!$row || ($row['group_type'] == GROUP_SPECIAL && empty($user->lang))) +	if (!$row || ($row['group_type'] == GROUP_SPECIAL && !$user->is_setup()))  	{  		return '';  	} diff --git a/phpBB/includes/mcp/info/mcp_ban.php b/phpBB/includes/mcp/info/mcp_ban.php index 4aedbc8558..b4fd32792a 100644 --- a/phpBB/includes/mcp/info/mcp_ban.php +++ b/phpBB/includes/mcp/info/mcp_ban.php @@ -18,7 +18,6 @@ class mcp_ban_info  		return array(  			'filename'	=> 'mcp_ban',  			'title'		=> 'MCP_BAN', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'user'		=> array('title' => 'MCP_BAN_USERNAMES', 'auth' => 'acl_m_ban', 'cat' => array('MCP_BAN')),  				'ip'		=> array('title' => 'MCP_BAN_IPS', 'auth' => 'acl_m_ban', 'cat' => array('MCP_BAN')), diff --git a/phpBB/includes/mcp/info/mcp_logs.php b/phpBB/includes/mcp/info/mcp_logs.php index c6482c1255..7a0205fce9 100644 --- a/phpBB/includes/mcp/info/mcp_logs.php +++ b/phpBB/includes/mcp/info/mcp_logs.php @@ -18,7 +18,6 @@ class mcp_logs_info  		return array(  			'filename'	=> 'mcp_logs',  			'title'		=> 'MCP_LOGS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'front'			=> array('title' => 'MCP_LOGS_FRONT', 'auth' => 'acl_m_ || aclf_m_', 'cat' => array('MCP_LOGS')),  				'forum_logs'	=> array('title' => 'MCP_LOGS_FORUM_VIEW', 'auth' => 'acl_m_,$id', 'cat' => array('MCP_LOGS')), diff --git a/phpBB/includes/mcp/info/mcp_main.php b/phpBB/includes/mcp/info/mcp_main.php index 81ccdbd1cd..c0f0363255 100644 --- a/phpBB/includes/mcp/info/mcp_main.php +++ b/phpBB/includes/mcp/info/mcp_main.php @@ -18,7 +18,6 @@ class mcp_main_info  		return array(  			'filename'	=> 'mcp_main',  			'title'		=> 'MCP_MAIN', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'front'			=> array('title' => 'MCP_MAIN_FRONT', 'auth' => '', 'cat' => array('MCP_MAIN')),  				'forum_view'	=> array('title' => 'MCP_MAIN_FORUM_VIEW', 'auth' => 'acl_m_,$id', 'cat' => array('MCP_MAIN')), diff --git a/phpBB/includes/mcp/info/mcp_notes.php b/phpBB/includes/mcp/info/mcp_notes.php index 4b8c255fe2..de4a41dd80 100644 --- a/phpBB/includes/mcp/info/mcp_notes.php +++ b/phpBB/includes/mcp/info/mcp_notes.php @@ -18,7 +18,6 @@ class mcp_notes_info  		return array(  			'filename'	=> 'mcp_notes',  			'title'		=> 'MCP_NOTES', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'front'				=> array('title' => 'MCP_NOTES_FRONT', 'auth' => '', 'cat' => array('MCP_NOTES')),  				'user_notes'		=> array('title' => 'MCP_NOTES_USER', 'auth' => '', 'cat' => array('MCP_NOTES')), diff --git a/phpBB/includes/mcp/info/mcp_pm_reports.php b/phpBB/includes/mcp/info/mcp_pm_reports.php index 8670b71084..6f8b8d9937 100644 --- a/phpBB/includes/mcp/info/mcp_pm_reports.php +++ b/phpBB/includes/mcp/info/mcp_pm_reports.php @@ -18,7 +18,6 @@ class mcp_pm_reports_info  		return array(  			'filename'	=> 'mcp_pm_reports',  			'title'		=> 'MCP_PM_REPORTS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'pm_reports'		=> array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),  				'pm_reports_closed'	=> array('title' => 'MCP_PM_REPORTS_CLOSED', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')), diff --git a/phpBB/includes/mcp/info/mcp_queue.php b/phpBB/includes/mcp/info/mcp_queue.php index 556c3902b0..d5605aa50e 100644 --- a/phpBB/includes/mcp/info/mcp_queue.php +++ b/phpBB/includes/mcp/info/mcp_queue.php @@ -18,7 +18,6 @@ class mcp_queue_info  		return array(  			'filename'	=> 'mcp_queue',  			'title'		=> 'MCP_QUEUE', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'unapproved_topics'	=> array('title' => 'MCP_QUEUE_UNAPPROVED_TOPICS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),  				'unapproved_posts'	=> array('title' => 'MCP_QUEUE_UNAPPROVED_POSTS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')), diff --git a/phpBB/includes/mcp/info/mcp_reports.php b/phpBB/includes/mcp/info/mcp_reports.php index 31fee19d79..76e62efe9c 100644 --- a/phpBB/includes/mcp/info/mcp_reports.php +++ b/phpBB/includes/mcp/info/mcp_reports.php @@ -18,7 +18,6 @@ class mcp_reports_info  		return array(  			'filename'	=> 'mcp_reports',  			'title'		=> 'MCP_REPORTS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'reports'			=> array('title' => 'MCP_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),  				'reports_closed'	=> array('title' => 'MCP_REPORTS_CLOSED', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')), diff --git a/phpBB/includes/mcp/info/mcp_warn.php b/phpBB/includes/mcp/info/mcp_warn.php index d85499f280..b4f83e77c6 100644 --- a/phpBB/includes/mcp/info/mcp_warn.php +++ b/phpBB/includes/mcp/info/mcp_warn.php @@ -18,7 +18,6 @@ class mcp_warn_info  		return array(  			'filename'	=> 'mcp_warn',  			'title'		=> 'MCP_WARN', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'front'				=> array('title' => 'MCP_WARN_FRONT', 'auth' => 'aclf_m_warn', 'cat' => array('MCP_WARN')),  				'list'				=> array('title' => 'MCP_WARN_LIST', 'auth' => 'aclf_m_warn', 'cat' => array('MCP_WARN')), diff --git a/phpBB/includes/mcp/mcp_forum.php b/phpBB/includes/mcp/mcp_forum.php index 157134b09e..485c9d5eec 100644 --- a/phpBB/includes/mcp/mcp_forum.php +++ b/phpBB/includes/mcp/mcp_forum.php @@ -45,11 +45,11 @@ function mcp_forum_view($id, $mode, $action, $forum_info)  	}  	$forum_id			= $forum_info['forum_id']; -	$start				= request_var('start', 0); -	$topic_id_list		= request_var('topic_id_list', array(0)); -	$post_id_list		= request_var('post_id_list', array(0)); -	$source_topic_ids	= array(request_var('t', 0)); -	$to_topic_id		= request_var('to_topic_id', 0); +	$start				= $request->variable('start', 0); +	$topic_id_list		= $request->variable('topic_id_list', array(0)); +	$post_id_list		= $request->variable('post_id_list', array(0)); +	$source_topic_ids	= array($request->variable('t', 0)); +	$to_topic_id		= $request->variable('to_topic_id', 0);  	$url_extra = '';  	$url_extra .= ($forum_id) ? "&f=$forum_id" : ''; @@ -63,7 +63,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)  	switch ($action)  	{  		case 'resync': -			$topic_ids = request_var('topic_id_list', array(0)); +			$topic_ids = $request->variable('topic_id_list', array(0));  			mcp_resync_topics($topic_ids);  		break; @@ -101,6 +101,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)  	);  	extract($phpbb_dispatcher->trigger_event('core.mcp_forum_view_before', compact($vars))); +	/* @var $pagination \phpbb\pagination */  	$pagination = $phpbb_container->get('pagination');  	$selected_ids = ''; @@ -154,9 +155,10 @@ function mcp_forum_view($id, $mode, $action, $forum_info)  		'S_CAN_SYNC'			=> $auth->acl_get('m_', $forum_id),  		'S_CAN_APPROVE'			=> $auth->acl_get('m_approve', $forum_id),  		'S_MERGE_SELECT'		=> ($merge_select) ? true : false, -		'S_CAN_MAKE_NORMAL'		=> $auth->acl_gets('f_sticky', 'f_announce', $forum_id), +		'S_CAN_MAKE_NORMAL'		=> $auth->acl_gets('f_sticky', 'f_announce', 'f_announce_global', $forum_id),  		'S_CAN_MAKE_STICKY'		=> $auth->acl_get('f_sticky', $forum_id),  		'S_CAN_MAKE_ANNOUNCE'	=> $auth->acl_get('f_announce', $forum_id), +		'S_CAN_MAKE_ANNOUNCE_GLOBAL'	=> $auth->acl_get('f_announce_global', $forum_id),  		'U_VIEW_FORUM'			=> append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),  		'U_VIEW_FORUM_LOGS'		=> ($auth->acl_gets('a_', 'm_', $forum_id) && $module->loaded('logs')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=logs&mode=forum_logs&f=' . $forum_id) : '', @@ -181,6 +183,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)  		$read_tracking_join = $read_tracking_select = '';  	} +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	$sql = 'SELECT t.topic_id @@ -361,7 +364,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)  */  function mcp_resync_topics($topic_ids)  { -	global $auth, $db, $template, $phpEx, $user, $phpbb_root_path; +	global $auth, $db, $template, $phpEx, $user, $phpbb_root_path, $phpbb_log, $request;  	if (!sizeof($topic_ids))  	{ @@ -386,13 +389,17 @@ function mcp_resync_topics($topic_ids)  	// Log this action  	while ($row = $db->sql_fetchrow($result))  	{ -		add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_TOPIC_RESYNC', $row['topic_title']); +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_TOPIC_RESYNC', false, array( +			'forum_id' => $row['forum_id'], +			'topic_id' => $row['topic_id'], +			$row['topic_title'] +		));  	}  	$db->sql_freeresult($result);  	$msg = (sizeof($topic_ids) == 1) ? $user->lang['TOPIC_RESYNC_SUCCESS'] : $user->lang['TOPICS_RESYNC_SUCCESS']; -	$redirect = request_var('redirect', $user->data['session_page']); +	$redirect = $request->variable('redirect', $user->data['session_page']);  	meta_refresh(3, $redirect);  	trigger_error($msg . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>')); @@ -405,7 +412,7 @@ function mcp_resync_topics($topic_ids)  */  function merge_topics($forum_id, $topic_ids, $to_topic_id)  { -	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth; +	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $phpbb_log, $request;  	if (!sizeof($topic_ids))  	{ @@ -436,8 +443,8 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)  	$topic_data = $topic_data[$to_topic_id]; -	$post_id_list	= request_var('post_id_list', array(0)); -	$start			= request_var('start', 0); +	$post_id_list	= $request->variable('post_id_list', array(0)); +	$start			= $request->variable('start', 0);  	if (!sizeof($post_id_list) && sizeof($topic_ids))  	{ @@ -465,7 +472,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)  		return;  	} -	$redirect = request_var('redirect', build_url(array('quickmod'))); +	$redirect = $request->variable('redirect', build_url(array('quickmod')));  	$s_hidden_fields = build_hidden_fields(array(  		'i'				=> 'main', @@ -485,7 +492,12 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)  		$to_forum_id = $topic_data['forum_id'];  		move_posts($post_id_list, $to_topic_id, false); -		add_log('mod', $to_forum_id, $to_topic_id, 'LOG_MERGE', $topic_data['topic_title']); + +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MERGE', false, array( +			'forum_id' => $to_forum_id, +			'topic_id' => $to_topic_id, +			$topic_data['topic_title'] +		));  		// Message and return links  		$success_msg = 'POSTS_MERGED_SUCCESS'; @@ -509,7 +521,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)  		// Link to the new topic  		$return_link .= (($return_link) ? '<br /><br />' : '') . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $to_forum_id . '&t=' . $to_topic_id) . '">', '</a>'); -		$redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&t=$to_topic_id"); +		$redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&t=$to_topic_id");  		$redirect = reapply_sid($redirect);  		meta_refresh(3, $redirect); diff --git a/phpBB/includes/mcp/mcp_front.php b/phpBB/includes/mcp/mcp_front.php index 629b6fd275..0d03a37731 100644 --- a/phpBB/includes/mcp/mcp_front.php +++ b/phpBB/includes/mcp/mcp_front.php @@ -26,7 +26,7 @@ function mcp_front_view($id, $mode, $action)  {  	global $phpEx, $phpbb_root_path, $config;  	global $template, $db, $user, $auth, $module; -	global $phpbb_dispatcher; +	global $phpbb_dispatcher, $request;  	// Latest 5 unapproved  	if ($module->loaded('queue')) @@ -35,7 +35,7 @@ function mcp_front_view($id, $mode, $action)  		$post_list = array();  		$forum_names = array(); -		$forum_id = request_var('f', 0); +		$forum_id = $request->variable('f', 0);  		$template->assign_var('S_SHOW_UNAPPROVED', (!empty($forum_list)) ? true : false); diff --git a/phpBB/includes/mcp/mcp_logs.php b/phpBB/includes/mcp/mcp_logs.php index 9c76f0df90..43327707b3 100644 --- a/phpBB/includes/mcp/mcp_logs.php +++ b/phpBB/includes/mcp/mcp_logs.php @@ -35,12 +35,12 @@ class mcp_logs  	function main($id, $mode)  	{ -		global $auth, $db, $user, $template; +		global $auth, $db, $user, $template, $request;  		global $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_log;  		$user->add_lang('acp/common'); -		$action = request_var('action', array('' => '')); +		$action = $request->variable('action', array('' => ''));  		if (is_array($action))  		{ @@ -48,23 +48,24 @@ class mcp_logs  		}  		else  		{ -			$action = request_var('action', ''); +			$action = $request->variable('action', '');  		}  		// Set up general vars -		$start		= request_var('start', 0); +		$start		= $request->variable('start', 0);  		$deletemark = ($action == 'del_marked') ? true : false;  		$deleteall	= ($action == 'del_all') ? true : false; -		$marked		= request_var('mark', array(0)); +		$marked		= $request->variable('mark', array(0));  		// Sort keys -		$sort_days	= request_var('st', 0); -		$sort_key	= request_var('sk', 't'); -		$sort_dir	= request_var('sd', 'd'); +		$sort_days	= $request->variable('st', 0); +		$sort_key	= $request->variable('sk', 't'); +		$sort_dir	= $request->variable('sd', 'd');  		$this->tpl_name = 'mcp_logs';  		$this->page_title = 'MCP_LOGS'; +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination');  		$forum_list = array_values(array_intersect(get_forum_list('f_read'), get_forum_list('m_'))); @@ -78,7 +79,7 @@ class mcp_logs  			break;  			case 'forum_logs': -				$forum_id = request_var('f', 0); +				$forum_id = $request->variable('f', 0);  				if (!in_array($forum_id, $forum_list))  				{ @@ -89,7 +90,7 @@ class mcp_logs  			break;  			case 'topic_logs': -				$topic_id = request_var('t', 0); +				$topic_id = $request->variable('t', 0);  				$sql = 'SELECT forum_id  					FROM ' . TOPICS_TABLE . ' @@ -123,7 +124,7 @@ class mcp_logs  				}  				else if ($deleteall)  				{ -					$keywords = utf8_normalize_nfc(request_var('keywords', '', true)); +					$keywords = $request->variable('keywords', '', true);  					$conditions = array(  						'forum_id'	=> array('IN' => $forum_list), @@ -157,7 +158,7 @@ class mcp_logs  					'sd'		=> $sort_dir,  					'i'			=> $id,  					'mode'		=> $mode, -					'action'	=> request_var('action', array('' => '')))) +					'action'	=> $request->variable('action', array('' => ''))))  				);  			}  		} @@ -174,7 +175,7 @@ class mcp_logs  		$sql_where = ($sort_days) ? (time() - ($sort_days * 86400)) : 0;  		$sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); -		$keywords = utf8_normalize_nfc(request_var('keywords', '', true)); +		$keywords = $request->variable('keywords', '', true);  		$keywords_param = !empty($keywords) ? '&keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';  		// Grab log data diff --git a/phpBB/includes/mcp/mcp_main.php b/phpBB/includes/mcp/mcp_main.php index fc28968101..66e59bb74d 100644 --- a/phpBB/includes/mcp/mcp_main.php +++ b/phpBB/includes/mcp/mcp_main.php @@ -45,7 +45,7 @@ class mcp_main  		{  			case 'lock':  			case 'unlock': -				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0)); +				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));  				if (!sizeof($topic_ids))  				{ @@ -58,7 +58,7 @@ class mcp_main  			case 'lock_post':  			case 'unlock_post': -				$post_ids = (!$quickmod) ? request_var('post_id_list', array(0)) : array(request_var('p', 0)); +				$post_ids = (!$quickmod) ? $request->variable('post_id_list', array(0)) : array($request->variable('p', 0));  				if (!sizeof($post_ids))  				{ @@ -73,7 +73,7 @@ class mcp_main  			case 'make_global':  			case 'make_normal': -				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0)); +				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));  				if (!sizeof($topic_ids))  				{ @@ -86,7 +86,7 @@ class mcp_main  			case 'move':  				$user->add_lang('viewtopic'); -				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0)); +				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));  				if (!sizeof($topic_ids))  				{ @@ -99,7 +99,7 @@ class mcp_main  			case 'fork':  				$user->add_lang('viewtopic'); -				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0)); +				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));  				if (!sizeof($topic_ids))  				{ @@ -189,7 +189,7 @@ class mcp_main  				$user->add_lang('viewforum'); -				$forum_id = request_var('f', 0); +				$forum_id = $request->variable('f', 0);  				$forum_info = phpbb_get_forum_data($forum_id, 'm_', true); @@ -262,7 +262,7 @@ class mcp_main  */  function lock_unlock($action, $ids)  { -	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request; +	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_log;  	if ($action == 'lock' || $action == 'unlock')  	{ @@ -298,7 +298,7 @@ function lock_unlock($action, $ids)  	}  	unset($orig_ids); -	$redirect = request_var('redirect', build_url(array('action', 'quickmod'))); +	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));  	$redirect = reapply_sid($redirect);  	$s_hidden_fields = build_hidden_fields(array( @@ -319,7 +319,11 @@ function lock_unlock($action, $ids)  		foreach ($data as $id => $row)  		{ -			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_' . strtoupper($action), $row['topic_title']); +			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_' . strtoupper($action), false, array( +				'forum_id' => $row['forum_id'], +				'topic_id' => $row['topic_id'], +				$row['topic_title'] +			));  		}  		$success_msg = $l_prefix . ((sizeof($ids) == 1) ? '' : 'S') . '_' . (($action == 'lock' || $action == 'lock_post') ? 'LOCKED' : 'UNLOCKED') . '_SUCCESS'; @@ -346,7 +350,7 @@ function lock_unlock($action, $ids)  */  function change_topic_type($action, $topic_ids)  { -	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request; +	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_log;  	switch ($action)  	{ @@ -358,7 +362,7 @@ function change_topic_type($action, $topic_ids)  		case 'make_global':  			$new_topic_type = POST_GLOBAL; -			$check_acl = 'f_announce'; +			$check_acl = 'f_announce_global';  			$l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_GLOBAL' : 'MCP_MAKE_GLOBALS';  		break; @@ -382,7 +386,7 @@ function change_topic_type($action, $topic_ids)  		return;  	} -	$redirect = request_var('redirect', build_url(array('action', 'quickmod'))); +	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));  	$redirect = reapply_sid($redirect);  	$s_hidden_fields = array( @@ -421,7 +425,11 @@ function change_topic_type($action, $topic_ids)  			foreach ($data as $topic_id => $row)  			{ -				add_log('mod', $forum_id, $topic_id, 'LOG_TOPIC_TYPE_CHANGED', $row['topic_title']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_TOPIC_TYPE_CHANGED', false, array( +					'forum_id' => $forum_id, +					'topic_id' => $topic_id, +					$row['topic_title'] +				));  			}  		} @@ -458,8 +466,8 @@ function mcp_move_topic($topic_ids)  		return;  	} -	$to_forum_id = request_var('to_forum_id', 0); -	$redirect = request_var('redirect', build_url(array('action', 'quickmod'))); +	$to_forum_id = $request->variable('to_forum_id', 0); +	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));  	$additional_msg = $success_msg = '';  	$s_hidden_fields = build_hidden_fields(array( @@ -679,7 +687,7 @@ function mcp_move_topic($topic_ids)  		confirm_box(false, 'MOVE_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');  	} -	$redirect = request_var('redirect', "index.$phpEx"); +	$redirect = $request->variable('redirect', "index.$phpEx");  	$redirect = reapply_sid($redirect);  	if (!$success_msg) @@ -704,7 +712,7 @@ function mcp_move_topic($topic_ids)  */  function mcp_restore_topic($topic_ids)  { -	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container; +	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_log;  	if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_approve')))  	{ @@ -728,13 +736,19 @@ function mcp_restore_topic($topic_ids)  		$data = phpbb_get_topic_data($topic_ids); +		/* @var $phpbb_content_visibility \phpbb\content_visibility */  		$phpbb_content_visibility = $phpbb_container->get('content.visibility');  		foreach ($data as $topic_id => $row)  		{  			$return = $phpbb_content_visibility->set_topic_visibility(ITEM_APPROVED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), '');  			if (!empty($return))  			{ -				add_log('mod', $row['forum_id'], $topic_id, 'LOG_RESTORE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_RESTORE_TOPIC', false, array( +					'forum_id' => $row['forum_id'], +					'topic_id' => $topic_id, +					$row['topic_title'], +					$row['topic_first_poster_name'] +				));  			}  		}  	} @@ -777,7 +791,7 @@ function mcp_restore_topic($topic_ids)  */  function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_topic')  { -	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container; +	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_log;  	$check_permission = ($is_soft) ? 'm_softdelete' : 'm_delete';  	if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array($check_permission))) @@ -806,23 +820,40 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''  		{  			if ($row['topic_moved_id'])  			{ -				add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_SHADOW_TOPIC', $row['topic_title']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_DELETE_SHADOW_TOPIC', false, array( +					'forum_id' => $row['forum_id'], +					'topic_id' => $topic_id, +					$row['topic_title'] +				));  			}  			else  			{  				// Only soft delete non-shadow topics  				if ($is_soft)  				{ +					/* @var $phpbb_content_visibility \phpbb\content_visibility */  					$phpbb_content_visibility = $phpbb_container->get('content.visibility');  					$return = $phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), $soft_delete_reason);  					if (!empty($return))  					{ -						add_log('mod', $row['forum_id'], $topic_id, 'LOG_SOFTDELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name'], $soft_delete_reason); +						$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SOFTDELETE_TOPIC', false, array( +							'forum_id' => $row['forum_id'], +							'topic_id' => $topic_id, +							$row['topic_title'], +							$row['topic_first_poster_name'], +							$soft_delete_reason +						));  					}  				}  				else  				{ -					add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name'], $soft_delete_reason); +					$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_DELETE_TOPIC', false, array( +						'forum_id' => $row['forum_id'], +						'topic_id' => $topic_id, +						$row['topic_title'], +						$row['topic_first_poster_name'], +						$soft_delete_reason +					));  				}  			}  		} @@ -916,7 +947,7 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''  */  function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_post')  { -	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container; +	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_log;  	$check_permission = ($is_soft) ? 'm_softdelete' : 'm_delete';  	if (!phpbb_check_ids($post_ids, POSTS_TABLE, 'post_id', array($check_permission))) @@ -973,6 +1004,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',  			);  		} +		/* @var $phpbb_content_visibility \phpbb\content_visibility */  		$phpbb_content_visibility = $phpbb_container->get('content.visibility');  		foreach ($topic_info as $topic_id => $topic_data)  		{ @@ -987,7 +1019,13 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',  		foreach ($approve_log as $row)  		{  			$post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username']; -			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_SOFTDELETE_POST', $row['post_subject'], $post_username, $soft_delete_reason); +			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SOFTDELETE_POST', false, array( +				'forum_id' => $row['forum_id'], +				'topic_id' => $row['topic_id'], +				$row['post_subject'], +				$post_username, +				$soft_delete_reason +			));  		}  		$topic_id = $request->variable('t', 0); @@ -1030,7 +1068,13 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',  		foreach ($post_data as $id => $row)  		{  			$post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username']; -			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_DELETE_POST', $row['post_subject'], $post_username, $soft_delete_reason); +			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_DELETE_POST', false, array( +				'forum_id' => $row['forum_id'], +				'topic_id' => $row['topic_id'], +				$row['post_subject'], +				$post_username, +				$soft_delete_reason +			));  		}  		// Now delete the posts, topics and forums are automatically resync'ed @@ -1144,16 +1188,16 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',  function mcp_fork_topic($topic_ids)  {  	global $auth, $user, $db, $template, $config; -	global $phpEx, $phpbb_root_path, $phpbb_dispatcher; +	global $phpEx, $phpbb_root_path, $phpbb_log, $request, $phpbb_dispatcher;  	if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))  	{  		return;  	} -	$to_forum_id = request_var('to_forum_id', 0); -	$forum_id = request_var('f', 0); -	$redirect = request_var('redirect', build_url(array('action', 'quickmod'))); +	$to_forum_id = $request->variable('to_forum_id', 0); +	$forum_id = $request->variable('f', 0); +	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));  	$additional_msg = $success_msg = '';  	$counter = array(); @@ -1497,12 +1541,16 @@ function mcp_fork_topic($topic_ids)  		sync('topic', 'topic_id', $new_topic_id_list);  		sync('forum', 'forum_id', $to_forum_id); -		set_config_count('num_topics', sizeof($new_topic_id_list), true); -		set_config_count('num_posts', $total_posts, true); +		$config->increment('num_topics', sizeof($new_topic_id_list), false); +		$config->increment('num_posts', $total_posts, false);  		foreach ($new_topic_id_list as $topic_id => $new_topic_id)  		{ -			add_log('mod', $to_forum_id, $new_topic_id, 'LOG_FORK', $topic_row['forum_name']); +			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_FORK', false, array( +				'forum_id' => $to_forum_id, +				'topic_id' => $new_topic_id, +				$topic_row['forum_name'] +			));  		}  		$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_FORKED_SUCCESS' : 'TOPICS_FORKED_SUCCESS'; @@ -1518,7 +1566,7 @@ function mcp_fork_topic($topic_ids)  		confirm_box(false, 'FORK_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');  	} -	$redirect = request_var('redirect', "index.$phpEx"); +	$redirect = $request->variable('redirect', "index.$phpEx");  	$redirect = reapply_sid($redirect);  	if (!$success_msg) diff --git a/phpBB/includes/mcp/mcp_notes.php b/phpBB/includes/mcp/mcp_notes.php index 465ee63a98..502d4cb1e7 100644 --- a/phpBB/includes/mcp/mcp_notes.php +++ b/phpBB/includes/mcp/mcp_notes.php @@ -35,10 +35,10 @@ class mcp_notes  	function main($id, $mode)  	{ -		global $auth, $db, $user, $template; +		global $auth, $db, $user, $template, $request;  		global $config, $phpbb_root_path, $phpEx; -		$action = request_var('action', array('' => '')); +		$action = $request->variable('action', array('' => ''));  		if (is_array($action))  		{ @@ -74,15 +74,17 @@ class mcp_notes  	*/  	function mcp_notes_user_view($action)  	{ -		global $phpEx, $phpbb_root_path, $config; +		global $phpEx, $phpbb_root_path, $config, $phpbb_log, $request;  		global $template, $db, $user, $auth, $phpbb_container; -		$user_id = request_var('u', 0); -		$username = request_var('username', '', true); -		$start = request_var('start', 0); -		$st	= request_var('st', 0); -		$sk	= request_var('sk', 'b'); -		$sd	= request_var('sd', 'd'); +		$user_id = $request->variable('u', 0); +		$username = $request->variable('username', '', true); +		$start = $request->variable('start', 0); +		$st	= $request->variable('st', 0); +		$sk	= $request->variable('sk', 'b'); +		$sd	= $request->variable('sd', 'd'); + +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination');  		add_form_key('mcp_notes'); @@ -114,8 +116,8 @@ class mcp_notes  		$deletemark = ($action == 'del_marked') ? true : false;  		$deleteall	= ($action == 'del_all') ? true : false; -		$marked		= request_var('marknote', array(0)); -		$usernote	= utf8_normalize_nfc(request_var('usernote', '', true)); +		$marked		= $request->variable('marknote', array(0)); +		$usernote	= $request->variable('usernote', '', true);  		// Handle any actions  		if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs')) @@ -142,7 +144,7 @@ class mcp_notes  							$where_sql";  					$db->sql_query($sql); -					add_log('admin', 'LOG_CLEAR_USER', $userrow['username']); +					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CLEAR_USER', false, array($userrow['username']));  					$msg = ($deletemark) ? 'MARKED_NOTES_DELETED' : 'ALL_NOTES_DELETED';  				} @@ -160,10 +162,17 @@ class mcp_notes  		{  			if (check_form_key('mcp_notes'))  			{ -				add_log('admin', 'LOG_USER_FEEDBACK', $userrow['username']); -				add_log('mod', 0, 0, 'LOG_USER_FEEDBACK', $userrow['username']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array($userrow['username'])); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array( +					'forum_id' => 0, +					'topic_id' => 0, +					$userrow['username'] +				)); +				$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GENERAL', false, array( +					'reportee_id' => $user_id, +					$usernote +				)); -				add_log('user', $user_id, 'LOG_USER_GENERAL', $usernote);  				$msg = $user->lang['USER_FEEDBACK_ADDED'];  			}  			else @@ -192,7 +201,7 @@ class mcp_notes  		$sql_where = ($st) ? (time() - ($st * 86400)) : 0;  		$sql_sort = $sort_by_sql[$sk] . ' ' . (($sd == 'd') ? 'DESC' : 'ASC'); -		$keywords = utf8_normalize_nfc(request_var('keywords', '', true)); +		$keywords = $request->variable('keywords', '', true);  		$keywords_param = !empty($keywords) ? '&keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';  		$log_data = array(); diff --git a/phpBB/includes/mcp/mcp_pm_reports.php b/phpBB/includes/mcp/mcp_pm_reports.php index d76bedba98..6e1d594135 100644 --- a/phpBB/includes/mcp/mcp_pm_reports.php +++ b/phpBB/includes/mcp/mcp_pm_reports.php @@ -35,14 +35,15 @@ class mcp_pm_reports  	function main($id, $mode)  	{ -		global $auth, $db, $user, $template, $cache; +		global $auth, $db, $user, $template, $cache, $request;  		global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;  		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);  		include_once($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx); -		$start = request_var('start', 0); +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination'); +		$start = $request->variable('start', 0);  		$this->page_title = 'MCP_PM_REPORTS'; @@ -52,7 +53,7 @@ class mcp_pm_reports  			case 'delete':  				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); -				$report_id_list = request_var('report_id_list', array(0)); +				$report_id_list = $request->variable('report_id_list', array(0));  				if (!sizeof($report_id_list))  				{ @@ -75,7 +76,7 @@ class mcp_pm_reports  				$user->add_lang(array('posting', 'viewforum', 'viewtopic', 'ucp')); -				$report_id = request_var('r', 0); +				$report_id = $request->variable('r', 0);  				$sql = 'SELECT r.pm_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour  					FROM ' . REPORTS_TABLE . ' r, ' . REPORTS_REASONS_TABLE . ' rr, ' . USERS_TABLE . ' u @@ -93,9 +94,10 @@ class mcp_pm_reports  					trigger_error('NO_REPORT');  				} +				/* @var $phpbb_notifications \phpbb\notification\manager */  				$phpbb_notifications = $phpbb_container->get('notification_manager'); -				$phpbb_notifications->mark_notifications_read_by_parent('notification.type.report_pm', $report_id, $user->data['user_id']); +				$phpbb_notifications->mark_notifications_by_parent('report_pm', $report_id, $user->data['user_id']);  				$pm_id = $report['pm_id'];  				$report_id = $report['report_id']; @@ -199,7 +201,7 @@ class mcp_pm_reports  					'POST_SUBJECT'			=> ($pm_info['message_subject']) ? $pm_info['message_subject'] : $user->lang['NO_SUBJECT'],  					'POST_DATE'				=> $user->format_date($pm_info['message_time']),  					'POST_IP'				=> $pm_info['author_ip'], -					'POST_IPADDR'			=> ($auth->acl_getf_global('m_info') && request_var('lookup', '')) ? @gethostbyaddr($pm_info['author_ip']) : '', +					'POST_IPADDR'			=> ($auth->acl_getf_global('m_info') && $request->variable('lookup', '')) ? @gethostbyaddr($pm_info['author_ip']) : '',  					'POST_ID'				=> $pm_info['msg_id'],  					'U_LOOKUP_IP'			=> ($auth->acl_getf_global('m_info')) ? $this->u_action . '&r=' . $report_id . '&pm=' . $pm_id . '&lookup=' . $pm_info['author_ip'] . '#ip' : '', diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php index 7a93f73228..f53f40d66a 100644 --- a/phpBB/includes/mcp/mcp_post.php +++ b/phpBB/includes/mcp/mcp_post.php @@ -24,14 +24,14 @@ if (!defined('IN_PHPBB'))  */  function mcp_post_details($id, $mode, $action)  { -	global $phpEx, $phpbb_root_path, $config; +	global $phpEx, $phpbb_root_path, $config, $request;  	global $template, $db, $user, $auth, $cache;  	global $phpbb_dispatcher;  	$user->add_lang('posting'); -	$post_id = request_var('p', 0); -	$start	= request_var('start', 0); +	$post_id = $request->variable('p', 0); +	$start	= $request->variable('start', 0);  	// Get post data  	$post_info = phpbb_get_post_data(array($post_id), false, true); @@ -52,7 +52,7 @@ function mcp_post_details($id, $mode, $action)  			if ($auth->acl_get('m_info', $post_info['forum_id']))  			{ -				$ip = request_var('ip', ''); +				$ip = $request->variable('ip', '');  				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);  				$template->assign_vars(array( @@ -73,12 +73,12 @@ function mcp_post_details($id, $mode, $action)  			if ($action == 'chgposter')  			{ -				$username = request_var('username', '', true); +				$username = $request->variable('username', '', true);  				$sql_where = "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";  			}  			else  			{ -				$new_user_id = request_var('u', 0); +				$new_user_id = $request->variable('u', 0);  				$sql_where = 'user_id = ' . $new_user_id;  			} @@ -260,7 +260,7 @@ function mcp_post_details($id, $mode, $action)  		'POST_SUBJECT'			=> $post_info['post_subject'],  		'POST_DATE'				=> $user->format_date($post_info['post_time']),  		'POST_IP'				=> $post_info['poster_ip'], -		'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '', +		'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',  		'POST_ID'				=> $post_info['post_id'],  		'U_LOOKUP_IP'			=> ($auth->acl_get('m_info', $post_info['forum_id'])) ? "$url&i=$id&mode=$mode&lookup={$post_info['poster_ip']}#ip" : '', @@ -355,7 +355,7 @@ function mcp_post_details($id, $mode, $action)  	// Get IP  	if ($auth->acl_get('m_info', $post_info['forum_id']))  	{ -		$rdns_ip_num = request_var('rdns', ''); +		$rdns_ip_num = $request->variable('rdns', '');  		if ($rdns_ip_num != 'all')  		{ @@ -461,7 +461,7 @@ function mcp_post_details($id, $mode, $action)  */  function change_poster(&$post_info, $userdata)  { -	global $auth, $db, $config, $phpbb_root_path, $phpEx, $user, $phpbb_dispatcher; +	global $auth, $db, $config, $phpbb_root_path, $phpEx, $user, $phpbb_log, $phpbb_dispatcher;  	if (empty($userdata) || $userdata['user_id'] == $post_info['user_id'])  	{ @@ -571,5 +571,11 @@ function change_poster(&$post_info, $userdata)  	extract($phpbb_dispatcher->trigger_event('core.mcp_change_poster_after', compact($vars)));  	// Now add log entry -	add_log('mod', $post_info['forum_id'], $post_info['topic_id'], 'LOG_MCP_CHANGE_POSTER', $post_info['topic_title'], $from_username, $to_username); +	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MCP_CHANGE_POSTER', false, array( +		'forum_id' => $post_info['forum_id'], +		'topic_id' => $post_info['topic_id'], +		$post_info['topic_title'], +		$from_username, +		$to_username +	));  } diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php index 5fde63ecb4..3488ea326d 100644 --- a/phpBB/includes/mcp/mcp_queue.php +++ b/phpBB/includes/mcp/mcp_queue.php @@ -41,8 +41,8 @@ class mcp_queue  		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); -		$forum_id = request_var('f', 0); -		$start = request_var('start', 0); +		$forum_id = $request->variable('f', 0); +		$start = $request->variable('start', 0);  		$this->page_title = 'MCP_QUEUE'; @@ -153,9 +153,10 @@ class mcp_queue  				$user->add_lang(array('posting', 'viewtopic')); -				$post_id = request_var('p', 0); -				$topic_id = request_var('t', 0); +				$post_id = $request->variable('p', 0); +				$topic_id = $request->variable('t', 0); +				/* @var $phpbb_notifications \phpbb\notification\manager */  				$phpbb_notifications = $phpbb_container->get('notification_manager');  				if ($topic_id) @@ -165,7 +166,7 @@ class mcp_queue  					{  						$post_id = (int) $topic_info[$topic_id]['topic_first_post_id']; -						$phpbb_notifications->mark_notifications_read('notification.type.topic_in_queue', $topic_id, $user->data['user_id']); +						$phpbb_notifications->mark_notifications('topic_in_queue', $topic_id, $user->data['user_id']);  					}  					else  					{ @@ -173,7 +174,7 @@ class mcp_queue  					}  				} -				$phpbb_notifications->mark_notifications_read('notification.type.post_in_queue', $post_id, $user->data['user_id']); +				$phpbb_notifications->mark_notifications('post_in_queue', $post_id, $user->data['user_id']);  				$post_info = phpbb_get_post_data(array($post_id), 'm_approve', true); @@ -318,7 +319,7 @@ class mcp_queue  					'POST_SUBJECT'			=> $post_info['post_subject'],  					'POST_DATE'				=> $user->format_date($post_info['post_time']),  					'POST_IP'				=> $post_info['poster_ip'], -					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '', +					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',  					'POST_ID'				=> $post_info['post_id'],  					'S_FIRST_POST'			=> ($post_info['topic_first_post_id'] == $post_id), @@ -340,6 +341,8 @@ class mcp_queue  				$topic_id = $request->variable('t', 0);  				$forum_info = array(); + +				/* @var $pagination \phpbb\pagination */  				$pagination = $phpbb_container->get('pagination');  				if ($topic_id) @@ -617,7 +620,7 @@ class mcp_queue  	static public function approve_posts($action, $post_id_list, $id, $mode)  	{  		global $db, $template, $user, $config, $request, $phpbb_container, $phpbb_dispatcher; -		global $phpEx, $phpbb_root_path; +		global $phpEx, $phpbb_root_path, $phpbb_log;  		if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))  		{ @@ -679,6 +682,7 @@ class mcp_queue  				);  			} +			/* @var $phpbb_content_visibility \phpbb\content_visibility */  			$phpbb_content_visibility = $phpbb_container->get('content.visibility');  			foreach ($topic_info as $topic_id => $topic_data)  			{ @@ -687,12 +691,17 @@ class mcp_queue  			foreach ($approve_log as $log_data)  			{ -				add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_POST_' . strtoupper($action) . 'D', $log_data['post_subject']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_POST_' . strtoupper($action) . 'D', false, array( +					'forum_id' => $log_data['forum_id'], +					'topic_id' => $log_data['topic_id'], +					$log_data['post_subject'] +				));  			}  			// Only send out the mails, when the posts are being approved  			if ($action == 'approve')  			{ +				/* @var $phpbb_notifications \phpbb\notification\manager */  				$phpbb_notifications = $phpbb_container->get('notification_manager');  				// Handle notifications @@ -729,7 +738,7 @@ class mcp_queue  					$phpbb_notifications->add_notifications(array('notification.type.quote'), $post_data);  					$phpbb_notifications->delete_notifications('notification.type.post_in_queue', $post_id); -					$phpbb_notifications->mark_notifications_read(array( +					$phpbb_notifications->mark_notifications(array(  						'notification.type.quote',  						'notification.type.bookmark',  						'notification.type.post', @@ -863,7 +872,7 @@ class mcp_queue  	*/  	static public function approve_topics($action, $topic_id_list, $id, $mode)  	{ -		global $db, $template, $user, $config; +		global $db, $template, $user, $config, $phpbb_log;  		global $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_dispatcher;  		if (!phpbb_check_ids($topic_id_list, TOPICS_TABLE, 'topic_id', array('m_approve'))) @@ -890,6 +899,7 @@ class mcp_queue  		{  			$notify_poster = ($action == 'approve' && isset($_REQUEST['notify_poster'])) ? true : false; +			/* @var $phpbb_content_visibility \phpbb\content_visibility */  			$phpbb_content_visibility = $phpbb_container->get('content.visibility');  			$first_post_ids = array(); @@ -914,7 +924,11 @@ class mcp_queue  			foreach ($approve_log as $log_data)  			{ -				add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_TOPIC_' . strtoupper($action) . 'D', $log_data['topic_title']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_TOPIC_' . strtoupper($action) . 'D', false, array( +					'forum_id' => $log_data['forum_id'], +					'topic_id' => $log_data['topic_id'], +					$log_data['topic_title'] +				));  			}  			// Only send out the mails, when the posts are being approved @@ -933,6 +947,7 @@ class mcp_queue  				$db->sql_freeresult($result);  				// Handle notifications +				/* @var $phpbb_notifications \phpbb\notification\manager */  				$phpbb_notifications = $phpbb_container->get('notification_manager');  				foreach ($topic_info as $topic_id => $topic_data) @@ -959,8 +974,8 @@ class mcp_queue  						), $topic_data);  					} -					$phpbb_notifications->mark_notifications_read('notification.type.quote', $topic_data['post_id'], $user->data['user_id']); -					$phpbb_notifications->mark_notifications_read('notification.type.topic', $topic_id, $user->data['user_id']); +					$phpbb_notifications->mark_notifications('quote', $topic_data['post_id'], $user->data['user_id']); +					$phpbb_notifications->mark_notifications('topic', $topic_id, $user->data['user_id']);  					if ($notify_poster)  					{ @@ -1055,7 +1070,7 @@ class mcp_queue  	static public function disapprove_posts($post_id_list, $id, $mode)  	{  		global $db, $template, $user, $config, $phpbb_container, $phpbb_dispatcher; -		global $phpEx, $phpbb_root_path, $request; +		global $phpEx, $phpbb_root_path, $request, $phpbb_log;  		if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))  		{ @@ -1204,16 +1219,28 @@ class mcp_queue  					if ($is_disapproving)  					{  						$l_log_message = ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED'; -						add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $disapprove_reason, $log_data['post_username']); +						$phpbb_log->add('mod', $user->data['user_id'], $user->ip, $l_log_message, false, array( +							'forum_id' => $log_data['forum_id'], +							'topic_id' => $log_data['topic_id'], +							$log_data['post_subject'], +							$disapprove_reason, +							$log_data['post_username'] +						));  					}  					else  					{  						$l_log_message = ($log_data['type'] == 'topic') ? 'LOG_DELETE_TOPIC' : 'LOG_DELETE_POST'; -						add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $log_data['post_username']); +						$phpbb_log->add('mod', $user->data['user_id'], $user->ip, $l_log_message, false, array( +							'forum_id' => $log_data['forum_id'], +							'topic_id' => $log_data['topic_id'], +							$log_data['post_subject'], +							$log_data['post_username'] +						));  					}  				}  			} +			/* @var $phpbb_notifications \phpbb\notification\manager */  			$phpbb_notifications = $phpbb_container->get('notification_manager');  			$lang_reasons = array(); @@ -1375,11 +1402,6 @@ class mcp_queue  		}  		else  		{ -			if (!function_exists('display_reasons')) -			{ -				include($phpbb_root_path . 'includes/functions_display.' . $phpEx); -			} -  			$show_notify = false;  			foreach ($post_info as $post_data) @@ -1399,7 +1421,7 @@ class mcp_queue  			$confirm_template = 'mcp_approve.html';  			if ($is_disapproving)  			{ -				display_reasons($reason_id); +				$phpbb_container->get('phpbb.report.report_reason_list_provider')->display_reasons($reason_id);  			}  			else  			{ diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php index fa2fed842f..3970237058 100644 --- a/phpBB/includes/mcp/mcp_reports.php +++ b/phpBB/includes/mcp/mcp_reports.php @@ -35,13 +35,13 @@ class mcp_reports  	function main($id, $mode)  	{ -		global $auth, $db, $user, $template, $cache; +		global $auth, $db, $user, $template, $cache, $request;  		global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container, $phpbb_dispatcher;  		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); -		$forum_id = request_var('f', 0); -		$start = request_var('start', 0); +		$forum_id = $request->variable('f', 0); +		$start = $request->variable('start', 0);  		$this->page_title = 'MCP_REPORTS'; @@ -51,7 +51,7 @@ class mcp_reports  			case 'delete':  				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); -				$report_id_list = request_var('report_id_list', array(0)); +				$report_id_list = $request->variable('report_id_list', array(0));  				if (!sizeof($report_id_list))  				{ @@ -69,10 +69,11 @@ class mcp_reports  				$user->add_lang(array('posting', 'viewforum', 'viewtopic')); -				$post_id = request_var('p', 0); +				$post_id = $request->variable('p', 0);  				// closed reports are accessed by report id -				$report_id = request_var('r', 0); +				$report_id = $request->variable('r', 0); +  				$sql_ary = array(  					'SELECT'	=> 'r.post_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, r.reported_post_text, r.reported_post_uid, r.reported_post_bitfield, r.reported_post_enable_magic_url, r.reported_post_enable_smilies, r.reported_post_enable_bbcode, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour', @@ -138,9 +139,10 @@ class mcp_reports  					trigger_error('NO_REPORT');  				} +				/* @var $phpbb_notifications \phpbb\notification\manager */  				$phpbb_notifications = $phpbb_container->get('notification_manager'); -				$phpbb_notifications->mark_notifications_read('notification.type.report_post', $post_id, $user->data['user_id']); +				$phpbb_notifications->mark_notifications('report_post', $post_id, $user->data['user_id']);  				if (!$report_id && $report['report_closed'])  				{ @@ -287,7 +289,7 @@ class mcp_reports  					'POST_SUBJECT'			=> ($post_info['post_subject']) ? $post_info['post_subject'] : $user->lang['NO_SUBJECT'],  					'POST_DATE'				=> $user->format_date($post_info['post_time']),  					'POST_IP'				=> $post_info['poster_ip'], -					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '', +					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',  					'POST_ID'				=> $post_info['post_id'],  					'U_LOOKUP_IP'			=> ($auth->acl_get('m_info', $post_info['forum_id'])) ? $this->u_action . '&r=' . $report_id . '&p=' . $post_id . '&f=' . $forum_id . '&lookup=' . $post_info['poster_ip'] . '#ip' : '', @@ -299,7 +301,7 @@ class mcp_reports  			case 'reports':  			case 'reports_closed': -				$topic_id = request_var('t', 0); +				$topic_id = $request->variable('t', 0);  				$forum_info = array();  				$forum_list_reports = get_forum_list('m_report', false, true); @@ -371,9 +373,10 @@ class mcp_reports  					$forum_list = array($forum_id);  				} +				/* @var $pagination \phpbb\pagination */ +				$pagination = $phpbb_container->get('pagination');  				$forum_list[] = 0;  				$forum_data = array(); -				$pagination = $phpbb_container->get('pagination');  				$forum_options = '<option value="0"' . (($forum_id == 0) ? ' selected="selected"' : '') . '>' . $user->lang['ALL_FORUMS'] . '</option>';  				foreach ($forum_list_reports as $row) @@ -519,7 +522,7 @@ class mcp_reports  */  function close_report($report_id_list, $mode, $action, $pm = false)  { -	global $db, $template, $user, $config, $auth; +	global $db, $template, $user, $config, $auth, $phpbb_log, $request;  	global $phpEx, $phpbb_root_path, $phpbb_container;  	$pm_where = ($pm) ? ' AND r.post_id = 0 ' : ' AND r.pm_id = 0 '; @@ -557,19 +560,19 @@ function close_report($report_id_list, $mode, $action, $pm = false)  	if ($action == 'delete' && strpos($user->data['session_page'], 'mode=report_details') !== false)  	{ -		$redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&mode=reports'); +		$redirect = $request->variable('redirect', build_url(array('mode', 'r', 'quickmod')) . '&mode=reports');  	}  	else if ($action == 'delete' && strpos($user->data['session_page'], 'mode=pm_report_details') !== false)  	{ -		$redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&mode=pm_reports'); +		$redirect = $request->variable('redirect', build_url(array('mode', 'r', 'quickmod')) . '&mode=pm_reports');  	} -	else if ($action == 'close' && !request_var('r', 0)) +	else if ($action == 'close' && !$request->variable('r', 0))  	{ -		$redirect = request_var('redirect', build_url(array('mode', 'p', 'quickmod')) . '&mode=' . $module); +		$redirect = $request->variable('redirect', build_url(array('mode', 'p', 'quickmod')) . '&mode=' . $module);  	}  	else  	{ -		$redirect = request_var('redirect', build_url(array('quickmod'))); +		$redirect = $request->variable('redirect', build_url(array('quickmod')));  	}  	$success_msg = '';  	$forum_ids = array(); @@ -694,18 +697,27 @@ function close_report($report_id_list, $mode, $action, $pm = false)  		}  		unset($close_report_posts, $close_report_topics); +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager');  		foreach ($reports as $report)  		{  			if ($pm)  			{ -				add_log('mod', 0, 0, 'LOG_PM_REPORT_' .  strtoupper($action) . 'D', $post_info[$report['pm_id']]['message_subject']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_PM_REPORT_' .  strtoupper($action) . 'D', false, array( +					'forum_id' => 0, +					'topic_id' => 0, +					$post_info[$report['pm_id']]['message_subject'] +				));  				$phpbb_notifications->delete_notifications('notification.type.report_pm', $report['pm_id']);  			}  			else  			{ -				add_log('mod', $post_info[$report['post_id']]['forum_id'], $post_info[$report['post_id']]['topic_id'], 'LOG_REPORT_' .  strtoupper($action) . 'D', $post_info[$report['post_id']]['post_subject']); +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_REPORT_' .  strtoupper($action) . 'D', false, array( +					'forum_id' => $post_info[$report['post_id']]['forum_id'], +					'topic_id' => $post_info[$report['post_id']]['topic_id'], +					$post_info[$report['post_id']]['post_subject'] +				));  				$phpbb_notifications->delete_notifications('notification.type.report_post', $report['post_id']);  			}  		} @@ -758,7 +770,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)  		confirm_box(false, $user->lang[strtoupper($action) . "_{$pm_prefix}REPORT" . ((sizeof($report_id_list) == 1) ? '' : 'S') . '_CONFIRM'], $s_hidden_fields);  	} -	$redirect = request_var('redirect', "index.$phpEx"); +	$redirect = $request->variable('redirect', "index.$phpEx");  	$redirect = reapply_sid($redirect);  	if (!$success_msg) diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php index 8347830d0f..66bcdad72c 100644 --- a/phpBB/includes/mcp/mcp_topic.php +++ b/phpBB/includes/mcp/mcp_topic.php @@ -24,15 +24,16 @@ if (!defined('IN_PHPBB'))  */  function mcp_topic_view($id, $mode, $action)  { -	global $phpEx, $phpbb_root_path, $config; +	global $phpEx, $phpbb_root_path, $config, $request;  	global $template, $db, $user, $auth, $cache, $phpbb_container, $phpbb_dispatcher;  	$url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . phpbb_extra_url()); -	$user->add_lang('viewtopic'); +	/* @var $pagination \phpbb\pagination */  	$pagination = $phpbb_container->get('pagination'); +	$user->add_lang('viewtopic'); -	$topic_id = request_var('t', 0); +	$topic_id = $request->variable('t', 0);  	$topic_info = phpbb_get_topic_data(array($topic_id), false, true);  	if (!sizeof($topic_info)) @@ -43,16 +44,16 @@ function mcp_topic_view($id, $mode, $action)  	$topic_info = $topic_info[$topic_id];  	// Set up some vars -	$icon_id		= request_var('icon', 0); -	$subject		= utf8_normalize_nfc(request_var('subject', '', true)); -	$start			= request_var('start', 0); -	$sort_days_old	= request_var('st_old', 0); -	$forum_id		= request_var('f', 0); -	$to_topic_id	= request_var('to_topic_id', 0); -	$to_forum_id	= request_var('to_forum_id', 0); +	$icon_id		= $request->variable('icon', 0); +	$subject		= $request->variable('subject', '', true); +	$start			= $request->variable('start', 0); +	$sort_days_old	= $request->variable('st_old', 0); +	$forum_id		= $request->variable('f', 0); +	$to_topic_id	= $request->variable('to_topic_id', 0); +	$to_forum_id	= $request->variable('to_forum_id', 0);  	$sort			= isset($_POST['sort']) ? true : false; -	$submitted_id_list	= request_var('post_ids', array(0)); -	$checked_ids = $post_id_list = request_var('post_id_list', array(0)); +	$submitted_id_list	= $request->variable('post_ids', array(0)); +	$checked_ids = $post_id_list = $request->variable('post_id_list', array(0));  	// Resync Topic?  	if ($action == 'resync') @@ -116,15 +117,16 @@ function mcp_topic_view($id, $mode, $action)  	$sort_by_sql = $sort_order_sql = array();  	phpbb_mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $topic_info['forum_id'], $topic_id, $where_sql); -	$limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : ''; +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility'); +	$limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';  	if ($total == -1)  	{  		$total = $phpbb_content_visibility->get_count('topic_posts', $topic_info, $topic_info['forum_id']);  	} -	$posts_per_page = max(0, request_var('posts_per_page', intval($config['posts_per_page']))); +	$posts_per_page = max(0, $request->variable('posts_per_page', intval($config['posts_per_page'])));  	if ($posts_per_page == 0)  	{  		$posts_per_page = $total; @@ -382,11 +384,11 @@ function mcp_topic_view($id, $mode, $action)  */  function split_topic($action, $topic_id, $to_forum_id, $subject)  { -	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $config; +	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $config, $phpbb_log, $request; -	$post_id_list	= request_var('post_id_list', array(0)); -	$forum_id		= request_var('forum_id', 0); -	$start			= request_var('start', 0); +	$post_id_list	= $request->variable('post_id_list', array(0)); +	$forum_id		= $request->variable('forum_id', 0); +	$start			= $request->variable('start', 0);  	if (!sizeof($post_id_list))  	{ @@ -440,7 +442,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)  		return;  	} -	$redirect = request_var('redirect', build_url(array('quickmod'))); +	$redirect = $request->variable('redirect', build_url(array('quickmod')));  	$s_hidden_fields = build_hidden_fields(array(  		'i'				=> 'main', @@ -453,7 +455,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)  		'redirect'		=> $redirect,  		'subject'		=> $subject,  		'to_forum_id'	=> $to_forum_id, -		'icon'			=> request_var('icon', 0)) +		'icon'			=> $request->variable('icon', 0))  	);  	$success_msg = $return_link = ''; @@ -516,7 +518,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)  			trigger_error('NO_POST_SELECTED');  		} -		$icon_id = request_var('icon', 0); +		$icon_id = $request->variable('icon', 0);  		$sql_ary = array(  			'forum_id'			=> $to_forum_id, @@ -534,8 +536,16 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)  		$topic_info = phpbb_get_topic_data(array($topic_id));  		$topic_info = $topic_info[$topic_id]; -		add_log('mod', $to_forum_id, $to_topic_id, 'LOG_SPLIT_DESTINATION', $subject); -		add_log('mod', $forum_id, $topic_id, 'LOG_SPLIT_SOURCE', $topic_info['topic_title']); +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SPLIT_DESTINATION', false, array( +			'forum_id' => $to_forum_id, +			'topic_id' => $to_topic_id, +			$subject +		)); +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SPLIT_SOURCE', false, array( +			'forum_id' => $forum_id, +			'topic_id' => $topic_id, +			$topic_info['topic_title'] +		));  		// Change topic title of first post  		$sql = 'UPDATE ' . POSTS_TABLE . " @@ -589,11 +599,11 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)  		$success_msg = 'TOPIC_SPLIT_SUCCESS';  		// Update forum statistics -		set_config_count('num_topics', 1, true); +		$config->increment('num_topics', 1, false);  		// Link back to both topics  		$return_link = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&t=' . $post_info['topic_id']) . '">', '</a>') . '<br /><br />' . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $to_forum_id . '&t=' . $to_topic_id) . '">', '</a>'); -		$redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&t=$to_topic_id"); +		$redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&t=$to_topic_id");  		$redirect = reapply_sid($redirect);  		meta_refresh(3, $redirect); @@ -610,7 +620,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)  */  function merge_posts($topic_id, $to_topic_id)  { -	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth; +	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $phpbb_log, $request;  	if (!$to_topic_id)  	{ @@ -636,8 +646,8 @@ function merge_posts($topic_id, $to_topic_id)  	$topic_data = $topic_data[$to_topic_id]; -	$post_id_list	= request_var('post_id_list', array(0)); -	$start			= request_var('start', 0); +	$post_id_list	= $request->variable('post_id_list', array(0)); +	$start			= $request->variable('start', 0);  	if (!sizeof($post_id_list))  	{ @@ -650,7 +660,7 @@ function merge_posts($topic_id, $to_topic_id)  		return;  	} -	$redirect = request_var('redirect', build_url(array('quickmod'))); +	$redirect = $request->variable('redirect', build_url(array('quickmod')));  	$s_hidden_fields = build_hidden_fields(array(  		'i'				=> 'main', @@ -669,7 +679,12 @@ function merge_posts($topic_id, $to_topic_id)  		$to_forum_id = $topic_data['forum_id'];  		move_posts($post_id_list, $to_topic_id, false); -		add_log('mod', $to_forum_id, $to_topic_id, 'LOG_MERGE', $topic_data['topic_title']); + +		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MERGE', false, array( +			'forum_id' => $to_forum_id, +			'topic_id' => $to_topic_id, +			$topic_data['topic_title'] +		));  		// Message and return links  		$success_msg = 'POSTS_MERGED_SUCCESS'; @@ -708,7 +723,7 @@ function merge_posts($topic_id, $to_topic_id)  		// Link to the new topic  		$return_link .= (($return_link) ? '<br /><br />' : '') . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $to_forum_id . '&t=' . $to_topic_id) . '">', '</a>'); -		$redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&t=$to_topic_id"); +		$redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&t=$to_topic_id");  		$redirect = reapply_sid($redirect);  		meta_refresh(3, $redirect); diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php index d724b8703b..970bdc6174 100644 --- a/phpBB/includes/mcp/mcp_warn.php +++ b/phpBB/includes/mcp/mcp_warn.php @@ -35,10 +35,10 @@ class mcp_warn  	function main($id, $mode)  	{ -		global $auth, $db, $user, $template; +		global $auth, $db, $user, $template, $request;  		global $config, $phpbb_root_path, $phpEx; -		$action = request_var('action', array('' => '')); +		$action = $request->variable('action', array('' => ''));  		if (is_array($action))  		{ @@ -132,15 +132,16 @@ class mcp_warn  	function mcp_warn_list_view($action)  	{  		global $phpEx, $phpbb_root_path, $config, $phpbb_container; -		global $template, $db, $user, $auth; +		global $template, $db, $user, $auth, $request; -		$user->add_lang('memberlist'); +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination'); +		$user->add_lang('memberlist'); -		$start	= request_var('start', 0); -		$st		= request_var('st', 0); -		$sk		= request_var('sk', 'b'); -		$sd		= request_var('sd', 'd'); +		$start	= $request->variable('start', 0); +		$st		= $request->variable('st', 0); +		$sk		= $request->variable('sk', 'b'); +		$sd		= $request->variable('sd', 'd');  		$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  		$sort_by_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_DATE'], 'c' => $user->lang['SORT_WARNINGS']); @@ -189,13 +190,13 @@ class mcp_warn  	*/  	function mcp_warn_post_view($action)  	{ -		global $phpEx, $phpbb_root_path, $config; +		global $phpEx, $phpbb_root_path, $config, $request;  		global $template, $db, $user, $auth, $phpbb_dispatcher; -		$post_id = request_var('p', 0); -		$forum_id = request_var('f', 0); +		$post_id = $request->variable('p', 0); +		$forum_id = $request->variable('f', 0);  		$notify = (isset($_REQUEST['notify_user'])) ? true : false; -		$warning = utf8_normalize_nfc(request_var('warning', '', true)); +		$warning = $request->variable('warning', '', true);  		$sql = 'SELECT u.*, p.*  			FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u @@ -369,13 +370,13 @@ class mcp_warn  	*/  	function mcp_warn_user_view($action)  	{ -		global $phpEx, $phpbb_root_path, $config, $module; +		global $phpEx, $phpbb_root_path, $config, $module, $request;  		global $template, $db, $user, $auth, $phpbb_dispatcher; -		$user_id = request_var('u', 0); -		$username = request_var('username', '', true); +		$user_id = $request->variable('u', 0); +		$username = $request->variable('username', '', true);  		$notify = (isset($_REQUEST['notify_user'])) ? true : false; -		$warning = utf8_normalize_nfc(request_var('warning', '', true)); +		$warning = $request->variable('warning', '', true);  		$sql_where = ($user_id) ? "user_id = $user_id" : "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'"; @@ -522,7 +523,7 @@ class mcp_warn  */  function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)  { -	global $phpEx, $phpbb_root_path, $config; +	global $phpEx, $phpbb_root_path, $config, $phpbb_log;  	global $template, $db, $user, $auth;  	if ($send_pm) @@ -556,8 +557,11 @@ function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)  		submit_pm('post', $user->lang('WARNING_PM_SUBJECT'), $pm_data, false);  	} -	add_log('admin', 'LOG_USER_WARNING', $user_row['username']); -	$log_id = add_log('user', $user_row['user_id'], 'LOG_USER_WARNING_BODY', $warning); +	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_WARNING', false, array($user_row['username'])); +	$log_id = $phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_WARNING_BODY', false, array( +		'reportee_id' => $user_row['user_id'], +		$warning +	));  	$sql_ary = array(  		'user_id'		=> $user_row['user_id'], @@ -582,5 +586,9 @@ function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)  	$row = $db->sql_fetchrow($result);  	$db->sql_freeresult($result); -	add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_USER_WARNING', $user_row['username']); +	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_USER_WARNING', false, array( +		'forum_id' => $row['forum_id'], +		'topic_id' => $row['topic_id'], +		$user_row['username'] +	));  } diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php index 8b3d8d9fd5..5afbe5062e 100644 --- a/phpBB/includes/message_parser.php +++ b/phpBB/includes/message_parser.php @@ -83,7 +83,14 @@ class bbcode_firstpass extends bbcode  					// it should not demand recompilation  					if (preg_match($regexp, $this->message))  					{ -						$this->message = preg_replace($regexp, $replacement, $this->message); +						if (is_callable($replacement)) +						{ +							$this->message = preg_replace_callback($regexp, $replacement, $this->message); +						} +						else +						{ +							$this->message = preg_replace($regexp, $replacement, $this->message); +						}  						$bitfield->set($bbcode_data['bbcode_id']);  					}  				} @@ -123,6 +130,8 @@ class bbcode_firstpass extends bbcode  		static $rowset; +		$bbcode_class = $this; +  		// This array holds all bbcode data. BBCodes will be processed in this  		// order, so it is important to keep [code] in first position and  		// [quote] in second position. @@ -132,19 +141,71 @@ class bbcode_firstpass extends bbcode  		// To perform custom validation in extension, use $this->validate_bbcode_by_extension()  		// method which accepts variable number of parameters  		$this->bbcodes = array( -			'code'			=> array('bbcode_id' => 8,	'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uise' => "\$this->bbcode_code('\$1', '\$2')")), -			'quote'			=> array('bbcode_id' => 0,	'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#uise' => "\$this->bbcode_quote('\$0')")), -			'attachment'	=> array('bbcode_id' => 12,	'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uise' => "\$this->bbcode_attachment('\$1', '\$2')")), -			'b'				=> array('bbcode_id' => 1,	'regexp' => array('#\[b\](.*?)\[/b\]#uise' => "\$this->bbcode_strong('\$1')")), -			'i'				=> array('bbcode_id' => 2,	'regexp' => array('#\[i\](.*?)\[/i\]#uise' => "\$this->bbcode_italic('\$1')")), -			'url'			=> array('bbcode_id' => 3,	'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiUe' => "\$this->validate_url('\$2', ('\$3') ? '\$3' : '\$4')")), -			'img'			=> array('bbcode_id' => 4,	'regexp' => array('#\[img\](.*)\[/img\]#uiUe' => "\$this->bbcode_img('\$1')")), -			'size'			=> array('bbcode_id' => 5,	'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uise' => "\$this->bbcode_size('\$1', '\$2')")), -			'color'			=> array('bbcode_id' => 6,	'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uise' => "\$this->bbcode_color('\$1', '\$2')")), -			'u'				=> array('bbcode_id' => 7,	'regexp' => array('#\[u\](.*?)\[/u\]#uise' => "\$this->bbcode_underline('\$1')")), -			'list'			=> array('bbcode_id' => 9,	'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uise' => "\$this->bbcode_parse_list('\$0')")), -			'email'			=> array('bbcode_id' => 10,	'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uise' => "\$this->validate_email('\$1', '\$2')")), -			'flash'			=> array('bbcode_id' => 11,	'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#uie' => "\$this->bbcode_flash('\$1', '\$2', '\$3')")) +			'code'			=> array('bbcode_id' => 8,	'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_code($match[1], $match[2]); +				} +			)), +			'quote'			=> array('bbcode_id' => 0,	'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_quote($match[0]); +				} +			)), +			'attachment'	=> array('bbcode_id' => 12,	'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_attachment($match[1], $match[2]); +				} +			)), +			'b'				=> array('bbcode_id' => 1,	'regexp' => array('#\[b\](.*?)\[/b\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_strong($match[1]); +				} +			)), +			'i'				=> array('bbcode_id' => 2,	'regexp' => array('#\[i\](.*?)\[/i\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_italic($match[1]); +				} +			)), +			'url'			=> array('bbcode_id' => 3,	'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiU' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->validate_url($match[2], ($match[3]) ? $match[3] : $match[4]); +				} +			)), +			'img'			=> array('bbcode_id' => 4,	'regexp' => array('#\[img\](.*)\[/img\]#uiU' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_img($match[1]); +				} +			)), +			'size'			=> array('bbcode_id' => 5,	'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_size($match[1], $match[2]); +				} +			)), +			'color'			=> array('bbcode_id' => 6,	'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_color($match[1], $match[2]); +				} +			)), +			'u'				=> array('bbcode_id' => 7,	'regexp' => array('#\[u\](.*?)\[/u\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_underline($match[1]); +				} +			)), +			'list'			=> array('bbcode_id' => 9,	'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_parse_list($match[0]); +				} +			)), +			'email'			=> array('bbcode_id' => 10,	'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uis' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->validate_email($match[1], $match[2]); +				} +			)), +			'flash'			=> array('bbcode_id' => 11,	'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ui' => function ($match) use($bbcode_class) +				{ +					return $bbcode_class->bbcode_flash($match[1], $match[2], $match[3]); +				} +			))  		);  		// Zero the parsed items array @@ -342,22 +403,23 @@ class bbcode_firstpass extends bbcode  		if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width'])  		{ -			$stats = @getimagesize(htmlspecialchars_decode($in)); +			$imagesize = new \fastImageSize\fastImageSize(); +			$size_info = $imagesize->getImageSize(htmlspecialchars_decode($in)); -			if ($stats === false) +			if ($size_info === false)  			{  				$error = true;  				$this->warn_msg[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];  			}  			else  			{ -				if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $stats[1]) +				if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $size_info['height'])  				{  					$error = true;  					$this->warn_msg[] = $user->lang('MAX_IMG_HEIGHT_EXCEEDED', (int) $config['max_' . $this->mode . '_img_height']);  				} -				if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $stats[0]) +				if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $size_info['width'])  				{  					$error = true;  					$this->warn_msg[] = $user->lang('MAX_IMG_WIDTH_EXCEEDED', (int) $config['max_' . $this->mode . '_img_width']); @@ -746,7 +808,9 @@ class bbcode_firstpass extends bbcode  		}  		// To let the parser not catch tokens within quote_username quotes we encode them before we start this... -		$in = preg_replace('#quote="(.*?)"\]#ie', "'quote="' . str_replace(array('[', ']', '\\\"'), array('[', ']', '\"'), '\$1') . '"]'", $in); +		$in = preg_replace_callback('#quote="(.*?)"\]#i', function ($match) { +			return 'quote="' . str_replace(array('[', ']', '\\\"'), array('[', ']', '\"'), $match[1]) . '"]'; +		}, $in);  		$tok = ']';  		$out = '['; @@ -1097,7 +1161,7 @@ class parse_message extends bbcode_firstpass  	*/  	function parse($allow_bbcode, $allow_magic_url, $allow_smilies, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true, $update_this_message = true, $mode = 'post')  	{ -		global $config, $db, $user, $phpbb_dispatcher; +		global $config, $db, $user, $phpbb_dispatcher, $phpbb_container;  		$this->mode = $mode; @@ -1126,12 +1190,6 @@ class parse_message extends bbcode_firstpass  			$this->decode_message();  		} -		// Do some general 'cleanup' first before processing message, -		// e.g. remove excessive newlines(?), smilies(?) -		$match = array('#(script|about|applet|activex|chrome):#i'); -		$replace = array("\\1:"); -		$this->message = preg_replace($match, $replace, trim($this->message)); -  		// Store message length...  		$message_length = ($mode == 'post') ? utf8_strlen($this->message) : utf8_strlen(preg_replace('#\[\/?[a-z\*\+\-]+(=[\S]+)?\]#ius', ' ', $this->message)); @@ -1204,56 +1262,29 @@ class parse_message extends bbcode_firstpass  			return (!$update_this_message) ? $return_message : $this->warn_msg;  		} -		// Prepare BBcode (just prepares some tags for better parsing) -		if ($allow_bbcode && strpos($this->message, '[') !== false) -		{ -			$this->bbcode_init(); -			$disallow = array('img', 'flash', 'quote', 'url'); -			foreach ($disallow as $bool) -			{ -				if (!${'allow_' . $bool . '_bbcode'}) -				{ -					$this->bbcodes[$bool]['disabled'] = true; -				} -			} - -			$this->prepare_bbcodes(); -		} +		// Get the parser +		$parser = $phpbb_container->get('text_formatter.parser'); -		// Parse smilies -		if ($allow_smilies) -		{ -			$this->smilies($config['max_' . $mode . '_smilies']); -		} +		// Set the parser's options +		($allow_bbcode)       ? $parser->enable_bbcodes()       : $parser->disable_bbcodes(); +		($allow_magic_url)    ? $parser->enable_magic_url()     : $parser->disable_magic_url(); +		($allow_smilies)      ? $parser->enable_smilies()       : $parser->disable_smilies(); +		($allow_img_bbcode)   ? $parser->enable_bbcode('img')   : $parser->disable_bbcode('img'); +		($allow_flash_bbcode) ? $parser->enable_bbcode('flash') : $parser->disable_bbcode('flash'); +		($allow_quote_bbcode) ? $parser->enable_bbcode('quote') : $parser->disable_bbcode('quote'); +		($allow_url_bbcode)   ? $parser->enable_bbcode('url')   : $parser->disable_bbcode('url'); -		$num_urls = 0; +		// Set some config values +		$parser->set_vars(array( +			'max_font_size'  => $config['max_' . $this->mode . '_font_size'], +			'max_img_height' => $config['max_' . $this->mode . '_img_height'], +			'max_img_width'  => $config['max_' . $this->mode . '_img_width'], +			'max_smilies'    => $config['max_' . $this->mode . '_smilies'], +			'max_urls'       => $config['max_' . $this->mode . '_urls'] +		)); -		// Parse BBCode -		if ($allow_bbcode && strpos($this->message, '[') !== false) -		{ -			$this->parse_bbcode(); -			$num_urls += $this->parsed_items['url']; -		} - -		// Parse URL's -		if ($allow_magic_url) -		{ -			$this->magic_url(generate_board_url()); - -			if ($config['max_' . $mode . '_urls']) -			{ -				$num_urls += preg_match_all('#\<!-- ([lmwe]) --\>.*?\<!-- \1 --\>#', $this->message, $matches); -			} -		} - -		// Check for out-of-bounds characters that are currently -		// not supported by utf8_bin in MySQL -		if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $this->message, $matches)) -		{ -			$character_list = implode('<br />', $matches[0]); -			$this->warn_msg[] = $user->lang('UNSUPPORTED_CHARACTERS_MESSAGE', $character_list); -			return $update_this_message ? $this->warn_msg : $return_message; -		} +		// Parse this message +		$this->message = $parser->parse(htmlspecialchars_decode($this->message, ENT_QUOTES));  		// Remove quotes that are nested too deep  		if ($config['max_quote_depth'] > 0) @@ -1269,10 +1300,27 @@ class parse_message extends bbcode_firstpass  			return (!$update_this_message) ? $return_message : $this->warn_msg;  		} -		// Check number of links -		if ($config['max_' . $mode . '_urls'] && $num_urls > $config['max_' . $mode . '_urls']) +		// Remove quotes that are nested too deep +		if ($config['max_quote_depth'] > 0) +		{ +			$this->message = $phpbb_container->get('text_formatter.utils')->remove_bbcode( +				$this->message, +				'quote', +				$config['max_quote_depth'] +			); +		} + +		// Check for errors +		$errors = $parser->get_errors(); +		if ($errors)  		{ -			$this->warn_msg[] = sprintf($user->lang['TOO_MANY_URLS'], $config['max_' . $mode . '_urls']); +			foreach ($errors as $i => $args) +			{ +				// Translate each error with $user->lang() +				$errors[$i] = call_user_func_array(array($user, 'lang'), $args); +			} +			$this->warn_msg = array_merge($this->warn_msg, $errors); +  			return (!$update_this_message) ? $return_message : $this->warn_msg;  		} @@ -1292,7 +1340,7 @@ class parse_message extends bbcode_firstpass  	*/  	function format_display($allow_bbcode, $allow_magic_url, $allow_smilies, $update_this_message = true)  	{ -		global $phpbb_dispatcher; +		global $phpbb_container, $phpbb_dispatcher;  		// If false, then the parsed message get returned but internal message not processed.  		if (!$update_this_message) @@ -1301,26 +1349,25 @@ class parse_message extends bbcode_firstpass  			$return_message = &$this->message;  		} -		if ($this->message_status == 'plain') +		// NOTE: message_status is unreliable for detecting unparsed text because some callers +		//       change $this->message without resetting $this->message_status to 'plain' so we +		//       inspect the message instead +		//if ($this->message_status == 'plain') +		if (!preg_match('/^<[rt][ >]/', $this->message))  		{  			// Force updating message - of course.  			$this->parse($allow_bbcode, $allow_magic_url, $allow_smilies, $this->allow_img_bbcode, $this->allow_flash_bbcode, $this->allow_quote_bbcode, $this->allow_url_bbcode, true);  		} -		// Replace naughty words such as farty pants -		$this->message = censor_text($this->message); - -		// Parse BBcode -		if ($allow_bbcode) +		// There's a bug when previewing a topic with no poll, because the empty title of the poll +		// gets parsed but $this->message still ends up empty. This fixes it, until a proper fix is +		// devised +		if ($this->message === '')  		{ -			$this->bbcode_cache_init(); - -			// We are giving those parameters to be able to use the bbcode class on its own -			$this->bbcode_second_pass($this->message, $this->bbcode_uid); +			$this->message = $phpbb_container->get('text_formatter.parser')->parse($this->message);  		} -		$this->message = bbcode_nl2br($this->message); -		$this->message = smiley_text($this->message, !$allow_smilies); +		$this->message = $phpbb_container->get('text_formatter.renderer')->render($this->message);  		$text = $this->message;  		$uid = $this->bbcode_uid; @@ -1475,7 +1522,7 @@ class parse_message extends bbcode_firstpass  		$error = array();  		$num_attachments = sizeof($this->attachment_data); -		$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true)); +		$this->filename_data['filecomment'] = $request->variable('filecomment', '', true);  		$upload = $request->file($form_name);  		$upload_file = (!empty($upload) && $upload['name'] !== 'none' && trim($upload['name'])); @@ -1483,7 +1530,7 @@ class parse_message extends bbcode_firstpass  		$delete_file	= (isset($_POST['delete_file'])) ? true : false;  		// First of all adjust comments if changed -		$actual_comment_list = utf8_normalize_nfc(request_var('comment_list', array(''), true)); +		$actual_comment_list = $request->variable('comment_list', array(''), true);  		foreach ($actual_comment_list as $comment_key => $comment)  		{ @@ -1536,7 +1583,9 @@ class parse_message extends bbcode_firstpass  					);  					$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data); -					$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message); +					$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) { +						return '[attachment='.($match[1] + 1).']' . $match[2] . '[/attachment]'; +					}, $this->message);  					$this->filename_data['filecomment'] = ''; @@ -1569,7 +1618,7 @@ class parse_message extends bbcode_firstpass  			{  				include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx); -				$index = array_keys(request_var('delete_file', array(0 => 0))); +				$index = array_keys($request->variable('delete_file', array(0 => 0)));  				$index = (!empty($index)) ? $index[0] : false;  				if ($index !== false && !empty($this->attachment_data[$index])) @@ -1604,7 +1653,9 @@ class parse_message extends bbcode_firstpass  					}  					unset($this->attachment_data[$index]); -					$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "(\\1 == \$index) ? '' : ((\\1 > \$index) ? '[attachment=' . (\\1 - 1) . ']\\2[/attachment]' : '\\0')", $this->message); +					$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) use($index) { +						return ($match[1] == $index) ? '' : (($match[1] > $index) ? '[attachment=' . ($match[1] - 1) . ']' . $match[2] . '[/attachment]' : $match[0]); +					}, $this->message);  					// Reindex Array  					$this->attachment_data = array_values($this->attachment_data); @@ -1648,7 +1699,9 @@ class parse_message extends bbcode_firstpass  						);  						$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data); -						$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message); +						$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) { +							return '[attachment=' . ($match[1] + 1) . ']' . $match[2] . '[/attachment]'; +						}, $this->message);  						$this->filename_data['filecomment'] = '';  						if (isset($this->plupload) && $this->plupload->is_active()) @@ -1695,7 +1748,7 @@ class parse_message extends bbcode_firstpass  		global $user, $db, $phpbb_root_path, $phpEx, $config;  		global $request; -		$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true)); +		$this->filename_data['filecomment'] = $request->variable('filecomment', '', true);  		$attachment_data = $request->variable('attachment_data', array(0 => array('' => '')), true, \phpbb\request\request_interface::POST);  		$this->attachment_data = array(); @@ -1784,24 +1837,22 @@ class parse_message extends bbcode_firstpass  		$poll_max_options = $poll['poll_max_options']; -		// Parse Poll Option text ;) +		// Parse Poll Option text  		$tmp_message = $this->message; -		$this->message = $poll['poll_option_text']; -		$bbcode_bitfield = $this->bbcode_bitfield; -		$poll['poll_option_text'] = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false, 'poll'); +		$poll['poll_options'] = explode("\n", trim($poll['poll_option_text'])); +		$poll['poll_options_size'] = sizeof($poll['poll_options']); -		$bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield)); -		$this->message = $tmp_message; +		foreach ($poll['poll_options'] as &$poll_option) +		{ +			$this->message = $poll_option; +			$poll_option = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false, 'poll'); +		} +		unset($poll_option); +		$poll['poll_option_text'] = implode("\n", $poll['poll_options']);  		// Parse Poll Title -		$tmp_message = $this->message;  		$this->message = $poll['poll_title']; -		$this->bbcode_bitfield = $bbcode_bitfield; - -		$poll['poll_options'] = explode("\n", trim($poll['poll_option_text'])); -		$poll['poll_options_size'] = sizeof($poll['poll_options']); -  		if (!$poll['poll_title'] && $poll['poll_options_size'])  		{  			$this->warn_msg[] = $user->lang['NO_POLL_TITLE']; @@ -1819,10 +1870,6 @@ class parse_message extends bbcode_firstpass  			}  		} -		$this->bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield)); -		$this->message = $tmp_message; -		unset($tmp_message); -  		if (sizeof($poll['poll_options']) == 1)  		{  			$this->warn_msg[] = $user->lang['TOO_FEW_POLL_OPTIONS']; @@ -1837,6 +1884,8 @@ class parse_message extends bbcode_firstpass  		}  		$poll['poll_max_options'] = ($poll['poll_max_options'] < 1) ? 1 : (($poll['poll_max_options'] > $config['max_poll_options']) ? $config['max_poll_options'] : $poll['poll_max_options']); + +		$this->message = $tmp_message;  	}  	/** @@ -1847,6 +1896,19 @@ class parse_message extends bbcode_firstpass  	*/  	public function remove_nested_quotes($max_depth)  	{ +		global $phpbb_container; + +		if (preg_match('#^<[rt][ >]#', $this->message)) +		{ +			$this->message = $phpbb_container->get('text_formatter.utils')->remove_bbcode( +				$this->message, +				'quote', +				$max_depth +			); + +			return; +		} +  		// Capture all [quote] and [/quote] tags  		preg_match_all('(\\[/?quote(?:="(.*?)")?:' . $this->bbcode_uid . '\\])', $this->message, $matches, PREG_OFFSET_CAPTURE); diff --git a/phpBB/includes/questionnaire/questionnaire.php b/phpBB/includes/questionnaire/questionnaire.php index 63ea432863..8fe93735ee 100644 --- a/phpBB/includes/questionnaire/questionnaire.php +++ b/phpBB/includes/questionnaire/questionnaire.php @@ -230,7 +230,7 @@ class phpbb_questionnaire_phpbb_data_provider  		if (empty($config['questionnaire_unique_id']))  		{  			$this->unique_id = unique_id(); -			set_config('questionnaire_unique_id', $this->unique_id); +			$config->set('questionnaire_unique_id', $this->unique_id);  		}  		else  		{ diff --git a/phpBB/includes/startup.php b/phpBB/includes/startup.php index 7353b90d99..5900016c39 100644 --- a/phpBB/includes/startup.php +++ b/phpBB/includes/startup.php @@ -19,10 +19,6 @@ if (!defined('IN_PHPBB'))  }  // Report all errors, except notices and deprecation messages -if (!defined('E_DEPRECATED')) -{ -	define('E_DEPRECATED', 8192); -}  $level = E_ALL & ~E_NOTICE & ~E_DEPRECATED;  error_reporting($level); @@ -109,33 +105,21 @@ else  	define('STRIP', (get_magic_quotes_gpc()) ? true : false);  } -// Prevent date/time functions from throwing E_WARNING on PHP 5.3 by setting a default timezone -if (function_exists('date_default_timezone_set') && function_exists('date_default_timezone_get')) -{ -	// For PHP 5.1.0 the date/time functions have been rewritten -	// and setting a timezone is required prior to calling any date/time function. - -	// Since PHP 5.2.0 calls to date/time functions without having a timezone set -	// result in E_STRICT errors being thrown. -	// Note: We already exclude E_STRICT errors -	// (to be exact: they are not included in E_ALL in PHP 5.2) - -	// In PHP 5.3.0 the error level has been raised to E_WARNING which causes problems -	// because we show E_WARNING errors and do not set a default timezone. -	// This is because we have our own timezone handling and work in UTC only anyway. +// In PHP 5.3.0 the error level has been raised to E_WARNING which causes problems +// because we show E_WARNING errors and do not set a default timezone. +// This is because we have our own timezone handling and work in UTC only anyway. -	// So what we basically want to do is set our timezone to UTC, -	// but we don't know what other scripts (such as bridges) are involved, -	// so we check whether a timezone is already set by calling date_default_timezone_get(). +// So what we basically want to do is set our timezone to UTC, +// but we don't know what other scripts (such as bridges) are involved, +// so we check whether a timezone is already set by calling date_default_timezone_get(). -	// Unfortunately, date_default_timezone_get() itself might throw E_WARNING -	// if no timezone has been set, so we have to keep it quiet with @. +// Unfortunately, date_default_timezone_get() itself might throw E_WARNING +// if no timezone has been set, so we have to keep it quiet with @. -	// date_default_timezone_get() tries to guess the correct timezone first -	// and then falls back to UTC when everything fails. -	// We just set the timezone to whatever date_default_timezone_get() returns. -	date_default_timezone_set(@date_default_timezone_get()); -} +// date_default_timezone_get() tries to guess the correct timezone first +// and then falls back to UTC when everything fails. +// We just set the timezone to whatever date_default_timezone_get() returns. +date_default_timezone_set(@date_default_timezone_get());  // Autoloading of dependencies.  // Three options are supported: @@ -172,5 +156,4 @@ else  	require($phpbb_root_path . 'vendor/autoload.php');  } -$starttime = explode(' ', microtime()); -$starttime = $starttime[1] + $starttime[0]; +$starttime = microtime(true); diff --git a/phpBB/includes/ucp/info/ucp_attachments.php b/phpBB/includes/ucp/info/ucp_attachments.php index 2e20106f5c..96e7956db9 100644 --- a/phpBB/includes/ucp/info/ucp_attachments.php +++ b/phpBB/includes/ucp/info/ucp_attachments.php @@ -18,7 +18,6 @@ class ucp_attachments_info  		return array(  			'filename'	=> 'ucp_attachments',  			'title'		=> 'UCP_ATTACHMENTS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'attachments'	=> array('title' => 'UCP_MAIN_ATTACHMENTS', 'auth' => 'acl_u_attach', 'cat' => array('UCP_MAIN')),  			), diff --git a/phpBB/includes/ucp/info/ucp_auth_link.php b/phpBB/includes/ucp/info/ucp_auth_link.php index 9ec4cb7b3a..57c9269c5e 100644 --- a/phpBB/includes/ucp/info/ucp_auth_link.php +++ b/phpBB/includes/ucp/info/ucp_auth_link.php @@ -18,7 +18,6 @@ class ucp_auth_link_info  		return array(  			'filename'	=> 'ucp_auth_link',  			'title'		=> 'UCP_AUTH_LINK', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'auth_link'	=> array('title' => 'UCP_AUTH_LINK_MANAGE', 'auth' => 'authmethod_oauth', 'cat' => array('UCP_PROFILE')),  			), diff --git a/phpBB/includes/ucp/info/ucp_groups.php b/phpBB/includes/ucp/info/ucp_groups.php index 6da2a4fe38..42eb285075 100644 --- a/phpBB/includes/ucp/info/ucp_groups.php +++ b/phpBB/includes/ucp/info/ucp_groups.php @@ -18,7 +18,6 @@ class ucp_groups_info  		return array(  			'filename'	=> 'ucp_groups',  			'title'		=> 'UCP_USERGROUPS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'membership'	=> array('title' => 'UCP_USERGROUPS_MEMBER', 'auth' => '', 'cat' => array('UCP_USERGROUPS')),  				'manage'		=> array('title' => 'UCP_USERGROUPS_MANAGE', 'auth' => '', 'cat' => array('UCP_USERGROUPS')), diff --git a/phpBB/includes/ucp/info/ucp_main.php b/phpBB/includes/ucp/info/ucp_main.php index de8e7d5602..e967b8445f 100644 --- a/phpBB/includes/ucp/info/ucp_main.php +++ b/phpBB/includes/ucp/info/ucp_main.php @@ -18,7 +18,6 @@ class ucp_main_info  		return array(  			'filename'	=> 'ucp_main',  			'title'		=> 'UCP_MAIN', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'front'			=> array('title' => 'UCP_MAIN_FRONT', 'auth' => '', 'cat' => array('UCP_MAIN')),  				'subscribed'	=> array('title' => 'UCP_MAIN_SUBSCRIBED', 'auth' => '', 'cat' => array('UCP_MAIN')), diff --git a/phpBB/includes/ucp/info/ucp_notifications.php b/phpBB/includes/ucp/info/ucp_notifications.php index 0cc011d96e..94e0467ccb 100644 --- a/phpBB/includes/ucp/info/ucp_notifications.php +++ b/phpBB/includes/ucp/info/ucp_notifications.php @@ -18,10 +18,9 @@ class ucp_notifications_info  		return array(  			'filename'	=> 'ucp_notifications',  			'title'		=> 'UCP_NOTIFICATION_OPTIONS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'notification_options'		=> array('title' => 'UCP_NOTIFICATION_OPTIONS', 'auth' => '', 'cat' => array('UCP_PREFS')), -				'notification_list'			=> array('title' => 'UCP_NOTIFICATION_LIST', 'auth' => '', 'cat' => array('UCP_MAIN')), +				'notification_list'			=> array('title' => 'UCP_NOTIFICATION_LIST',    'auth' => 'cfg_allow_board_notifications', 'cat' => array('UCP_MAIN')),  			),  		);  	} diff --git a/phpBB/includes/ucp/info/ucp_pm.php b/phpBB/includes/ucp/info/ucp_pm.php index 6aa1669cb6..26bd670fc5 100644 --- a/phpBB/includes/ucp/info/ucp_pm.php +++ b/phpBB/includes/ucp/info/ucp_pm.php @@ -18,7 +18,6 @@ class ucp_pm_info  		return array(  			'filename'	=> 'ucp_pm',  			'title'		=> 'UCP_PM', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'view'		=> array('title' => 'UCP_PM_VIEW', 'auth' => 'cfg_allow_privmsg', 'display' => false, 'cat' => array('UCP_PM')),  				'compose'	=> array('title' => 'UCP_PM_COMPOSE', 'auth' => 'cfg_allow_privmsg', 'cat' => array('UCP_PM')), diff --git a/phpBB/includes/ucp/info/ucp_prefs.php b/phpBB/includes/ucp/info/ucp_prefs.php index 5c2d29ac73..4793aa2649 100644 --- a/phpBB/includes/ucp/info/ucp_prefs.php +++ b/phpBB/includes/ucp/info/ucp_prefs.php @@ -18,7 +18,6 @@ class ucp_prefs_info  		return array(  			'filename'	=> 'ucp_prefs',  			'title'		=> 'UCP_PREFS', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'personal'	=> array('title' => 'UCP_PREFS_PERSONAL', 'auth' => '', 'cat' => array('UCP_PREFS')),  				'post'		=> array('title' => 'UCP_PREFS_POST', 'auth' => '', 'cat' => array('UCP_PREFS')), diff --git a/phpBB/includes/ucp/info/ucp_profile.php b/phpBB/includes/ucp/info/ucp_profile.php index 919de99a96..fc2792224d 100644 --- a/phpBB/includes/ucp/info/ucp_profile.php +++ b/phpBB/includes/ucp/info/ucp_profile.php @@ -18,7 +18,6 @@ class ucp_profile_info  		return array(  			'filename'	=> 'ucp_profile',  			'title'		=> 'UCP_PROFILE', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'profile_info'	=> array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => 'acl_u_chgprofileinfo', 'cat' => array('UCP_PROFILE')),  				'signature'		=> array('title' => 'UCP_PROFILE_SIGNATURE', 'auth' => 'acl_u_sig', 'cat' => array('UCP_PROFILE')), diff --git a/phpBB/includes/ucp/info/ucp_zebra.php b/phpBB/includes/ucp/info/ucp_zebra.php index 99d4a4f4c0..69274c2866 100644 --- a/phpBB/includes/ucp/info/ucp_zebra.php +++ b/phpBB/includes/ucp/info/ucp_zebra.php @@ -18,7 +18,6 @@ class ucp_zebra_info  		return array(  			'filename'	=> 'ucp_zebra',  			'title'		=> 'UCP_ZEBRA', -			'version'	=> '1.0.0',  			'modes'		=> array(  				'friends'		=> array('title' => 'UCP_ZEBRA_FRIENDS', 'auth' => '', 'cat' => array('UCP_ZEBRA')),  				'foes'			=> array('title' => 'UCP_ZEBRA_FOES', 'auth' => '', 'cat' => array('UCP_ZEBRA')), diff --git a/phpBB/includes/ucp/ucp_activate.php b/phpBB/includes/ucp/ucp_activate.php index 6e357b260a..f535073434 100644 --- a/phpBB/includes/ucp/ucp_activate.php +++ b/phpBB/includes/ucp/ucp_activate.php @@ -29,11 +29,11 @@ class ucp_activate  	function main($id, $mode)  	{ -		global $config, $phpbb_root_path, $phpEx; -		global $db, $user, $auth, $template, $phpbb_container; +		global $config, $phpbb_root_path, $phpEx, $request; +		global $db, $user, $auth, $template, $phpbb_container, $phpbb_log; -		$user_id = request_var('u', 0); -		$key = request_var('k', ''); +		$user_id = $request->variable('u', 0); +		$key = $request->variable('k', '');  		$sql = 'SELECT user_id, username, user_type, user_email, user_newpasswd, user_lang, user_notify_type, user_actkey, user_inactive_reason  			FROM ' . USERS_TABLE . " @@ -86,7 +86,10 @@ class ucp_activate  				WHERE user_id = ' . $user_row['user_id'];  			$db->sql_query($sql); -			add_log('user', $user_row['user_id'], 'LOG_USER_NEW_PASSWORD', $user_row['username']); +			$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array( +				'reportee_id' => $user_row['user_id'], +				$user_row['username'] +			));  		}  		if (!$update_password) @@ -101,15 +104,19 @@ class ucp_activate  			$db->sql_query($sql);  			// Create the correct logs -			add_log('user', $user_row['user_id'], 'LOG_USER_ACTIVE_USER'); +			$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE_USER', false, array( +				'reportee_id' => $user_row['user_id'] +			)); +  			if ($auth->acl_get('a_user'))  			{ -				add_log('admin', 'LOG_USER_ACTIVE', $user_row['username']); +				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE', false, array($user_row['username']));  			}  		}  		if ($config['require_activation'] == USER_ACTIVATION_ADMIN && !$update_password)  		{ +			/* @var $phpbb_notifications \phpbb\notification\manager */  			$phpbb_notifications = $phpbb_container->get('notification_manager');  			$phpbb_notifications->delete_notifications('notification.type.admin_activate_user', $user_row['user_id']); diff --git a/phpBB/includes/ucp/ucp_attachments.php b/phpBB/includes/ucp/ucp_attachments.php index 42724209aa..639f308091 100644 --- a/phpBB/includes/ucp/ucp_attachments.php +++ b/phpBB/includes/ucp/ucp_attachments.php @@ -29,15 +29,15 @@ class ucp_attachments  	function main($id, $mode)  	{ -		global $template, $user, $db, $config, $phpEx, $phpbb_root_path, $phpbb_container; +		global $template, $user, $db, $config, $phpEx, $phpbb_root_path, $phpbb_container, $request; -		$start		= request_var('start', 0); -		$sort_key	= request_var('sk', 'a'); -		$sort_dir	= request_var('sd', 'a'); +		$start		= $request->variable('start', 0); +		$sort_key	= $request->variable('sk', 'a'); +		$sort_dir	= $request->variable('sd', 'a');  		$delete		= (isset($_POST['delete'])) ? true : false;  		$confirm	= (isset($_POST['confirm'])) ? true : false; -		$delete_ids	= array_keys(request_var('attachment', array(0))); +		$delete_ids	= array_keys($request->variable('attachment', array(0)));  		if ($delete && sizeof($delete_ids))  		{ @@ -123,6 +123,7 @@ class ucp_attachments  		$db->sql_freeresult($result);  		// Ensure start is a valid value +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination');  		$start = $pagination->validate_start($start, $config['topics_per_page'], $num_attachments); diff --git a/phpBB/includes/ucp/ucp_auth_link.php b/phpBB/includes/ucp/ucp_auth_link.php index 748f0fdec2..08aacdef3a 100644 --- a/phpBB/includes/ucp/ucp_auth_link.php +++ b/phpBB/includes/ucp/ucp_auth_link.php @@ -38,6 +38,7 @@ class ucp_auth_link  		$error = array(); +		/* @var $provider_collection \phpbb\auth\provider_collection */  		$provider_collection = $phpbb_container->get('auth.provider_collection');  		$auth_provider = $provider_collection->get_provider(); diff --git a/phpBB/includes/ucp/ucp_confirm.php b/phpBB/includes/ucp/ucp_confirm.php index 7392f8dea8..403f7d37d0 100644 --- a/phpBB/includes/ucp/ucp_confirm.php +++ b/phpBB/includes/ucp/ucp_confirm.php @@ -36,10 +36,10 @@ class ucp_confirm  	function main($id, $mode)  	{ -		global $db, $user, $phpbb_root_path, $config, $phpEx, $phpbb_container; +		global $db, $user, $phpbb_root_path, $config, $phpEx, $phpbb_container, $request;  		$captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']); -		$captcha->init(request_var('type', 0)); +		$captcha->init($request->variable('type', 0));  		$captcha->execute();  		garbage_collection(); diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php index b9606945b4..3228ffb469 100644 --- a/phpBB/includes/ucp/ucp_groups.php +++ b/phpBB/includes/ucp/ucp_groups.php @@ -30,13 +30,13 @@ class ucp_groups  	{  		global $config, $phpbb_root_path, $phpEx, $phpbb_admin_path;  		global $db, $user, $auth, $cache, $template; -		global $request, $phpbb_container; +		global $request, $phpbb_container, $phpbb_log;  		$user->add_lang('groups');  		$return_page = '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '">', '</a>'); -		$mark_ary	= request_var('mark', array(0)); +		$mark_ary	= $request->variable('mark', array(0));  		$submit		= $request->variable('submit', false, false, \phpbb\request\request_interface::POST);  		$delete		= $request->variable('delete', false, false, \phpbb\request\request_interface::POST);  		$error = $data = array(); @@ -49,8 +49,8 @@ class ucp_groups  				if ($submit || isset($_POST['change_default']))  				{ -					$action = (isset($_POST['change_default'])) ? 'change_default' : request_var('action', ''); -					$group_id = ($action == 'change_default') ? request_var('default', 0) : request_var('selected', 0); +					$action = (isset($_POST['change_default'])) ? 'change_default' : $request->variable('action', ''); +					$group_id = ($action == 'change_default') ? $request->variable('default', 0) : $request->variable('selected', 0);  					if (!$group_id)  					{ @@ -99,7 +99,10 @@ class ucp_groups  							{  								group_user_attributes('default', $group_id, $user->data['user_id']); -								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_CHANGE', sprintf($user->lang['USER_GROUP_CHANGE'], $group_row[$user->data['group_id']]['group_name'], $group_row[$group_id]['group_name'])); +								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_CHANGE', false, array( +									'reportee_id' => $user->data['user_id'], +									sprintf($user->lang['USER_GROUP_CHANGE'], $group_row[$user->data['group_id']]['group_name'], $group_row[$group_id]['group_name']) +								));  								meta_refresh(3, $this->u_action);  								trigger_error($user->lang['CHANGED_DEFAULT_GROUP'] . $return_page); @@ -146,7 +149,10 @@ class ucp_groups  							{  								group_user_del($group_id, $user->data['user_id']); -								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_RESIGN', $group_row[$group_id]['group_name']); +								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_RESIGN', false, array( +									'reportee_id' => $user->data['user_id'], +									$group_row[$group_id]['group_name'] +								));  								meta_refresh(3, $this->u_action);  								trigger_error($user->lang[($row['user_pending']) ? 'GROUP_RESIGNED_PENDING' : 'GROUP_RESIGNED_MEMBERSHIP'] . $return_page); @@ -202,7 +208,10 @@ class ucp_groups  									group_user_add($group_id, $user->data['user_id'], false, false, false, 0, 1);  								} -								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), $group_row[$group_id]['group_name']); +								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), false, array( +									'reportee_id' => $user->data['user_id'], +									$group_row[$group_id]['group_name'] +								));  								meta_refresh(3, $this->u_action);  								trigger_error($user->lang[($group_row[$group_id]['group_type'] == GROUP_FREE) ? 'GROUP_JOINED' : 'GROUP_JOINED_PENDING'] . $return_page); @@ -237,7 +246,10 @@ class ucp_groups  							{  								group_user_attributes('demote', $group_id, $user->data['user_id']); -								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_DEMOTE', $group_row[$group_id]['group_name']); +								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_DEMOTE', false, array( +									'reportee_id' => $user->data['user_id'], +									$group_row[$group_id]['group_name'] +								));  								meta_refresh(3, $this->u_action);  								trigger_error($user->lang['USER_GROUP_DEMOTED'] . $return_page); @@ -379,8 +391,8 @@ class ucp_groups  			case 'manage':  				$this->page_title = 'UCP_USERGROUPS_MANAGE'; -				$action		= (isset($_POST['addusers'])) ? 'addusers' : request_var('action', ''); -				$group_id	= request_var('g', 0); +				$action		= (isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', ''); +				$group_id	= $request->variable('g', 0);  				include($phpbb_root_path . 'includes/functions_display.' . $phpEx); @@ -464,6 +476,7 @@ class ucp_groups  						if ($config['allow_avatar'])  						{ +							/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  							$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  							$avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers(); @@ -497,20 +510,20 @@ class ucp_groups  						// Did we submit?  						if ($update)  						{ -							$group_name	= utf8_normalize_nfc(request_var('group_name', '', true)); -							$group_desc = utf8_normalize_nfc(request_var('group_desc', '', true)); -							$group_type	= request_var('group_type', GROUP_FREE); +							$group_name	= $request->variable('group_name', '', true); +							$group_desc = $request->variable('group_desc', '', true); +							$group_type	= $request->variable('group_type', GROUP_FREE); -							$allow_desc_bbcode	= request_var('desc_parse_bbcode', false); -							$allow_desc_urls	= request_var('desc_parse_urls', false); -							$allow_desc_smilies	= request_var('desc_parse_smilies', false); +							$allow_desc_bbcode	= $request->variable('desc_parse_bbcode', false); +							$allow_desc_urls	= $request->variable('desc_parse_urls', false); +							$allow_desc_smilies	= $request->variable('desc_parse_smilies', false);  							$submit_ary = array( -								'colour'		=> request_var('group_colour', ''), -								'rank'			=> request_var('group_rank', 0), +								'colour'		=> $request->variable('group_colour', ''), +								'rank'			=> $request->variable('group_rank', 0),  								'receive_pm'	=> isset($_REQUEST['group_receive_pm']) ? 1 : 0, -								'message_limit'	=> request_var('group_message_limit', 0), -								'max_recipients'=> request_var('group_max_recipients', 0), +								'message_limit'	=> $request->variable('group_message_limit', 0), +								'max_recipients'=> $request->variable('group_max_recipients', 0),  								'legend'	=> $group_row['group_legend'],  								'teampage'	=> $group_row['group_teampage'],  							); @@ -608,7 +621,7 @@ class ucp_groups  						}  						else if (!$group_id)  						{ -							$group_name = utf8_normalize_nfc(request_var('group_name', '', true)); +							$group_name = $request->variable('group_name', '', true);  							$group_desc_data = array(  								'text'			=> '',  								'allow_bbcode'	=> true, @@ -737,7 +750,7 @@ class ucp_groups  						}  						$user->add_lang(array('acp/groups', 'acp/common')); -						$start = request_var('start', 0); +						$start = $request->variable('start', 0);  						// Grab the leaders - always, on every page...  						$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_colour, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending @@ -826,6 +839,7 @@ class ucp_groups  							$s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';  						} +						/* @var $pagination \phpbb\pagination */  						$pagination = $phpbb_container->get('pagination');  						$base_url = $this->u_action . "&action=$action&g=$group_id";  						$start = $pagination->validate_start($start, $config['topics_per_page'], $total_members); @@ -1004,7 +1018,7 @@ class ucp_groups  						$user->add_lang(array('acp/groups', 'acp/common')); -						$names = utf8_normalize_nfc(request_var('usernames', '', true)); +						$names = $request->variable('usernames', '', true);  						if (!$group_id)  						{ @@ -1030,7 +1044,7 @@ class ucp_groups  						$name_ary = array_unique(explode("\n", $names));  						$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name']; -						$default = request_var('default', 0); +						$default = $request->variable('default', 0);  						if (confirm_box(true))  						{ diff --git a/phpBB/includes/ucp/ucp_login_link.php b/phpBB/includes/ucp/ucp_login_link.php index bfe4804286..902fbaafcf 100644 --- a/phpBB/includes/ucp/ucp_login_link.php +++ b/phpBB/includes/ucp/ucp_login_link.php @@ -57,6 +57,7 @@ class ucp_login_link  		}  		// Use the auth_provider requested even if different from configured +		/* @var $provider_collection \phpbb\auth\provider_collection */  		$provider_collection = $phpbb_container->get('auth.provider_collection');  		$auth_provider = $provider_collection->get_provider($request->variable('auth_provider', '')); diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index a1624e78ec..036025e84e 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -219,8 +219,8 @@ class ucp_main  				{  					if (check_form_key('ucp_front_subscribed'))  					{ -						$forums = array_keys(request_var('f', array(0 => 0))); -						$topics = array_keys(request_var('t', array(0 => 0))); +						$forums = array_keys($request->variable('f', array(0 => 0))); +						$topics = array_keys($request->variable('t', array(0 => 0)));  						$msg = '';  						if (sizeof($forums) || sizeof($topics)) @@ -401,7 +401,7 @@ class ucp_main  				if (isset($_POST['unbookmark']))  				{  					$s_hidden_fields = array('unbookmark' => 1); -					$topics = (isset($_POST['t'])) ? array_keys(request_var('t', array(0 => 0))) : array(); +					$topics = (isset($_POST['t'])) ? array_keys($request->variable('t', array(0 => 0))) : array();  					$url = $this->u_action;  					if (!sizeof($topics)) @@ -457,7 +457,7 @@ class ucp_main  				{  					if (check_form_key('ucp_draft'))  					{ -						$drafts = array_keys(request_var('d', array(0 => 0))); +						$drafts = array_keys($request->variable('d', array(0 => 0)));  						if (sizeof($drafts))  						{ @@ -480,8 +480,8 @@ class ucp_main  				if ($submit && $edit)  				{ -					$draft_subject = utf8_normalize_nfc(request_var('subject', '', true)); -					$draft_message = utf8_normalize_nfc(request_var('message', '', true)); +					$draft_subject = $request->variable('subject', '', true); +					$draft_message = $request->variable('message', '', true);  					if (check_form_key('ucp_draft'))  					{  						if ($draft_message && $draft_subject) @@ -643,11 +643,12 @@ class ucp_main  	*/  	function assign_topiclist($mode = 'subscribed', $forbidden_forum_ary = array())  	{ -		global $user, $db, $template, $config, $cache, $auth, $phpbb_root_path, $phpEx, $phpbb_container; +		global $user, $db, $template, $config, $cache, $auth, $phpbb_root_path, $phpEx, $phpbb_container, $request; -		$table = ($mode == 'subscribed') ? TOPICS_WATCH_TABLE : BOOKMARKS_TABLE; -		$start = request_var('start', 0); +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination'); +		$table = ($mode == 'subscribed') ? TOPICS_WATCH_TABLE : BOOKMARKS_TABLE; +		$start = $request->variable('start', 0);  		// Grab icons  		$icons = $cache->obtain_icons(); @@ -769,6 +770,7 @@ class ucp_main  			}  		} +		/* @var $phpbb_content_visibility \phpbb\content_visibility */  		$phpbb_content_visibility = $phpbb_container->get('content.visibility');  		foreach ($topic_list as $topic_id) diff --git a/phpBB/includes/ucp/ucp_notifications.php b/phpBB/includes/ucp/ucp_notifications.php index 66dc651447..51bd77bd4c 100644 --- a/phpBB/includes/ucp/ucp_notifications.php +++ b/phpBB/includes/ucp/ucp_notifications.php @@ -34,7 +34,10 @@ class ucp_notifications  		$form_time = $request->variable('form_time', 0);  		$form_time = ($form_time <= 0 || $form_time > time()) ? time() : $form_time; +		/* @var $phpbb_notifications \phpbb\notification\manager */  		$phpbb_notifications = $phpbb_container->get('notification_manager'); + +		/* @var $pagination \phpbb\pagination */  		$pagination = $phpbb_container->get('pagination');  		switch ($mode) @@ -67,15 +70,6 @@ class ucp_notifications  									$phpbb_notifications->delete_subscription($type, 0, $method_data['id']);  								}  							} - -							if ($request->is_set_post(str_replace('.', '_', $type) . '_notification') && !isset($subscriptions[$type])) -							{ -								$phpbb_notifications->add_subscription($type); -							} -							else if (!$request->is_set_post(str_replace('.', '_', $type) . '_notification') && isset($subscriptions[$type])) -							{ -								$phpbb_notifications->delete_subscription($type); -							}  						}  					} @@ -97,7 +91,7 @@ class ucp_notifications  				// Mark all items read  				if ($request->variable('mark', '') == 'all' && check_link_hash($request->variable('token', ''), 'mark_all_notifications_read'))  				{ -					$phpbb_notifications->mark_notifications_read(false, false, $user->data['user_id'], $form_time); +					$phpbb_notifications->mark_notifications(false, false, $user->data['user_id'], $form_time);  					meta_refresh(3, $this->u_action);  					$message = $user->lang['NOTIFICATIONS_MARK_ALL_READ_SUCCESS']; @@ -128,11 +122,11 @@ class ucp_notifications  					if (!empty($mark_read))  					{ -						$phpbb_notifications->mark_notifications_read_by_id($mark_read, $form_time); +						$phpbb_notifications->mark_notifications_by_id('notification.method.board', $mark_read, $form_time);  					}  				} -				$notifications = $phpbb_notifications->load_notifications(array( +				$notifications = $phpbb_notifications->load_notifications('notification.method.board', array(  					'start'			=> $start,  					'limit'			=> $config['topics_per_page'],  					'count_total'	=> true, @@ -193,8 +187,6 @@ class ucp_notifications  					'NAME'				=> $user->lang($data['lang']),  					'EXPLAIN'			=> (isset($user->lang[$data['lang'] . '_EXPLAIN'])) ? $user->lang($data['lang'] . '_EXPLAIN') : '', - -					'SUBSCRIBED'		=> (isset($subscriptions[$type])) ? true : false,  				));  				foreach ($notification_methods as $method => $method_data) diff --git a/phpBB/includes/ucp/ucp_pm.php b/phpBB/includes/ucp/ucp_pm.php index 425a56cf6c..5f24d05c8b 100644 --- a/phpBB/includes/ucp/ucp_pm.php +++ b/phpBB/includes/ucp/ucp_pm.php @@ -62,7 +62,7 @@ class ucp_pm  		$template->assign_var('S_PRIVMSGS', true);  		// Folder directly specified? -		$folder_specified = request_var('folder', ''); +		$folder_specified = $request->variable('folder', '');  		if (!in_array($folder_specified, array('inbox', 'outbox', 'sentbox')))  		{ @@ -75,7 +75,7 @@ class ucp_pm  		if (!$folder_specified)  		{ -			$mode = (!$mode) ? request_var('mode', 'view') : $mode; +			$mode = (!$mode) ? $request->variable('mode', 'view') : $mode;  		}  		else  		{ @@ -88,7 +88,7 @@ class ucp_pm  		{  			// Compose message  			case 'compose': -				$action = request_var('action', 'post'); +				$action = $request->variable('action', 'post');  				$user_folders = get_folder($user->data['user_id']); @@ -151,12 +151,12 @@ class ucp_pm  				}  				else  				{ -					$folder_id = request_var('f', PRIVMSGS_NO_BOX); -					$action = request_var('action', 'view_folder'); +					$folder_id = $request->variable('f', PRIVMSGS_NO_BOX); +					$action = $request->variable('action', 'view_folder');  				} -				$msg_id = request_var('p', 0); -				$view	= request_var('view', ''); +				$msg_id = $request->variable('p', 0); +				$view	= $request->variable('view', '');  				// View message if specified  				if ($msg_id) @@ -178,8 +178,8 @@ class ucp_pm  				// First Handle Mark actions and moving messages  				$submit_mark	= (isset($_POST['submit_mark'])) ? true : false;  				$move_pm		= (isset($_POST['move_pm'])) ? true : false; -				$mark_option	= request_var('mark_option', ''); -				$dest_folder	= request_var('dest_folder', PRIVMSGS_NO_BOX); +				$mark_option	= $request->variable('mark_option', ''); +				$dest_folder	= $request->variable('dest_folder', PRIVMSGS_NO_BOX);  				// Is moving PM triggered through mark options?  				if (!in_array($mark_option, array('mark_important', 'delete_marked')) && $submit_mark) @@ -192,8 +192,8 @@ class ucp_pm  				// Move PM  				if ($move_pm)  				{ -					$move_msg_ids	= (isset($_POST['marked_msg_id'])) ? request_var('marked_msg_id', array(0)) : array(); -					$cur_folder_id	= request_var('cur_folder_id', PRIVMSGS_NO_BOX); +					$move_msg_ids	= (isset($_POST['marked_msg_id'])) ? $request->variable('marked_msg_id', array(0)) : array(); +					$cur_folder_id	= $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);  					if (move_pm($user->data['user_id'], $user->data['message_limit'], $move_msg_ids, $dest_folder, $cur_folder_id))  					{ @@ -201,7 +201,7 @@ class ucp_pm  						if ($action == 'view_message')  						{  							$msg_id		= 0; -							$folder_id	= request_var('cur_folder_id', PRIVMSGS_NO_BOX); +							$folder_id	= $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);  							$action		= 'view_folder';  						}  					} @@ -215,7 +215,7 @@ class ucp_pm  				// If new messages arrived, place them into the appropriate folder  				$num_not_moved = $num_removed = 0; -				$release = request_var('release', 0); +				$release = $request->variable('release', 0);  				if ($user->data['user_new_privmsg'] && ($action == 'view_folder' || $action == 'view_message'))  				{ diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index 8b7d42e9c9..c00363bee9 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -44,14 +44,14 @@ function compose_pm($id, $mode, $action, $user_folders = array())  	add_form_key('ucp_pm_compose');  	// Grab only parameters needed here -	$to_user_id		= request_var('u', 0); -	$to_group_id	= request_var('g', 0); -	$msg_id			= request_var('p', 0); -	$draft_id		= request_var('d', 0); -	$lastclick		= request_var('lastclick', 0); +	$to_user_id		= $request->variable('u', 0); +	$to_group_id	= $request->variable('g', 0); +	$msg_id			= $request->variable('p', 0); +	$draft_id		= $request->variable('d', 0); +	$lastclick		= $request->variable('lastclick', 0);  	// Reply to all triggered (quote/reply) -	$reply_to_all	= request_var('reply_to_all', 0); +	$reply_to_all	= $request->variable('reply_to_all', 0);  	$address_list	= $request->variable('address_list', array('' => array(0 => ''))); @@ -484,8 +484,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())  		$icon_id = 0;  	} -	$message_parser = new parse_message(); +	/* @var $plupload \phpbb\plupload\plupload */  	$plupload = $phpbb_container->get('plupload'); +	$message_parser = new parse_message();  	$message_parser->set_plupload($plupload);  	$message_parser->message = ($action == 'reply') ? '' : $message_text; @@ -498,7 +499,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())  	if ($action == 'delete')  	{  		// Folder id has been determined by the SQL Statement -		// $folder_id = request_var('f', PRIVMSGS_NO_BOX); +		// $folder_id = $request->variable('f', PRIVMSGS_NO_BOX);  		// Do we need to confirm ?  		if (confirm_box(true)) @@ -529,15 +530,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())  	}  	// Get maximum number of allowed recipients -	$sql = 'SELECT MAX(g.group_max_recipients) as max_recipients -		FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug -		WHERE ug.user_id = ' . $user->data['user_id'] . ' -			AND ug.user_pending = 0 -			AND ug.group_id = g.group_id'; -	$result = $db->sql_query($sql); -	$max_recipients = (int) $db->sql_fetchfield('max_recipients'); -	$db->sql_freeresult($result); +	$max_recipients = phpbb_get_max_setting_from_group($db, $user->data['user_id'], 'max_recipients'); +	// If it is 0, there is no limit set and we use the maximum value within the config.  	$max_recipients = (!$max_recipients) ? $config['pm_max_recipients'] : $max_recipients;  	// If this is a quote/reply "to all"... we may increase the max_recpients to the number of original recipients @@ -645,9 +640,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())  	// Save Draft  	if ($save && $auth->acl_get('u_savedrafts'))  	{ -		$subject = utf8_normalize_nfc(request_var('subject', '', true)); +		$subject = $request->variable('subject', '', true);  		$subject = (!$subject && $action != 'post') ? $user->lang['NEW_MESSAGE'] : $subject; -		$message = utf8_normalize_nfc(request_var('message', '', true)); +		$message = $request->variable('message', '', true);  		if ($subject && $message)  		{ @@ -741,10 +736,10 @@ function compose_pm($id, $mode, $action, $user_folders = array())  		{  			$error[] = $user->lang['FORM_INVALID'];  		} -		$subject = utf8_normalize_nfc(request_var('subject', '', true)); -		$message_parser->message = utf8_normalize_nfc(request_var('message', '', true)); +		$subject = $request->variable('subject', '', true); +		$message_parser->message = $request->variable('message', '', true); -		$icon_id			= request_var('icon', 0); +		$icon_id			= $request->variable('icon', 0);  		$enable_bbcode 		= (!$bbcode_status || isset($_POST['disable_bbcode'])) ? false : true;  		$enable_smilies		= (!$smilies_status || isset($_POST['disable_smilies'])) ? false : true; @@ -932,7 +927,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())  	{  		if ($action == 'quotepost')  		{ -			$post_id = request_var('p', 0); +			$post_id = $request->variable('p', 0);  			if ($config['allow_post_links'])  			{  				$message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}[/url]\n\n"; @@ -946,7 +941,20 @@ function compose_pm($id, $mode, $action, $user_folders = array())  		{  			$message_link = '';  		} -		$message_parser->message = $message_link . '[quote="' . $quote_username . '"]' . censor_text(trim($message_parser->message)) . "[/quote]\n"; +		$quote_attributes = array( +			'author'  => $quote_username, +			'time'    => $post['message_time'], +			'user_id' => $post['author_id'], +		); +		if ($action === 'quotepost') +		{ +			$quote_attributes['post_id'] = $post['msg_id']; +		} +		$quote_text = $phpbb_container->get('text_formatter.utils')->generate_quote( +			censor_text($message_parser->message), +			$quote_attributes +		); +		$message_parser->message = $message_link . $quote_text . "\n\n";  	}  	if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh) @@ -974,7 +982,11 @@ function compose_pm($id, $mode, $action, $user_folders = array())  		$forward_text[] = sprintf($user->lang['FWD_FROM'], $quote_username_text);  		$forward_text[] = sprintf($user->lang['FWD_TO'], implode($user->lang['COMMA_SEPARATOR'], $fwd_to_field['to'])); -		$message_parser->message = implode("\n", $forward_text) . "\n\n[quote="{$quote_username}"]\n" . censor_text(trim($message_parser->message)) . "\n[/quote]"; +		$quote_text = $phpbb_container->get('text_formatter.utils')->generate_quote( +			censor_text($message_parser->message), +			array('author' => $quote_username) +		); +		$message_parser->message = implode("\n", $forward_text) . "\n\n" . $quote_text;  		$message_subject = ((!preg_match('/^Fwd:/', $message_subject)) ? 'Fwd: ' : '') . censor_text($message_subject);  	} @@ -1145,6 +1157,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())  	$form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"'; +	/** @var \phpbb\controller\helper $controller_helper */ +	$controller_helper = $phpbb_container->get('controller.helper'); +  	// Start assigning vars for main posting page ...  	$template->assign_vars(array(  		'L_POST_A'					=> $page_title, @@ -1153,7 +1168,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())  		'SUBJECT'				=> (isset($message_subject)) ? $message_subject : '',  		'MESSAGE'				=> $message_text, -		'BBCODE_STATUS'			=> ($bbcode_status) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'), +		'BBCODE_STATUS'			=> $user->lang(($bbcode_status ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),  		'IMG_STATUS'			=> ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],  		'FLASH_STATUS'			=> ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],  		'SMILIES_STATUS'		=> ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'], @@ -1249,13 +1264,13 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove  	}  	// Add Selected Groups -	$group_list = request_var('group_list', array(0)); +	$group_list = $request->variable('group_list', array(0));  	// Build usernames to add -	$usernames = request_var('username', '', true); +	$usernames = $request->variable('username', '', true);  	$usernames = (empty($usernames)) ? array() : array($usernames); -	$username_list = request_var('username_list', '', true); +	$username_list = $request->variable('username_list', '', true);  	if ($username_list)  	{  		$usernames = array_merge($usernames, explode("\n", $username_list)); @@ -1272,7 +1287,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove  		$submit = false;  		// Preview is only true if there was also a message entered -		if (request_var('message', '')) +		if ($request->variable('message', ''))  		{  			$preview = true;  		} @@ -1404,7 +1419,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove  }  /** -* Build the hidden field for the recipients. Needed, as the variable is not read via request_var. +* Build the hidden field for the recipients. Needed, as the variable is not read via $request->variable().  */  function build_address_field($address_list)  { diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php index d1fc9d2c62..b674a457c1 100644 --- a/phpBB/includes/ucp/ucp_pm_options.php +++ b/phpBB/includes/ucp/ucp_pm_options.php @@ -24,7 +24,7 @@ if (!defined('IN_PHPBB'))  */  function message_options($id, $mode, $global_privmsgs_rules, $global_rule_conditions)  { -	global $phpbb_root_path, $phpEx, $user, $template, $auth, $config, $db; +	global $phpbb_root_path, $phpEx, $user, $template, $auth, $config, $db, $request;  	$redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&mode=options"); @@ -37,7 +37,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  			trigger_error('FORM_INVALID');  		} -		$full_action = request_var('full_action', 0); +		$full_action = $request->variable('full_action', 0);  		$set_folder_id = 0;  		switch ($full_action) @@ -47,7 +47,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  			break;  			case 2: -				$set_folder_id = request_var('full_move_to', PRIVMSGS_INBOX); +				$set_folder_id = $request->variable('full_move_to', PRIVMSGS_INBOX);  			break;  			case 3: @@ -79,7 +79,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	{  		if (check_form_key('ucp_pm_options'))  		{ -			$folder_name = utf8_normalize_nfc(request_var('foldername', '', true)); +			$folder_name = $request->variable('foldername', '', true);  			$msg = '';  			if ($folder_name) @@ -135,8 +135,8 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	{  		if (check_form_key('ucp_pm_options'))  		{ -			$new_folder_name = utf8_normalize_nfc(request_var('new_folder_name', '', true)); -			$rename_folder_id= request_var('rename_folder_id', 0); +			$new_folder_name = $request->variable('new_folder_name', '', true); +			$rename_folder_id= $request->variable('rename_folder_id', 0);  			if (!$new_folder_name)  			{ @@ -178,11 +178,11 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	// Remove Folder  	if (isset($_POST['remove_folder']))  	{ -		$remove_folder_id = request_var('remove_folder_id', 0); +		$remove_folder_id = $request->variable('remove_folder_id', 0);  		// Default to "move all messages to inbox" -		$remove_action = request_var('remove_action', 1); -		$move_to = request_var('move_to', PRIVMSGS_INBOX); +		$remove_action = $request->variable('remove_action', 1); +		$move_to = $request->variable('move_to', PRIVMSGS_INBOX);  		// Move to same folder?  		if ($remove_action == 1 && $remove_folder_id == $move_to) @@ -291,13 +291,13 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	{  		if (check_form_key('ucp_pm_options'))  		{ -			$check_option	= request_var('check_option', 0); -			$rule_option	= request_var('rule_option', 0); -			$cond_option	= request_var('cond_option', ''); -			$action_option	= explode('|', request_var('action_option', '')); -			$rule_string	= ($cond_option != 'none') ? utf8_normalize_nfc(request_var('rule_string', '', true)) : ''; -			$rule_user_id	= ($cond_option != 'none') ? request_var('rule_user_id', 0) : 0; -			$rule_group_id	= ($cond_option != 'none') ? request_var('rule_group_id', 0) : 0; +			$check_option	= $request->variable('check_option', 0); +			$rule_option	= $request->variable('rule_option', 0); +			$cond_option	= $request->variable('cond_option', ''); +			$action_option	= explode('|', $request->variable('action_option', '')); +			$rule_string	= ($cond_option != 'none') ? $request->variable('rule_string', '', true) : ''; +			$rule_user_id	= ($cond_option != 'none') ? $request->variable('rule_user_id', 0) : 0; +			$rule_group_id	= ($cond_option != 'none') ? $request->variable('rule_group_id', 0) : 0;  			$action = (int) $action_option[0];  			$folder_id = (int) $action_option[1]; @@ -371,7 +371,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	// Remove Rule  	if (isset($_POST['delete_rule']) && !isset($_POST['cancel']))  	{ -		$delete_id = array_keys(request_var('delete_rule', array(0 => 0))); +		$delete_id = array_keys($request->variable('delete_rule', array(0 => 0)));  		$delete_id = (!empty($delete_id[0])) ? $delete_id[0] : 0;  		if (!$delete_id) @@ -507,18 +507,20 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	$rule_lang = $action_lang = $check_lang = array();  	// Build all three language arrays -	preg_replace('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#e', "\${strtolower('\\2') . '_lang'}[constant('\\1')] = \$user->lang['PM_\\2']['\\3']", array_keys(get_defined_constants())); +	preg_replace_callback('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#', function ($match) use(&$rule_lang, &$action_lang, &$check_lang, $user) { +		${strtolower($match[2]) . '_lang'}[constant($match[1])] = $user->lang['PM_' . $match[2]][$match[3]]; +	}, array_keys(get_defined_constants()));  	/*  		Rule Ordering:  			-> CHECK_* -> RULE_* [IN $global_privmsgs_rules:CHECK_*] -> [IF $rule_conditions[RULE_*] [|text|bool|user|group|own_group]] -> ACTION_*  	*/ -	$check_option	= request_var('check_option', 0); -	$rule_option	= request_var('rule_option', 0); -	$cond_option	= request_var('cond_option', ''); -	$action_option	= request_var('action_option', ''); -	$back = (isset($_REQUEST['back'])) ? request_var('back', array('' => 0)) : array(); +	$check_option	= $request->variable('check_option', 0); +	$rule_option	= $request->variable('rule_option', 0); +	$cond_option	= $request->variable('cond_option', ''); +	$action_option	= $request->variable('action_option', ''); +	$back = (isset($_REQUEST['back'])) ? $request->variable('back', array('' => 0)) : array();  	if (sizeof($back))  	{ @@ -698,7 +700,7 @@ function define_rule_option($hardcoded, $rule_option, $rule_lang, $check_ary)  */  function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule_conditions)  { -	global $db, $template, $auth, $user; +	global $db, $template, $auth, $user, $request;  	$template->assign_vars(array(  		'S_COND_DEFINED'	=> true, @@ -722,7 +724,7 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule  	switch ($condition)  	{  		case 'text': -			$rule_string = utf8_normalize_nfc(request_var('rule_string', '', true)); +			$rule_string = $request->variable('rule_string', '', true);  			$template->assign_vars(array(  				'S_TEXT_CONDITION'	=> true, @@ -735,8 +737,8 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule  		break;  		case 'user': -			$rule_user_id = request_var('rule_user_id', 0); -			$rule_string = utf8_normalize_nfc(request_var('rule_string', '', true)); +			$rule_user_id = $request->variable('rule_user_id', 0); +			$rule_string = $request->variable('rule_string', '', true);  			if ($rule_string && !$rule_user_id)  			{ @@ -778,8 +780,8 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule  		break;  		case 'group': -			$rule_group_id = request_var('rule_group_id', 0); -			$rule_string = utf8_normalize_nfc(request_var('rule_string', '', true)); +			$rule_group_id = $request->variable('rule_group_id', 0); +			$rule_string = $request->variable('rule_string', '', true);  			$sql = 'SELECT g.group_id, g.group_name, g.group_type  					FROM ' . GROUPS_TABLE . ' g '; diff --git a/phpBB/includes/ucp/ucp_pm_viewfolder.php b/phpBB/includes/ucp/ucp_pm_viewfolder.php index 19acd9ecb9..e88e40a1cb 100644 --- a/phpBB/includes/ucp/ucp_pm_viewfolder.php +++ b/phpBB/includes/ucp/ucp_pm_viewfolder.php @@ -25,7 +25,7 @@ if (!defined('IN_PHPBB'))  */  function view_folder($id, $mode, $folder_id, $folder)  { -	global $user, $template, $auth, $db, $cache; +	global $user, $template, $auth, $db, $cache, $request;  	global $phpbb_root_path, $config, $phpEx;  	$submit_export = (isset($_POST['submit_export'])) ? true : false; @@ -196,9 +196,9 @@ function view_folder($id, $mode, $folder_id, $folder)  	}  	else  	{ -		$export_type = request_var('export_option', ''); -		$enclosure = request_var('enclosure', ''); -		$delimiter = request_var('delimiter', ''); +		$export_type = $request->variable('export_option', ''); +		$enclosure = $request->variable('enclosure', ''); +		$delimiter = $request->variable('delimiter', '');  		if ($export_type == 'CSV' && ($delimiter === '' || $enclosure === ''))  		{ @@ -397,15 +397,16 @@ function view_folder($id, $mode, $folder_id, $folder)  */  function get_pm_from($folder_id, $folder, $user_id)  { -	global $user, $db, $template, $config, $auth, $phpbb_container, $phpbb_root_path, $phpEx; +	global $user, $db, $template, $config, $auth, $phpbb_container, $phpbb_root_path, $phpEx, $request; -	$start = request_var('start', 0); +	$start = $request->variable('start', 0);  	// Additional vars later, pm ordering is mostly different from post ordering. :/ -	$sort_days	= request_var('st', 0); -	$sort_key	= request_var('sk', 't'); -	$sort_dir	= request_var('sd', 'd'); +	$sort_days	= $request->variable('st', 0); +	$sort_key	= $request->variable('sk', 't'); +	$sort_dir	= $request->variable('sd', 'd'); +	/* @var $pagination \phpbb\pagination */  	$pagination = $phpbb_container->get('pagination');  	// PM ordering options diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php index d7b9b32dbf..3de3410ea8 100644 --- a/phpBB/includes/ucp/ucp_pm_viewmessage.php +++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php @@ -32,7 +32,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)  	$msg_id		= (int) $msg_id;  	$folder_id	= (int) $folder_id;  	$author_id	= (int) $message_row['author_id']; -	$view		= request_var('view', ''); +	$view		= $request->variable('view', '');  	// Not able to view message, it was deleted by the sender  	if ($message_row['pm_deleted']) @@ -56,6 +56,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)  	// Load the custom profile fields  	if ($config['load_cpf_pm'])  	{ +		/* @var $cp \phpbb\profilefields\manager */  		$cp = $phpbb_container->get('profilefields.manager');  		$profile_fields = $cp->grab_profile_fields_data($author_id); @@ -231,7 +232,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)  		'U_DELETE'			=> ($auth->acl_get('u_pm_delete')) ? "$url&mode=compose&action=delete&f=$folder_id&p=" . $message_row['msg_id'] : '',  		'U_EMAIL'			=> $user_info['email'], -		'U_REPORT'			=> ($config['allow_pm_report']) ? append_sid("{$phpbb_root_path}report.$phpEx", "pm=" . $message_row['msg_id']) : '', +		'U_REPORT'			=> ($config['allow_pm_report']) ? $phpbb_container->get('controller.helper')->route('phpbb_report_pm_controller', array('id' => $message_row['msg_id'])) : '',  		'U_QUOTE'			=> ($auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&mode=compose&action=quote&f=$folder_id&p=" . $message_row['msg_id'] : '',  		'U_EDIT'			=> (($message_row['message_time'] > time() - ($config['pm_edit_time'] * 60) || !$config['pm_edit_time']) && $folder_id == PRIVMSGS_OUTBOX && $auth->acl_get('u_pm_edit')) ? "$url&mode=compose&action=edit&f=$folder_id&p=" . $message_row['msg_id'] : '',  		'U_POST_REPLY_PM'	=> ($auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&mode=compose&action=reply&f=$folder_id&p=" . $message_row['msg_id'] : '', diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php index 3c274b53c7..215a870007 100644 --- a/phpBB/includes/ucp/ucp_prefs.php +++ b/phpBB/includes/ucp/ucp_prefs.php @@ -29,7 +29,7 @@ class ucp_prefs  	function main($id, $mode)  	{ -		global $config, $db, $user, $auth, $template, $phpbb_dispatcher, $phpbb_root_path, $phpEx; +		global $config, $db, $user, $auth, $template, $phpbb_dispatcher, $phpbb_root_path, $phpEx, $request;  		$submit = (isset($_POST['submit'])) ? true : false;  		$error = $data = array(); @@ -40,16 +40,16 @@ class ucp_prefs  			case 'personal':  				add_form_key('ucp_prefs_personal');  				$data = array( -					'notifymethod'	=> request_var('notifymethod', $user->data['user_notify_type']), -					'dateformat'	=> request_var('dateformat', $user->data['user_dateformat'], true), -					'lang'			=> basename(request_var('lang', $user->data['user_lang'])), -					'user_style'		=> request_var('user_style', (int) $user->data['user_style']), -					'tz'			=> request_var('tz', $user->data['user_timezone']), - -					'viewemail'		=> request_var('viewemail', (bool) $user->data['user_allow_viewemail']), -					'massemail'		=> request_var('massemail', (bool) $user->data['user_allow_massemail']), -					'hideonline'	=> request_var('hideonline', (bool) !$user->data['user_allow_viewonline']), -					'allowpm'		=> request_var('allowpm', (bool) $user->data['user_allow_pm']), +					'notifymethod'	=> $request->variable('notifymethod', $user->data['user_notify_type']), +					'dateformat'	=> $request->variable('dateformat', $user->data['user_dateformat'], true), +					'lang'			=> basename($request->variable('lang', $user->data['user_lang'])), +					'user_style'		=> $request->variable('user_style', (int) $user->data['user_style']), +					'tz'			=> $request->variable('tz', $user->data['user_timezone']), + +					'viewemail'		=> $request->variable('viewemail', (bool) $user->data['user_allow_viewemail']), +					'massemail'		=> $request->variable('massemail', (bool) $user->data['user_allow_massemail']), +					'hideonline'	=> $request->variable('hideonline', (bool) !$user->data['user_allow_viewonline']), +					'allowpm'		=> $request->variable('allowpm', (bool) $user->data['user_allow_pm']),  				);  				if ($data['notifymethod'] == NOTIFY_IM && (!$config['jab_enable'] || !$user->data['user_jabber'] || !@extension_loaded('xml'))) @@ -221,20 +221,20 @@ class ucp_prefs  				add_form_key('ucp_prefs_view');  				$data = array( -					'topic_sk'		=> request_var('topic_sk', (!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't'), -					'topic_sd'		=> request_var('topic_sd', (!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd'), -					'topic_st'		=> request_var('topic_st', (!empty($user->data['user_topic_show_days'])) ? (int) $user->data['user_topic_show_days'] : 0), - -					'post_sk'		=> request_var('post_sk', (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'), -					'post_sd'		=> request_var('post_sd', (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'), -					'post_st'		=> request_var('post_st', (!empty($user->data['user_post_show_days'])) ? (int) $user->data['user_post_show_days'] : 0), - -					'images'		=> request_var('images', (bool) $user->optionget('viewimg')), -					'flash'			=> request_var('flash', (bool) $user->optionget('viewflash')), -					'smilies'		=> request_var('smilies', (bool) $user->optionget('viewsmilies')), -					'sigs'			=> request_var('sigs', (bool) $user->optionget('viewsigs')), -					'avatars'		=> request_var('avatars', (bool) $user->optionget('viewavatars')), -					'wordcensor'	=> request_var('wordcensor', (bool) $user->optionget('viewcensors')), +					'topic_sk'		=> $request->variable('topic_sk', (!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't'), +					'topic_sd'		=> $request->variable('topic_sd', (!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd'), +					'topic_st'		=> $request->variable('topic_st', (!empty($user->data['user_topic_show_days'])) ? (int) $user->data['user_topic_show_days'] : 0), + +					'post_sk'		=> $request->variable('post_sk', (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'), +					'post_sd'		=> $request->variable('post_sd', (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'), +					'post_st'		=> $request->variable('post_st', (!empty($user->data['user_post_show_days'])) ? (int) $user->data['user_post_show_days'] : 0), + +					'images'		=> $request->variable('images', (bool) $user->optionget('viewimg')), +					'flash'			=> $request->variable('flash', (bool) $user->optionget('viewflash')), +					'smilies'		=> $request->variable('smilies', (bool) $user->optionget('viewsmilies')), +					'sigs'			=> $request->variable('sigs', (bool) $user->optionget('viewsigs')), +					'avatars'		=> $request->variable('avatars', (bool) $user->optionget('viewavatars')), +					'wordcensor'	=> $request->variable('wordcensor', (bool) $user->optionget('viewcensors')),  				);  				/** @@ -393,10 +393,10 @@ class ucp_prefs  			case 'post':  				$data = array( -					'bbcode'	=> request_var('bbcode', $user->optionget('bbcode')), -					'smilies'	=> request_var('smilies', $user->optionget('smilies')), -					'sig'		=> request_var('sig', $user->optionget('attachsig')), -					'notify'	=> request_var('notify', (bool) $user->data['user_notify']), +					'bbcode'	=> $request->variable('bbcode', $user->optionget('bbcode')), +					'smilies'	=> $request->variable('smilies', $user->optionget('smilies')), +					'sig'		=> $request->variable('sig', $user->optionget('attachsig')), +					'notify'	=> $request->variable('notify', (bool) $user->data['user_notify']),  				);  				add_form_key('ucp_prefs_post'); diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index 8d8d42e742..2f4d650ed0 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -32,11 +32,10 @@ class ucp_profile  	function main($id, $mode)  	{  		global $cache, $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx; -		global $request, $phpbb_container, $phpbb_dispatcher; +		global $request, $phpbb_container, $phpbb_log, $phpbb_dispatcher;  		$user->add_lang('posting'); -		$preview	= $request->variable('preview', false, false, \phpbb\request\request_interface::POST);  		$submit		= $request->variable('submit', false, false, \phpbb\request\request_interface::POST);  		$delete		= $request->variable('delete', false, false, \phpbb\request\request_interface::POST);  		$error = $data = array(); @@ -47,8 +46,8 @@ class ucp_profile  			case 'reg_details':  				$data = array( -					'username'			=> utf8_normalize_nfc(request_var('username', $user->data['username'], true)), -					'email'				=> strtolower(request_var('email', $user->data['user_email'])), +					'username'			=> $request->variable('username', $user->data['username'], true), +					'email'				=> strtolower($request->variable('email', $user->data['user_email'])),  					'new_password'		=> $request->variable('new_password', '', true),  					'cur_password'		=> $request->variable('cur_password', '', true),  					'password_confirm'	=> $request->variable('password_confirm', '', true), @@ -96,6 +95,7 @@ class ucp_profile  					}  					// Instantiate passwords manager +					/* @var $passwords_manager \phpbb\passwords\manager */  					$passwords_manager = $phpbb_container->get('passwords.manager');  					// Only check the new password against the previous password if there have been no errors @@ -139,18 +139,30 @@ class ucp_profile  						if ($auth->acl_get('u_chgname') && $config['allow_namechange'] && $data['username'] != $user->data['username'])  						{ -							add_log('user', $user->data['user_id'], 'LOG_USER_UPDATE_NAME', $user->data['username'], $data['username']); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_NAME', false, array( +								'reportee_id' => $user->data['user_id'], +								$user->data['username'], +								$data['username'] +							));  						}  						if ($auth->acl_get('u_chgpasswd') && $data['new_password'] && !$passwords_manager->check($data['new_password'], $user->data['user_password']))  						{  							$user->reset_login_keys(); -							add_log('user', $user->data['user_id'], 'LOG_USER_NEW_PASSWORD', $data['username']); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array( +								'reportee_id' => $user->data['user_id'], +								$user->data['username'] +							));  						}  						if ($auth->acl_get('u_chgemail') && $data['email'] != $user->data['user_email'])  						{ -							add_log('user', $user->data['user_id'], 'LOG_USER_UPDATE_EMAIL', $data['username'], $user->data['user_email'], $data['email']); +							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_EMAIL', false, array( +								'reportee_id' => $user->data['user_id'], +								$user->data['username'], +								$data['user_email'], +								$data['email'] +							));  						}  						$message = 'PROFILE_UPDATED'; @@ -296,12 +308,13 @@ class ucp_profile  					trigger_error('NO_AUTH_PROFILEINFO');  				} +				/* @var $cp \phpbb\profilefields\manager */  				$cp = $phpbb_container->get('profilefields.manager');  				$cp_data = $cp_error = array();  				$data = array( -					'jabber'		=> utf8_normalize_nfc(request_var('jabber', $user->data['user_jabber'], true)), +					'jabber'		=> $request->variable('jabber', $user->data['user_jabber'], true),  				);  				if ($config['allow_birthdays']) @@ -313,9 +326,9 @@ class ucp_profile  						list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user->data['user_birthday']);  					} -					$data['bday_day'] = request_var('bday_day', $data['bday_day']); -					$data['bday_month'] = request_var('bday_month', $data['bday_month']); -					$data['bday_year'] = request_var('bday_year', $data['bday_year']); +					$data['bday_day'] = $request->variable('bday_day', $data['bday_day']); +					$data['bday_month'] = $request->variable('bday_month', $data['bday_month']); +					$data['bday_year'] = $request->variable('bday_year', $data['bday_year']);  					$data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);  				} @@ -484,86 +497,82 @@ class ucp_profile  				include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);  				include($phpbb_root_path . 'includes/functions_display.' . $phpEx); -				$enable_bbcode	= ($config['allow_sig_bbcode']) ? (bool) $user->optionget('sig_bbcode') : false; -				$enable_smilies	= ($config['allow_sig_smilies']) ? (bool) $user->optionget('sig_smilies') : false; -				$enable_urls	= ($config['allow_sig_links']) ? (bool) $user->optionget('sig_links') : false; +				$enable_bbcode	= ($config['allow_sig_bbcode']) ? $user->optionget('sig_bbcode') : false; +				$enable_smilies	= ($config['allow_sig_smilies']) ? $user->optionget('sig_smilies') : false; +				$enable_urls	= ($config['allow_sig_links']) ? $user->optionget('sig_links') : false; -				$signature		= utf8_normalize_nfc(request_var('signature', (string) $user->data['user_sig'], true)); +				$decoded_message	= generate_text_for_edit($user->data['user_sig'], $user->data['user_sig_bbcode_uid'], $user->data['user_sig_bbcode_bitfield']); +				$signature			= $request->variable('signature', $decoded_message['text'], true); +				$signature_preview	= ''; -				add_form_key('ucp_sig'); - -				if ($submit || $preview) +				if ($submit || $request->is_set_post('preview'))  				{ -					include($phpbb_root_path . 'includes/message_parser.' . $phpEx); - -					$enable_bbcode	= ($config['allow_sig_bbcode']) ? ((request_var('disable_bbcode', false)) ? false : true) : false; -					$enable_smilies	= ($config['allow_sig_smilies']) ? ((request_var('disable_smilies', false)) ? false : true) : false; -					$enable_urls	= ($config['allow_sig_links']) ? ((request_var('disable_magic_url', false)) ? false : true) : false; +					$enable_bbcode	= ($config['allow_sig_bbcode']) ? !$request->variable('disable_bbcode', false) : false; +					$enable_smilies	= ($config['allow_sig_smilies']) ? !$request->variable('disable_smilies', false) : false; +					$enable_urls	= ($config['allow_sig_links']) ? !$request->variable('disable_magic_url', false) : false; -					if (!sizeof($error)) +					if (!check_form_key('ucp_sig'))  					{ -						$message_parser = new parse_message($signature); +						$error[] = 'FORM_INVALID'; +					} +				} -						// Allowing Quote BBCode -						$message_parser->parse($enable_bbcode, $enable_urls, $enable_smilies, $config['allow_sig_img'], $config['allow_sig_flash'], true, $config['allow_sig_links'], true, 'sig'); +				$bbcode_uid = $bbcode_bitfield = $bbcode_flags = ''; +				$warn_msg = generate_text_for_storage($signature, $bbcode_uid, $bbcode_bitfield, $bbcode_flags, $enable_bbcode, $enable_urls, $enable_smilies); -						if (sizeof($message_parser->warn_msg)) -						{ -							$error[] = implode('<br />', $message_parser->warn_msg); -						} +				if (sizeof($warn_msg)) +				{ +					$error += $warn_msg; +				} -						if (!check_form_key('ucp_sig')) -						{ -							$error[] = 'FORM_INVALID'; -						} +				if (!$submit) +				{ +					// Parse it for displaying +					$signature_preview = generate_text_for_display($signature, $bbcode_uid, $bbcode_bitfield, $bbcode_flags); +				} +				else +				{ +					if (!sizeof($error)) +					{ +						$user->optionset('sig_bbcode', $enable_bbcode); +						$user->optionset('sig_smilies', $enable_smilies); +						$user->optionset('sig_links', $enable_urls); -						if (!sizeof($error) && $submit) -						{ -							$user->optionset('sig_bbcode', $enable_bbcode); -							$user->optionset('sig_smilies', $enable_smilies); -							$user->optionset('sig_links', $enable_urls); - -							$sql_ary = array( -								'user_sig'					=> (string) $message_parser->message, -								'user_options'				=> $user->data['user_options'], -								'user_sig_bbcode_uid'		=> (string) $message_parser->bbcode_uid, -								'user_sig_bbcode_bitfield'	=> $message_parser->bbcode_bitfield -							); +						$sql_ary = array( +							'user_sig'					=> $signature, +							'user_options'				=> $user->data['user_options'], +							'user_sig_bbcode_uid'		=> $bbcode_uid, +							'user_sig_bbcode_bitfield'	=> $bbcode_bitfield +						); -							$sql = 'UPDATE ' . USERS_TABLE . ' -								SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' -								WHERE user_id = ' . $user->data['user_id']; -							$db->sql_query($sql); +						$sql = 'UPDATE ' . USERS_TABLE . ' +							SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' +							WHERE user_id = ' . $user->data['user_id']; +						$db->sql_query($sql); -							$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>'); -							trigger_error($message); -						} +						$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>'); +						trigger_error($message);  					} - -					// Replace "error" strings with their real, localised form -					$error = array_map(array($user, 'lang'), $error);  				} -				$signature_preview = ''; -				if ($preview) -				{ -					// Now parse it for displaying -					$signature_preview = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false); -					unset($message_parser); -				} +				// Replace "error" strings with their real, localised form +				$error = array_map(array($user, 'lang'), $error); + +				$decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_bitfield); -				decode_message($signature, $user->data['user_sig_bbcode_uid']); +				/** @var \phpbb\controller\helper $controller_helper */ +				$controller_helper = $phpbb_container->get('controller.helper');  				$template->assign_vars(array(  					'ERROR'				=> (sizeof($error)) ? implode('<br />', $error) : '', -					'SIGNATURE'			=> $signature, +					'SIGNATURE'			=> $decoded_message['text'],  					'SIGNATURE_PREVIEW'	=> $signature_preview,  					'S_BBCODE_CHECKED' 		=> (!$enable_bbcode) ? ' checked="checked"' : '',  					'S_SMILIES_CHECKED' 	=> (!$enable_smilies) ? ' checked="checked"' : '',  					'S_MAGIC_URL_CHECKED' 	=> (!$enable_urls) ? ' checked="checked"' : '', -					'BBCODE_STATUS'			=> ($config['allow_sig_bbcode']) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'), +					'BBCODE_STATUS'			=> $user->lang(($config['allow_sig_bbcode'] ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),  					'SMILIES_STATUS'		=> ($config['allow_sig_smilies']) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],  					'IMG_STATUS'			=> ($config['allow_sig_img']) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],  					'FLASH_STATUS'			=> ($config['allow_sig_flash']) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'], @@ -579,6 +588,8 @@ class ucp_profile  					'S_LINKS_ALLOWED'		=> ($config['allow_sig_links']) ? true : false)  				); +				add_form_key('ucp_sig'); +  				// Build custom bbcodes array  				display_custom_bbcodes(); @@ -595,6 +606,7 @@ class ucp_profile  				if ($config['allow_avatar'] && $auth->acl_get('u_chgavatar'))  				{ +					/* @var $phpbb_avatar_manager \phpbb\avatar\manager */  					$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');  					$avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers(); @@ -713,7 +725,7 @@ class ucp_profile  				if ($submit)  				{ -					$keys = request_var('keys', array('')); +					$keys = $request->variable('keys', array(''));  					if (!check_form_key('ucp_autologin_keys'))  					{ diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php index 3426af95d0..4f9639114f 100644 --- a/phpBB/includes/ucp/ucp_register.php +++ b/phpBB/includes/ucp/ucp_register.php @@ -42,8 +42,8 @@ class ucp_register  		$coppa			= $request->is_set('coppa') ? (int) $request->variable('coppa', false) : false;  		$agreed			= $request->variable('agreed', false);  		$submit			= $request->is_set_post('submit'); -		$change_lang	= request_var('change_lang', ''); -		$user_lang		= request_var('lang', $user->lang_name); +		$change_lang	= $request->variable('change_lang', ''); +		$user_lang		= $request->variable('lang', $user->lang_name);  		if ($agreed)  		{ @@ -77,6 +77,7 @@ class ucp_register  			}  		} +		/* @var $cp \phpbb\profilefields\manager */  		$cp = $phpbb_container->get('profilefields.manager');  		$error = $cp_data = $cp_error = array(); @@ -88,6 +89,7 @@ class ucp_register  		if (!empty($login_link_data))  		{  			// Confirm that we have all necessary data +			/* @var $provider_collection \phpbb\auth\provider_collection */  			$provider_collection = $phpbb_container->get('auth.provider_collection');  			$auth_provider = $provider_collection->get_provider($request->variable('auth_provider', '')); @@ -113,10 +115,10 @@ class ucp_register  			{  				// We do not include the password  				$s_hidden_fields = array_merge($s_hidden_fields, array( -					'username'			=> utf8_normalize_nfc(request_var('username', '', true)), -					'email'				=> strtolower(request_var('email', '')), +					'username'			=> $request->variable('username', '', true), +					'email'				=> strtolower($request->variable('email', '')),  					'lang'				=> $user->lang_name, -					'tz'				=> request_var('tz', $config['board_timezone']), +					'tz'				=> $request->variable('tz', $config['board_timezone']),  				));  			} @@ -200,12 +202,12 @@ class ucp_register  		$timezone = $config['board_timezone'];  		$data = array( -			'username'			=> utf8_normalize_nfc(request_var('username', '', true)), +			'username'			=> $request->variable('username', '', true),  			'new_password'		=> $request->variable('new_password', '', true),  			'password_confirm'	=> $request->variable('password_confirm', '', true), -			'email'				=> strtolower(request_var('email', '')), -			'lang'				=> basename(request_var('lang', $user->lang_name)), -			'tz'				=> request_var('tz', $timezone), +			'email'				=> strtolower($request->variable('email', '')), +			'lang'				=> basename($request->variable('lang', $user->lang_name)), +			'tz'				=> $request->variable('tz', $timezone),  		);  		/**  		* Add UCP register data before they are assigned to the template or submitted @@ -334,6 +336,7 @@ class ucp_register  				}  				// Instantiate passwords manager +				/* @var $passwords_manager \phpbb\passwords\manager */  				$passwords_manager = $phpbb_container->get('passwords.manager');  				$user_row = array( @@ -439,6 +442,7 @@ class ucp_register  				if ($config['require_activation'] == USER_ACTIVATION_ADMIN)  				{ +					/* @var $phpbb_notifications \phpbb\notification\manager */  					$phpbb_notifications = $phpbb_container->get('notification_manager');  					$phpbb_notifications->add_notifications('notification.type.admin_activate_user', array(  						'user_id'		=> $user_id, diff --git a/phpBB/includes/ucp/ucp_remind.php b/phpBB/includes/ucp/ucp_remind.php index 415bf0e84d..2342aa2137 100644 --- a/phpBB/includes/ucp/ucp_remind.php +++ b/phpBB/includes/ucp/ucp_remind.php @@ -29,7 +29,7 @@ class ucp_remind  	function main($id, $mode)  	{ -		global $config, $phpbb_root_path, $phpEx; +		global $config, $phpbb_root_path, $phpEx, $request;  		global $db, $user, $auth, $template, $phpbb_container;  		if (!$config['allow_password_reset']) @@ -37,8 +37,8 @@ class ucp_remind  			trigger_error($user->lang('UCP_PASSWORD_RESET_DISABLED', '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>'));  		} -		$username	= request_var('username', '', true); -		$email		= strtolower(request_var('email', '')); +		$username	= $request->variable('username', '', true); +		$email		= strtolower($request->variable('email', ''));  		$submit		= (isset($_POST['submit'])) ? true : false;  		if ($submit) @@ -92,6 +92,7 @@ class ucp_remind  			$user_actkey = gen_rand_string(mt_rand(6, 10));  			// Instantiate passwords manager +			/* @var $manager \phpbb\passwords\manager */  			$passwords_manager = $phpbb_container->get('passwords.manager');  			$sql = 'UPDATE ' . USERS_TABLE . " diff --git a/phpBB/includes/ucp/ucp_resend.php b/phpBB/includes/ucp/ucp_resend.php index 9fe8850000..44c54100cd 100644 --- a/phpBB/includes/ucp/ucp_resend.php +++ b/phpBB/includes/ucp/ucp_resend.php @@ -30,10 +30,10 @@ class ucp_resend  	function main($id, $mode)  	{  		global $config, $phpbb_root_path, $phpEx; -		global $db, $user, $auth, $template; +		global $db, $user, $auth, $template, $request; -		$username	= request_var('username', '', true); -		$email		= strtolower(request_var('email', '')); +		$username	= $request->variable('username', '', true); +		$email		= strtolower($request->variable('email', ''));  		$submit		= (isset($_POST['submit'])) ? true : false;  		add_form_key('ucp_resend'); diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php index dbf8cf31c1..d4e7e70247 100644 --- a/phpBB/includes/ucp/ucp_zebra.php +++ b/phpBB/includes/ucp/ucp_zebra.php @@ -44,7 +44,7 @@ class ucp_zebra  			foreach ($var_ary as $var => $default)  			{ -				$data[$var] = request_var($var, $default, true); +				$data[$var] = $request->variable($var, $default, true);  			}  			if (!empty($data['add']) || sizeof($data['usernames'])) diff --git a/phpBB/includes/utf/data/utf_canonical_comp.php b/phpBB/includes/utf/data/utf_canonical_comp.php deleted file mode 100644 index 2de3149ee8..0000000000 --- a/phpBB/includes/utf/data/utf_canonical_comp.php +++ /dev/null @@ -1,2 +0,0 @@ -<?php -$GLOBALS['utf_canonical_comp']=array('AÌ€'=>'À','AÌ'=>'Ã','AÌ‚'=>'Â','Ã'=>'Ã','Ä'=>'Ä','AÌŠ'=>'Ã…','Ç'=>'Ç','EÌ€'=>'È','EÌ'=>'É','EÌ‚'=>'Ê','Ë'=>'Ë','IÌ€'=>'ÃŒ','IÌ'=>'Ã','IÌ‚'=>'ÃŽ','Ï'=>'Ã','Ñ'=>'Ñ','OÌ€'=>'Ã’','OÌ'=>'Ó','OÌ‚'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','UÌ€'=>'Ù','UÌ'=>'Ú','UÌ‚'=>'Û','Ü'=>'Ü','YÌ'=>'Ã','aÌ€'=>'à','aÌ'=>'á','aÌ‚'=>'â','ã'=>'ã','ä'=>'ä','aÌŠ'=>'Ã¥','ç'=>'ç','eÌ€'=>'è','eÌ'=>'é','eÌ‚'=>'ê','ë'=>'ë','iÌ€'=>'ì','iÌ'=>'Ã','iÌ‚'=>'î','ï'=>'ï','ñ'=>'ñ','oÌ€'=>'ò','oÌ'=>'ó','oÌ‚'=>'ô','õ'=>'õ','ö'=>'ö','uÌ€'=>'ù','uÌ'=>'ú','uÌ‚'=>'û','ü'=>'ü','yÌ'=>'ý','ÿ'=>'ÿ','AÌ„'=>'Ä€','aÌ„'=>'Ä','Ă'=>'Ä‚','ă'=>'ă','Ą'=>'Ä„','ą'=>'Ä…','CÌ'=>'Ć','cÌ'=>'ć','CÌ‚'=>'Ĉ','cÌ‚'=>'ĉ','Ċ'=>'ÄŠ','ċ'=>'Ä‹','CÌŒ'=>'ÄŒ','cÌŒ'=>'Ä','DÌŒ'=>'ÄŽ','dÌŒ'=>'Ä','EÌ„'=>'Ä’','eÌ„'=>'Ä“','Ĕ'=>'Ä”','ĕ'=>'Ä•','Ė'=>'Ä–','ė'=>'Ä—','Ę'=>'Ę','ę'=>'Ä™','EÌŒ'=>'Äš','eÌŒ'=>'Ä›','GÌ‚'=>'Äœ','gÌ‚'=>'Ä','Ğ'=>'Äž','ğ'=>'ÄŸ','Ġ'=>'Ä ','ġ'=>'Ä¡','Ģ'=>'Ä¢','ģ'=>'Ä£','HÌ‚'=>'Ĥ','hÌ‚'=>'Ä¥','Ĩ'=>'Ĩ','ĩ'=>'Ä©','IÌ„'=>'Ī','iÌ„'=>'Ä«','Ĭ'=>'Ĭ','ĭ'=>'Ä','Į'=>'Ä®','į'=>'į','İ'=>'İ','JÌ‚'=>'Ä´','jÌ‚'=>'ĵ','Ķ'=>'Ķ','ķ'=>'Ä·','LÌ'=>'Ĺ','lÌ'=>'ĺ','Ļ'=>'Ä»','ļ'=>'ļ','LÌŒ'=>'Ľ','lÌŒ'=>'ľ','NÌ'=>'Ń','nÌ'=>'Å„','Ņ'=>'Å…','ņ'=>'ņ','NÌŒ'=>'Ň','nÌŒ'=>'ň','OÌ„'=>'ÅŒ','oÌ„'=>'Å','Ŏ'=>'ÅŽ','ŏ'=>'Å','OÌ‹'=>'Å','oÌ‹'=>'Å‘','RÌ'=>'Å”','rÌ'=>'Å•','Ŗ'=>'Å–','ŗ'=>'Å—','RÌŒ'=>'Ř','rÌŒ'=>'Å™','SÌ'=>'Åš','sÌ'=>'Å›','SÌ‚'=>'Åœ','sÌ‚'=>'Å','Ş'=>'Åž','ş'=>'ÅŸ','SÌŒ'=>'Å ','sÌŒ'=>'Å¡','Ţ'=>'Å¢','ţ'=>'Å£','TÌŒ'=>'Ť','tÌŒ'=>'Å¥','Ũ'=>'Ũ','ũ'=>'Å©','UÌ„'=>'Ū','uÌ„'=>'Å«','Ŭ'=>'Ŭ','ŭ'=>'Å','UÌŠ'=>'Å®','uÌŠ'=>'ů','UÌ‹'=>'Ű','uÌ‹'=>'ű','Ų'=>'Ų','ų'=>'ų','WÌ‚'=>'Å´','wÌ‚'=>'ŵ','YÌ‚'=>'Ŷ','yÌ‚'=>'Å·','Ÿ'=>'Ÿ','ZÌ'=>'Ź','zÌ'=>'ź','Ż'=>'Å»','ż'=>'ż','ZÌŒ'=>'Ž','zÌŒ'=>'ž','OÌ›'=>'Æ ','oÌ›'=>'Æ¡','UÌ›'=>'Ư','uÌ›'=>'ư','AÌŒ'=>'Ç','aÌŒ'=>'ÇŽ','IÌŒ'=>'Ç','iÌŒ'=>'Ç','OÌŒ'=>'Ç‘','oÌŒ'=>'Ç’','UÌŒ'=>'Ç“','uÌŒ'=>'Ç”','Ǖ'=>'Ç•','ǖ'=>'Ç–','ÜÌ'=>'Ç—','üÌ'=>'ǘ','Ǚ'=>'Ç™','ǚ'=>'Çš','Ǜ'=>'Ç›','ǜ'=>'Çœ','Ǟ'=>'Çž','ǟ'=>'ÇŸ','Ǡ'=>'Ç ','ǡ'=>'Ç¡','Ǣ'=>'Ç¢','ǣ'=>'Ç£','GÌŒ'=>'Ǧ','gÌŒ'=>'ǧ','KÌŒ'=>'Ǩ','kÌŒ'=>'Ç©','Ǫ'=>'Ǫ','ǫ'=>'Ç«','Ǭ'=>'Ǭ','ǭ'=>'Ç','Æ·ÌŒ'=>'Ç®','Ê’ÌŒ'=>'ǯ','jÌŒ'=>'ǰ','GÌ'=>'Ç´','gÌ'=>'ǵ','NÌ€'=>'Ǹ','nÌ€'=>'ǹ','Ã…Ì'=>'Ǻ','Ã¥Ì'=>'Ç»','ÆÌ'=>'Ǽ','æÌ'=>'ǽ','ØÌ'=>'Ǿ','øÌ'=>'Ç¿','AÌ'=>'È€','aÌ'=>'È','AÌ‘'=>'È‚','aÌ‘'=>'ȃ','EÌ'=>'È„','eÌ'=>'È…','EÌ‘'=>'Ȇ','eÌ‘'=>'ȇ','IÌ'=>'Ȉ','iÌ'=>'ȉ','IÌ‘'=>'ÈŠ','iÌ‘'=>'È‹','OÌ'=>'ÈŒ','oÌ'=>'È','OÌ‘'=>'ÈŽ','oÌ‘'=>'È','RÌ'=>'È','rÌ'=>'È‘','RÌ‘'=>'È’','rÌ‘'=>'È“','UÌ'=>'È”','uÌ'=>'È•','UÌ‘'=>'È–','uÌ‘'=>'È—','Ș'=>'Ș','ș'=>'È™','Ț'=>'Èš','ț'=>'È›','HÌŒ'=>'Èž','hÌŒ'=>'ÈŸ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'È©','Ȫ'=>'Ȫ','ȫ'=>'È«','Ȭ'=>'Ȭ','ȭ'=>'È','Ȯ'=>'È®','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','YÌ„'=>'Ȳ','yÌ„'=>'ȳ','̈Ì'=>'Í„','¨Ì'=>'Î…','ΑÌ'=>'Ά','ΕÌ'=>'Έ','ΗÌ'=>'Ή','ΙÌ'=>'Ί','ΟÌ'=>'ÎŒ','Î¥Ì'=>'ÎŽ','ΩÌ'=>'Î','ÏŠÌ'=>'Î','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','αÌ'=>'ά','εÌ'=>'Î','ηÌ'=>'ή','ιÌ'=>'ί','Ï‹Ì'=>'ΰ','ϊ'=>'ÏŠ','ϋ'=>'Ï‹','οÌ'=>'ÏŒ','Ï…Ì'=>'Ï','ωÌ'=>'ÏŽ','Ï’Ì'=>'Ï“','ϔ'=>'Ï”','Ѐ'=>'Ѐ','Ё'=>'Ð','ГÌ'=>'Ѓ','Ї'=>'Ї','КÌ'=>'ÐŒ','Ѝ'=>'Ð','Ў'=>'ÐŽ','Й'=>'Й','й'=>'й','ѐ'=>'Ñ','ё'=>'Ñ‘','гÌ'=>'Ñ“','ї'=>'Ñ—','кÌ'=>'Ñœ','ѝ'=>'Ñ','ў'=>'Ñž','Ñ´Ì'=>'Ѷ','ѵÌ'=>'Ñ·','Ӂ'=>'Ó','ӂ'=>'Ó‚','Ð̆'=>'Ó','ӑ'=>'Ó‘','Ð̈'=>'Ó’','ӓ'=>'Ó“','Ӗ'=>'Ó–','ӗ'=>'Ó—','Ӛ'=>'Óš','ӛ'=>'Ó›','Ӝ'=>'Óœ','ӝ'=>'Ó','Ӟ'=>'Óž','ӟ'=>'ÓŸ','Ӣ'=>'Ó¢','ӣ'=>'Ó£','Ӥ'=>'Ó¤','ӥ'=>'Ó¥','Ӧ'=>'Ó¦','ӧ'=>'Ó§','Ӫ'=>'Óª','ӫ'=>'Ó«','Ð̈'=>'Ó¬','Ñ̈'=>'Ó','Ӯ'=>'Ó®','ӯ'=>'Ó¯','Ӱ'=>'Ó°','ӱ'=>'Ó±','Ӳ'=>'Ó²','ӳ'=>'Ó³','Ӵ'=>'Ó´','ӵ'=>'Óµ','Ӹ'=>'Ó¸','ӹ'=>'Ó¹','آ'=>'Ø¢','أ'=>'Ø£','ÙˆÙ”'=>'ؤ','إ'=>'Ø¥','ÙŠÙ”'=>'ئ','Û•Ù”'=>'Û€','ÛÙ”'=>'Û‚','Û’Ù”'=>'Û“','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','ো'=>'à§‹','ৌ'=>'à§Œ','à‡à–'=>'àˆ','à‡à¬¾'=>'à‹','à‡à—'=>'àŒ','ஔ'=>'à®”','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'à³€','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'à·š','à·™à·'=>'à·œ','ෝ'=>'à·','ෞ'=>'à·ž','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ཱྀ'=>'à¾','ဦ'=>'ဦ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','á¬á¬µ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'á€','ᭁ'=>'á','á‚ᬵ'=>'áƒ','AÌ¥'=>'Ḁ','aÌ¥'=>'á¸','Ḃ'=>'Ḃ','ḃ'=>'ḃ','BÌ£'=>'Ḅ','bÌ£'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','ÇÌ'=>'Ḉ','çÌ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','DÌ£'=>'Ḍ','dÌ£'=>'á¸','Ḏ'=>'Ḏ','ḏ'=>'á¸','Ḑ'=>'á¸','ḑ'=>'ḑ','DÌ'=>'Ḓ','dÌ'=>'ḓ','Ä’Ì€'=>'Ḕ','ḕ'=>'ḕ','Ä’Ì'=>'Ḗ','Ä“Ì'=>'ḗ','EÌ'=>'Ḙ','eÌ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'á¸','Ḟ'=>'Ḟ','ḟ'=>'ḟ','GÌ„'=>'Ḡ','gÌ„'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','HÌ£'=>'Ḥ','hÌ£'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','HÌ®'=>'Ḫ','hÌ®'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'á¸','ÃÌ'=>'Ḯ','ïÌ'=>'ḯ','KÌ'=>'Ḱ','kÌ'=>'ḱ','KÌ£'=>'Ḳ','kÌ£'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','LÌ£'=>'Ḷ','lÌ£'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','LÌ'=>'Ḽ','lÌ'=>'ḽ','MÌ'=>'Ḿ','mÌ'=>'ḿ','Ṁ'=>'á¹€','ṁ'=>'á¹','MÌ£'=>'Ṃ','mÌ£'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'á¹…','NÌ£'=>'Ṇ','nÌ£'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','NÌ'=>'Ṋ','nÌ'=>'ṋ','ÕÌ'=>'Ṍ','õÌ'=>'á¹','Ṏ'=>'Ṏ','ṏ'=>'á¹','Ṑ'=>'á¹','ÅÌ€'=>'ṑ','ÅŒÌ'=>'á¹’','ÅÌ'=>'ṓ','PÌ'=>'á¹”','pÌ'=>'ṕ','Ṗ'=>'á¹–','ṗ'=>'á¹—','Ṙ'=>'Ṙ','ṙ'=>'á¹™','RÌ£'=>'Ṛ','rÌ£'=>'á¹›','Ṝ'=>'Ṝ','ṝ'=>'á¹','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'á¹ ','ṡ'=>'ṡ','SÌ£'=>'á¹¢','sÌ£'=>'á¹£','Ṥ'=>'Ṥ','ṥ'=>'á¹¥','Ṧ'=>'Ṧ','ṧ'=>'á¹§','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','TÌ£'=>'Ṭ','tÌ£'=>'á¹','Ṯ'=>'á¹®','ṯ'=>'ṯ','TÌ'=>'á¹°','tÌ'=>'á¹±','Ṳ'=>'á¹²','ṳ'=>'á¹³','Ṵ'=>'á¹´','ṵ'=>'á¹µ','UÌ'=>'á¹¶','uÌ'=>'á¹·','ŨÌ'=>'Ṹ','Å©Ì'=>'á¹¹','Ṻ'=>'Ṻ','ṻ'=>'á¹»','Ṽ'=>'á¹¼','ṽ'=>'á¹½','VÌ£'=>'á¹¾','vÌ£'=>'ṿ','WÌ€'=>'Ẁ','wÌ€'=>'áº','WÌ'=>'Ẃ','wÌ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','WÌ£'=>'Ẉ','wÌ£'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'áº','Ẏ'=>'Ẏ','ẏ'=>'áº','ZÌ‚'=>'áº','zÌ‚'=>'ẑ','ZÌ£'=>'Ẓ','zÌ£'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','wÌŠ'=>'ẘ','yÌŠ'=>'ẙ','ẛ'=>'ẛ','AÌ£'=>'Ạ','aÌ£'=>'ạ','Ả'=>'Ả','ả'=>'ả','ÂÌ'=>'Ấ','âÌ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'áº','Ä‚Ì'=>'Ắ','ăÌ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','EÌ£'=>'Ẹ','eÌ£'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','ÊÌ'=>'Ế','êÌ'=>'ế','Ề'=>'Ề','ề'=>'á»','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'á»…','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','IÌ£'=>'Ị','iÌ£'=>'ị','OÌ£'=>'Ọ','oÌ£'=>'á»','Ỏ'=>'Ỏ','ỏ'=>'á»','ÔÌ'=>'á»','ôÌ'=>'ố','Ồ'=>'á»’','ồ'=>'ồ','Ổ'=>'á»”','ổ'=>'ổ','Ỗ'=>'á»–','ỗ'=>'á»—','Ộ'=>'Ộ','á»Ì‚'=>'á»™','Æ Ì'=>'Ớ','Æ¡Ì'=>'á»›','Ờ'=>'Ờ','ờ'=>'á»','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'á» ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','UÌ£'=>'Ụ','uÌ£'=>'ụ','Ủ'=>'Ủ','ủ'=>'á»§','ƯÌ'=>'Ứ','ưÌ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'á»','Ữ'=>'á»®','ữ'=>'ữ','Ự'=>'á»°','ự'=>'á»±','YÌ€'=>'Ỳ','yÌ€'=>'ỳ','YÌ£'=>'á»´','yÌ£'=>'ỵ','Ỷ'=>'á»¶','ỷ'=>'á»·','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'á¼€','ἁ'=>'á¼','ἂ'=>'ἂ','á¼Ì€'=>'ἃ','á¼€Ì'=>'ἄ','á¼Ì'=>'á¼…','ἆ'=>'ἆ','á¼Í‚'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','ἈÌ'=>'Ἄ','ἉÌ'=>'á¼','Ἆ'=>'Ἆ','Ἇ'=>'á¼','ἐ'=>'á¼','ἑ'=>'ἑ','á¼Ì€'=>'á¼’','ἓ'=>'ἓ','á¼Ì'=>'á¼”','ἑÌ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'á¼™','Ἒ'=>'Ἒ','Ἓ'=>'á¼›','ἘÌ'=>'Ἔ','á¼™Ì'=>'á¼','ἠ'=>'á¼ ','ἡ'=>'ἡ','ἢ'=>'á¼¢','ἣ'=>'á¼£','á¼ Ì'=>'ἤ','ἡÌ'=>'á¼¥','á¼ Í‚'=>'ἦ','ἧ'=>'á¼§','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','ἨÌ'=>'Ἤ','ἩÌ'=>'á¼','Ἦ'=>'á¼®','Ἧ'=>'Ἧ','ἰ'=>'á¼°','ἱ'=>'á¼±','á¼°Ì€'=>'á¼²','ἳ'=>'á¼³','á¼°Ì'=>'á¼´','á¼±Ì'=>'á¼µ','á¼°Í‚'=>'á¼¶','ἷ'=>'á¼·','Ἰ'=>'Ἰ','Ἱ'=>'á¼¹','Ἲ'=>'Ἲ','Ἳ'=>'á¼»','ἸÌ'=>'á¼¼','á¼¹Ì'=>'á¼½','Ἶ'=>'á¼¾','Ἷ'=>'Ἷ','ὀ'=>'á½€','ὁ'=>'á½','ὂ'=>'ὂ','á½Ì€'=>'ὃ','á½€Ì'=>'ὄ','á½Ì'=>'á½…','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','ὈÌ'=>'Ὄ','ὉÌ'=>'á½','Ï…Ì“'=>'á½','Ï…Ì”'=>'ὑ','á½Ì€'=>'á½’','ὓ'=>'ὓ','á½Ì'=>'á½”','ὑÌ'=>'ὕ','á½Í‚'=>'á½–','ὗ'=>'á½—','Ὑ'=>'á½™','Ὓ'=>'á½›','á½™Ì'=>'á½','Ὗ'=>'Ὗ','ὠ'=>'á½ ','ὡ'=>'ὡ','ὢ'=>'á½¢','ὣ'=>'á½£','á½ Ì'=>'ὤ','ὡÌ'=>'á½¥','á½ Í‚'=>'ὦ','ὧ'=>'á½§','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','ὨÌ'=>'Ὤ','ὩÌ'=>'á½','Ὦ'=>'á½®','Ὧ'=>'Ὧ','ὰ'=>'á½°','ὲ'=>'á½²','ὴ'=>'á½´','ὶ'=>'á½¶','ὸ'=>'ὸ','Ï…Ì€'=>'ὺ','ὼ'=>'á½¼','ᾀ'=>'á¾€','á¼Í…'=>'á¾','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','á¼…Í…'=>'á¾…','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','á¼Í…'=>'á¾','ᾎ'=>'ᾎ','á¼Í…'=>'á¾','á¼ Í…'=>'á¾','ᾑ'=>'ᾑ','ᾒ'=>'á¾’','ᾓ'=>'ᾓ','ᾔ'=>'á¾”','ᾕ'=>'ᾕ','ᾖ'=>'á¾–','á¼§Í…'=>'á¾—','ᾘ'=>'ᾘ','ᾙ'=>'á¾™','ᾚ'=>'ᾚ','ᾛ'=>'á¾›','ᾜ'=>'ᾜ','á¼Í…'=>'á¾','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','á½ Í…'=>'á¾ ','ᾡ'=>'ᾡ','ᾢ'=>'á¾¢','ᾣ'=>'á¾£','ᾤ'=>'ᾤ','ᾥ'=>'á¾¥','ᾦ'=>'ᾦ','á½§Í…'=>'á¾§','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','á½Í…'=>'á¾','ᾮ'=>'á¾®','ᾯ'=>'ᾯ','ᾰ'=>'á¾°','ᾱ'=>'á¾±','á½°Í…'=>'á¾²','ᾳ'=>'á¾³','ᾴ'=>'á¾´','ᾶ'=>'á¾¶','á¾¶Í…'=>'á¾·','Ᾰ'=>'Ᾰ','Ᾱ'=>'á¾¹','Ὰ'=>'Ὰ','ᾼ'=>'á¾¼','῁'=>'á¿','á½´Í…'=>'á¿‚','ῃ'=>'ῃ','ῄ'=>'á¿„','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Ὴ'=>'Ὴ','ῌ'=>'ῌ','῍'=>'á¿','᾿Ì'=>'῎','῏'=>'á¿','ῐ'=>'á¿','ῑ'=>'á¿‘','ÏŠÌ€'=>'á¿’','ῖ'=>'á¿–','ÏŠÍ‚'=>'á¿—','Ῐ'=>'Ῐ','Ῑ'=>'á¿™','Ὶ'=>'Ὶ','῝'=>'á¿','῾Ì'=>'῞','῟'=>'῟','ῠ'=>'á¿ ','Ï…Ì„'=>'á¿¡','ῢ'=>'á¿¢','ÏÌ“'=>'ῤ','ÏÌ”'=>'á¿¥','Ï…Í‚'=>'ῦ','ῧ'=>'á¿§','Ῠ'=>'Ῠ','Ῡ'=>'á¿©','Ὺ'=>'Ὺ','Ῥ'=>'Ῥ','῭'=>'á¿','ῲ'=>'ῲ','ῳ'=>'ῳ','ÏŽÍ…'=>'á¿´','ῶ'=>'á¿¶','á¿¶Í…'=>'á¿·','Ὸ'=>'Ὸ','Ὼ'=>'Ὼ','ῼ'=>'ῼ','â†Ì¸'=>'↚','↛'=>'↛','↮'=>'↮','â‡Ì¸'=>'â‡','⇎'=>'⇎','⇏'=>'â‡','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','≁'=>'â‰','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','â‰Ì¸'=>'â‰','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'âŠ','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'âŠ','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'â‹ ','⋡'=>'â‹¡','⋢'=>'â‹¢','⋣'=>'â‹£','⋪'=>'⋪','⋫'=>'â‹«','⋬'=>'⋬','⋭'=>'â‹','ã‹ã‚™'=>'ãŒ','ãã‚™'=>'ãŽ','ãã‚™'=>'ã','ã‘ã‚™'=>'ã’','ã“ã‚™'=>'ã”','ã•ã‚™'=>'ã–','ã—ã‚™'=>'ã˜','ã™ã‚™'=>'ãš','ã›ã‚™'=>'ãœ','ãã‚™'=>'ãž','ãŸã‚™'=>'ã ','ã¡ã‚™'=>'ã¢','ã¤ã‚™'=>'ã¥','ã¦ã‚™'=>'ã§','ã¨ã‚™'=>'ã©','ã¯ã‚™'=>'ã°','ã¯ã‚š'=>'ã±','ã²ã‚™'=>'ã³','ã²ã‚š'=>'ã´','ãµã‚™'=>'ã¶','ãµã‚š'=>'ã·','ã¸ã‚™'=>'ã¹','ã¸ã‚š'=>'ãº','ã»ã‚™'=>'ã¼','ã»ã‚š'=>'ã½','ã†ã‚™'=>'ã‚”','ã‚ã‚™'=>'ゞ','ã‚«ã‚™'=>'ガ','ã‚ã‚™'=>'ã‚®','グ'=>'ã‚°','ゲ'=>'ゲ','ゴ'=>'ã‚´','ザ'=>'ã‚¶','ã‚·ã‚™'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ã‚¿ã‚™'=>'ダ','ãƒã‚™'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','ãƒã‚™'=>'ãƒ','ãƒã‚š'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ãƒ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ'); diff --git a/phpBB/includes/utf/data/utf_canonical_decomp.php b/phpBB/includes/utf/data/utf_canonical_decomp.php deleted file mode 100644 index 9fb90803e2..0000000000 --- a/phpBB/includes/utf/data/utf_canonical_decomp.php +++ /dev/null @@ -1,2 +0,0 @@ -<?php -$GLOBALS['utf_canonical_decomp']=array('À'=>'AÌ€','Ã'=>'AÌ','Â'=>'AÌ‚','Ã'=>'Ã','Ä'=>'Ä','Ã…'=>'AÌŠ','Ç'=>'Ç','È'=>'EÌ€','É'=>'EÌ','Ê'=>'EÌ‚','Ë'=>'Ë','ÃŒ'=>'IÌ€','Ã'=>'IÌ','ÃŽ'=>'IÌ‚','Ã'=>'Ï','Ñ'=>'Ñ','Ã’'=>'OÌ€','Ó'=>'OÌ','Ô'=>'OÌ‚','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'UÌ€','Ú'=>'UÌ','Û'=>'UÌ‚','Ü'=>'Ü','Ã'=>'YÌ','à'=>'aÌ€','á'=>'aÌ','â'=>'aÌ‚','ã'=>'ã','ä'=>'ä','Ã¥'=>'aÌŠ','ç'=>'ç','è'=>'eÌ€','é'=>'eÌ','ê'=>'eÌ‚','ë'=>'ë','ì'=>'iÌ€','Ã'=>'iÌ','î'=>'iÌ‚','ï'=>'ï','ñ'=>'ñ','ò'=>'oÌ€','ó'=>'oÌ','ô'=>'oÌ‚','õ'=>'õ','ö'=>'ö','ù'=>'uÌ€','ú'=>'uÌ','û'=>'uÌ‚','ü'=>'ü','ý'=>'yÌ','ÿ'=>'ÿ','Ä€'=>'AÌ„','Ä'=>'aÌ„','Ä‚'=>'Ă','ă'=>'ă','Ä„'=>'Ą','Ä…'=>'ą','Ć'=>'CÌ','ć'=>'cÌ','Ĉ'=>'CÌ‚','ĉ'=>'cÌ‚','ÄŠ'=>'Ċ','Ä‹'=>'ċ','ÄŒ'=>'CÌŒ','Ä'=>'cÌŒ','ÄŽ'=>'DÌŒ','Ä'=>'dÌŒ','Ä’'=>'EÌ„','Ä“'=>'eÌ„','Ä”'=>'Ĕ','Ä•'=>'ĕ','Ä–'=>'Ė','Ä—'=>'ė','Ę'=>'Ę','Ä™'=>'ę','Äš'=>'EÌŒ','Ä›'=>'eÌŒ','Äœ'=>'GÌ‚','Ä'=>'gÌ‚','Äž'=>'Ğ','ÄŸ'=>'ğ','Ä '=>'Ġ','Ä¡'=>'ġ','Ä¢'=>'Ģ','Ä£'=>'ģ','Ĥ'=>'HÌ‚','Ä¥'=>'hÌ‚','Ĩ'=>'Ĩ','Ä©'=>'ĩ','Ī'=>'IÌ„','Ä«'=>'iÌ„','Ĭ'=>'Ĭ','Ä'=>'ĭ','Ä®'=>'Į','į'=>'į','İ'=>'İ','Ä´'=>'JÌ‚','ĵ'=>'jÌ‚','Ķ'=>'Ķ','Ä·'=>'ķ','Ĺ'=>'LÌ','ĺ'=>'lÌ','Ä»'=>'Ļ','ļ'=>'ļ','Ľ'=>'LÌŒ','ľ'=>'lÌŒ','Ń'=>'NÌ','Å„'=>'nÌ','Å…'=>'Ņ','ņ'=>'ņ','Ň'=>'NÌŒ','ň'=>'nÌŒ','ÅŒ'=>'OÌ„','Å'=>'oÌ„','ÅŽ'=>'Ŏ','Å'=>'ŏ','Å'=>'OÌ‹','Å‘'=>'oÌ‹','Å”'=>'RÌ','Å•'=>'rÌ','Å–'=>'Ŗ','Å—'=>'ŗ','Ř'=>'RÌŒ','Å™'=>'rÌŒ','Åš'=>'SÌ','Å›'=>'sÌ','Åœ'=>'SÌ‚','Å'=>'sÌ‚','Åž'=>'Ş','ÅŸ'=>'ş','Å '=>'SÌŒ','Å¡'=>'sÌŒ','Å¢'=>'Ţ','Å£'=>'ţ','Ť'=>'TÌŒ','Å¥'=>'tÌŒ','Ũ'=>'Ũ','Å©'=>'ũ','Ū'=>'UÌ„','Å«'=>'uÌ„','Ŭ'=>'Ŭ','Å'=>'ŭ','Å®'=>'UÌŠ','ů'=>'uÌŠ','Ű'=>'UÌ‹','ű'=>'uÌ‹','Ų'=>'Ų','ų'=>'ų','Å´'=>'WÌ‚','ŵ'=>'wÌ‚','Ŷ'=>'YÌ‚','Å·'=>'yÌ‚','Ÿ'=>'Ÿ','Ź'=>'ZÌ','ź'=>'zÌ','Å»'=>'Ż','ż'=>'ż','Ž'=>'ZÌŒ','ž'=>'zÌŒ','Æ '=>'OÌ›','Æ¡'=>'oÌ›','Ư'=>'UÌ›','ư'=>'uÌ›','Ç'=>'AÌŒ','ÇŽ'=>'aÌŒ','Ç'=>'IÌŒ','Ç'=>'iÌŒ','Ç‘'=>'OÌŒ','Ç’'=>'oÌŒ','Ç“'=>'UÌŒ','Ç”'=>'uÌŒ','Ç•'=>'Ǖ','Ç–'=>'ǖ','Ç—'=>'ÜÌ','ǘ'=>'üÌ','Ç™'=>'Ǚ','Çš'=>'ǚ','Ç›'=>'Ǜ','Çœ'=>'ǜ','Çž'=>'Ǟ','ÇŸ'=>'ǟ','Ç '=>'Ǡ','Ç¡'=>'ǡ','Ç¢'=>'Ǣ','Ç£'=>'ǣ','Ǧ'=>'GÌŒ','ǧ'=>'gÌŒ','Ǩ'=>'KÌŒ','Ç©'=>'kÌŒ','Ǫ'=>'Ǫ','Ç«'=>'ǫ','Ǭ'=>'Ǭ','Ç'=>'ǭ','Ç®'=>'Æ·ÌŒ','ǯ'=>'Ê’ÌŒ','ǰ'=>'jÌŒ','Ç´'=>'GÌ','ǵ'=>'gÌ','Ǹ'=>'NÌ€','ǹ'=>'nÌ€','Ǻ'=>'AÌŠÌ','Ç»'=>'aÌŠÌ','Ǽ'=>'ÆÌ','ǽ'=>'æÌ','Ǿ'=>'ØÌ','Ç¿'=>'øÌ','È€'=>'AÌ','È'=>'aÌ','È‚'=>'AÌ‘','ȃ'=>'aÌ‘','È„'=>'EÌ','È…'=>'eÌ','Ȇ'=>'EÌ‘','ȇ'=>'eÌ‘','Ȉ'=>'IÌ','ȉ'=>'iÌ','ÈŠ'=>'IÌ‘','È‹'=>'iÌ‘','ÈŒ'=>'OÌ','È'=>'oÌ','ÈŽ'=>'OÌ‘','È'=>'oÌ‘','È'=>'RÌ','È‘'=>'rÌ','È’'=>'RÌ‘','È“'=>'rÌ‘','È”'=>'UÌ','È•'=>'uÌ','È–'=>'UÌ‘','È—'=>'uÌ‘','Ș'=>'Ș','È™'=>'ș','Èš'=>'Ț','È›'=>'ț','Èž'=>'HÌŒ','ÈŸ'=>'hÌŒ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','È©'=>'ȩ','Ȫ'=>'Ȫ','È«'=>'ȫ','Ȭ'=>'Ȭ','È'=>'ȭ','È®'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'YÌ„','ȳ'=>'yÌ„','Í€'=>'Ì€','Í'=>'Ì','̓'=>'Ì“','Í„'=>'̈Ì','Í´'=>'ʹ',';'=>';','Î…'=>'¨Ì','Ά'=>'ΑÌ','·'=>'·','Έ'=>'ΕÌ','Ή'=>'ΗÌ','Ί'=>'ΙÌ','ÎŒ'=>'ΟÌ','ÎŽ'=>'Î¥Ì','Î'=>'ΩÌ','Î'=>'ϊÌ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'αÌ','Î'=>'εÌ','ή'=>'ηÌ','ί'=>'ιÌ','ΰ'=>'ϋÌ','ÏŠ'=>'ϊ','Ï‹'=>'ϋ','ÏŒ'=>'οÌ','Ï'=>'Ï…Ì','ÏŽ'=>'ωÌ','Ï“'=>'Ï’Ì','Ï”'=>'ϔ','Ѐ'=>'Ѐ','Ð'=>'Ё','Ѓ'=>'ГÌ','Ї'=>'Ї','ÐŒ'=>'КÌ','Ð'=>'Ѝ','ÐŽ'=>'Ў','Й'=>'Й','й'=>'й','Ñ'=>'ѐ','Ñ‘'=>'ё','Ñ“'=>'гÌ','Ñ—'=>'ї','Ñœ'=>'кÌ','Ñ'=>'ѝ','Ñž'=>'ў','Ѷ'=>'Ñ´Ì','Ñ·'=>'ѵÌ','Ó'=>'Ӂ','Ó‚'=>'ӂ','Ó'=>'Ð̆','Ó‘'=>'ӑ','Ó’'=>'Ð̈','Ó“'=>'ӓ','Ó–'=>'Ӗ','Ó—'=>'ӗ','Óš'=>'Ӛ','Ó›'=>'ӛ','Óœ'=>'Ӝ','Ó'=>'ӝ','Óž'=>'Ӟ','ÓŸ'=>'ӟ','Ó¢'=>'Ӣ','Ó£'=>'ӣ','Ó¤'=>'Ӥ','Ó¥'=>'ӥ','Ó¦'=>'Ӧ','Ó§'=>'ӧ','Óª'=>'Ӫ','Ó«'=>'ӫ','Ó¬'=>'Ð̈','Ó'=>'Ñ̈','Ó®'=>'Ӯ','Ó¯'=>'ӯ','Ó°'=>'Ӱ','Ó±'=>'ӱ','Ó²'=>'Ӳ','Ó³'=>'ӳ','Ó´'=>'Ӵ','Óµ'=>'ӵ','Ó¸'=>'Ӹ','Ó¹'=>'ӹ','Ø¢'=>'آ','Ø£'=>'أ','ؤ'=>'ÙˆÙ”','Ø¥'=>'إ','ئ'=>'ÙŠÙ”','Û€'=>'Û•Ù”','Û‚'=>'ÛÙ”','Û“'=>'Û’Ù”','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','à¥'=>'ढ़','फ़'=>'फ़','य़'=>'य़','à§‹'=>'ো','à§Œ'=>'ৌ','à§œ'=>'ড়','à§'=>'ঢ়','à§Ÿ'=>'য়','ਲ਼'=>'ਲ਼','ਸ਼'=>'ਸ਼','à©™'=>'ਖ਼','ਗ਼'=>'ਗ਼','à©›'=>'ਜ਼','ਫ਼'=>'ਫ਼','àˆ'=>'à‡à–','à‹'=>'à‡à¬¾','àŒ'=>'à‡à—','àœ'=>'ଡ଼','à'=>'ଢ଼','à®”'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','à³€'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','à·š'=>'ේ','à·œ'=>'à·™à·','à·'=>'à·™à·à·Š','à·ž'=>'ෞ','གྷ'=>'གྷ','à½'=>'ཌྷ','དྷ'=>'དྷ','བྷ'=>'བྷ','ཛྷ'=>'ཛྷ','ཀྵ'=>'ཀྵ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ླྀ'=>'ླྀ','à¾'=>'ཱྀ','ྒྷ'=>'ྒྷ','à¾'=>'ྜྷ','ྡྷ'=>'ྡྷ','ྦྷ'=>'ྦྷ','ྫྷ'=>'ྫྷ','ྐྵ'=>'à¾à¾µ','ဦ'=>'ဦ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'á¬á¬µ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','á€'=>'ᭀ','á'=>'ᭁ','áƒ'=>'á‚ᬵ','Ḁ'=>'AÌ¥','á¸'=>'aÌ¥','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'BÌ£','ḅ'=>'bÌ£','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'ÇÌ','ḉ'=>'çÌ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'DÌ£','á¸'=>'dÌ£','Ḏ'=>'Ḏ','á¸'=>'ḏ','á¸'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'DÌ','ḓ'=>'dÌ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'EÌ„Ì','ḗ'=>'eÌ„Ì','Ḙ'=>'EÌ','ḙ'=>'eÌ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','á¸'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'GÌ„','ḡ'=>'gÌ„','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'HÌ£','ḥ'=>'hÌ£','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'HÌ®','ḫ'=>'hÌ®','Ḭ'=>'Ḭ','á¸'=>'ḭ','Ḯ'=>'ÏÌ','ḯ'=>'ïÌ','Ḱ'=>'KÌ','ḱ'=>'kÌ','Ḳ'=>'KÌ£','ḳ'=>'kÌ£','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'LÌ£','ḷ'=>'lÌ£','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'LÌ','ḽ'=>'lÌ','Ḿ'=>'MÌ','ḿ'=>'mÌ','á¹€'=>'Ṁ','á¹'=>'ṁ','Ṃ'=>'MÌ£','ṃ'=>'mÌ£','Ṅ'=>'Ṅ','á¹…'=>'ṅ','Ṇ'=>'NÌ£','ṇ'=>'nÌ£','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'NÌ','ṋ'=>'nÌ','Ṍ'=>'ÕÌ','á¹'=>'õÌ','Ṏ'=>'Ṏ','á¹'=>'ṏ','á¹'=>'Ṑ','ṑ'=>'ṑ','á¹’'=>'OÌ„Ì','ṓ'=>'oÌ„Ì','á¹”'=>'PÌ','ṕ'=>'pÌ','á¹–'=>'Ṗ','á¹—'=>'ṗ','Ṙ'=>'Ṙ','á¹™'=>'ṙ','Ṛ'=>'RÌ£','á¹›'=>'rÌ£','Ṝ'=>'Ṝ','á¹'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','á¹ '=>'Ṡ','ṡ'=>'ṡ','á¹¢'=>'SÌ£','á¹£'=>'sÌ£','Ṥ'=>'SÌ̇','á¹¥'=>'sÌ̇','Ṧ'=>'Ṧ','á¹§'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'TÌ£','á¹'=>'tÌ£','á¹®'=>'Ṯ','ṯ'=>'ṯ','á¹°'=>'TÌ','á¹±'=>'tÌ','á¹²'=>'Ṳ','á¹³'=>'ṳ','á¹´'=>'Ṵ','á¹µ'=>'ṵ','á¹¶'=>'UÌ','á¹·'=>'uÌ','Ṹ'=>'ŨÌ','á¹¹'=>'ũÌ','Ṻ'=>'Ṻ','á¹»'=>'ṻ','á¹¼'=>'Ṽ','á¹½'=>'ṽ','á¹¾'=>'VÌ£','ṿ'=>'vÌ£','Ẁ'=>'WÌ€','áº'=>'wÌ€','Ẃ'=>'WÌ','ẃ'=>'wÌ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'WÌ£','ẉ'=>'wÌ£','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','áº'=>'ẍ','Ẏ'=>'Ẏ','áº'=>'ẏ','áº'=>'ZÌ‚','ẑ'=>'zÌ‚','Ẓ'=>'ZÌ£','ẓ'=>'zÌ£','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'wÌŠ','ẙ'=>'yÌŠ','ẛ'=>'ẛ','Ạ'=>'AÌ£','ạ'=>'aÌ£','Ả'=>'Ả','ả'=>'ả','Ấ'=>'AÌ‚Ì','ấ'=>'aÌ‚Ì','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','áº'=>'ậ','Ắ'=>'ĂÌ','ắ'=>'ăÌ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'EÌ£','ẹ'=>'eÌ£','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'EÌ‚Ì','ế'=>'eÌ‚Ì','Ề'=>'Ề','á»'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','á»…'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'IÌ£','ị'=>'iÌ£','Ọ'=>'OÌ£','á»'=>'oÌ£','Ỏ'=>'Ỏ','á»'=>'ỏ','á»'=>'OÌ‚Ì','ố'=>'oÌ‚Ì','á»’'=>'Ồ','ồ'=>'ồ','á»”'=>'Ổ','ổ'=>'ổ','á»–'=>'Ỗ','á»—'=>'ỗ','Ộ'=>'Ộ','á»™'=>'ộ','Ớ'=>'OÌ›Ì','á»›'=>'oÌ›Ì','Ờ'=>'Ờ','á»'=>'ờ','Ở'=>'Ở','ở'=>'ở','á» '=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'UÌ£','ụ'=>'uÌ£','Ủ'=>'Ủ','á»§'=>'ủ','Ứ'=>'UÌ›Ì','ứ'=>'uÌ›Ì','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','á»'=>'ử','á»®'=>'Ữ','ữ'=>'ữ','á»°'=>'Ự','á»±'=>'ự','Ỳ'=>'YÌ€','ỳ'=>'yÌ€','á»´'=>'YÌ£','ỵ'=>'yÌ£','á»¶'=>'Ỷ','á»·'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','á¼€'=>'ἀ','á¼'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἀÌ','á¼…'=>'ἁÌ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'ἈÌ','á¼'=>'ἉÌ','Ἆ'=>'Ἆ','á¼'=>'Ἇ','á¼'=>'ἐ','ἑ'=>'ἑ','á¼’'=>'ἒ','ἓ'=>'ἓ','á¼”'=>'ἐÌ','ἕ'=>'ἑÌ','Ἐ'=>'Ἐ','á¼™'=>'Ἑ','Ἒ'=>'Ἒ','á¼›'=>'Ἓ','Ἔ'=>'ἘÌ','á¼'=>'ἙÌ','á¼ '=>'ἠ','ἡ'=>'ἡ','á¼¢'=>'ἢ','á¼£'=>'ἣ','ἤ'=>'ἠÌ','á¼¥'=>'ἡÌ','ἦ'=>'ἦ','á¼§'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'ἨÌ','á¼'=>'ἩÌ','á¼®'=>'Ἦ','Ἧ'=>'Ἧ','á¼°'=>'ἰ','á¼±'=>'ἱ','á¼²'=>'ἲ','á¼³'=>'ἳ','á¼´'=>'ἰÌ','á¼µ'=>'ἱÌ','á¼¶'=>'ἶ','á¼·'=>'ἷ','Ἰ'=>'Ἰ','á¼¹'=>'Ἱ','Ἲ'=>'Ἲ','á¼»'=>'Ἳ','á¼¼'=>'ἸÌ','á¼½'=>'ἹÌ','á¼¾'=>'Ἶ','Ἷ'=>'Ἷ','á½€'=>'ὀ','á½'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὀÌ','á½…'=>'ὁÌ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'ὈÌ','á½'=>'ὉÌ','á½'=>'Ï…Ì“','ὑ'=>'Ï…Ì”','á½’'=>'ὒ','ὓ'=>'ὓ','á½”'=>'Ï…Ì“Ì','ὕ'=>'Ï…Ì”Ì','á½–'=>'ὖ','á½—'=>'ὗ','á½™'=>'Ὑ','á½›'=>'Ὓ','á½'=>'ὙÌ','Ὗ'=>'Ὗ','á½ '=>'ὠ','ὡ'=>'ὡ','á½¢'=>'ὢ','á½£'=>'ὣ','ὤ'=>'ὠÌ','á½¥'=>'ὡÌ','ὦ'=>'ὦ','á½§'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'ὨÌ','á½'=>'ὩÌ','á½®'=>'Ὦ','Ὧ'=>'Ὧ','á½°'=>'ὰ','á½±'=>'αÌ','á½²'=>'ὲ','á½³'=>'εÌ','á½´'=>'ὴ','á½µ'=>'ηÌ','á½¶'=>'ὶ','á½·'=>'ιÌ','ὸ'=>'ὸ','á½¹'=>'οÌ','ὺ'=>'Ï…Ì€','á½»'=>'Ï…Ì','á½¼'=>'ὼ','á½½'=>'ωÌ','á¾€'=>'ᾀ','á¾'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ἀÌÍ…','á¾…'=>'ἁÌÍ…','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ἈÌÍ…','á¾'=>'ἉÌÍ…','ᾎ'=>'ᾎ','á¾'=>'ᾏ','á¾'=>'ᾐ','ᾑ'=>'ᾑ','á¾’'=>'ᾒ','ᾓ'=>'ᾓ','á¾”'=>'ἠÌÍ…','ᾕ'=>'ἡÌÍ…','á¾–'=>'ᾖ','á¾—'=>'ᾗ','ᾘ'=>'ᾘ','á¾™'=>'ᾙ','ᾚ'=>'ᾚ','á¾›'=>'ᾛ','ᾜ'=>'ἨÌÍ…','á¾'=>'ἩÌÍ…','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','á¾ '=>'ᾠ','ᾡ'=>'ᾡ','á¾¢'=>'ᾢ','á¾£'=>'ᾣ','ᾤ'=>'ὠÌÍ…','á¾¥'=>'ὡÌÍ…','ᾦ'=>'ᾦ','á¾§'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ὨÌÍ…','á¾'=>'ὩÌÍ…','á¾®'=>'ᾮ','ᾯ'=>'ᾯ','á¾°'=>'ᾰ','á¾±'=>'ᾱ','á¾²'=>'ᾲ','á¾³'=>'ᾳ','á¾´'=>'αÌÍ…','á¾¶'=>'ᾶ','á¾·'=>'ᾷ','Ᾰ'=>'Ᾰ','á¾¹'=>'Ᾱ','Ὰ'=>'Ὰ','á¾»'=>'ΑÌ','á¾¼'=>'ᾼ','á¾¾'=>'ι','á¿'=>'῁','á¿‚'=>'ῂ','ῃ'=>'ῃ','á¿„'=>'ηÌÍ…','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Έ'=>'ΕÌ','Ὴ'=>'Ὴ','á¿‹'=>'ΗÌ','ῌ'=>'ῌ','á¿'=>'῍','῎'=>'᾿Ì','á¿'=>'῏','á¿'=>'ῐ','á¿‘'=>'ῑ','á¿’'=>'ῒ','á¿“'=>'ϊÌ','á¿–'=>'ῖ','á¿—'=>'ῗ','Ῐ'=>'Ῐ','á¿™'=>'Ῑ','Ὶ'=>'Ὶ','á¿›'=>'ΙÌ','á¿'=>'῝','῞'=>'῾Ì','῟'=>'῟','á¿ '=>'ῠ','á¿¡'=>'Ï…Ì„','á¿¢'=>'ῢ','á¿£'=>'ϋÌ','ῤ'=>'ÏÌ“','á¿¥'=>'ÏÌ”','ῦ'=>'Ï…Í‚','á¿§'=>'ῧ','Ῠ'=>'Ῠ','á¿©'=>'Ῡ','Ὺ'=>'Ὺ','á¿«'=>'Î¥Ì','Ῥ'=>'Ῥ','á¿'=>'῭','á¿®'=>'¨Ì','`'=>'`','ῲ'=>'ῲ','ῳ'=>'ῳ','á¿´'=>'ωÌÍ…','á¿¶'=>'ῶ','á¿·'=>'ῷ','Ὸ'=>'Ὸ','Ό'=>'ΟÌ','Ὼ'=>'Ὼ','á¿»'=>'ΩÌ','ῼ'=>'ῼ','´'=>'´',' '=>' ','â€'=>' ','Ω'=>'Ω','K'=>'K','â„«'=>'AÌŠ','↚'=>'â†Ì¸','↛'=>'↛','↮'=>'↮','â‡'=>'â‡Ì¸','⇎'=>'⇎','â‡'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','â‰'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','â‰'=>'â‰Ì¸','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','âŠ'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','âŠ'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','â‹ '=>'⋠','â‹¡'=>'⋡','â‹¢'=>'⋢','â‹£'=>'⋣','⋪'=>'⋪','â‹«'=>'⋫','⋬'=>'⋬','â‹'=>'⋭','〈'=>'〈','〉'=>'〉','⫝̸'=>'â«Ì¸','ãŒ'=>'ã‹ã‚™','ãŽ'=>'ãã‚™','ã'=>'ãã‚™','ã’'=>'ã‘ã‚™','ã”'=>'ã“ã‚™','ã–'=>'ã•ã‚™','ã˜'=>'ã—ã‚™','ãš'=>'ã™ã‚™','ãœ'=>'ã›ã‚™','ãž'=>'ãã‚™','ã '=>'ãŸã‚™','ã¢'=>'ã¡ã‚™','ã¥'=>'ã¤ã‚™','ã§'=>'ã¦ã‚™','ã©'=>'ã¨ã‚™','ã°'=>'ã¯ã‚™','ã±'=>'ã¯ã‚š','ã³'=>'ã²ã‚™','ã´'=>'ã²ã‚š','ã¶'=>'ãµã‚™','ã·'=>'ãµã‚š','ã¹'=>'ã¸ã‚™','ãº'=>'ã¸ã‚š','ã¼'=>'ã»ã‚™','ã½'=>'ã»ã‚š','ã‚”'=>'ã†ã‚™','ゞ'=>'ã‚ã‚™','ガ'=>'ã‚«ã‚™','ã‚®'=>'ã‚ã‚™','ã‚°'=>'グ','ゲ'=>'ゲ','ã‚´'=>'ゴ','ã‚¶'=>'ザ','ジ'=>'ã‚·ã‚™','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ã‚¿ã‚™','ヂ'=>'ãƒã‚™','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','ãƒ'=>'ãƒã‚™','パ'=>'ãƒã‚š','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ãƒ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ','豈'=>'豈','ï¤'=>'æ›´','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'å¥','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'å–‡','奈'=>'奈','ï¤'=>'懶','癩'=>'癩','ï¤'=>'ç¾…','ï¤'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'é‚','樂'=>'樂','洛'=>'æ´›','烙'=>'烙','珞'=>'çž','落'=>'è½','酪'=>'é…ª','駱'=>'é§±','亂'=>'亂','卵'=>'åµ','ï¤'=>'欄','爛'=>'爛','蘭'=>'è˜','鸞'=>'鸞','嵐'=>'åµ','濫'=>'æ¿«','藍'=>'è—','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'è Ÿ','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','ï¤'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'æ“„','櫓'=>'æ«“','爐'=>'çˆ','盧'=>'ç›§','老'=>'è€','蘆'=>'蘆','虜'=>'虜','路'=>'è·¯','露'=>'露','魯'=>'é¯','鷺'=>'é·º','碌'=>'碌','祿'=>'祿','綠'=>'ç¶ ','菉'=>'è‰','錄'=>'錄','鹿'=>'鹿','ï¥'=>'è«–','壟'=>'壟','弄'=>'弄','籠'=>'ç± ','聾'=>'è¾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'é›·','壘'=>'壘','屢'=>'å±¢','樓'=>'樓','ï¥'=>'æ·š','漏'=>'æ¼','ï¥'=>'ç´¯','ï¥'=>'縷','陋'=>'陋','勒'=>'å‹’','肋'=>'è‚‹','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'ç¶¾','菱'=>'è±','陵'=>'陵','讀'=>'讀','拏'=>'æ‹','樂'=>'樂','ï¥'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'ç•°','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'ä¸','泌'=>'泌','數'=>'數','索'=>'ç´¢','參'=>'åƒ','塞'=>'塞','ï¥'=>'çœ','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'è¾°','沈'=>'沈','拾'=>'拾','若'=>'è‹¥','掠'=>'掠','略'=>'ç•¥','亮'=>'亮','兩'=>'å…©','凉'=>'凉','梁'=>'æ¢','糧'=>'ç³§','良'=>'良','諒'=>'è«’','量'=>'é‡','勵'=>'勵','呂'=>'å‘‚','ï¦'=>'女','廬'=>'廬','旅'=>'æ—…','濾'=>'濾','礪'=>'礪','閭'=>'é–','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'æ·','ï¦'=>'è½¢','年'=>'å¹´','ï¦'=>'æ†','ï¦'=>'戀','撚'=>'æ’š','漣'=>'æ¼£','煉'=>'ç…‰','璉'=>'ç’‰','秊'=>'ç§Š','練'=>'ç·´','聯'=>'è¯','輦'=>'輦','蓮'=>'è“®','連'=>'連','鍊'=>'éŠ','列'=>'列','ï¦'=>'劣','咽'=>'å’½','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'æ»','殮'=>'æ®®','簾'=>'ç°¾','獵'=>'çµ','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','ï¦'=>'玲','瑩'=>'ç‘©','羚'=>'羚','聆'=>'è†','鈴'=>'鈴','零'=>'é›¶','靈'=>'éˆ','領'=>'é ˜','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'å°¿','料'=>'æ–™','樂'=>'樂','ï§€'=>'燎','ï§'=>'療','ï§‚'=>'蓼','遼'=>'é¼','ï§„'=>'é¾','ï§…'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'æ»','柳'=>'柳','ï§Š'=>'æµ','ï§‹'=>'溜','ï§Œ'=>'ç‰','ï§'=>'ç•™','ï§Ž'=>'ç¡«','ï§'=>'ç´','ï§'=>'類','ï§‘'=>'å…','ï§’'=>'戮','ï§“'=>'陸','ï§”'=>'倫','ï§•'=>'å´™','ï§–'=>'æ·ª','ï§—'=>'輪','律'=>'律','ï§™'=>'æ…„','ï§š'=>'æ —','ï§›'=>'率','ï§œ'=>'隆','ï§'=>'利','ï§ž'=>'å','ï§Ÿ'=>'å±¥','ï§ '=>'易','ï§¡'=>'æŽ','ï§¢'=>'梨','ï§£'=>'æ³¥','理'=>'ç†','ï§¥'=>'ç—¢','罹'=>'ç½¹','ï§§'=>'è£','裡'=>'裡','ï§©'=>'里','離'=>'離','ï§«'=>'匿','溺'=>'溺','ï§'=>'å','ï§®'=>'ç‡','璘'=>'ç’˜','ï§°'=>'è—º','ï§±'=>'隣','ï§²'=>'é±—','ï§³'=>'麟','ï§´'=>'æž—','ï§µ'=>'æ·‹','ï§¶'=>'臨','ï§·'=>'ç«‹','笠'=>'笠','ï§¹'=>'ç²’','狀'=>'ç‹€','ï§»'=>'ç‚™','ï§¼'=>'è˜','ï§½'=>'什','ï§¾'=>'茶','ï§¿'=>'刺','切'=>'切','ï¨'=>'度','拓'=>'æ‹“','糖'=>'ç³–','宅'=>'å®…','洞'=>'æ´ž','暴'=>'æš´','輻'=>'è¼»','行'=>'行','降'=>'é™','見'=>'見','廓'=>'廓','兀'=>'å…€','ï¨'=>'å—€','ï¨'=>'塚','晴'=>'æ™´','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'ç¦','靖'=>'é–','ï¨'=>'ç²¾','羽'=>'ç¾½','蘒'=>'蘒','諸'=>'諸','逸'=>'逸','都'=>'都','飯'=>'飯','飼'=>'飼','館'=>'館','ï¨'=>'é¶´','侮'=>'ä¾®','僧'=>'僧','免'=>'å…','勉'=>'勉','勤'=>'勤','卑'=>'å‘','喝'=>'å–','嘆'=>'嘆','器'=>'器','塀'=>'å¡€','墨'=>'墨','層'=>'層','屮'=>'å±®','悔'=>'æ‚”','慨'=>'æ…¨','憎'=>'憎','ï©€'=>'懲','ï©'=>'æ•','ï©‚'=>'æ—¢','暑'=>'æš‘','ï©„'=>'梅','ï©…'=>'æµ·','渚'=>'渚','漢'=>'æ¼¢','煮'=>'ç…®','爫'=>'爫','琢'=>'ç¢','ï©‹'=>'碑','社'=>'社','ï©'=>'祉','祈'=>'祈','ï©'=>'ç¥','ï©'=>'祖','ï©‘'=>'ç¥','ï©’'=>'ç¦','ï©“'=>'禎','ï©”'=>'ç©€','ï©•'=>'çª','ï©–'=>'節','ï©—'=>'ç·´','縉'=>'縉','ï©™'=>'ç¹','署'=>'ç½²','ï©›'=>'者','臭'=>'è‡','ï©'=>'艹','艹'=>'艹','著'=>'è‘—','ï© '=>'è¤','ï©¡'=>'視','ï©¢'=>'è¬','ï©£'=>'謹','賓'=>'賓','ï©¥'=>'è´ˆ','辶'=>'è¾¶','ï©§'=>'逸','難'=>'難','ï©©'=>'響','頻'=>'é »','ï©°'=>'並','况'=>'况','全'=>'å…¨','侀'=>'ä¾€','ï©´'=>'å……','冀'=>'冀','ï©¶'=>'勇','ï©·'=>'勺','喝'=>'å–','啕'=>'å••','喙'=>'å–™','ï©»'=>'å—¢','塚'=>'塚','墳'=>'墳','奄'=>'奄','ï©¿'=>'奔','婢'=>'å©¢','ïª'=>'嬨','廒'=>'å»’','廙'=>'å»™','彩'=>'彩','徭'=>'å¾','惘'=>'惘','慎'=>'æ…Ž','愈'=>'愈','憎'=>'憎','慠'=>'æ… ','懲'=>'懲','戴'=>'戴','ïª'=>'æ„','搜'=>'æœ','ïª'=>'æ‘’','ïª'=>'æ•–','晴'=>'æ™´','朗'=>'朗','望'=>'望','杖'=>'æ–','歹'=>'æ¹','殺'=>'殺','流'=>'æµ','滛'=>'æ»›','滋'=>'滋','漢'=>'æ¼¢','瀞'=>'瀞','煮'=>'ç…®','ïª'=>'çž§','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'ç”»','瘝'=>'ç˜','瘟'=>'瘟','益'=>'益','盛'=>'ç››','直'=>'ç›´','睊'=>'çŠ','着'=>'ç€','磌'=>'磌','窱'=>'窱','ïª'=>'節','类'=>'ç±»','絛'=>'çµ›','練'=>'ç·´','缾'=>'ç¼¾','者'=>'者','荒'=>'è’','華'=>'è¯','蝹'=>'è¹','襁'=>'è¥','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'è«‹','謁'=>'è¬','諾'=>'諾','諭'=>'è«','謹'=>'謹','ï«€'=>'變','ï«'=>'è´ˆ','ï«‚'=>'輸','遲'=>'é²','ï«„'=>'醙','ï«…'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'é–','韛'=>'韛','響'=>'響','ï«‹'=>'é ‹','頻'=>'é »','ï«'=>'鬒','龜'=>'龜','ï«'=>'𢡊','ï«'=>'𢡄','ï«‘'=>'ð£•','ï«’'=>'ã®','ï«“'=>'䀘','ï«”'=>'䀹','ï«•'=>'𥉉','ï«–'=>'ð¥³','ï«—'=>'𧻓','齃'=>'齃','ï«™'=>'龎','ï¬'=>'×™Ö´','ײַ'=>'ײַ','שׁ'=>'ש×','שׂ'=>'שׂ','שּׁ'=>'שּ×','ï¬'=>'שּׂ','אַ'=>'×Ö·','אָ'=>'×Ö¸','אּ'=>'×Ö¼','בּ'=>'בּ','גּ'=>'×’Ö¼','דּ'=>'דּ','הּ'=>'×”Ö¼','וּ'=>'וּ','זּ'=>'×–Ö¼','טּ'=>'טּ','יּ'=>'×™Ö¼','ךּ'=>'ךּ','כּ'=>'×›Ö¼','לּ'=>'לּ','מּ'=>'מּ','ï€'=>'× Ö¼','ï'=>'סּ','ïƒ'=>'×£Ö¼','ï„'=>'פּ','ï†'=>'צּ','ï‡'=>'×§Ö¼','ïˆ'=>'רּ','ï‰'=>'שּ','ïŠ'=>'תּ','ï‹'=>'וֹ','ïŒ'=>'בֿ','ï'=>'×›Ö¿','ïŽ'=>'פֿ','ð…ž'=>'ð…—ð…¥','ð…Ÿ'=>'ð…˜ð…¥','ð… '=>'ð…˜ð…¥ð…®','ð…¡'=>'ð…˜ð…¥ð…¯','ð…¢'=>'ð…˜ð…¥ð…°','ð…£'=>'ð…˜ð…¥ð…±','ð…¤'=>'ð…˜ð…¥ð…²','ð†»'=>'ð†¹ð…¥','ð†¼'=>'ð†ºð…¥','ð†½'=>'ð†¹ð…¥ð…®','ð†¾'=>'ð†ºð…¥ð…®','ð†¿'=>'ð†¹ð…¥ð…¯','ð‡€'=>'ð†ºð…¥ð…¯','丽'=>'丽','ð¯ '=>'丸','乁'=>'ä¹','𠄢'=>'ð „¢','你'=>'ä½ ','侮'=>'ä¾®','侻'=>'ä¾»','倂'=>'倂','偺'=>'åº','備'=>'å‚™','僧'=>'僧','像'=>'åƒ','㒞'=>'ã’ž','ð¯ '=>'𠘺','免'=>'å…','ð¯ '=>'å…”','ð¯ '=>'å…¤','具'=>'å…·','𠔜'=>'𠔜','㒹'=>'ã’¹','內'=>'å…§','再'=>'å†','𠕋'=>'ð •‹','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','ð¯ '=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'å‰','ð¯ '=>'å‘','博'=>'åš','即'=>'å³','卽'=>'å½','卿'=>'å¿','卿'=>'å¿','卿'=>'å¿','𠨬'=>'𠨬','灰'=>'ç°','及'=>'åŠ','叟'=>'åŸ','𠭣'=>'ð £','叫'=>'å«','叱'=>'å±','吆'=>'å†','咞'=>'å’ž','吸'=>'å¸','呈'=>'呈','周'=>'周','咢'=>'å’¢','ð¯¡'=>'å“¶','唐'=>'å”','啓'=>'å•“','啣'=>'å•£','善'=>'å–„','善'=>'å–„','喙'=>'å–™','喫'=>'å–«','喳'=>'å–³','嗂'=>'å—‚','圖'=>'圖','嘆'=>'嘆','ð¯¡'=>'圗','噑'=>'噑','ð¯¡'=>'å™´','ð¯¡'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'å ','型'=>'åž‹','堲'=>'å ²','報'=>'å ±','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','ð¯¡'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'ã›®','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','ð¯¡'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'å°†','当'=>'当','尢'=>'å°¢','㞁'=>'ãž','屠'=>'å± ','屮'=>'å±®','峀'=>'å³€','岍'=>'å²','𡷤'=>'ð¡·¤','嵃'=>'嵃','𡷦'=>'ð¡·¦','嵮'=>'åµ®','嵫'=>'嵫','嵼'=>'åµ¼','ð¯¢'=>'å·¡','巢'=>'å·¢','㠯'=>'ã ¯','巽'=>'å·½','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'ã¡¢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','ð¯¢'=>'庶','廊'=>'廊','ð¯¢'=>'𪎒','ð¯¢'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'èˆ','弢'=>'å¼¢','弢'=>'å¼¢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'å½¢','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','ð¯¢'=>'å¿','志'=>'å¿—','忹'=>'忹','悁'=>'æ‚','㤺'=>'㤺','㤜'=>'㤜','悔'=>'æ‚”','𢛔'=>'𢛔','惇'=>'惇','慈'=>'æ…ˆ','慌'=>'æ…Œ','慎'=>'æ…Ž','慌'=>'æ…Œ','慺'=>'æ…º','憎'=>'憎','憲'=>'憲','ð¯¢'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'æˆ','戛'=>'戛','扝'=>'æ‰','抱'=>'抱','拔'=>'æ‹”','捐'=>'æ','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'æ¨','掃'=>'掃','揤'=>'æ¤','𢯱'=>'𢯱','搢'=>'æ¢','揅'=>'æ…','ð¯£'=>'掩','㨮'=>'㨮','摩'=>'æ‘©','摾'=>'摾','撝'=>'æ’','摷'=>'æ‘·','㩬'=>'㩬','敏'=>'æ•','敬'=>'敬','𣀊'=>'𣀊','旣'=>'æ—£','書'=>'書','ð¯£'=>'晉','㬙'=>'㬙','ð¯£'=>'æš‘','ð¯£'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'æšœ','肭'=>'è‚','䏙'=>'ä™','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'æž','杓'=>'æ“','ð¯£'=>'ð£ƒ','㭉'=>'ã‰','柺'=>'柺','枅'=>'æž…','桒'=>'æ¡’','梅'=>'梅','𣑭'=>'ð£‘','梎'=>'梎','栟'=>'æ Ÿ','椔'=>'椔','㮝'=>'ã®','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','ð¯£'=>'æ«›','㰘'=>'ã°˜','次'=>'次','𣢧'=>'𣢧','歔'=>'æ”','㱎'=>'㱎','歲'=>'æ²','殟'=>'殟','殺'=>'殺','殻'=>'æ®»','𣪍'=>'ð£ª','𡴋'=>'ð¡´‹','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'æ³','汧'=>'æ±§','洖'=>'æ´–','派'=>'æ´¾','ð¯¤'=>'æµ·','流'=>'æµ','浩'=>'浩','浸'=>'浸','涅'=>'æ¶…','𣴞'=>'𣴞','洴'=>'æ´´','港'=>'港','湮'=>'æ¹®','㴳'=>'ã´³','滋'=>'滋','滇'=>'滇','ð¯¤'=>'𣻑','淹'=>'æ·¹','ð¯¤'=>'æ½®','ð¯¤'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'ã¶–','灊'=>'çŠ','災'=>'ç½','灷'=>'ç·','炭'=>'ç‚','𠔥'=>'𠔥','煅'=>'ç……','ð¯¤'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'ç‰','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'çº','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','ð¯¤'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'ç’…','瓊'=>'瓊','㼛'=>'ã¼›','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'ç•°','𢆟'=>'𢆟','瘐'=>'ç˜','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'ð¥„','㿼'=>'㿼','䀈'=>'䀈','直'=>'ç›´','ð¯¥'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'çŠ','䀹'=>'䀹','瞋'=>'çž‹','䁆'=>'ä†','䂖'=>'ä‚–','ð¯¥'=>'ð¥','硎'=>'硎','ð¯¥'=>'碌','ð¯¥'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'ç¦','秫'=>'ç§«','䄯'=>'䄯','穀'=>'ç©€','穊'=>'穊','穏'=>'ç©','𥥼'=>'𥥼','ð¯¥'=>'𥪧','𥪧'=>'𥪧','竮'=>'ç«®','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'ç³’','䊠'=>'䊠','糨'=>'糨','糣'=>'ç³£','紀'=>'ç´€','𥾆'=>'𥾆','絣'=>'çµ£','ð¯¥'=>'äŒ','緇'=>'ç·‡','縂'=>'縂','繅'=>'ç¹…','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'ä™','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'è ','𦖨'=>'𦖨','聰'=>'è°','𣍟'=>'ð£Ÿ','ð¯¦'=>'ä•','育'=>'育','脃'=>'脃','䐋'=>'ä‹','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'èˆ','舄'=>'舄','ð¯¦'=>'辞','䑫'=>'ä‘«','ð¯¦'=>'芑','ð¯¦'=>'芋','芝'=>'èŠ','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'è‹¥','茝'=>'èŒ','荣'=>'è£','莭'=>'èŽ','茣'=>'茣','ð¯¦'=>'莽','菧'=>'è§','著'=>'è‘—','荓'=>'è“','菊'=>'èŠ','菌'=>'èŒ','菜'=>'èœ','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'è”–','𧏊'=>'ð§Š','蕤'=>'蕤','ð¯¦'=>'𦼬','䕝'=>'ä•','䕡'=>'ä•¡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'ä•«','虐'=>'è™','虜'=>'虜','虧'=>'è™§','虩'=>'虩','蚩'=>'èš©','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'è¹','蜨'=>'蜨','蝫'=>'è«','螆'=>'螆','䗗'=>'ä——','蟡'=>'蟡','ð¯§'=>'è ','䗹'=>'ä—¹','衠'=>'è¡ ','衣'=>'è¡£','𧙧'=>'ð§™§','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'ã’»','𧢮'=>'ð§¢®','𧥦'=>'𧥦','ð¯§'=>'äš¾','䛇'=>'䛇','ð¯§'=>'誠','ð¯§'=>'è«','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'è³','贛'=>'è´›','起'=>'èµ·','𧼯'=>'𧼯','𠠄'=>'ð  „','跋'=>'è·‹','趼'=>'è¶¼','跰'=>'è·°','ð¯§'=>'𠣞','軔'=>'è»”','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'ð¨—','邔'=>'é‚”','郱'=>'郱','鄑'=>'é„‘','𨜮'=>'𨜮','鄛'=>'é„›','鈸'=>'鈸','鋗'=>'é‹—','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'é¹','鐕'=>'é•','ð¯§'=>'𨯺','開'=>'é–‹','䦕'=>'䦕','閷'=>'é–·','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'å¶²','霣'=>'霣','𩅅'=>'ð©……','𩈚'=>'𩈚','䩮'=>'ä©®','䩶'=>'ä©¶','韠'=>'韠','𩐊'=>'ð©Š','䪲'=>'䪲','𩒖'=>'ð©’–','頋'=>'é ‹','頋'=>'é ‹','頩'=>'é ©','ð¯¨'=>'ð©–¶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'é§‚','駾'=>'é§¾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'é±€','鳽'=>'é³½','ð¯¨'=>'䳎','䳭'=>'ä³','ð¯¨'=>'éµ§','ð¯¨'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'äµ–','黹'=>'黹','黾'=>'黾','鼅'=>'é¼…','鼏'=>'é¼','鼖'=>'é¼–','鼻'=>'é¼»','ð¯¨'=>'𪘀'); diff --git a/phpBB/includes/utf/data/utf_compatibility_decomp.php b/phpBB/includes/utf/data/utf_compatibility_decomp.php deleted file mode 100644 index c62948e81a..0000000000 --- a/phpBB/includes/utf/data/utf_compatibility_decomp.php +++ /dev/null @@ -1,2 +0,0 @@ -<?php -$GLOBALS['utf_compatibility_decomp']=array(' '=>' ','¨'=>' ̈','ª'=>'a','¯'=>' Ì„','²'=>'2','³'=>'3','´'=>' Ì','µ'=>'μ','¸'=>' ̧','¹'=>'1','º'=>'o','¼'=>'1â„4','½'=>'1â„2','¾'=>'3â„4','À'=>'AÌ€','Ã'=>'AÌ','Â'=>'AÌ‚','Ã'=>'Ã','Ä'=>'Ä','Ã…'=>'AÌŠ','Ç'=>'Ç','È'=>'EÌ€','É'=>'EÌ','Ê'=>'EÌ‚','Ë'=>'Ë','ÃŒ'=>'IÌ€','Ã'=>'IÌ','ÃŽ'=>'IÌ‚','Ã'=>'Ï','Ñ'=>'Ñ','Ã’'=>'OÌ€','Ó'=>'OÌ','Ô'=>'OÌ‚','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'UÌ€','Ú'=>'UÌ','Û'=>'UÌ‚','Ü'=>'Ü','Ã'=>'YÌ','à'=>'aÌ€','á'=>'aÌ','â'=>'aÌ‚','ã'=>'ã','ä'=>'ä','Ã¥'=>'aÌŠ','ç'=>'ç','è'=>'eÌ€','é'=>'eÌ','ê'=>'eÌ‚','ë'=>'ë','ì'=>'iÌ€','Ã'=>'iÌ','î'=>'iÌ‚','ï'=>'ï','ñ'=>'ñ','ò'=>'oÌ€','ó'=>'oÌ','ô'=>'oÌ‚','õ'=>'õ','ö'=>'ö','ù'=>'uÌ€','ú'=>'uÌ','û'=>'uÌ‚','ü'=>'ü','ý'=>'yÌ','ÿ'=>'ÿ','Ä€'=>'AÌ„','Ä'=>'aÌ„','Ä‚'=>'Ă','ă'=>'ă','Ä„'=>'Ą','Ä…'=>'ą','Ć'=>'CÌ','ć'=>'cÌ','Ĉ'=>'CÌ‚','ĉ'=>'cÌ‚','ÄŠ'=>'Ċ','Ä‹'=>'ċ','ÄŒ'=>'CÌŒ','Ä'=>'cÌŒ','ÄŽ'=>'DÌŒ','Ä'=>'dÌŒ','Ä’'=>'EÌ„','Ä“'=>'eÌ„','Ä”'=>'Ĕ','Ä•'=>'ĕ','Ä–'=>'Ė','Ä—'=>'ė','Ę'=>'Ę','Ä™'=>'ę','Äš'=>'EÌŒ','Ä›'=>'eÌŒ','Äœ'=>'GÌ‚','Ä'=>'gÌ‚','Äž'=>'Ğ','ÄŸ'=>'ğ','Ä '=>'Ġ','Ä¡'=>'ġ','Ä¢'=>'Ģ','Ä£'=>'ģ','Ĥ'=>'HÌ‚','Ä¥'=>'hÌ‚','Ĩ'=>'Ĩ','Ä©'=>'ĩ','Ī'=>'IÌ„','Ä«'=>'iÌ„','Ĭ'=>'Ĭ','Ä'=>'ĭ','Ä®'=>'Į','į'=>'į','İ'=>'İ','IJ'=>'IJ','ij'=>'ij','Ä´'=>'JÌ‚','ĵ'=>'jÌ‚','Ķ'=>'Ķ','Ä·'=>'ķ','Ĺ'=>'LÌ','ĺ'=>'lÌ','Ä»'=>'Ļ','ļ'=>'ļ','Ľ'=>'LÌŒ','ľ'=>'lÌŒ','Ä¿'=>'L·','Å€'=>'l·','Ń'=>'NÌ','Å„'=>'nÌ','Å…'=>'Ņ','ņ'=>'ņ','Ň'=>'NÌŒ','ň'=>'nÌŒ','ʼn'=>'ʼn','ÅŒ'=>'OÌ„','Å'=>'oÌ„','ÅŽ'=>'Ŏ','Å'=>'ŏ','Å'=>'OÌ‹','Å‘'=>'oÌ‹','Å”'=>'RÌ','Å•'=>'rÌ','Å–'=>'Ŗ','Å—'=>'ŗ','Ř'=>'RÌŒ','Å™'=>'rÌŒ','Åš'=>'SÌ','Å›'=>'sÌ','Åœ'=>'SÌ‚','Å'=>'sÌ‚','Åž'=>'Ş','ÅŸ'=>'ş','Å '=>'SÌŒ','Å¡'=>'sÌŒ','Å¢'=>'Ţ','Å£'=>'ţ','Ť'=>'TÌŒ','Å¥'=>'tÌŒ','Ũ'=>'Ũ','Å©'=>'ũ','Ū'=>'UÌ„','Å«'=>'uÌ„','Ŭ'=>'Ŭ','Å'=>'ŭ','Å®'=>'UÌŠ','ů'=>'uÌŠ','Ű'=>'UÌ‹','ű'=>'uÌ‹','Ų'=>'Ų','ų'=>'ų','Å´'=>'WÌ‚','ŵ'=>'wÌ‚','Ŷ'=>'YÌ‚','Å·'=>'yÌ‚','Ÿ'=>'Ÿ','Ź'=>'ZÌ','ź'=>'zÌ','Å»'=>'Ż','ż'=>'ż','Ž'=>'ZÌŒ','ž'=>'zÌŒ','Å¿'=>'s','Æ '=>'OÌ›','Æ¡'=>'oÌ›','Ư'=>'UÌ›','ư'=>'uÌ›','Ç„'=>'DZÌŒ','Ç…'=>'DzÌŒ','dž'=>'dzÌŒ','LJ'=>'LJ','Lj'=>'Lj','lj'=>'lj','ÇŠ'=>'NJ','Ç‹'=>'Nj','ÇŒ'=>'nj','Ç'=>'AÌŒ','ÇŽ'=>'aÌŒ','Ç'=>'IÌŒ','Ç'=>'iÌŒ','Ç‘'=>'OÌŒ','Ç’'=>'oÌŒ','Ç“'=>'UÌŒ','Ç”'=>'uÌŒ','Ç•'=>'Ǖ','Ç–'=>'ǖ','Ç—'=>'ÜÌ','ǘ'=>'üÌ','Ç™'=>'Ǚ','Çš'=>'ǚ','Ç›'=>'Ǜ','Çœ'=>'ǜ','Çž'=>'Ǟ','ÇŸ'=>'ǟ','Ç '=>'Ǡ','Ç¡'=>'ǡ','Ç¢'=>'Ǣ','Ç£'=>'ǣ','Ǧ'=>'GÌŒ','ǧ'=>'gÌŒ','Ǩ'=>'KÌŒ','Ç©'=>'kÌŒ','Ǫ'=>'Ǫ','Ç«'=>'ǫ','Ǭ'=>'Ǭ','Ç'=>'ǭ','Ç®'=>'Æ·ÌŒ','ǯ'=>'Ê’ÌŒ','ǰ'=>'jÌŒ','DZ'=>'DZ','Dz'=>'Dz','dz'=>'dz','Ç´'=>'GÌ','ǵ'=>'gÌ','Ǹ'=>'NÌ€','ǹ'=>'nÌ€','Ǻ'=>'AÌŠÌ','Ç»'=>'aÌŠÌ','Ǽ'=>'ÆÌ','ǽ'=>'æÌ','Ǿ'=>'ØÌ','Ç¿'=>'øÌ','È€'=>'AÌ','È'=>'aÌ','È‚'=>'AÌ‘','ȃ'=>'aÌ‘','È„'=>'EÌ','È…'=>'eÌ','Ȇ'=>'EÌ‘','ȇ'=>'eÌ‘','Ȉ'=>'IÌ','ȉ'=>'iÌ','ÈŠ'=>'IÌ‘','È‹'=>'iÌ‘','ÈŒ'=>'OÌ','È'=>'oÌ','ÈŽ'=>'OÌ‘','È'=>'oÌ‘','È'=>'RÌ','È‘'=>'rÌ','È’'=>'RÌ‘','È“'=>'rÌ‘','È”'=>'UÌ','È•'=>'uÌ','È–'=>'UÌ‘','È—'=>'uÌ‘','Ș'=>'Ș','È™'=>'ș','Èš'=>'Ț','È›'=>'ț','Èž'=>'HÌŒ','ÈŸ'=>'hÌŒ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','È©'=>'ȩ','Ȫ'=>'Ȫ','È«'=>'ȫ','Ȭ'=>'Ȭ','È'=>'ȭ','È®'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'YÌ„','ȳ'=>'yÌ„','ʰ'=>'h','ʱ'=>'ɦ','ʲ'=>'j','ʳ'=>'r','Ê´'=>'ɹ','ʵ'=>'É»','ʶ'=>'Ê','Ê·'=>'w','ʸ'=>'y','˘'=>' ̆','Ë™'=>' ̇','Ëš'=>' ÌŠ','Ë›'=>' ̨','Ëœ'=>' ̃','Ë'=>' Ì‹','Ë '=>'É£','Ë¡'=>'l','Ë¢'=>'s','Ë£'=>'x','ˤ'=>'Ê•','Í€'=>'Ì€','Í'=>'Ì','̓'=>'Ì“','Í„'=>'̈Ì','Í´'=>'ʹ','ͺ'=>' Í…',';'=>';','΄'=>' Ì','Î…'=>' ̈Ì','Ά'=>'ΑÌ','·'=>'·','Έ'=>'ΕÌ','Ή'=>'ΗÌ','Ί'=>'ΙÌ','ÎŒ'=>'ΟÌ','ÎŽ'=>'Î¥Ì','Î'=>'ΩÌ','Î'=>'ϊÌ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'αÌ','Î'=>'εÌ','ή'=>'ηÌ','ί'=>'ιÌ','ΰ'=>'ϋÌ','ÏŠ'=>'ϊ','Ï‹'=>'ϋ','ÏŒ'=>'οÌ','Ï'=>'Ï…Ì','ÏŽ'=>'ωÌ','Ï'=>'β','Ï‘'=>'θ','Ï’'=>'Î¥','Ï“'=>'Î¥Ì','Ï”'=>'Ϋ','Ï•'=>'φ','Ï–'=>'Ï€','ϰ'=>'κ','ϱ'=>'Ï','ϲ'=>'Ï‚','Ï´'=>'Θ','ϵ'=>'ε','Ϲ'=>'Σ','Ѐ'=>'Ѐ','Ð'=>'Ё','Ѓ'=>'ГÌ','Ї'=>'Ї','ÐŒ'=>'КÌ','Ð'=>'Ѝ','ÐŽ'=>'Ў','Й'=>'Й','й'=>'й','Ñ'=>'ѐ','Ñ‘'=>'ё','Ñ“'=>'гÌ','Ñ—'=>'ї','Ñœ'=>'кÌ','Ñ'=>'ѝ','Ñž'=>'ў','Ѷ'=>'Ñ´Ì','Ñ·'=>'ѵÌ','Ó'=>'Ӂ','Ó‚'=>'ӂ','Ó'=>'Ð̆','Ó‘'=>'ӑ','Ó’'=>'Ð̈','Ó“'=>'ӓ','Ó–'=>'Ӗ','Ó—'=>'ӗ','Óš'=>'Ӛ','Ó›'=>'ӛ','Óœ'=>'Ӝ','Ó'=>'ӝ','Óž'=>'Ӟ','ÓŸ'=>'ӟ','Ó¢'=>'Ӣ','Ó£'=>'ӣ','Ó¤'=>'Ӥ','Ó¥'=>'ӥ','Ó¦'=>'Ӧ','Ó§'=>'ӧ','Óª'=>'Ӫ','Ó«'=>'ӫ','Ó¬'=>'Ð̈','Ó'=>'Ñ̈','Ó®'=>'Ӯ','Ó¯'=>'ӯ','Ó°'=>'Ӱ','Ó±'=>'ӱ','Ó²'=>'Ӳ','Ó³'=>'ӳ','Ó´'=>'Ӵ','Óµ'=>'ӵ','Ó¸'=>'Ӹ','Ó¹'=>'ӹ','Ö‡'=>'Õ¥Ö‚','Ø¢'=>'آ','Ø£'=>'أ','ؤ'=>'ÙˆÙ”','Ø¥'=>'إ','ئ'=>'ÙŠÙ”','Ùµ'=>'اٴ','Ù¶'=>'وٴ','Ù·'=>'Û‡Ù´','Ù¸'=>'يٴ','Û€'=>'Û•Ù”','Û‚'=>'ÛÙ”','Û“'=>'Û’Ù”','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','à¥'=>'ढ़','फ़'=>'फ़','य़'=>'य़','à§‹'=>'ো','à§Œ'=>'ৌ','à§œ'=>'ড়','à§'=>'ঢ়','à§Ÿ'=>'য়','ਲ਼'=>'ਲ਼','ਸ਼'=>'ਸ਼','à©™'=>'ਖ਼','ਗ਼'=>'ਗ਼','à©›'=>'ਜ਼','ਫ਼'=>'ਫ਼','àˆ'=>'à‡à–','à‹'=>'à‡à¬¾','àŒ'=>'à‡à—','àœ'=>'ଡ଼','à'=>'ଢ଼','à®”'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','à³€'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','à·š'=>'ේ','à·œ'=>'à·™à·','à·'=>'à·™à·à·Š','à·ž'=>'ෞ','ำ'=>'à¹à¸²','ຳ'=>'à»àº²','ໜ'=>'ຫນ','à»'=>'ຫມ','༌'=>'་','གྷ'=>'གྷ','à½'=>'ཌྷ','དྷ'=>'དྷ','བྷ'=>'བྷ','ཛྷ'=>'ཛྷ','ཀྵ'=>'ཀྵ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ཷ'=>'ྲཱྀ','ླྀ'=>'ླྀ','ཹ'=>'ླཱྀ','à¾'=>'ཱྀ','ྒྷ'=>'ྒྷ','à¾'=>'ྜྷ','ྡྷ'=>'ྡྷ','ྦྷ'=>'ྦྷ','ྫྷ'=>'ྫྷ','ྐྵ'=>'à¾à¾µ','ဦ'=>'ဦ','ჼ'=>'ნ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'á¬á¬µ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','á€'=>'ᭀ','á'=>'ᭁ','áƒ'=>'á‚ᬵ','á´¬'=>'A','á´'=>'Æ','á´®'=>'B','á´°'=>'D','á´±'=>'E','á´²'=>'ÆŽ','á´³'=>'G','á´´'=>'H','á´µ'=>'I','á´¶'=>'J','á´·'=>'K','á´¸'=>'L','á´¹'=>'M','á´º'=>'N','á´¼'=>'O','á´½'=>'È¢','á´¾'=>'P','á´¿'=>'R','áµ€'=>'T','áµ'=>'U','ᵂ'=>'W','ᵃ'=>'a','ᵄ'=>'É','áµ…'=>'É‘','ᵆ'=>'á´‚','ᵇ'=>'b','ᵈ'=>'d','ᵉ'=>'e','ᵊ'=>'É™','ᵋ'=>'É›','ᵌ'=>'Éœ','áµ'=>'g','áµ'=>'k','áµ'=>'m','ᵑ'=>'Å‹','áµ’'=>'o','ᵓ'=>'É”','áµ”'=>'á´–','ᵕ'=>'á´—','áµ–'=>'p','áµ—'=>'t','ᵘ'=>'u','áµ™'=>'á´','ᵚ'=>'ɯ','áµ›'=>'v','ᵜ'=>'á´¥','áµ'=>'β','ᵞ'=>'γ','ᵟ'=>'δ','áµ '=>'φ','ᵡ'=>'χ','áµ¢'=>'i','áµ£'=>'r','ᵤ'=>'u','áµ¥'=>'v','ᵦ'=>'β','áµ§'=>'γ','ᵨ'=>'Ï','ᵩ'=>'φ','ᵪ'=>'χ','ᵸ'=>'н','á¶›'=>'É’','á¶œ'=>'c','á¶'=>'É•','á¶ž'=>'ð','á¶Ÿ'=>'Éœ','á¶ '=>'f','á¶¡'=>'ÉŸ','á¶¢'=>'É¡','á¶£'=>'É¥','ᶤ'=>'ɨ','á¶¥'=>'É©','ᶦ'=>'ɪ','á¶§'=>'áµ»','ᶨ'=>'Ê','á¶©'=>'É','ᶪ'=>'á¶…','á¶«'=>'ÊŸ','ᶬ'=>'ɱ','á¶'=>'ɰ','á¶®'=>'ɲ','ᶯ'=>'ɳ','á¶°'=>'É´','á¶±'=>'ɵ','á¶²'=>'ɸ','á¶³'=>'Ê‚','á¶´'=>'ʃ','á¶µ'=>'Æ«','á¶¶'=>'ʉ','á¶·'=>'ÊŠ','ᶸ'=>'á´œ','á¶¹'=>'Ê‹','ᶺ'=>'ÊŒ','á¶»'=>'z','á¶¼'=>'Ê','á¶½'=>'Ê‘','á¶¾'=>'Ê’','á¶¿'=>'θ','Ḁ'=>'AÌ¥','á¸'=>'aÌ¥','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'BÌ£','ḅ'=>'bÌ£','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'ÇÌ','ḉ'=>'çÌ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'DÌ£','á¸'=>'dÌ£','Ḏ'=>'Ḏ','á¸'=>'ḏ','á¸'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'DÌ','ḓ'=>'dÌ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'EÌ„Ì','ḗ'=>'eÌ„Ì','Ḙ'=>'EÌ','ḙ'=>'eÌ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','á¸'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'GÌ„','ḡ'=>'gÌ„','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'HÌ£','ḥ'=>'hÌ£','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'HÌ®','ḫ'=>'hÌ®','Ḭ'=>'Ḭ','á¸'=>'ḭ','Ḯ'=>'ÏÌ','ḯ'=>'ïÌ','Ḱ'=>'KÌ','ḱ'=>'kÌ','Ḳ'=>'KÌ£','ḳ'=>'kÌ£','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'LÌ£','ḷ'=>'lÌ£','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'LÌ','ḽ'=>'lÌ','Ḿ'=>'MÌ','ḿ'=>'mÌ','á¹€'=>'Ṁ','á¹'=>'ṁ','Ṃ'=>'MÌ£','ṃ'=>'mÌ£','Ṅ'=>'Ṅ','á¹…'=>'ṅ','Ṇ'=>'NÌ£','ṇ'=>'nÌ£','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'NÌ','ṋ'=>'nÌ','Ṍ'=>'ÕÌ','á¹'=>'õÌ','Ṏ'=>'Ṏ','á¹'=>'ṏ','á¹'=>'Ṑ','ṑ'=>'ṑ','á¹’'=>'OÌ„Ì','ṓ'=>'oÌ„Ì','á¹”'=>'PÌ','ṕ'=>'pÌ','á¹–'=>'Ṗ','á¹—'=>'ṗ','Ṙ'=>'Ṙ','á¹™'=>'ṙ','Ṛ'=>'RÌ£','á¹›'=>'rÌ£','Ṝ'=>'Ṝ','á¹'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','á¹ '=>'Ṡ','ṡ'=>'ṡ','á¹¢'=>'SÌ£','á¹£'=>'sÌ£','Ṥ'=>'SÌ̇','á¹¥'=>'sÌ̇','Ṧ'=>'Ṧ','á¹§'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'TÌ£','á¹'=>'tÌ£','á¹®'=>'Ṯ','ṯ'=>'ṯ','á¹°'=>'TÌ','á¹±'=>'tÌ','á¹²'=>'Ṳ','á¹³'=>'ṳ','á¹´'=>'Ṵ','á¹µ'=>'ṵ','á¹¶'=>'UÌ','á¹·'=>'uÌ','Ṹ'=>'ŨÌ','á¹¹'=>'ũÌ','Ṻ'=>'Ṻ','á¹»'=>'ṻ','á¹¼'=>'Ṽ','á¹½'=>'ṽ','á¹¾'=>'VÌ£','ṿ'=>'vÌ£','Ẁ'=>'WÌ€','áº'=>'wÌ€','Ẃ'=>'WÌ','ẃ'=>'wÌ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'WÌ£','ẉ'=>'wÌ£','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','áº'=>'ẍ','Ẏ'=>'Ẏ','áº'=>'ẏ','áº'=>'ZÌ‚','ẑ'=>'zÌ‚','Ẓ'=>'ZÌ£','ẓ'=>'zÌ£','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'wÌŠ','ẙ'=>'yÌŠ','ẚ'=>'aʾ','ẛ'=>'ṡ','Ạ'=>'AÌ£','ạ'=>'aÌ£','Ả'=>'Ả','ả'=>'ả','Ấ'=>'AÌ‚Ì','ấ'=>'aÌ‚Ì','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','áº'=>'ậ','Ắ'=>'ĂÌ','ắ'=>'ăÌ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'EÌ£','ẹ'=>'eÌ£','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'EÌ‚Ì','ế'=>'eÌ‚Ì','Ề'=>'Ề','á»'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','á»…'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'IÌ£','ị'=>'iÌ£','Ọ'=>'OÌ£','á»'=>'oÌ£','Ỏ'=>'Ỏ','á»'=>'ỏ','á»'=>'OÌ‚Ì','ố'=>'oÌ‚Ì','á»’'=>'Ồ','ồ'=>'ồ','á»”'=>'Ổ','ổ'=>'ổ','á»–'=>'Ỗ','á»—'=>'ỗ','Ộ'=>'Ộ','á»™'=>'ộ','Ớ'=>'OÌ›Ì','á»›'=>'oÌ›Ì','Ờ'=>'Ờ','á»'=>'ờ','Ở'=>'Ở','ở'=>'ở','á» '=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'UÌ£','ụ'=>'uÌ£','Ủ'=>'Ủ','á»§'=>'ủ','Ứ'=>'UÌ›Ì','ứ'=>'uÌ›Ì','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','á»'=>'ử','á»®'=>'Ữ','ữ'=>'ữ','á»°'=>'Ự','á»±'=>'ự','Ỳ'=>'YÌ€','ỳ'=>'yÌ€','á»´'=>'YÌ£','ỵ'=>'yÌ£','á»¶'=>'Ỷ','á»·'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','á¼€'=>'ἀ','á¼'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἀÌ','á¼…'=>'ἁÌ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'ἈÌ','á¼'=>'ἉÌ','Ἆ'=>'Ἆ','á¼'=>'Ἇ','á¼'=>'ἐ','ἑ'=>'ἑ','á¼’'=>'ἒ','ἓ'=>'ἓ','á¼”'=>'ἐÌ','ἕ'=>'ἑÌ','Ἐ'=>'Ἐ','á¼™'=>'Ἑ','Ἒ'=>'Ἒ','á¼›'=>'Ἓ','Ἔ'=>'ἘÌ','á¼'=>'ἙÌ','á¼ '=>'ἠ','ἡ'=>'ἡ','á¼¢'=>'ἢ','á¼£'=>'ἣ','ἤ'=>'ἠÌ','á¼¥'=>'ἡÌ','ἦ'=>'ἦ','á¼§'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'ἨÌ','á¼'=>'ἩÌ','á¼®'=>'Ἦ','Ἧ'=>'Ἧ','á¼°'=>'ἰ','á¼±'=>'ἱ','á¼²'=>'ἲ','á¼³'=>'ἳ','á¼´'=>'ἰÌ','á¼µ'=>'ἱÌ','á¼¶'=>'ἶ','á¼·'=>'ἷ','Ἰ'=>'Ἰ','á¼¹'=>'Ἱ','Ἲ'=>'Ἲ','á¼»'=>'Ἳ','á¼¼'=>'ἸÌ','á¼½'=>'ἹÌ','á¼¾'=>'Ἶ','Ἷ'=>'Ἷ','á½€'=>'ὀ','á½'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὀÌ','á½…'=>'ὁÌ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'ὈÌ','á½'=>'ὉÌ','á½'=>'Ï…Ì“','ὑ'=>'Ï…Ì”','á½’'=>'ὒ','ὓ'=>'ὓ','á½”'=>'Ï…Ì“Ì','ὕ'=>'Ï…Ì”Ì','á½–'=>'ὖ','á½—'=>'ὗ','á½™'=>'Ὑ','á½›'=>'Ὓ','á½'=>'ὙÌ','Ὗ'=>'Ὗ','á½ '=>'ὠ','ὡ'=>'ὡ','á½¢'=>'ὢ','á½£'=>'ὣ','ὤ'=>'ὠÌ','á½¥'=>'ὡÌ','ὦ'=>'ὦ','á½§'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'ὨÌ','á½'=>'ὩÌ','á½®'=>'Ὦ','Ὧ'=>'Ὧ','á½°'=>'ὰ','á½±'=>'αÌ','á½²'=>'ὲ','á½³'=>'εÌ','á½´'=>'ὴ','á½µ'=>'ηÌ','á½¶'=>'ὶ','á½·'=>'ιÌ','ὸ'=>'ὸ','á½¹'=>'οÌ','ὺ'=>'Ï…Ì€','á½»'=>'Ï…Ì','á½¼'=>'ὼ','á½½'=>'ωÌ','á¾€'=>'ᾀ','á¾'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ἀÌÍ…','á¾…'=>'ἁÌÍ…','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ἈÌÍ…','á¾'=>'ἉÌÍ…','ᾎ'=>'ᾎ','á¾'=>'ᾏ','á¾'=>'ᾐ','ᾑ'=>'ᾑ','á¾’'=>'ᾒ','ᾓ'=>'ᾓ','á¾”'=>'ἠÌÍ…','ᾕ'=>'ἡÌÍ…','á¾–'=>'ᾖ','á¾—'=>'ᾗ','ᾘ'=>'ᾘ','á¾™'=>'ᾙ','ᾚ'=>'ᾚ','á¾›'=>'ᾛ','ᾜ'=>'ἨÌÍ…','á¾'=>'ἩÌÍ…','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','á¾ '=>'ᾠ','ᾡ'=>'ᾡ','á¾¢'=>'ᾢ','á¾£'=>'ᾣ','ᾤ'=>'ὠÌÍ…','á¾¥'=>'ὡÌÍ…','ᾦ'=>'ᾦ','á¾§'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ὨÌÍ…','á¾'=>'ὩÌÍ…','á¾®'=>'ᾮ','ᾯ'=>'ᾯ','á¾°'=>'ᾰ','á¾±'=>'ᾱ','á¾²'=>'ᾲ','á¾³'=>'ᾳ','á¾´'=>'αÌÍ…','á¾¶'=>'ᾶ','á¾·'=>'ᾷ','Ᾰ'=>'Ᾰ','á¾¹'=>'Ᾱ','Ὰ'=>'Ὰ','á¾»'=>'ΑÌ','á¾¼'=>'ᾼ','á¾½'=>' Ì“','á¾¾'=>'ι','᾿'=>' Ì“','á¿€'=>' Í‚','á¿'=>' ̈͂','á¿‚'=>'ῂ','ῃ'=>'ῃ','á¿„'=>'ηÌÍ…','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Έ'=>'ΕÌ','Ὴ'=>'Ὴ','á¿‹'=>'ΗÌ','ῌ'=>'ῌ','á¿'=>' ̓̀','῎'=>' Ì“Ì','á¿'=>' ̓͂','á¿'=>'ῐ','á¿‘'=>'ῑ','á¿’'=>'ῒ','á¿“'=>'ϊÌ','á¿–'=>'ῖ','á¿—'=>'ῗ','Ῐ'=>'Ῐ','á¿™'=>'Ῑ','Ὶ'=>'Ὶ','á¿›'=>'ΙÌ','á¿'=>' ̔̀','῞'=>' Ì”Ì','῟'=>' ̔͂','á¿ '=>'ῠ','á¿¡'=>'Ï…Ì„','á¿¢'=>'ῢ','á¿£'=>'ϋÌ','ῤ'=>'ÏÌ“','á¿¥'=>'ÏÌ”','ῦ'=>'Ï…Í‚','á¿§'=>'ῧ','Ῠ'=>'Ῠ','á¿©'=>'Ῡ','Ὺ'=>'Ὺ','á¿«'=>'Î¥Ì','Ῥ'=>'Ῥ','á¿'=>' ̈̀','á¿®'=>' ̈Ì','`'=>'`','ῲ'=>'ῲ','ῳ'=>'ῳ','á¿´'=>'ωÌÍ…','á¿¶'=>'ῶ','á¿·'=>'ῷ','Ὸ'=>'Ὸ','Ό'=>'ΟÌ','Ὼ'=>'Ὼ','á¿»'=>'ΩÌ','ῼ'=>'ῼ','´'=>' Ì','῾'=>' Ì”',' '=>' ','â€'=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','‑'=>'â€','‗'=>' ̳','․'=>'.','‥'=>'..','…'=>'...',' '=>' ','″'=>'′′','‴'=>'′′′','‶'=>'‵‵','‷'=>'‵‵‵','‼'=>'!!','‾'=>' Ì…','â‡'=>'??','âˆ'=>'?!','â‰'=>'!?','â—'=>'′′′′','âŸ'=>' ','â°'=>'0','â±'=>'i','â´'=>'4','âµ'=>'5','â¶'=>'6','â·'=>'7','â¸'=>'8','â¹'=>'9','âº'=>'+','â»'=>'−','â¼'=>'=','â½'=>'(','â¾'=>')','â¿'=>'n','â‚€'=>'0','â‚'=>'1','â‚‚'=>'2','₃'=>'3','â‚„'=>'4','â‚…'=>'5','₆'=>'6','₇'=>'7','₈'=>'8','₉'=>'9','₊'=>'+','â‚‹'=>'−','₌'=>'=','â‚'=>'(','₎'=>')','â‚'=>'a','â‚‘'=>'e','â‚’'=>'o','â‚“'=>'x','â‚”'=>'É™','₨'=>'Rs','â„€'=>'a/c','â„'=>'a/s','â„‚'=>'C','℃'=>'°C','â„…'=>'c/o','℆'=>'c/u','ℇ'=>'Æ','℉'=>'°F','ℊ'=>'g','â„‹'=>'H','ℌ'=>'H','â„'=>'H','ℎ'=>'h','â„'=>'ħ','â„'=>'I','â„‘'=>'I','â„’'=>'L','â„“'=>'l','â„•'=>'N','â„–'=>'No','â„™'=>'P','ℚ'=>'Q','â„›'=>'R','ℜ'=>'R','â„'=>'R','â„ '=>'SM','â„¡'=>'TEL','â„¢'=>'TM','ℤ'=>'Z','Ω'=>'Ω','ℨ'=>'Z','K'=>'K','â„«'=>'AÌŠ','ℬ'=>'B','â„'=>'C','ℯ'=>'e','â„°'=>'E','ℱ'=>'F','ℳ'=>'M','â„´'=>'o','ℵ'=>'×','â„¶'=>'ב','â„·'=>'×’','ℸ'=>'ד','ℹ'=>'i','â„»'=>'FAX','ℼ'=>'Ï€','ℽ'=>'γ','ℾ'=>'Γ','â„¿'=>'Π','â…€'=>'∑','â……'=>'D','â…†'=>'d','â…‡'=>'e','â…ˆ'=>'i','â…‰'=>'j','â…“'=>'1â„3','â…”'=>'2â„3','â…•'=>'1â„5','â…–'=>'2â„5','â…—'=>'3â„5','â…˜'=>'4â„5','â…™'=>'1â„6','â…š'=>'5â„6','â…›'=>'1â„8','â…œ'=>'3â„8','â…'=>'5â„8','â…ž'=>'7â„8','â…Ÿ'=>'1â„','â… '=>'I','â…¡'=>'II','â…¢'=>'III','â…£'=>'IV','â…¤'=>'V','â…¥'=>'VI','â…¦'=>'VII','â…§'=>'VIII','â…¨'=>'IX','â…©'=>'X','â…ª'=>'XI','â…«'=>'XII','â…¬'=>'L','â…'=>'C','â…®'=>'D','â…¯'=>'M','â…°'=>'i','â…±'=>'ii','â…²'=>'iii','â…³'=>'iv','â…´'=>'v','â…µ'=>'vi','â…¶'=>'vii','â…·'=>'viii','â…¸'=>'ix','â…¹'=>'x','â…º'=>'xi','â…»'=>'xii','â…¼'=>'l','â…½'=>'c','â…¾'=>'d','â…¿'=>'m','↚'=>'â†Ì¸','↛'=>'↛','↮'=>'↮','â‡'=>'â‡Ì¸','⇎'=>'⇎','â‡'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','∬'=>'∫∫','âˆ'=>'∫∫∫','∯'=>'∮∮','∰'=>'∮∮∮','â‰'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','â‰'=>'â‰Ì¸','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','âŠ'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','âŠ'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','â‹ '=>'⋠','â‹¡'=>'⋡','â‹¢'=>'⋢','â‹£'=>'⋣','⋪'=>'⋪','â‹«'=>'⋫','⋬'=>'⋬','â‹'=>'⋭','〈'=>'〈','〉'=>'〉','â‘ '=>'1','â‘¡'=>'2','â‘¢'=>'3','â‘£'=>'4','⑤'=>'5','â‘¥'=>'6','⑦'=>'7','â‘§'=>'8','⑨'=>'9','â‘©'=>'10','⑪'=>'11','â‘«'=>'12','⑬'=>'13','â‘'=>'14','â‘®'=>'15','⑯'=>'16','â‘°'=>'17','⑱'=>'18','⑲'=>'19','⑳'=>'20','â‘´'=>'(1)','⑵'=>'(2)','â‘¶'=>'(3)','â‘·'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','â‘»'=>'(8)','⑼'=>'(9)','⑽'=>'(10)','⑾'=>'(11)','â‘¿'=>'(12)','â’€'=>'(13)','â’'=>'(14)','â’‚'=>'(15)','â’ƒ'=>'(16)','â’„'=>'(17)','â’…'=>'(18)','â’†'=>'(19)','â’‡'=>'(20)','â’ˆ'=>'1.','â’‰'=>'2.','â’Š'=>'3.','â’‹'=>'4.','â’Œ'=>'5.','â’'=>'6.','â’Ž'=>'7.','â’'=>'8.','â’'=>'9.','â’‘'=>'10.','â’’'=>'11.','â’“'=>'12.','â’”'=>'13.','â’•'=>'14.','â’–'=>'15.','â’—'=>'16.','â’˜'=>'17.','â’™'=>'18.','â’š'=>'19.','â’›'=>'20.','â’œ'=>'(a)','â’'=>'(b)','â’ž'=>'(c)','â’Ÿ'=>'(d)','â’ '=>'(e)','â’¡'=>'(f)','â’¢'=>'(g)','â’£'=>'(h)','â’¤'=>'(i)','â’¥'=>'(j)','â’¦'=>'(k)','â’§'=>'(l)','â’¨'=>'(m)','â’©'=>'(n)','â’ª'=>'(o)','â’«'=>'(p)','â’¬'=>'(q)','â’'=>'(r)','â’®'=>'(s)','â’¯'=>'(t)','â’°'=>'(u)','â’±'=>'(v)','â’²'=>'(w)','â’³'=>'(x)','â’´'=>'(y)','â’µ'=>'(z)','â’¶'=>'A','â’·'=>'B','â’¸'=>'C','â’¹'=>'D','â’º'=>'E','â’»'=>'F','â’¼'=>'G','â’½'=>'H','â’¾'=>'I','â’¿'=>'J','â“€'=>'K','â“'=>'L','â“‚'=>'M','Ⓝ'=>'N','â“„'=>'O','â“…'=>'P','Ⓠ'=>'Q','Ⓡ'=>'R','Ⓢ'=>'S','Ⓣ'=>'T','Ⓤ'=>'U','â“‹'=>'V','Ⓦ'=>'W','â“'=>'X','Ⓨ'=>'Y','â“'=>'Z','â“'=>'a','â“‘'=>'b','â“’'=>'c','â““'=>'d','â“”'=>'e','â“•'=>'f','â“–'=>'g','â“—'=>'h','ⓘ'=>'i','â“™'=>'j','ⓚ'=>'k','â“›'=>'l','ⓜ'=>'m','â“'=>'n','ⓞ'=>'o','ⓟ'=>'p','â“ '=>'q','â“¡'=>'r','â“¢'=>'s','â“£'=>'t','ⓤ'=>'u','â“¥'=>'v','ⓦ'=>'w','â“§'=>'x','ⓨ'=>'y','â“©'=>'z','⓪'=>'0','⨌'=>'∫∫∫∫','â©´'=>'::=','⩵'=>'==','â©¶'=>'===','⫝̸'=>'â«Ì¸','ⵯ'=>'ⵡ','⺟'=>'æ¯','⻳'=>'龟','â¼€'=>'一','â¼'=>'丨','⼂'=>'丶','⼃'=>'丿','⼄'=>'ä¹™','â¼…'=>'亅','⼆'=>'二','⼇'=>'亠','⼈'=>'人','⼉'=>'å„¿','⼊'=>'å…¥','⼋'=>'å…«','⼌'=>'冂','â¼'=>'冖','⼎'=>'冫','â¼'=>'几','â¼'=>'凵','⼑'=>'刀','â¼’'=>'力','⼓'=>'勹','â¼”'=>'匕','⼕'=>'匚','â¼–'=>'匸','â¼—'=>'å','⼘'=>'åœ','â¼™'=>'å©','⼚'=>'厂','â¼›'=>'厶','⼜'=>'åˆ','â¼'=>'å£','⼞'=>'å›—','⼟'=>'土','â¼ '=>'士','⼡'=>'夂','â¼¢'=>'夊','â¼£'=>'夕','⼤'=>'大','â¼¥'=>'女','⼦'=>'å','â¼§'=>'宀','⼨'=>'寸','⼩'=>'å°','⼪'=>'å°¢','⼫'=>'å°¸','⼬'=>'å±®','â¼'=>'å±±','â¼®'=>'å·›','⼯'=>'å·¥','â¼°'=>'å·±','â¼±'=>'å·¾','â¼²'=>'å¹²','â¼³'=>'幺','â¼´'=>'广','â¼µ'=>'å»´','â¼¶'=>'廾','â¼·'=>'弋','⼸'=>'弓','â¼¹'=>'å½','⼺'=>'彡','â¼»'=>'å½³','â¼¼'=>'心','â¼½'=>'戈','â¼¾'=>'戶','⼿'=>'手','â½€'=>'支','â½'=>'æ”´','⽂'=>'æ–‡','⽃'=>'æ–—','⽄'=>'æ–¤','â½…'=>'æ–¹','⽆'=>'æ— ','⽇'=>'æ—¥','⽈'=>'æ›°','⽉'=>'月','⽊'=>'木','⽋'=>'欠','⽌'=>'æ¢','â½'=>'æ¹','⽎'=>'殳','â½'=>'毋','â½'=>'比','⽑'=>'毛','â½’'=>'æ°','⽓'=>'æ°”','â½”'=>'æ°´','⽕'=>'ç«','â½–'=>'爪','â½—'=>'父','⽘'=>'爻','â½™'=>'爿','⽚'=>'片','â½›'=>'牙','⽜'=>'牛','â½'=>'犬','⽞'=>'玄','⽟'=>'玉','â½ '=>'瓜','⽡'=>'瓦','â½¢'=>'甘','â½£'=>'生','⽤'=>'用','â½¥'=>'ç”°','⽦'=>'ç–‹','â½§'=>'ç–’','⽨'=>'ç™¶','⽩'=>'白','⽪'=>'çš®','⽫'=>'çš¿','⽬'=>'ç›®','â½'=>'矛','â½®'=>'矢','⽯'=>'石','â½°'=>'示','â½±'=>'禸','â½²'=>'禾','â½³'=>'ç©´','â½´'=>'ç«‹','â½µ'=>'竹','â½¶'=>'ç±³','â½·'=>'糸','⽸'=>'ç¼¶','â½¹'=>'网','⽺'=>'羊','â½»'=>'ç¾½','â½¼'=>'è€','â½½'=>'而','â½¾'=>'耒','⽿'=>'耳','â¾€'=>'è¿','â¾'=>'肉','⾂'=>'臣','⾃'=>'自','⾄'=>'至','â¾…'=>'臼','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','⾊'=>'色','⾋'=>'艸','⾌'=>'è™','â¾'=>'虫','⾎'=>'è¡€','â¾'=>'行','â¾'=>'è¡£','⾑'=>'襾','â¾’'=>'見','⾓'=>'è§’','â¾”'=>'言','⾕'=>'è°·','â¾–'=>'豆','â¾—'=>'豕','⾘'=>'豸','â¾™'=>'è²','⾚'=>'赤','â¾›'=>'èµ°','⾜'=>'è¶³','â¾'=>'身','⾞'=>'車','⾟'=>'è¾›','â¾ '=>'è¾°','⾡'=>'è¾µ','â¾¢'=>'é‚‘','â¾£'=>'é…‰','⾤'=>'釆','â¾¥'=>'里','⾦'=>'金','â¾§'=>'é•·','⾨'=>'é–€','⾩'=>'阜','⾪'=>'éš¶','⾫'=>'éš¹','⾬'=>'雨','â¾'=>'é‘','â¾®'=>'éž','⾯'=>'é¢','â¾°'=>'é©','â¾±'=>'韋','â¾²'=>'éŸ','â¾³'=>'音','â¾´'=>'é ','â¾µ'=>'風','â¾¶'=>'飛','â¾·'=>'食','⾸'=>'首','â¾¹'=>'香','⾺'=>'馬','â¾»'=>'骨','â¾¼'=>'高','â¾½'=>'髟','â¾¾'=>'鬥','⾿'=>'鬯','â¿€'=>'鬲','â¿'=>'鬼','â¿‚'=>'éš','⿃'=>'é³¥','â¿„'=>'é¹µ','â¿…'=>'鹿','⿆'=>'麥','⿇'=>'麻','⿈'=>'黃','⿉'=>'é»','⿊'=>'黑','â¿‹'=>'黹','⿌'=>'黽','â¿'=>'鼎','⿎'=>'鼓','â¿'=>'é¼ ','â¿'=>'é¼»','â¿‘'=>'齊','â¿’'=>'é½’','â¿“'=>'é¾','â¿”'=>'龜','â¿•'=>'é¾ ',' '=>' ','〶'=>'〒','〸'=>'å','〹'=>'å„','〺'=>'å…','ãŒ'=>'ã‹ã‚™','ãŽ'=>'ãã‚™','ã'=>'ãã‚™','ã’'=>'ã‘ã‚™','ã”'=>'ã“ã‚™','ã–'=>'ã•ã‚™','ã˜'=>'ã—ã‚™','ãš'=>'ã™ã‚™','ãœ'=>'ã›ã‚™','ãž'=>'ãã‚™','ã '=>'ãŸã‚™','ã¢'=>'ã¡ã‚™','ã¥'=>'ã¤ã‚™','ã§'=>'ã¦ã‚™','ã©'=>'ã¨ã‚™','ã°'=>'ã¯ã‚™','ã±'=>'ã¯ã‚š','ã³'=>'ã²ã‚™','ã´'=>'ã²ã‚š','ã¶'=>'ãµã‚™','ã·'=>'ãµã‚š','ã¹'=>'ã¸ã‚™','ãº'=>'ã¸ã‚š','ã¼'=>'ã»ã‚™','ã½'=>'ã»ã‚š','ã‚”'=>'ã†ã‚™','ã‚›'=>' ã‚™','゜'=>' ゚','ゞ'=>'ã‚ã‚™','ゟ'=>'より','ガ'=>'ã‚«ã‚™','ã‚®'=>'ã‚ã‚™','ã‚°'=>'グ','ゲ'=>'ゲ','ã‚´'=>'ゴ','ã‚¶'=>'ザ','ジ'=>'ã‚·ã‚™','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ã‚¿ã‚™','ヂ'=>'ãƒã‚™','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','ãƒ'=>'ãƒã‚™','パ'=>'ãƒã‚š','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ãƒ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ','ヿ'=>'コト','ㄱ'=>'á„€','ㄲ'=>'á„','ㄳ'=>'ᆪ','ã„´'=>'á„‚','ㄵ'=>'ᆬ','ã„¶'=>'á†','ã„·'=>'ᄃ','ㄸ'=>'á„„','ㄹ'=>'á„…','ㄺ'=>'ᆰ','ã„»'=>'ᆱ','ㄼ'=>'ᆲ','ㄽ'=>'ᆳ','ㄾ'=>'ᆴ','ã„¿'=>'ᆵ','ã…€'=>'ᄚ','ã…'=>'ᄆ','ã…‚'=>'ᄇ','ã…ƒ'=>'ᄈ','ã…„'=>'á„¡','ã……'=>'ᄉ','ã…†'=>'ᄊ','ã…‡'=>'á„‹','ã…ˆ'=>'ᄌ','ã…‰'=>'á„','ã…Š'=>'ᄎ','ã…‹'=>'á„','ã…Œ'=>'á„','ã…'=>'á„‘','ã…Ž'=>'á„’','ã…'=>'á…¡','ã…'=>'á…¢','ã…‘'=>'á…£','ã…’'=>'á…¤','ã…“'=>'á…¥','ã…”'=>'á…¦','ã…•'=>'á…§','ã…–'=>'á…¨','ã…—'=>'á…©','ã…˜'=>'á…ª','ã…™'=>'á…«','ã…š'=>'á…¬','ã…›'=>'á…','ã…œ'=>'á…®','ã…'=>'á…¯','ã…ž'=>'á…°','ã…Ÿ'=>'á…±','ã… '=>'á…²','ã…¡'=>'á…³','ã…¢'=>'á…´','ã…£'=>'á…µ','ã…¤'=>'á… ','ã…¥'=>'á„”','ã…¦'=>'á„•','ã…§'=>'ᇇ','ã…¨'=>'ᇈ','ã…©'=>'ᇌ','ã…ª'=>'ᇎ','ã…«'=>'ᇓ','ã…¬'=>'ᇗ','ã…'=>'ᇙ','ã…®'=>'ᄜ','ã…¯'=>'á‡','ã…°'=>'ᇟ','ã…±'=>'á„','ã…²'=>'ᄞ','ã…³'=>'á„ ','ã…´'=>'á„¢','ã…µ'=>'á„£','ã…¶'=>'á„§','ã…·'=>'á„©','ã…¸'=>'á„«','ã…¹'=>'ᄬ','ã…º'=>'á„','ã…»'=>'á„®','ã…¼'=>'ᄯ','ã…½'=>'ᄲ','ã…¾'=>'á„¶','ã…¿'=>'á…€','ㆀ'=>'á…‡','ã†'=>'á…Œ','ㆂ'=>'ᇱ','ㆃ'=>'ᇲ','ㆄ'=>'á…—','ㆅ'=>'á…˜','ㆆ'=>'á…™','ㆇ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ã†'=>'ᆞ','ㆎ'=>'ᆡ','㆒'=>'一','㆓'=>'二','㆔'=>'三','㆕'=>'å››','㆖'=>'上','㆗'=>'ä¸','㆘'=>'下','㆙'=>'甲','㆚'=>'ä¹™','㆛'=>'丙','㆜'=>'ä¸','ã†'=>'天','㆞'=>'地','㆟'=>'人','㈀'=>'(á„€)','ãˆ'=>'(á„‚)','㈂'=>'(ᄃ)','㈃'=>'(á„…)','㈄'=>'(ᄆ)','㈅'=>'(ᄇ)','㈆'=>'(ᄉ)','㈇'=>'(á„‹)','㈈'=>'(ᄌ)','㈉'=>'(ᄎ)','㈊'=>'(á„)','㈋'=>'(á„)','㈌'=>'(á„‘)','ãˆ'=>'(á„’)','㈎'=>'(가)','ãˆ'=>'(á„‚á…¡)','ãˆ'=>'(다)','㈑'=>'(á„…á…¡)','㈒'=>'(마)','㈓'=>'(바)','㈔'=>'(사)','㈕'=>'(á„‹á…¡)','㈖'=>'(자)','㈗'=>'(차)','㈘'=>'(á„á…¡)','㈙'=>'(á„á…¡)','㈚'=>'(á„‘á…¡)','㈛'=>'(á„’á…¡)','㈜'=>'(주)','ãˆ'=>'(오전)','㈞'=>'(á„‹á…©á„’á…®)','㈠'=>'(一)','㈡'=>'(二)','㈢'=>'(三)','㈣'=>'(å››)','㈤'=>'(五)','㈥'=>'(å…)','㈦'=>'(七)','㈧'=>'(å…«)','㈨'=>'(ä¹)','㈩'=>'(å)','㈪'=>'(月)','㈫'=>'(ç«)','㈬'=>'(æ°´)','ãˆ'=>'(木)','㈮'=>'(金)','㈯'=>'(土)','㈰'=>'(æ—¥)','㈱'=>'(æ ª)','㈲'=>'(有)','㈳'=>'(社)','㈴'=>'(å)','㈵'=>'(特)','㈶'=>'(財)','㈷'=>'(ç¥)','㈸'=>'(労)','㈹'=>'(代)','㈺'=>'(呼)','㈻'=>'(å¦)','㈼'=>'(監)','㈽'=>'(ä¼)','㈾'=>'(資)','㈿'=>'(å”)','㉀'=>'(ç¥)','ã‰'=>'(休)','㉂'=>'(自)','㉃'=>'(至)','ã‰'=>'PTE','㉑'=>'21','㉒'=>'22','㉓'=>'23','㉔'=>'24','㉕'=>'25','㉖'=>'26','㉗'=>'27','㉘'=>'28','㉙'=>'29','㉚'=>'30','㉛'=>'31','㉜'=>'32','ã‰'=>'33','㉞'=>'34','㉟'=>'35','㉠'=>'á„€','㉡'=>'á„‚','㉢'=>'ᄃ','㉣'=>'á„…','㉤'=>'ᄆ','㉥'=>'ᄇ','㉦'=>'ᄉ','㉧'=>'á„‹','㉨'=>'ᄌ','㉩'=>'ᄎ','㉪'=>'á„','㉫'=>'á„','㉬'=>'á„‘','ã‰'=>'á„’','㉮'=>'가','㉯'=>'á„‚á…¡','㉰'=>'다','㉱'=>'á„…á…¡','㉲'=>'마','㉳'=>'바','㉴'=>'사','㉵'=>'á„‹á…¡','㉶'=>'자','㉷'=>'차','㉸'=>'á„á…¡','㉹'=>'á„á…¡','㉺'=>'á„‘á…¡','㉻'=>'á„’á…¡','㉼'=>'참고','㉽'=>'주의','㉾'=>'á„‹á…®','㊀'=>'一','ãŠ'=>'二','㊂'=>'三','㊃'=>'å››','㊄'=>'五','㊅'=>'å…','㊆'=>'七','㊇'=>'å…«','㊈'=>'ä¹','㊉'=>'å','㊊'=>'月','㊋'=>'ç«','㊌'=>'æ°´','ãŠ'=>'木','㊎'=>'金','ãŠ'=>'土','ãŠ'=>'æ—¥','㊑'=>'æ ª','㊒'=>'有','㊓'=>'社','㊔'=>'å','㊕'=>'特','㊖'=>'財','㊗'=>'ç¥','㊘'=>'労','㊙'=>'秘','㊚'=>'ç”·','㊛'=>'女','㊜'=>'é©','ãŠ'=>'優','㊞'=>'å°','㊟'=>'注','㊠'=>'é …','㊡'=>'休','㊢'=>'写','㊣'=>'æ£','㊤'=>'上','㊥'=>'ä¸','㊦'=>'下','㊧'=>'å·¦','㊨'=>'å³','㊩'=>'医','㊪'=>'å®—','㊫'=>'å¦','㊬'=>'監','ãŠ'=>'ä¼','㊮'=>'資','㊯'=>'å”','㊰'=>'夜','㊱'=>'36','㊲'=>'37','㊳'=>'38','㊴'=>'39','㊵'=>'40','㊶'=>'41','㊷'=>'42','㊸'=>'43','㊹'=>'44','㊺'=>'45','㊻'=>'46','㊼'=>'47','㊽'=>'48','㊾'=>'49','㊿'=>'50','ã‹€'=>'1月','ã‹'=>'2月','ã‹‚'=>'3月','㋃'=>'4月','ã‹„'=>'5月','ã‹…'=>'6月','㋆'=>'7月','㋇'=>'8月','㋈'=>'9月','㋉'=>'10月','㋊'=>'11月','ã‹‹'=>'12月','㋌'=>'Hg','ã‹'=>'erg','㋎'=>'eV','ã‹'=>'LTD','ã‹'=>'ã‚¢','ã‹‘'=>'イ','ã‹’'=>'ウ','ã‹“'=>'エ','ã‹”'=>'オ','ã‹•'=>'ã‚«','ã‹–'=>'ã‚','ã‹—'=>'ク','㋘'=>'ケ','ã‹™'=>'コ','㋚'=>'サ','ã‹›'=>'ã‚·','㋜'=>'ス','ã‹'=>'ã‚»','㋞'=>'ソ','㋟'=>'ã‚¿','ã‹ '=>'ãƒ','ã‹¡'=>'ツ','ã‹¢'=>'テ','ã‹£'=>'ト','㋤'=>'ナ','ã‹¥'=>'ニ','㋦'=>'ヌ','ã‹§'=>'ãƒ','㋨'=>'ノ','ã‹©'=>'ãƒ','㋪'=>'ヒ','ã‹«'=>'フ','㋬'=>'ヘ','ã‹'=>'ホ','ã‹®'=>'マ','㋯'=>'ミ','ã‹°'=>'ム','㋱'=>'メ','㋲'=>'モ','㋳'=>'ヤ','ã‹´'=>'ユ','㋵'=>'ヨ','ã‹¶'=>'ラ','ã‹·'=>'リ','㋸'=>'ル','㋹'=>'レ','㋺'=>'ãƒ','ã‹»'=>'ワ','㋼'=>'ヰ','㋽'=>'ヱ','㋾'=>'ヲ','㌀'=>'ã‚¢ãƒã‚šãƒ¼ãƒˆ','ãŒ'=>'アルファ','㌂'=>'アンペア','㌃'=>'アール','㌄'=>'イニング','㌅'=>'インãƒ','㌆'=>'ウォン','㌇'=>'エスクード','㌈'=>'エーカー','㌉'=>'オンス','㌊'=>'オーム','㌋'=>'カイリ','㌌'=>'カラット','ãŒ'=>'ã‚«ãƒãƒªãƒ¼','㌎'=>'ã‚«ã‚™ãƒãƒ³','ãŒ'=>'ガンマ','ãŒ'=>'ã‚゙ガ','㌑'=>'ã‚゙ニー','㌒'=>'ã‚ュリー','㌓'=>'ã‚゙ルダー','㌔'=>'ã‚ãƒ','㌕'=>'ã‚ãƒã‚¯ã‚™ãƒ©ãƒ ','㌖'=>'ã‚ãƒãƒ¡ãƒ¼ãƒˆãƒ«','㌗'=>'ã‚ãƒãƒ¯ãƒƒãƒˆ','㌘'=>'グラム','㌙'=>'グラムトン','㌚'=>'クルゼイãƒ','㌛'=>'クãƒãƒ¼ãƒ','㌜'=>'ケース','ãŒ'=>'コルナ','㌞'=>'コーポ','㌟'=>'サイクル','㌠'=>'サンãƒãƒ¼ãƒ ','㌡'=>'シリング','㌢'=>'センãƒ','㌣'=>'セント','㌤'=>'ダース','㌥'=>'デシ','㌦'=>'ドル','㌧'=>'トン','㌨'=>'ナノ','㌩'=>'ノット','㌪'=>'ãƒã‚¤ãƒ„','㌫'=>'ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ','㌬'=>'ãƒã‚šãƒ¼ãƒ„','ãŒ'=>'ãƒã‚™ãƒ¼ãƒ¬ãƒ«','㌮'=>'ピアストル','㌯'=>'ピクル','㌰'=>'ピコ','㌱'=>'ビル','㌲'=>'ファラッド','㌳'=>'フィート','㌴'=>'ブッシェル','㌵'=>'フラン','㌶'=>'ヘクタール','㌷'=>'ペソ','㌸'=>'ペニヒ','㌹'=>'ヘルツ','㌺'=>'ペンス','㌻'=>'ページ','㌼'=>'ベータ','㌽'=>'ポイント','㌾'=>'ボルト','㌿'=>'ホン','ã€'=>'ポンド','ã'=>'ホール','ã‚'=>'ホーン','ãƒ'=>'マイクãƒ','ã„'=>'マイル','ã…'=>'マッãƒ','ã†'=>'マルク','ã‡'=>'マンション','ãˆ'=>'ミクãƒãƒ³','ã‰'=>'ミリ','ãŠ'=>'ミリãƒã‚™ãƒ¼ãƒ«','ã‹'=>'メガ','ãŒ'=>'メガトン','ã'=>'メートル','ãŽ'=>'ヤード','ã'=>'ヤール','ã'=>'ユアン','ã‘'=>'リットル','ã’'=>'リラ','ã“'=>'ルピー','ã”'=>'ルーブル','ã•'=>'レム','ã–'=>'レントゲン','ã—'=>'ワット','ã˜'=>'0点','ã™'=>'1点','ãš'=>'2点','ã›'=>'3点','ãœ'=>'4点','ã'=>'5点','ãž'=>'6点','ãŸ'=>'7点','ã '=>'8点','ã¡'=>'9点','ã¢'=>'10点','ã£'=>'11点','ã¤'=>'12点','ã¥'=>'13点','ã¦'=>'14点','ã§'=>'15点','ã¨'=>'16点','ã©'=>'17点','ãª'=>'18点','ã«'=>'19点','ã¬'=>'20点','ã'=>'21点','ã®'=>'22点','ã¯'=>'23点','ã°'=>'24点','ã±'=>'hPa','ã²'=>'da','ã³'=>'AU','ã´'=>'bar','ãµ'=>'oV','ã¶'=>'pc','ã·'=>'dm','ã¸'=>'dm2','ã¹'=>'dm3','ãº'=>'IU','ã»'=>'å¹³æˆ','ã¼'=>'æ˜å’Œ','ã½'=>'大æ£','ã¾'=>'明治','ã¿'=>'æ ªå¼ä¼šç¤¾','㎀'=>'pA','ãŽ'=>'nA','㎂'=>'μA','㎃'=>'mA','㎄'=>'kA','㎅'=>'KB','㎆'=>'MB','㎇'=>'GB','㎈'=>'cal','㎉'=>'kcal','㎊'=>'pF','㎋'=>'nF','㎌'=>'μF','ãŽ'=>'μg','㎎'=>'mg','ãŽ'=>'kg','ãŽ'=>'Hz','㎑'=>'kHz','㎒'=>'MHz','㎓'=>'GHz','㎔'=>'THz','㎕'=>'μl','㎖'=>'ml','㎗'=>'dl','㎘'=>'kl','㎙'=>'fm','㎚'=>'nm','㎛'=>'μm','㎜'=>'mm','ãŽ'=>'cm','㎞'=>'km','㎟'=>'mm2','㎠'=>'cm2','㎡'=>'m2','㎢'=>'km2','㎣'=>'mm3','㎤'=>'cm3','㎥'=>'m3','㎦'=>'km3','㎧'=>'m∕s','㎨'=>'m∕s2','㎩'=>'Pa','㎪'=>'kPa','㎫'=>'MPa','㎬'=>'GPa','ãŽ'=>'rad','㎮'=>'rad∕s','㎯'=>'rad∕s2','㎰'=>'ps','㎱'=>'ns','㎲'=>'μs','㎳'=>'ms','㎴'=>'pV','㎵'=>'nV','㎶'=>'μV','㎷'=>'mV','㎸'=>'kV','㎹'=>'MV','㎺'=>'pW','㎻'=>'nW','㎼'=>'μW','㎽'=>'mW','㎾'=>'kW','㎿'=>'MW','ã€'=>'kΩ','ã'=>'MΩ','ã‚'=>'a.m.','ãƒ'=>'Bq','ã„'=>'cc','ã…'=>'cd','ã†'=>'C∕kg','ã‡'=>'Co.','ãˆ'=>'dB','ã‰'=>'Gy','ãŠ'=>'ha','ã‹'=>'HP','ãŒ'=>'in','ã'=>'KK','ãŽ'=>'KM','ã'=>'kt','ã'=>'lm','ã‘'=>'ln','ã’'=>'log','ã“'=>'lx','ã”'=>'mb','ã•'=>'mil','ã–'=>'mol','ã—'=>'PH','ã˜'=>'p.m.','ã™'=>'PPM','ãš'=>'PR','ã›'=>'sr','ãœ'=>'Sv','ã'=>'Wb','ãž'=>'V∕m','ãŸ'=>'A∕m','ã '=>'1æ—¥','ã¡'=>'2æ—¥','ã¢'=>'3æ—¥','ã£'=>'4æ—¥','ã¤'=>'5æ—¥','ã¥'=>'6æ—¥','ã¦'=>'7æ—¥','ã§'=>'8æ—¥','ã¨'=>'9æ—¥','ã©'=>'10æ—¥','ãª'=>'11æ—¥','ã«'=>'12æ—¥','ã¬'=>'13æ—¥','ã'=>'14æ—¥','ã®'=>'15æ—¥','ã¯'=>'16æ—¥','ã°'=>'17æ—¥','ã±'=>'18æ—¥','ã²'=>'19æ—¥','ã³'=>'20æ—¥','ã´'=>'21æ—¥','ãµ'=>'22æ—¥','ã¶'=>'23æ—¥','ã·'=>'24æ—¥','ã¸'=>'25æ—¥','ã¹'=>'26æ—¥','ãº'=>'27æ—¥','ã»'=>'28æ—¥','ã¼'=>'29æ—¥','ã½'=>'30æ—¥','ã¾'=>'31æ—¥','ã¿'=>'gal','豈'=>'豈','ï¤'=>'æ›´','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'å¥','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'å–‡','奈'=>'奈','ï¤'=>'懶','癩'=>'癩','ï¤'=>'ç¾…','ï¤'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'é‚','樂'=>'樂','洛'=>'æ´›','烙'=>'烙','珞'=>'çž','落'=>'è½','酪'=>'é…ª','駱'=>'é§±','亂'=>'亂','卵'=>'åµ','ï¤'=>'欄','爛'=>'爛','蘭'=>'è˜','鸞'=>'鸞','嵐'=>'åµ','濫'=>'æ¿«','藍'=>'è—','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'è Ÿ','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','ï¤'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'æ“„','櫓'=>'æ«“','爐'=>'çˆ','盧'=>'ç›§','老'=>'è€','蘆'=>'蘆','虜'=>'虜','路'=>'è·¯','露'=>'露','魯'=>'é¯','鷺'=>'é·º','碌'=>'碌','祿'=>'祿','綠'=>'ç¶ ','菉'=>'è‰','錄'=>'錄','鹿'=>'鹿','ï¥'=>'è«–','壟'=>'壟','弄'=>'弄','籠'=>'ç± ','聾'=>'è¾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'é›·','壘'=>'壘','屢'=>'å±¢','樓'=>'樓','ï¥'=>'æ·š','漏'=>'æ¼','ï¥'=>'ç´¯','ï¥'=>'縷','陋'=>'陋','勒'=>'å‹’','肋'=>'è‚‹','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'ç¶¾','菱'=>'è±','陵'=>'陵','讀'=>'讀','拏'=>'æ‹','樂'=>'樂','ï¥'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'ç•°','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'ä¸','泌'=>'泌','數'=>'數','索'=>'ç´¢','參'=>'åƒ','塞'=>'塞','ï¥'=>'çœ','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'è¾°','沈'=>'沈','拾'=>'拾','若'=>'è‹¥','掠'=>'掠','略'=>'ç•¥','亮'=>'亮','兩'=>'å…©','凉'=>'凉','梁'=>'æ¢','糧'=>'ç³§','良'=>'良','諒'=>'è«’','量'=>'é‡','勵'=>'勵','呂'=>'å‘‚','ï¦'=>'女','廬'=>'廬','旅'=>'æ—…','濾'=>'濾','礪'=>'礪','閭'=>'é–','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'æ·','ï¦'=>'è½¢','年'=>'å¹´','ï¦'=>'æ†','ï¦'=>'戀','撚'=>'æ’š','漣'=>'æ¼£','煉'=>'ç…‰','璉'=>'ç’‰','秊'=>'ç§Š','練'=>'ç·´','聯'=>'è¯','輦'=>'輦','蓮'=>'è“®','連'=>'連','鍊'=>'éŠ','列'=>'列','ï¦'=>'劣','咽'=>'å’½','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'æ»','殮'=>'æ®®','簾'=>'ç°¾','獵'=>'çµ','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','ï¦'=>'玲','瑩'=>'ç‘©','羚'=>'羚','聆'=>'è†','鈴'=>'鈴','零'=>'é›¶','靈'=>'éˆ','領'=>'é ˜','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'å°¿','料'=>'æ–™','樂'=>'樂','ï§€'=>'燎','ï§'=>'療','ï§‚'=>'蓼','遼'=>'é¼','ï§„'=>'é¾','ï§…'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'æ»','柳'=>'柳','ï§Š'=>'æµ','ï§‹'=>'溜','ï§Œ'=>'ç‰','ï§'=>'ç•™','ï§Ž'=>'ç¡«','ï§'=>'ç´','ï§'=>'類','ï§‘'=>'å…','ï§’'=>'戮','ï§“'=>'陸','ï§”'=>'倫','ï§•'=>'å´™','ï§–'=>'æ·ª','ï§—'=>'輪','律'=>'律','ï§™'=>'æ…„','ï§š'=>'æ —','ï§›'=>'率','ï§œ'=>'隆','ï§'=>'利','ï§ž'=>'å','ï§Ÿ'=>'å±¥','ï§ '=>'易','ï§¡'=>'æŽ','ï§¢'=>'梨','ï§£'=>'æ³¥','理'=>'ç†','ï§¥'=>'ç—¢','罹'=>'ç½¹','ï§§'=>'è£','裡'=>'裡','ï§©'=>'里','離'=>'離','ï§«'=>'匿','溺'=>'溺','ï§'=>'å','ï§®'=>'ç‡','璘'=>'ç’˜','ï§°'=>'è—º','ï§±'=>'隣','ï§²'=>'é±—','ï§³'=>'麟','ï§´'=>'æž—','ï§µ'=>'æ·‹','ï§¶'=>'臨','ï§·'=>'ç«‹','笠'=>'笠','ï§¹'=>'ç²’','狀'=>'ç‹€','ï§»'=>'ç‚™','ï§¼'=>'è˜','ï§½'=>'什','ï§¾'=>'茶','ï§¿'=>'刺','切'=>'切','ï¨'=>'度','拓'=>'æ‹“','糖'=>'ç³–','宅'=>'å®…','洞'=>'æ´ž','暴'=>'æš´','輻'=>'è¼»','行'=>'行','降'=>'é™','見'=>'見','廓'=>'廓','兀'=>'å…€','ï¨'=>'å—€','ï¨'=>'塚','晴'=>'æ™´','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'ç¦','靖'=>'é–','ï¨'=>'ç²¾','羽'=>'ç¾½','蘒'=>'蘒','諸'=>'諸','逸'=>'逸','都'=>'都','飯'=>'飯','飼'=>'飼','館'=>'館','ï¨'=>'é¶´','侮'=>'ä¾®','僧'=>'僧','免'=>'å…','勉'=>'勉','勤'=>'勤','卑'=>'å‘','喝'=>'å–','嘆'=>'嘆','器'=>'器','塀'=>'å¡€','墨'=>'墨','層'=>'層','屮'=>'å±®','悔'=>'æ‚”','慨'=>'æ…¨','憎'=>'憎','ï©€'=>'懲','ï©'=>'æ•','ï©‚'=>'æ—¢','暑'=>'æš‘','ï©„'=>'梅','ï©…'=>'æµ·','渚'=>'渚','漢'=>'æ¼¢','煮'=>'ç…®','爫'=>'爫','琢'=>'ç¢','ï©‹'=>'碑','社'=>'社','ï©'=>'祉','祈'=>'祈','ï©'=>'ç¥','ï©'=>'祖','ï©‘'=>'ç¥','ï©’'=>'ç¦','ï©“'=>'禎','ï©”'=>'ç©€','ï©•'=>'çª','ï©–'=>'節','ï©—'=>'ç·´','縉'=>'縉','ï©™'=>'ç¹','署'=>'ç½²','ï©›'=>'者','臭'=>'è‡','ï©'=>'艹','艹'=>'艹','著'=>'è‘—','ï© '=>'è¤','ï©¡'=>'視','ï©¢'=>'è¬','ï©£'=>'謹','賓'=>'賓','ï©¥'=>'è´ˆ','辶'=>'è¾¶','ï©§'=>'逸','難'=>'難','ï©©'=>'響','頻'=>'é »','ï©°'=>'並','况'=>'况','全'=>'å…¨','侀'=>'ä¾€','ï©´'=>'å……','冀'=>'冀','ï©¶'=>'勇','ï©·'=>'勺','喝'=>'å–','啕'=>'å••','喙'=>'å–™','ï©»'=>'å—¢','塚'=>'塚','墳'=>'墳','奄'=>'奄','ï©¿'=>'奔','婢'=>'å©¢','ïª'=>'嬨','廒'=>'å»’','廙'=>'å»™','彩'=>'彩','徭'=>'å¾','惘'=>'惘','慎'=>'æ…Ž','愈'=>'愈','憎'=>'憎','慠'=>'æ… ','懲'=>'懲','戴'=>'戴','ïª'=>'æ„','搜'=>'æœ','ïª'=>'æ‘’','ïª'=>'æ•–','晴'=>'æ™´','朗'=>'朗','望'=>'望','杖'=>'æ–','歹'=>'æ¹','殺'=>'殺','流'=>'æµ','滛'=>'æ»›','滋'=>'滋','漢'=>'æ¼¢','瀞'=>'瀞','煮'=>'ç…®','ïª'=>'çž§','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'ç”»','瘝'=>'ç˜','瘟'=>'瘟','益'=>'益','盛'=>'ç››','直'=>'ç›´','睊'=>'çŠ','着'=>'ç€','磌'=>'磌','窱'=>'窱','ïª'=>'節','类'=>'ç±»','絛'=>'çµ›','練'=>'ç·´','缾'=>'ç¼¾','者'=>'者','荒'=>'è’','華'=>'è¯','蝹'=>'è¹','襁'=>'è¥','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'è«‹','謁'=>'è¬','諾'=>'諾','諭'=>'è«','謹'=>'謹','ï«€'=>'變','ï«'=>'è´ˆ','ï«‚'=>'輸','遲'=>'é²','ï«„'=>'醙','ï«…'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'é–','韛'=>'韛','響'=>'響','ï«‹'=>'é ‹','頻'=>'é »','ï«'=>'鬒','龜'=>'龜','ï«'=>'𢡊','ï«'=>'𢡄','ï«‘'=>'ð£•','ï«’'=>'ã®','ï«“'=>'䀘','ï«”'=>'䀹','ï«•'=>'𥉉','ï«–'=>'ð¥³','ï«—'=>'𧻓','齃'=>'齃','ï«™'=>'龎','ff'=>'ff','ï¬'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'st','st'=>'st','ﬓ'=>'Õ´Õ¶','ﬔ'=>'Õ´Õ¥','ﬕ'=>'Õ´Õ«','ﬖ'=>'Õ¾Õ¶','ﬗ'=>'Õ´Õ','ï¬'=>'×™Ö´','ײַ'=>'ײַ','ﬠ'=>'×¢','ﬡ'=>'×','ﬢ'=>'ד','ﬣ'=>'×”','ﬤ'=>'×›','ﬥ'=>'ל','ﬦ'=>'×','ﬧ'=>'ר','ﬨ'=>'ת','﬩'=>'+','שׁ'=>'ש×','שׂ'=>'שׂ','שּׁ'=>'שּ×','ï¬'=>'שּׂ','אַ'=>'×Ö·','אָ'=>'×Ö¸','אּ'=>'×Ö¼','בּ'=>'בּ','גּ'=>'×’Ö¼','דּ'=>'דּ','הּ'=>'×”Ö¼','וּ'=>'וּ','זּ'=>'×–Ö¼','טּ'=>'טּ','יּ'=>'×™Ö¼','ךּ'=>'ךּ','כּ'=>'×›Ö¼','לּ'=>'לּ','מּ'=>'מּ','ï€'=>'× Ö¼','ï'=>'סּ','ïƒ'=>'×£Ö¼','ï„'=>'פּ','ï†'=>'צּ','ï‡'=>'×§Ö¼','ïˆ'=>'רּ','ï‰'=>'שּ','ïŠ'=>'תּ','ï‹'=>'וֹ','ïŒ'=>'בֿ','ï'=>'×›Ö¿','ïŽ'=>'פֿ','ï'=>'×ל','ï'=>'Ù±','ï‘'=>'Ù±','ï’'=>'Ù»','ï“'=>'Ù»','ï”'=>'Ù»','ï•'=>'Ù»','ï–'=>'Ù¾','ï—'=>'Ù¾','ï˜'=>'Ù¾','ï™'=>'Ù¾','ïš'=>'Ú€','ï›'=>'Ú€','ïœ'=>'Ú€','ï'=>'Ú€','ïž'=>'Ùº','ïŸ'=>'Ùº','ï '=>'Ùº','ï¡'=>'Ùº','ï¢'=>'Ù¿','ï£'=>'Ù¿','ï¤'=>'Ù¿','ï¥'=>'Ù¿','ï¦'=>'Ù¹','ï§'=>'Ù¹','ï¨'=>'Ù¹','ï©'=>'Ù¹','ïª'=>'Ú¤','ï«'=>'Ú¤','ï¬'=>'Ú¤','ï'=>'Ú¤','ï®'=>'Ú¦','ï¯'=>'Ú¦','ï°'=>'Ú¦','ï±'=>'Ú¦','ï²'=>'Ú„','ï³'=>'Ú„','ï´'=>'Ú„','ïµ'=>'Ú„','ï¶'=>'Úƒ','ï·'=>'Úƒ','ï¸'=>'Úƒ','ï¹'=>'Úƒ','ïº'=>'Ú†','ï»'=>'Ú†','ï¼'=>'Ú†','ï½'=>'Ú†','ï¾'=>'Ú‡','ï¿'=>'Ú‡','ﮀ'=>'Ú‡','ï®'=>'Ú‡','ﮂ'=>'Ú','ﮃ'=>'Ú','ﮄ'=>'ÚŒ','ï®…'=>'ÚŒ','ﮆ'=>'ÚŽ','ﮇ'=>'ÚŽ','ﮈ'=>'Úˆ','ﮉ'=>'Úˆ','ﮊ'=>'Ú˜','ﮋ'=>'Ú˜','ﮌ'=>'Ú‘','ï®'=>'Ú‘','ﮎ'=>'Ú©','ï®'=>'Ú©','ï®'=>'Ú©','ﮑ'=>'Ú©','ï®’'=>'Ú¯','ﮓ'=>'Ú¯','ï®”'=>'Ú¯','ﮕ'=>'Ú¯','ï®–'=>'Ú³','ï®—'=>'Ú³','ﮘ'=>'Ú³','ï®™'=>'Ú³','ﮚ'=>'Ú±','ï®›'=>'Ú±','ﮜ'=>'Ú±','ï®'=>'Ú±','ﮞ'=>'Úº','ﮟ'=>'Úº','ï® '=>'Ú»','ﮡ'=>'Ú»','ﮢ'=>'Ú»','ﮣ'=>'Ú»','ﮤ'=>'Û•Ù”','ﮥ'=>'Û•Ù”','ﮦ'=>'Û','ï®§'=>'Û','ﮨ'=>'Û','ﮩ'=>'Û','ﮪ'=>'Ú¾','ﮫ'=>'Ú¾','ﮬ'=>'Ú¾','ï®'=>'Ú¾','ï®®'=>'Û’','ﮯ'=>'Û’','ï®°'=>'Û’Ù”','ï®±'=>'Û’Ù”','ﯓ'=>'Ú','ﯔ'=>'Ú','ﯕ'=>'Ú','ﯖ'=>'Ú','ﯗ'=>'Û‡','ﯘ'=>'Û‡','ﯙ'=>'Û†','ﯚ'=>'Û†','ﯛ'=>'Ûˆ','ﯜ'=>'Ûˆ','ï¯'=>'Û‡Ù´','ﯞ'=>'Û‹','ﯟ'=>'Û‹','ﯠ'=>'Û…','ﯡ'=>'Û…','ﯢ'=>'Û‰','ﯣ'=>'Û‰','ﯤ'=>'Û','ﯥ'=>'Û','ﯦ'=>'Û','ﯧ'=>'Û','ﯨ'=>'Ù‰','ﯩ'=>'Ù‰','ﯪ'=>'ئا','ﯫ'=>'ئا','ﯬ'=>'ÙŠÙ”Û•','ï¯'=>'ÙŠÙ”Û•','ﯮ'=>'ÙŠÙ”Ùˆ','ﯯ'=>'ÙŠÙ”Ùˆ','ﯰ'=>'ÙŠÙ”Û‡','ﯱ'=>'ÙŠÙ”Û‡','ﯲ'=>'ÙŠÙ”Û†','ﯳ'=>'ÙŠÙ”Û†','ﯴ'=>'ÙŠÙ”Ûˆ','ﯵ'=>'ÙŠÙ”Ûˆ','ﯶ'=>'ÙŠÙ”Û','ﯷ'=>'ÙŠÙ”Û','ﯸ'=>'ÙŠÙ”Û','ﯹ'=>'ÙŠÙ”Ù‰','ﯺ'=>'ÙŠÙ”Ù‰','ﯻ'=>'ÙŠÙ”Ù‰','ﯼ'=>'ÛŒ','ﯽ'=>'ÛŒ','ﯾ'=>'ÛŒ','ﯿ'=>'ÛŒ','ï°€'=>'ئج','ï°'=>'ÙŠÙ”Ø','ï°‚'=>'ÙŠÙ”Ù…','ï°ƒ'=>'ÙŠÙ”Ù‰','ï°„'=>'ÙŠÙ”ÙŠ','ï°…'=>'بج','ï°†'=>'بØ','ï°‡'=>'بخ','ï°ˆ'=>'بم','ï°‰'=>'بى','ï°Š'=>'بي','ï°‹'=>'تج','ï°Œ'=>'تØ','ï°'=>'تخ','ï°Ž'=>'تم','ï°'=>'تى','ï°'=>'تي','ï°‘'=>'ثج','ï°’'=>'ثم','ï°“'=>'ثى','ï°”'=>'ثي','ï°•'=>'جØ','ï°–'=>'جم','ï°—'=>'ØØ¬','ï°˜'=>'ØÙ…','ï°™'=>'خج','ï°š'=>'Ø®Ø','ï°›'=>'خم','ï°œ'=>'سج','ï°'=>'سØ','ï°ž'=>'سخ','ï°Ÿ'=>'سم','ï° '=>'صØ','ï°¡'=>'صم','ï°¢'=>'ضج','ï°£'=>'ضØ','ï°¤'=>'ضخ','ï°¥'=>'ضم','ï°¦'=>'Ø·Ø','ï°§'=>'طم','ï°¨'=>'ظم','ï°©'=>'عج','ï°ª'=>'عم','ï°«'=>'غج','ï°¬'=>'غم','ï°'=>'ÙØ¬','ï°®'=>'ÙØ','ï°¯'=>'ÙØ®','ï°°'=>'ÙÙ…','ï°±'=>'ÙÙ‰','ï°²'=>'ÙÙŠ','ï°³'=>'Ù‚Ø','ï°´'=>'قم','ï°µ'=>'قى','ï°¶'=>'قي','ï°·'=>'كا','ï°¸'=>'كج','ï°¹'=>'ÙƒØ','ï°º'=>'كخ','ï°»'=>'كل','ï°¼'=>'كم','ï°½'=>'كى','ï°¾'=>'كي','ï°¿'=>'لج','ï±€'=>'Ù„Ø','ï±'=>'لخ','ﱂ'=>'لم','ﱃ'=>'لى','ﱄ'=>'لي','ï±…'=>'مج','ﱆ'=>'Ù…Ø','ﱇ'=>'مخ','ﱈ'=>'مم','ﱉ'=>'مى','ﱊ'=>'مي','ﱋ'=>'نج','ﱌ'=>'Ù†Ø','ï±'=>'نخ','ﱎ'=>'نم','ï±'=>'نى','ï±'=>'ني','ﱑ'=>'هج','ï±’'=>'هم','ﱓ'=>'هى','ï±”'=>'هي','ﱕ'=>'يج','ï±–'=>'ÙŠØ','ï±—'=>'يخ','ﱘ'=>'يم','ï±™'=>'يى','ﱚ'=>'يي','ï±›'=>'ذٰ','ﱜ'=>'رٰ','ï±'=>'ىٰ','ﱞ'=>' ٌّ','ﱟ'=>' ÙÙ‘','ï± '=>' ÙŽÙ‘','ﱡ'=>' ÙÙ‘','ï±¢'=>' ÙÙ‘','ï±£'=>' ّٰ','ﱤ'=>'ئر','ï±¥'=>'ئز','ﱦ'=>'ÙŠÙ”Ù…','ï±§'=>'ÙŠÙ”Ù†','ﱨ'=>'ÙŠÙ”Ù‰','ﱩ'=>'ÙŠÙ”ÙŠ','ﱪ'=>'بر','ﱫ'=>'بز','ﱬ'=>'بم','ï±'=>'بن','ï±®'=>'بى','ﱯ'=>'بي','ï±°'=>'تر','ï±±'=>'تز','ï±²'=>'تم','ï±³'=>'تن','ï±´'=>'تى','ï±µ'=>'تي','ï±¶'=>'ثر','ï±·'=>'ثز','ﱸ'=>'ثم','ï±¹'=>'ثن','ﱺ'=>'ثى','ï±»'=>'ثي','ï±¼'=>'ÙÙ‰','ï±½'=>'ÙÙŠ','ï±¾'=>'قى','ﱿ'=>'قي','ï²€'=>'كا','ï²'=>'كل','ﲂ'=>'كم','ﲃ'=>'كى','ﲄ'=>'كي','ï²…'=>'لم','ﲆ'=>'لى','ﲇ'=>'لي','ﲈ'=>'ما','ﲉ'=>'مم','ﲊ'=>'نر','ﲋ'=>'نز','ﲌ'=>'نم','ï²'=>'نن','ﲎ'=>'نى','ï²'=>'ني','ï²'=>'ىٰ','ﲑ'=>'ير','ï²’'=>'يز','ﲓ'=>'يم','ï²”'=>'ين','ﲕ'=>'يى','ï²–'=>'يي','ï²—'=>'ئج','ﲘ'=>'ÙŠÙ”Ø','ï²™'=>'ئخ','ﲚ'=>'ÙŠÙ”Ù…','ï²›'=>'ÙŠÙ”Ù‡','ﲜ'=>'بج','ï²'=>'بØ','ﲞ'=>'بخ','ﲟ'=>'بم','ï² '=>'به','ﲡ'=>'تج','ï²¢'=>'تØ','ï²£'=>'تخ','ﲤ'=>'تم','ï²¥'=>'ته','ﲦ'=>'ثم','ï²§'=>'جØ','ﲨ'=>'جم','ﲩ'=>'ØØ¬','ﲪ'=>'ØÙ…','ﲫ'=>'خج','ﲬ'=>'خم','ï²'=>'سج','ï²®'=>'سØ','ﲯ'=>'سخ','ï²°'=>'سم','ï²±'=>'صØ','ï²²'=>'صخ','ï²³'=>'صم','ï²´'=>'ضج','ï²µ'=>'ضØ','ï²¶'=>'ضخ','ï²·'=>'ضم','ﲸ'=>'Ø·Ø','ï²¹'=>'ظم','ﲺ'=>'عج','ï²»'=>'عم','ï²¼'=>'غج','ï²½'=>'غم','ï²¾'=>'ÙØ¬','ﲿ'=>'ÙØ','ï³€'=>'ÙØ®','ï³'=>'ÙÙ…','ﳂ'=>'Ù‚Ø','ﳃ'=>'قم','ﳄ'=>'كج','ï³…'=>'ÙƒØ','ﳆ'=>'كخ','ﳇ'=>'كل','ﳈ'=>'كم','ﳉ'=>'لج','ﳊ'=>'Ù„Ø','ﳋ'=>'لخ','ﳌ'=>'لم','ï³'=>'له','ﳎ'=>'مج','ï³'=>'Ù…Ø','ï³'=>'مخ','ﳑ'=>'مم','ï³’'=>'نج','ﳓ'=>'Ù†Ø','ï³”'=>'نخ','ﳕ'=>'نم','ï³–'=>'نه','ï³—'=>'هج','ﳘ'=>'هم','ï³™'=>'هٰ','ﳚ'=>'يج','ï³›'=>'ÙŠØ','ﳜ'=>'يخ','ï³'=>'يم','ﳞ'=>'يه','ﳟ'=>'ÙŠÙ”Ù…','ï³ '=>'ÙŠÙ”Ù‡','ﳡ'=>'بم','ï³¢'=>'به','ï³£'=>'تم','ﳤ'=>'ته','ï³¥'=>'ثم','ﳦ'=>'ثه','ï³§'=>'سم','ﳨ'=>'سه','ﳩ'=>'شم','ﳪ'=>'شه','ﳫ'=>'كل','ﳬ'=>'كم','ï³'=>'لم','ï³®'=>'نم','ﳯ'=>'نه','ï³°'=>'يم','ï³±'=>'يه','ï³²'=>'Ù€ÙŽÙ‘','ï³³'=>'Ù€ÙÙ‘','ï³´'=>'Ù€ÙÙ‘','ï³µ'=>'طى','ï³¶'=>'طي','ï³·'=>'عى','ﳸ'=>'عي','ï³¹'=>'غى','ﳺ'=>'غي','ï³»'=>'سى','ï³¼'=>'سي','ï³½'=>'شى','ï³¾'=>'شي','ﳿ'=>'ØÙ‰','ï´€'=>'ØÙŠ','ï´'=>'جى','ï´‚'=>'جي','ï´ƒ'=>'خى','ï´„'=>'خي','ï´…'=>'صى','ï´†'=>'صي','ï´‡'=>'ضى','ï´ˆ'=>'ضي','ï´‰'=>'شج','ï´Š'=>'Ø´Ø','ï´‹'=>'شخ','ï´Œ'=>'شم','ï´'=>'شر','ï´Ž'=>'سر','ï´'=>'صر','ï´'=>'ضر','ï´‘'=>'طى','ï´’'=>'طي','ï´“'=>'عى','ï´”'=>'عي','ï´•'=>'غى','ï´–'=>'غي','ï´—'=>'سى','ï´˜'=>'سي','ï´™'=>'شى','ï´š'=>'شي','ï´›'=>'ØÙ‰','ï´œ'=>'ØÙŠ','ï´'=>'جى','ï´ž'=>'جي','ï´Ÿ'=>'خى','ï´ '=>'خي','ï´¡'=>'صى','ï´¢'=>'صي','ï´£'=>'ضى','ï´¤'=>'ضي','ï´¥'=>'شج','ï´¦'=>'Ø´Ø','ï´§'=>'شخ','ï´¨'=>'شم','ï´©'=>'شر','ï´ª'=>'سر','ï´«'=>'صر','ï´¬'=>'ضر','ï´'=>'شج','ï´®'=>'Ø´Ø','ï´¯'=>'شخ','ï´°'=>'شم','ï´±'=>'سه','ï´²'=>'شه','ï´³'=>'طم','ï´´'=>'سج','ï´µ'=>'سØ','ï´¶'=>'سخ','ï´·'=>'شج','ï´¸'=>'Ø´Ø','ï´¹'=>'شخ','ï´º'=>'طم','ï´»'=>'ظم','ï´¼'=>'اً','ï´½'=>'اً','ïµ'=>'تجم','ﵑ'=>'ØªØØ¬','ïµ’'=>'ØªØØ¬','ﵓ'=>'تØÙ…','ïµ”'=>'تخم','ﵕ'=>'تمج','ïµ–'=>'تمØ','ïµ—'=>'تمخ','ﵘ'=>'جمØ','ïµ™'=>'جمØ','ﵚ'=>'ØÙ…ÙŠ','ïµ›'=>'ØÙ…Ù‰','ﵜ'=>'Ø³ØØ¬','ïµ'=>'سجØ','ﵞ'=>'سجى','ﵟ'=>'سمØ','ïµ '=>'سمØ','ﵡ'=>'سمج','ïµ¢'=>'سمم','ïµ£'=>'سمم','ﵤ'=>'ØµØØ','ïµ¥'=>'ØµØØ','ﵦ'=>'صمم','ïµ§'=>'Ø´ØÙ…','ﵨ'=>'Ø´ØÙ…','ﵩ'=>'شجي','ﵪ'=>'شمخ','ﵫ'=>'شمخ','ﵬ'=>'شمم','ïµ'=>'شمم','ïµ®'=>'ضØÙ‰','ﵯ'=>'ضخم','ïµ°'=>'ضخم','ïµ±'=>'طمØ','ïµ²'=>'طمØ','ïµ³'=>'طمم','ïµ´'=>'طمي','ïµµ'=>'عجم','ïµ¶'=>'عمم','ïµ·'=>'عمم','ﵸ'=>'عمى','ïµ¹'=>'غمم','ﵺ'=>'غمي','ïµ»'=>'غمى','ïµ¼'=>'ÙØ®Ù…','ïµ½'=>'ÙØ®Ù…','ïµ¾'=>'قمØ','ﵿ'=>'قمم','ï¶€'=>'Ù„ØÙ…','ï¶'=>'Ù„ØÙŠ','ï¶‚'=>'Ù„ØÙ‰','ﶃ'=>'لجج','ï¶„'=>'لجج','ï¶…'=>'لخم','ﶆ'=>'لخم','ﶇ'=>'لمØ','ﶈ'=>'لمØ','ﶉ'=>'Ù…ØØ¬','ï¶Š'=>'Ù…ØÙ…','ï¶‹'=>'Ù…ØÙŠ','ï¶Œ'=>'مجØ','ï¶'=>'مجم','ï¶Ž'=>'مخج','ï¶'=>'مخم','ï¶’'=>'مجخ','ï¶“'=>'همج','ï¶”'=>'همم','ï¶•'=>'Ù†ØÙ…','ï¶–'=>'Ù†ØÙ‰','ï¶—'=>'نجم','ﶘ'=>'نجم','ï¶™'=>'نجى','ï¶š'=>'نمي','ï¶›'=>'نمى','ï¶œ'=>'يمم','ï¶'=>'يمم','ï¶ž'=>'بخي','ï¶Ÿ'=>'تجي','ï¶ '=>'تجى','ï¶¡'=>'تخي','ï¶¢'=>'تخى','ï¶£'=>'تمي','ﶤ'=>'تمى','ï¶¥'=>'جمي','ﶦ'=>'جØÙ‰','ï¶§'=>'جمى','ﶨ'=>'سخى','ï¶©'=>'صØÙŠ','ﶪ'=>'Ø´ØÙŠ','ï¶«'=>'ضØÙŠ','ﶬ'=>'لجي','ï¶'=>'لمي','ï¶®'=>'ÙŠØÙŠ','ﶯ'=>'يجي','ï¶°'=>'يمي','ï¶±'=>'ممي','ï¶²'=>'قمي','ï¶³'=>'Ù†ØÙŠ','ï¶´'=>'قمØ','ï¶µ'=>'Ù„ØÙ…','ï¶¶'=>'عمي','ï¶·'=>'كمي','ﶸ'=>'نجØ','ï¶¹'=>'مخي','ﶺ'=>'لجم','ï¶»'=>'كمم','ï¶¼'=>'لجم','ï¶½'=>'نجØ','ï¶¾'=>'جØÙŠ','ï¶¿'=>'ØØ¬ÙŠ','ï·€'=>'مجي','ï·'=>'Ùمي','ï·‚'=>'بØÙŠ','ï·ƒ'=>'كمم','ï·„'=>'عجم','ï·…'=>'صمم','ï·†'=>'سخي','ï·‡'=>'نجي','ï·°'=>'صلے','ï·±'=>'قلے','ï·²'=>'الله','ï·³'=>'اكبر','ï·´'=>'Ù…ØÙ…د','ï·µ'=>'صلعم','ï·¶'=>'رسول','ï··'=>'عليه','ï·¸'=>'وسلم','ï·¹'=>'صلى','ï·º'=>'صلى الله عليه وسلم','ï·»'=>'جل جلاله','ï·¼'=>'ریال','ï¸'=>',','︑'=>'ã€','︒'=>'。','︓'=>':','︔'=>';','︕'=>'!','︖'=>'?','︗'=>'〖','︘'=>'〗','︙'=>'...','︰'=>'..','︱'=>'—','︲'=>'–','︳'=>'_','︴'=>'_','︵'=>'(','︶'=>')','︷'=>'{','︸'=>'}','︹'=>'〔','︺'=>'〕','︻'=>'ã€','︼'=>'】','︽'=>'《','︾'=>'》','︿'=>'〈','ï¹€'=>'〉','ï¹'=>'「','﹂'=>'ã€','﹃'=>'『','﹄'=>'ã€','﹇'=>'[','﹈'=>']','﹉'=>' Ì…','﹊'=>' Ì…','﹋'=>' Ì…','﹌'=>' Ì…','ï¹'=>'_','﹎'=>'_','ï¹'=>'_','ï¹'=>',','﹑'=>'ã€','ï¹’'=>'.','ï¹”'=>';','﹕'=>':','ï¹–'=>'?','ï¹—'=>'!','﹘'=>'—','ï¹™'=>'(','﹚'=>')','ï¹›'=>'{','﹜'=>'}','ï¹'=>'〔','﹞'=>'〕','﹟'=>'#','ï¹ '=>'&','﹡'=>'*','ï¹¢'=>'+','ï¹£'=>'-','﹤'=>'<','ï¹¥'=>'>','﹦'=>'=','﹨'=>'\\','﹩'=>'$','﹪'=>'%','﹫'=>'@','ï¹°'=>' Ù‹','ï¹±'=>'ـً','ï¹²'=>' ÙŒ','ï¹´'=>' Ù','ï¹¶'=>' ÙŽ','ï¹·'=>'Ù€ÙŽ','ﹸ'=>' Ù','ï¹¹'=>'Ù€Ù','ﹺ'=>' Ù','ï¹»'=>'Ù€Ù','ï¹¼'=>' Ù‘','ï¹½'=>'ـّ','ï¹¾'=>' Ù’','ﹿ'=>'ـْ','ﺀ'=>'Ø¡','ïº'=>'آ','ﺂ'=>'آ','ﺃ'=>'أ','ﺄ'=>'أ','ﺅ'=>'ÙˆÙ”','ﺆ'=>'ÙˆÙ”','ﺇ'=>'إ','ﺈ'=>'إ','ﺉ'=>'ÙŠÙ”','ﺊ'=>'ÙŠÙ”','ﺋ'=>'ÙŠÙ”','ﺌ'=>'ÙŠÙ”','ïº'=>'ا','ﺎ'=>'ا','ïº'=>'ب','ïº'=>'ب','ﺑ'=>'ب','ﺒ'=>'ب','ﺓ'=>'Ø©','ﺔ'=>'Ø©','ﺕ'=>'ت','ﺖ'=>'ت','ﺗ'=>'ت','ﺘ'=>'ت','ﺙ'=>'Ø«','ﺚ'=>'Ø«','ﺛ'=>'Ø«','ﺜ'=>'Ø«','ïº'=>'ج','ﺞ'=>'ج','ﺟ'=>'ج','ﺠ'=>'ج','ﺡ'=>'Ø','ﺢ'=>'Ø','ﺣ'=>'Ø','ﺤ'=>'Ø','ﺥ'=>'Ø®','ﺦ'=>'Ø®','ﺧ'=>'Ø®','ﺨ'=>'Ø®','ﺩ'=>'د','ﺪ'=>'د','ﺫ'=>'ذ','ﺬ'=>'ذ','ïº'=>'ر','ﺮ'=>'ر','ﺯ'=>'ز','ﺰ'=>'ز','ﺱ'=>'س','ﺲ'=>'س','ﺳ'=>'س','ﺴ'=>'س','ﺵ'=>'Ø´','ﺶ'=>'Ø´','ﺷ'=>'Ø´','ﺸ'=>'Ø´','ﺹ'=>'ص','ﺺ'=>'ص','ﺻ'=>'ص','ﺼ'=>'ص','ﺽ'=>'ض','ﺾ'=>'ض','ﺿ'=>'ض','ﻀ'=>'ض','ï»'=>'Ø·','ﻂ'=>'Ø·','ﻃ'=>'Ø·','ﻄ'=>'Ø·','ï»…'=>'ظ','ﻆ'=>'ظ','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻉ'=>'ع','ﻊ'=>'ع','ﻋ'=>'ع','ﻌ'=>'ع','ï»'=>'غ','ﻎ'=>'غ','ï»'=>'غ','ï»'=>'غ','ﻑ'=>'Ù','ï»’'=>'Ù','ﻓ'=>'Ù','ï»”'=>'Ù','ﻕ'=>'Ù‚','ï»–'=>'Ù‚','ï»—'=>'Ù‚','ﻘ'=>'Ù‚','ï»™'=>'Ùƒ','ﻚ'=>'Ùƒ','ï»›'=>'Ùƒ','ﻜ'=>'Ùƒ','ï»'=>'Ù„','ﻞ'=>'Ù„','ﻟ'=>'Ù„','ï» '=>'Ù„','ﻡ'=>'Ù…','ﻢ'=>'Ù…','ﻣ'=>'Ù…','ﻤ'=>'Ù…','ﻥ'=>'Ù†','ﻦ'=>'Ù†','ï»§'=>'Ù†','ﻨ'=>'Ù†','ﻩ'=>'Ù‡','ﻪ'=>'Ù‡','ﻫ'=>'Ù‡','ﻬ'=>'Ù‡','ï»'=>'Ùˆ','ï»®'=>'Ùˆ','ﻯ'=>'Ù‰','ï»°'=>'Ù‰','ï»±'=>'ÙŠ','ﻲ'=>'ÙŠ','ﻳ'=>'ÙŠ','ï»´'=>'ÙŠ','ﻵ'=>'لآ','ï»¶'=>'لآ','ï»·'=>'لأ','ﻸ'=>'لأ','ﻹ'=>'لإ','ﻺ'=>'لإ','ï»»'=>'لا','ﻼ'=>'لا','ï¼'=>'!','"'=>'"','#'=>'#','$'=>'$','ï¼…'=>'%','&'=>'&','''=>'\'','('=>'(',')'=>')','*'=>'*','+'=>'+',','=>',','ï¼'=>'-','.'=>'.','ï¼'=>'/','ï¼'=>'0','1'=>'1','ï¼’'=>'2','3'=>'3','ï¼”'=>'4','5'=>'5','ï¼–'=>'6','ï¼—'=>'7','8'=>'8','ï¼™'=>'9',':'=>':','ï¼›'=>';','<'=>'<','ï¼'=>'=','>'=>'>','?'=>'?','ï¼ '=>'@','A'=>'A','ï¼¢'=>'B','ï¼£'=>'C','D'=>'D','ï¼¥'=>'E','F'=>'F','ï¼§'=>'G','H'=>'H','I'=>'I','J'=>'J','K'=>'K','L'=>'L','ï¼'=>'M','ï¼®'=>'N','O'=>'O','ï¼°'=>'P','ï¼±'=>'Q','ï¼²'=>'R','ï¼³'=>'S','ï¼´'=>'T','ï¼µ'=>'U','ï¼¶'=>'V','ï¼·'=>'W','X'=>'X','ï¼¹'=>'Y','Z'=>'Z','ï¼»'=>'[','ï¼¼'=>'\\','ï¼½'=>']','ï¼¾'=>'^','_'=>'_','ï½€'=>'`','ï½'=>'a','b'=>'b','c'=>'c','d'=>'d','ï½…'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','ï½'=>'m','n'=>'n','ï½'=>'o','ï½'=>'p','q'=>'q','ï½’'=>'r','s'=>'s','ï½”'=>'t','u'=>'u','ï½–'=>'v','ï½—'=>'w','x'=>'x','ï½™'=>'y','z'=>'z','ï½›'=>'{','|'=>'|','ï½'=>'}','~'=>'~','⦅'=>'⦅','ï½ '=>'⦆','。'=>'。','ï½¢'=>'「','ï½£'=>'ã€','、'=>'ã€','ï½¥'=>'・','ヲ'=>'ヲ','ï½§'=>'ã‚¡','ィ'=>'ã‚£','ゥ'=>'ã‚¥','ェ'=>'ã‚§','ォ'=>'ã‚©','ャ'=>'ャ','ï½'=>'ュ','ï½®'=>'ョ','ッ'=>'ッ','ï½°'=>'ー','ï½±'=>'ã‚¢','ï½²'=>'イ','ï½³'=>'ウ','ï½´'=>'エ','ï½µ'=>'オ','ï½¶'=>'ã‚«','ï½·'=>'ã‚','ク'=>'ク','ï½¹'=>'ケ','コ'=>'コ','ï½»'=>'サ','ï½¼'=>'ã‚·','ï½½'=>'ス','ï½¾'=>'ã‚»','ソ'=>'ソ','ï¾€'=>'ã‚¿','ï¾'=>'ãƒ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ï¾…'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ãƒ','ノ'=>'ノ','ハ'=>'ãƒ','ヒ'=>'ヒ','フ'=>'フ','ï¾'=>'ヘ','ホ'=>'ホ','ï¾'=>'マ','ï¾'=>'ミ','ム'=>'ム','ï¾’'=>'メ','モ'=>'モ','ï¾”'=>'ヤ','ユ'=>'ユ','ï¾–'=>'ヨ','ï¾—'=>'ラ','リ'=>'リ','ï¾™'=>'ル','レ'=>'レ','ï¾›'=>'ãƒ','ワ'=>'ワ','ï¾'=>'ン','゙'=>'ã‚™','゚'=>'゚','ï¾ '=>'á… ','ᄀ'=>'á„€','ï¾¢'=>'á„','ï¾£'=>'ᆪ','ᄂ'=>'á„‚','ï¾¥'=>'ᆬ','ᆭ'=>'á†','ï¾§'=>'ᄃ','ᄄ'=>'á„„','ᄅ'=>'á„…','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ï¾'=>'ᆳ','ï¾®'=>'ᆴ','ᆵ'=>'ᆵ','ï¾°'=>'ᄚ','ï¾±'=>'ᄆ','ï¾²'=>'ᄇ','ï¾³'=>'ᄈ','ï¾´'=>'á„¡','ï¾µ'=>'ᄉ','ï¾¶'=>'ᄊ','ï¾·'=>'á„‹','ᄌ'=>'ᄌ','ï¾¹'=>'á„','ᄎ'=>'ᄎ','ï¾»'=>'á„','ï¾¼'=>'á„','ï¾½'=>'á„‘','ï¾¾'=>'á„’','ï¿‚'=>'á…¡','ᅢ'=>'á…¢','ï¿„'=>'á…£','ï¿…'=>'á…¤','ᅥ'=>'á…¥','ᅦ'=>'á…¦','ᅧ'=>'á…§','ï¿‹'=>'á…¨','ᅩ'=>'á…©','ï¿'=>'á…ª','ᅫ'=>'á…«','ï¿'=>'á…¬','ï¿’'=>'á…','ï¿“'=>'á…®','ï¿”'=>'á…¯','ï¿•'=>'á…°','ï¿–'=>'á…±','ï¿—'=>'á…²','ᅳ'=>'á…³','ï¿›'=>'á…´','ᅵ'=>'á…µ','ï¿ '=>'¢','ï¿¡'=>'£','ï¿¢'=>'¬','ï¿£'=>' Ì„','¦'=>'¦','ï¿¥'=>'Â¥','₩'=>'â‚©','│'=>'│','ï¿©'=>'â†','↑'=>'↑','ï¿«'=>'→','↓'=>'↓','ï¿'=>'â– ','ï¿®'=>'â—‹','ð…ž'=>'ð…—ð…¥','ð…Ÿ'=>'ð…˜ð…¥','ð… '=>'ð…˜ð…¥ð…®','ð…¡'=>'ð…˜ð…¥ð…¯','ð…¢'=>'ð…˜ð…¥ð…°','ð…£'=>'ð…˜ð…¥ð…±','ð…¤'=>'ð…˜ð…¥ð…²','ð†»'=>'ð†¹ð…¥','ð†¼'=>'ð†ºð…¥','ð†½'=>'ð†¹ð…¥ð…®','ð†¾'=>'ð†ºð…¥ð…®','ð†¿'=>'ð†¹ð…¥ð…¯','ð‡€'=>'ð†ºð…¥ð…¯','ð€'=>'A','ð'=>'B','ð‚'=>'C','ðƒ'=>'D','ð„'=>'E','ð…'=>'F','ð†'=>'G','ð‡'=>'H','ðˆ'=>'I','ð‰'=>'J','ðŠ'=>'K','ð‹'=>'L','ðŒ'=>'M','ð'=>'N','ðŽ'=>'O','ð'=>'P','ð'=>'Q','ð‘'=>'R','ð’'=>'S','ð“'=>'T','ð”'=>'U','ð•'=>'V','ð–'=>'W','ð—'=>'X','ð˜'=>'Y','ð™'=>'Z','ðš'=>'a','ð›'=>'b','ðœ'=>'c','ð'=>'d','ðž'=>'e','ðŸ'=>'f','ð '=>'g','ð¡'=>'h','ð¢'=>'i','ð£'=>'j','ð¤'=>'k','ð¥'=>'l','ð¦'=>'m','ð§'=>'n','ð¨'=>'o','ð©'=>'p','ðª'=>'q','ð«'=>'r','ð¬'=>'s','ð'=>'t','ð®'=>'u','ð¯'=>'v','ð°'=>'w','ð±'=>'x','ð²'=>'y','ð³'=>'z','ð´'=>'A','ðµ'=>'B','ð¶'=>'C','ð·'=>'D','ð¸'=>'E','ð¹'=>'F','ðº'=>'G','ð»'=>'H','ð¼'=>'I','ð½'=>'J','ð¾'=>'K','ð¿'=>'L','ð‘€'=>'M','ð‘'=>'N','ð‘‚'=>'O','ð‘ƒ'=>'P','ð‘„'=>'Q','ð‘…'=>'R','ð‘†'=>'S','ð‘‡'=>'T','ð‘ˆ'=>'U','ð‘‰'=>'V','ð‘Š'=>'W','ð‘‹'=>'X','ð‘Œ'=>'Y','ð‘'=>'Z','ð‘Ž'=>'a','ð‘'=>'b','ð‘'=>'c','ð‘‘'=>'d','ð‘’'=>'e','ð‘“'=>'f','ð‘”'=>'g','ð‘–'=>'i','ð‘—'=>'j','ð‘˜'=>'k','ð‘™'=>'l','ð‘š'=>'m','ð‘›'=>'n','ð‘œ'=>'o','ð‘'=>'p','ð‘ž'=>'q','ð‘Ÿ'=>'r','ð‘ '=>'s','ð‘¡'=>'t','ð‘¢'=>'u','ð‘£'=>'v','ð‘¤'=>'w','ð‘¥'=>'x','ð‘¦'=>'y','ð‘§'=>'z','ð‘¨'=>'A','ð‘©'=>'B','ð‘ª'=>'C','ð‘«'=>'D','ð‘¬'=>'E','ð‘'=>'F','ð‘®'=>'G','ð‘¯'=>'H','ð‘°'=>'I','ð‘±'=>'J','ð‘²'=>'K','ð‘³'=>'L','ð‘´'=>'M','ð‘µ'=>'N','ð‘¶'=>'O','ð‘·'=>'P','ð‘¸'=>'Q','ð‘¹'=>'R','ð‘º'=>'S','ð‘»'=>'T','ð‘¼'=>'U','ð‘½'=>'V','ð‘¾'=>'W','ð‘¿'=>'X','ð’€'=>'Y','ð’'=>'Z','ð’‚'=>'a','ð’ƒ'=>'b','ð’„'=>'c','ð’…'=>'d','ð’†'=>'e','ð’‡'=>'f','ð’ˆ'=>'g','ð’‰'=>'h','ð’Š'=>'i','ð’‹'=>'j','ð’Œ'=>'k','ð’'=>'l','ð’Ž'=>'m','ð’'=>'n','ð’'=>'o','ð’‘'=>'p','ð’’'=>'q','ð’“'=>'r','ð’”'=>'s','ð’•'=>'t','ð’–'=>'u','ð’—'=>'v','ð’˜'=>'w','ð’™'=>'x','ð’š'=>'y','ð’›'=>'z','ð’œ'=>'A','ð’ž'=>'C','ð’Ÿ'=>'D','ð’¢'=>'G','ð’¥'=>'J','ð’¦'=>'K','ð’©'=>'N','ð’ª'=>'O','ð’«'=>'P','ð’¬'=>'Q','ð’®'=>'S','ð’¯'=>'T','ð’°'=>'U','ð’±'=>'V','ð’²'=>'W','ð’³'=>'X','ð’´'=>'Y','ð’µ'=>'Z','ð’¶'=>'a','ð’·'=>'b','ð’¸'=>'c','ð’¹'=>'d','ð’»'=>'f','ð’½'=>'h','ð’¾'=>'i','ð’¿'=>'j','ð“€'=>'k','ð“'=>'l','ð“‚'=>'m','ð“ƒ'=>'n','ð“…'=>'p','ð“†'=>'q','ð“‡'=>'r','ð“ˆ'=>'s','ð“‰'=>'t','ð“Š'=>'u','ð“‹'=>'v','ð“Œ'=>'w','ð“'=>'x','ð“Ž'=>'y','ð“'=>'z','ð“'=>'A','ð“‘'=>'B','ð“’'=>'C','ð““'=>'D','ð“”'=>'E','ð“•'=>'F','ð“–'=>'G','ð“—'=>'H','ð“˜'=>'I','ð“™'=>'J','ð“š'=>'K','ð“›'=>'L','ð“œ'=>'M','ð“'=>'N','ð“ž'=>'O','ð“Ÿ'=>'P','ð“ '=>'Q','ð“¡'=>'R','ð“¢'=>'S','ð“£'=>'T','ð“¤'=>'U','ð“¥'=>'V','ð“¦'=>'W','ð“§'=>'X','ð“¨'=>'Y','ð“©'=>'Z','ð“ª'=>'a','ð“«'=>'b','ð“¬'=>'c','ð“'=>'d','ð“®'=>'e','ð“¯'=>'f','ð“°'=>'g','ð“±'=>'h','ð“²'=>'i','ð“³'=>'j','ð“´'=>'k','ð“µ'=>'l','ð“¶'=>'m','ð“·'=>'n','ð“¸'=>'o','ð“¹'=>'p','ð“º'=>'q','ð“»'=>'r','ð“¼'=>'s','ð“½'=>'t','ð“¾'=>'u','ð“¿'=>'v','ð”€'=>'w','ð”'=>'x','ð”‚'=>'y','ð”ƒ'=>'z','ð”„'=>'A','ð”…'=>'B','ð”‡'=>'D','ð”ˆ'=>'E','ð”‰'=>'F','ð”Š'=>'G','ð”'=>'J','ð”Ž'=>'K','ð”'=>'L','ð”'=>'M','ð”‘'=>'N','ð”’'=>'O','ð”“'=>'P','ð””'=>'Q','ð”–'=>'S','ð”—'=>'T','ð”˜'=>'U','ð”™'=>'V','ð”š'=>'W','ð”›'=>'X','ð”œ'=>'Y','ð”ž'=>'a','ð”Ÿ'=>'b','ð” '=>'c','ð”¡'=>'d','ð”¢'=>'e','ð”£'=>'f','ð”¤'=>'g','ð”¥'=>'h','ð”¦'=>'i','ð”§'=>'j','ð”¨'=>'k','ð”©'=>'l','ð”ª'=>'m','ð”«'=>'n','ð”¬'=>'o','ð”'=>'p','ð”®'=>'q','ð”¯'=>'r','ð”°'=>'s','ð”±'=>'t','ð”²'=>'u','ð”³'=>'v','ð”´'=>'w','ð”µ'=>'x','ð”¶'=>'y','ð”·'=>'z','ð”¸'=>'A','ð”¹'=>'B','ð”»'=>'D','ð”¼'=>'E','ð”½'=>'F','ð”¾'=>'G','ð•€'=>'I','ð•'=>'J','ð•‚'=>'K','ð•ƒ'=>'L','ð•„'=>'M','ð•†'=>'O','ð•Š'=>'S','ð•‹'=>'T','ð•Œ'=>'U','ð•'=>'V','ð•Ž'=>'W','ð•'=>'X','ð•'=>'Y','ð•’'=>'a','ð•“'=>'b','ð•”'=>'c','ð••'=>'d','ð•–'=>'e','ð•—'=>'f','ð•˜'=>'g','ð•™'=>'h','ð•š'=>'i','ð•›'=>'j','ð•œ'=>'k','ð•'=>'l','ð•ž'=>'m','ð•Ÿ'=>'n','ð• '=>'o','ð•¡'=>'p','ð•¢'=>'q','ð•£'=>'r','ð•¤'=>'s','ð•¥'=>'t','ð•¦'=>'u','ð•§'=>'v','ð•¨'=>'w','ð•©'=>'x','ð•ª'=>'y','ð•«'=>'z','ð•¬'=>'A','ð•'=>'B','ð•®'=>'C','ð•¯'=>'D','ð•°'=>'E','ð•±'=>'F','ð•²'=>'G','ð•³'=>'H','ð•´'=>'I','ð•µ'=>'J','ð•¶'=>'K','ð•·'=>'L','ð•¸'=>'M','ð•¹'=>'N','ð•º'=>'O','ð•»'=>'P','ð•¼'=>'Q','ð•½'=>'R','ð•¾'=>'S','ð•¿'=>'T','ð–€'=>'U','ð–'=>'V','ð–‚'=>'W','ð–ƒ'=>'X','ð–„'=>'Y','ð–…'=>'Z','ð–†'=>'a','ð–‡'=>'b','ð–ˆ'=>'c','ð–‰'=>'d','ð–Š'=>'e','ð–‹'=>'f','ð–Œ'=>'g','ð–'=>'h','ð–Ž'=>'i','ð–'=>'j','ð–'=>'k','ð–‘'=>'l','ð–’'=>'m','ð–“'=>'n','ð–”'=>'o','ð–•'=>'p','ð––'=>'q','ð–—'=>'r','ð–˜'=>'s','ð–™'=>'t','ð–š'=>'u','ð–›'=>'v','ð–œ'=>'w','ð–'=>'x','ð–ž'=>'y','ð–Ÿ'=>'z','ð– '=>'A','ð–¡'=>'B','ð–¢'=>'C','ð–£'=>'D','ð–¤'=>'E','ð–¥'=>'F','ð–¦'=>'G','ð–§'=>'H','ð–¨'=>'I','ð–©'=>'J','ð–ª'=>'K','ð–«'=>'L','ð–¬'=>'M','ð–'=>'N','ð–®'=>'O','ð–¯'=>'P','ð–°'=>'Q','ð–±'=>'R','ð–²'=>'S','ð–³'=>'T','ð–´'=>'U','ð–µ'=>'V','ð–¶'=>'W','ð–·'=>'X','ð–¸'=>'Y','ð–¹'=>'Z','ð–º'=>'a','ð–»'=>'b','ð–¼'=>'c','ð–½'=>'d','ð–¾'=>'e','ð–¿'=>'f','ð—€'=>'g','ð—'=>'h','ð—‚'=>'i','ð—ƒ'=>'j','ð—„'=>'k','ð—…'=>'l','ð—†'=>'m','ð—‡'=>'n','ð—ˆ'=>'o','ð—‰'=>'p','ð—Š'=>'q','ð—‹'=>'r','ð—Œ'=>'s','ð—'=>'t','ð—Ž'=>'u','ð—'=>'v','ð—'=>'w','ð—‘'=>'x','ð—’'=>'y','ð—“'=>'z','ð—”'=>'A','ð—•'=>'B','ð—–'=>'C','ð——'=>'D','ð—˜'=>'E','ð—™'=>'F','ð—š'=>'G','ð—›'=>'H','ð—œ'=>'I','ð—'=>'J','ð—ž'=>'K','ð—Ÿ'=>'L','ð— '=>'M','ð—¡'=>'N','ð—¢'=>'O','ð—£'=>'P','ð—¤'=>'Q','ð—¥'=>'R','ð—¦'=>'S','ð—§'=>'T','ð—¨'=>'U','ð—©'=>'V','ð—ª'=>'W','ð—«'=>'X','ð—¬'=>'Y','ð—'=>'Z','ð—®'=>'a','ð—¯'=>'b','ð—°'=>'c','ð—±'=>'d','ð—²'=>'e','ð—³'=>'f','ð—´'=>'g','ð—µ'=>'h','ð—¶'=>'i','ð—·'=>'j','ð—¸'=>'k','ð—¹'=>'l','ð—º'=>'m','ð—»'=>'n','ð—¼'=>'o','ð—½'=>'p','ð—¾'=>'q','ð—¿'=>'r','ð˜€'=>'s','ð˜'=>'t','ð˜‚'=>'u','ð˜ƒ'=>'v','ð˜„'=>'w','ð˜…'=>'x','ð˜†'=>'y','ð˜‡'=>'z','ð˜ˆ'=>'A','ð˜‰'=>'B','ð˜Š'=>'C','ð˜‹'=>'D','ð˜Œ'=>'E','ð˜'=>'F','ð˜Ž'=>'G','ð˜'=>'H','ð˜'=>'I','ð˜‘'=>'J','ð˜’'=>'K','ð˜“'=>'L','ð˜”'=>'M','ð˜•'=>'N','ð˜–'=>'O','ð˜—'=>'P','ð˜˜'=>'Q','ð˜™'=>'R','ð˜š'=>'S','ð˜›'=>'T','ð˜œ'=>'U','ð˜'=>'V','ð˜ž'=>'W','ð˜Ÿ'=>'X','ð˜ '=>'Y','ð˜¡'=>'Z','ð˜¢'=>'a','ð˜£'=>'b','ð˜¤'=>'c','ð˜¥'=>'d','ð˜¦'=>'e','ð˜§'=>'f','ð˜¨'=>'g','ð˜©'=>'h','ð˜ª'=>'i','ð˜«'=>'j','ð˜¬'=>'k','ð˜'=>'l','ð˜®'=>'m','ð˜¯'=>'n','ð˜°'=>'o','ð˜±'=>'p','ð˜²'=>'q','ð˜³'=>'r','ð˜´'=>'s','ð˜µ'=>'t','ð˜¶'=>'u','ð˜·'=>'v','ð˜¸'=>'w','ð˜¹'=>'x','ð˜º'=>'y','ð˜»'=>'z','ð˜¼'=>'A','ð˜½'=>'B','ð˜¾'=>'C','ð˜¿'=>'D','ð™€'=>'E','ð™'=>'F','ð™‚'=>'G','ð™ƒ'=>'H','ð™„'=>'I','ð™…'=>'J','ð™†'=>'K','ð™‡'=>'L','ð™ˆ'=>'M','ð™‰'=>'N','ð™Š'=>'O','ð™‹'=>'P','ð™Œ'=>'Q','ð™'=>'R','ð™Ž'=>'S','ð™'=>'T','ð™'=>'U','ð™‘'=>'V','ð™’'=>'W','ð™“'=>'X','ð™”'=>'Y','ð™•'=>'Z','ð™–'=>'a','ð™—'=>'b','ð™˜'=>'c','ð™™'=>'d','ð™š'=>'e','ð™›'=>'f','ð™œ'=>'g','ð™'=>'h','ð™ž'=>'i','ð™Ÿ'=>'j','ð™ '=>'k','ð™¡'=>'l','ð™¢'=>'m','ð™£'=>'n','ð™¤'=>'o','ð™¥'=>'p','ð™¦'=>'q','ð™§'=>'r','ð™¨'=>'s','ð™©'=>'t','ð™ª'=>'u','ð™«'=>'v','ð™¬'=>'w','ð™'=>'x','ð™®'=>'y','ð™¯'=>'z','ð™°'=>'A','ð™±'=>'B','ð™²'=>'C','ð™³'=>'D','ð™´'=>'E','ð™µ'=>'F','ð™¶'=>'G','ð™·'=>'H','ð™¸'=>'I','ð™¹'=>'J','ð™º'=>'K','ð™»'=>'L','ð™¼'=>'M','ð™½'=>'N','ð™¾'=>'O','ð™¿'=>'P','ðš€'=>'Q','ðš'=>'R','ðš‚'=>'S','ðšƒ'=>'T','ðš„'=>'U','ðš…'=>'V','ðš†'=>'W','ðš‡'=>'X','ðšˆ'=>'Y','ðš‰'=>'Z','ðšŠ'=>'a','ðš‹'=>'b','ðšŒ'=>'c','ðš'=>'d','ðšŽ'=>'e','ðš'=>'f','ðš'=>'g','ðš‘'=>'h','ðš’'=>'i','ðš“'=>'j','ðš”'=>'k','ðš•'=>'l','ðš–'=>'m','ðš—'=>'n','ðš˜'=>'o','ðš™'=>'p','ðšš'=>'q','ðš›'=>'r','ðšœ'=>'s','ðš'=>'t','ðšž'=>'u','ðšŸ'=>'v','ðš '=>'w','ðš¡'=>'x','ðš¢'=>'y','ðš£'=>'z','ðš¤'=>'ı','ðš¥'=>'È·','ðš¨'=>'Α','ðš©'=>'Î’','ðšª'=>'Γ','ðš«'=>'Δ','ðš¬'=>'Ε','ðš'=>'Ζ','ðš®'=>'Η','ðš¯'=>'Θ','ðš°'=>'Ι','ðš±'=>'Κ','ðš²'=>'Λ','ðš³'=>'Μ','ðš´'=>'Î','ðšµ'=>'Ξ','ðš¶'=>'Ο','ðš·'=>'Π','ðš¸'=>'Ρ','ðš¹'=>'Θ','ðšº'=>'Σ','ðš»'=>'Τ','ðš¼'=>'Î¥','ðš½'=>'Φ','ðš¾'=>'Χ','ðš¿'=>'Ψ','ð›€'=>'Ω','ð›'=>'∇','ð›‚'=>'α','ð›ƒ'=>'β','ð›„'=>'γ','ð›…'=>'δ','ð›†'=>'ε','ð›‡'=>'ζ','ð›ˆ'=>'η','ð›‰'=>'θ','ð›Š'=>'ι','ð›‹'=>'κ','ð›Œ'=>'λ','ð›'=>'μ','ð›Ž'=>'ν','ð›'=>'ξ','ð›'=>'ο','ð›‘'=>'Ï€','ð›’'=>'Ï','ð›“'=>'Ï‚','ð›”'=>'σ','ð›•'=>'Ï„','ð›–'=>'Ï…','ð›—'=>'φ','ð›˜'=>'χ','ð›™'=>'ψ','ð›š'=>'ω','ð››'=>'∂','ð›œ'=>'ε','ð›'=>'θ','ð›ž'=>'κ','ð›Ÿ'=>'φ','ð› '=>'Ï','ð›¡'=>'Ï€','ð›¢'=>'Α','ð›£'=>'Î’','ð›¤'=>'Γ','ð›¥'=>'Δ','ð›¦'=>'Ε','ð›§'=>'Ζ','ð›¨'=>'Η','ð›©'=>'Θ','ð›ª'=>'Ι','ð›«'=>'Κ','ð›¬'=>'Λ','ð›'=>'Μ','ð›®'=>'Î','ð›¯'=>'Ξ','ð›°'=>'Ο','ð›±'=>'Π','ð›²'=>'Ρ','ð›³'=>'Θ','ð›´'=>'Σ','ð›µ'=>'Τ','ð›¶'=>'Î¥','ð›·'=>'Φ','ð›¸'=>'Χ','ð›¹'=>'Ψ','ð›º'=>'Ω','ð›»'=>'∇','ð›¼'=>'α','ð›½'=>'β','ð›¾'=>'γ','ð›¿'=>'δ','ðœ€'=>'ε','ðœ'=>'ζ','ðœ‚'=>'η','ðœƒ'=>'θ','ðœ„'=>'ι','ðœ…'=>'κ','ðœ†'=>'λ','ðœ‡'=>'μ','ðœˆ'=>'ν','ðœ‰'=>'ξ','ðœŠ'=>'ο','ðœ‹'=>'Ï€','ðœŒ'=>'Ï','ðœ'=>'Ï‚','ðœŽ'=>'σ','ðœ'=>'Ï„','ðœ'=>'Ï…','ðœ‘'=>'φ','ðœ’'=>'χ','ðœ“'=>'ψ','ðœ”'=>'ω','ðœ•'=>'∂','ðœ–'=>'ε','ðœ—'=>'θ','ðœ˜'=>'κ','ðœ™'=>'φ','ðœš'=>'Ï','ðœ›'=>'Ï€','ðœœ'=>'Α','ðœ'=>'Î’','ðœž'=>'Γ','ðœŸ'=>'Δ','ðœ '=>'Ε','ðœ¡'=>'Ζ','ðœ¢'=>'Η','ðœ£'=>'Θ','ðœ¤'=>'Ι','ðœ¥'=>'Κ','ðœ¦'=>'Λ','ðœ§'=>'Μ','ðœ¨'=>'Î','ðœ©'=>'Ξ','ðœª'=>'Ο','ðœ«'=>'Π','ðœ¬'=>'Ρ','ðœ'=>'Θ','ðœ®'=>'Σ','ðœ¯'=>'Τ','ðœ°'=>'Î¥','ðœ±'=>'Φ','ðœ²'=>'Χ','ðœ³'=>'Ψ','ðœ´'=>'Ω','ðœµ'=>'∇','ðœ¶'=>'α','ðœ·'=>'β','ðœ¸'=>'γ','ðœ¹'=>'δ','ðœº'=>'ε','ðœ»'=>'ζ','ðœ¼'=>'η','ðœ½'=>'θ','ðœ¾'=>'ι','ðœ¿'=>'κ','ð€'=>'λ','ð'=>'μ','ð‚'=>'ν','ðƒ'=>'ξ','ð„'=>'ο','ð…'=>'Ï€','ð†'=>'Ï','ð‡'=>'Ï‚','ðˆ'=>'σ','ð‰'=>'Ï„','ðŠ'=>'Ï…','ð‹'=>'φ','ðŒ'=>'χ','ð'=>'ψ','ðŽ'=>'ω','ð'=>'∂','ð'=>'ε','ð‘'=>'θ','ð’'=>'κ','ð“'=>'φ','ð”'=>'Ï','ð•'=>'Ï€','ð–'=>'Α','ð—'=>'Î’','ð˜'=>'Γ','ð™'=>'Δ','ðš'=>'Ε','ð›'=>'Ζ','ðœ'=>'Η','ð'=>'Θ','ðž'=>'Ι','ðŸ'=>'Κ','ð '=>'Λ','ð¡'=>'Μ','ð¢'=>'Î','ð£'=>'Ξ','ð¤'=>'Ο','ð¥'=>'Π','ð¦'=>'Ρ','ð§'=>'Θ','ð¨'=>'Σ','ð©'=>'Τ','ðª'=>'Î¥','ð«'=>'Φ','ð¬'=>'Χ','ð'=>'Ψ','ð®'=>'Ω','ð¯'=>'∇','ð°'=>'α','ð±'=>'β','ð²'=>'γ','ð³'=>'δ','ð´'=>'ε','ðµ'=>'ζ','ð¶'=>'η','ð·'=>'θ','ð¸'=>'ι','ð¹'=>'κ','ðº'=>'λ','ð»'=>'μ','ð¼'=>'ν','ð½'=>'ξ','ð¾'=>'ο','ð¿'=>'Ï€','ðž€'=>'Ï','ðž'=>'Ï‚','ðž‚'=>'σ','ðžƒ'=>'Ï„','ðž„'=>'Ï…','ðž…'=>'φ','ðž†'=>'χ','ðž‡'=>'ψ','ðžˆ'=>'ω','ðž‰'=>'∂','ðžŠ'=>'ε','ðž‹'=>'θ','ðžŒ'=>'κ','ðž'=>'φ','ðžŽ'=>'Ï','ðž'=>'Ï€','ðž'=>'Α','ðž‘'=>'Î’','ðž’'=>'Γ','ðž“'=>'Δ','ðž”'=>'Ε','ðž•'=>'Ζ','ðž–'=>'Η','ðž—'=>'Θ','ðž˜'=>'Ι','ðž™'=>'Κ','ðžš'=>'Λ','ðž›'=>'Μ','ðžœ'=>'Î','ðž'=>'Ξ','ðžž'=>'Ο','ðžŸ'=>'Π','ðž '=>'Ρ','ðž¡'=>'Θ','ðž¢'=>'Σ','ðž£'=>'Τ','ðž¤'=>'Î¥','ðž¥'=>'Φ','ðž¦'=>'Χ','ðž§'=>'Ψ','ðž¨'=>'Ω','ðž©'=>'∇','ðžª'=>'α','ðž«'=>'β','ðž¬'=>'γ','ðž'=>'δ','ðž®'=>'ε','ðž¯'=>'ζ','ðž°'=>'η','ðž±'=>'θ','ðž²'=>'ι','ðž³'=>'κ','ðž´'=>'λ','ðžµ'=>'μ','ðž¶'=>'ν','ðž·'=>'ξ','ðž¸'=>'ο','ðž¹'=>'Ï€','ðžº'=>'Ï','ðž»'=>'Ï‚','ðž¼'=>'σ','ðž½'=>'Ï„','ðž¾'=>'Ï…','ðž¿'=>'φ','ðŸ€'=>'χ','ðŸ'=>'ψ','ðŸ‚'=>'ω','ðŸƒ'=>'∂','ðŸ„'=>'ε','ðŸ…'=>'θ','ðŸ†'=>'κ','ðŸ‡'=>'φ','ðŸˆ'=>'Ï','ðŸ‰'=>'Ï€','ðŸŠ'=>'Ïœ','ðŸ‹'=>'Ï','ðŸŽ'=>'0','ðŸ'=>'1','ðŸ'=>'2','ðŸ‘'=>'3','ðŸ’'=>'4','ðŸ“'=>'5','ðŸ”'=>'6','ðŸ•'=>'7','ðŸ–'=>'8','ðŸ—'=>'9','ðŸ˜'=>'0','ðŸ™'=>'1','ðŸš'=>'2','ðŸ›'=>'3','ðŸœ'=>'4','ðŸ'=>'5','ðŸž'=>'6','ðŸŸ'=>'7','ðŸ '=>'8','ðŸ¡'=>'9','ðŸ¢'=>'0','ðŸ£'=>'1','ðŸ¤'=>'2','ðŸ¥'=>'3','ðŸ¦'=>'4','ðŸ§'=>'5','ðŸ¨'=>'6','ðŸ©'=>'7','ðŸª'=>'8','ðŸ«'=>'9','ðŸ¬'=>'0','ðŸ'=>'1','ðŸ®'=>'2','ðŸ¯'=>'3','ðŸ°'=>'4','ðŸ±'=>'5','ðŸ²'=>'6','ðŸ³'=>'7','ðŸ´'=>'8','ðŸµ'=>'9','ðŸ¶'=>'0','ðŸ·'=>'1','ðŸ¸'=>'2','ðŸ¹'=>'3','ðŸº'=>'4','ðŸ»'=>'5','ðŸ¼'=>'6','ðŸ½'=>'7','ðŸ¾'=>'8','ðŸ¿'=>'9','丽'=>'丽','ð¯ '=>'丸','乁'=>'ä¹','𠄢'=>'ð „¢','你'=>'ä½ ','侮'=>'ä¾®','侻'=>'ä¾»','倂'=>'倂','偺'=>'åº','備'=>'å‚™','僧'=>'僧','像'=>'åƒ','㒞'=>'ã’ž','ð¯ '=>'𠘺','免'=>'å…','ð¯ '=>'å…”','ð¯ '=>'å…¤','具'=>'å…·','𠔜'=>'𠔜','㒹'=>'ã’¹','內'=>'å…§','再'=>'å†','𠕋'=>'ð •‹','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','ð¯ '=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'å‰','ð¯ '=>'å‘','博'=>'åš','即'=>'å³','卽'=>'å½','卿'=>'å¿','卿'=>'å¿','卿'=>'å¿','𠨬'=>'𠨬','灰'=>'ç°','及'=>'åŠ','叟'=>'åŸ','𠭣'=>'ð £','叫'=>'å«','叱'=>'å±','吆'=>'å†','咞'=>'å’ž','吸'=>'å¸','呈'=>'呈','周'=>'周','咢'=>'å’¢','ð¯¡'=>'å“¶','唐'=>'å”','啓'=>'å•“','啣'=>'å•£','善'=>'å–„','善'=>'å–„','喙'=>'å–™','喫'=>'å–«','喳'=>'å–³','嗂'=>'å—‚','圖'=>'圖','嘆'=>'嘆','ð¯¡'=>'圗','噑'=>'噑','ð¯¡'=>'å™´','ð¯¡'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'å ','型'=>'åž‹','堲'=>'å ²','報'=>'å ±','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','ð¯¡'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'ã›®','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','ð¯¡'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'å°†','当'=>'当','尢'=>'å°¢','㞁'=>'ãž','屠'=>'å± ','屮'=>'å±®','峀'=>'å³€','岍'=>'å²','𡷤'=>'ð¡·¤','嵃'=>'嵃','𡷦'=>'ð¡·¦','嵮'=>'åµ®','嵫'=>'嵫','嵼'=>'åµ¼','ð¯¢'=>'å·¡','巢'=>'å·¢','㠯'=>'ã ¯','巽'=>'å·½','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'ã¡¢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','ð¯¢'=>'庶','廊'=>'廊','ð¯¢'=>'𪎒','ð¯¢'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'èˆ','弢'=>'å¼¢','弢'=>'å¼¢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'å½¢','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','ð¯¢'=>'å¿','志'=>'å¿—','忹'=>'忹','悁'=>'æ‚','㤺'=>'㤺','㤜'=>'㤜','悔'=>'æ‚”','𢛔'=>'𢛔','惇'=>'惇','慈'=>'æ…ˆ','慌'=>'æ…Œ','慎'=>'æ…Ž','慌'=>'æ…Œ','慺'=>'æ…º','憎'=>'憎','憲'=>'憲','ð¯¢'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'æˆ','戛'=>'戛','扝'=>'æ‰','抱'=>'抱','拔'=>'æ‹”','捐'=>'æ','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'æ¨','掃'=>'掃','揤'=>'æ¤','𢯱'=>'𢯱','搢'=>'æ¢','揅'=>'æ…','ð¯£'=>'掩','㨮'=>'㨮','摩'=>'æ‘©','摾'=>'摾','撝'=>'æ’','摷'=>'æ‘·','㩬'=>'㩬','敏'=>'æ•','敬'=>'敬','𣀊'=>'𣀊','旣'=>'æ—£','書'=>'書','ð¯£'=>'晉','㬙'=>'㬙','ð¯£'=>'æš‘','ð¯£'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'æšœ','肭'=>'è‚','䏙'=>'ä™','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'æž','杓'=>'æ“','ð¯£'=>'ð£ƒ','㭉'=>'ã‰','柺'=>'柺','枅'=>'æž…','桒'=>'æ¡’','梅'=>'梅','𣑭'=>'ð£‘','梎'=>'梎','栟'=>'æ Ÿ','椔'=>'椔','㮝'=>'ã®','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','ð¯£'=>'æ«›','㰘'=>'ã°˜','次'=>'次','𣢧'=>'𣢧','歔'=>'æ”','㱎'=>'㱎','歲'=>'æ²','殟'=>'殟','殺'=>'殺','殻'=>'æ®»','𣪍'=>'ð£ª','𡴋'=>'ð¡´‹','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'æ³','汧'=>'æ±§','洖'=>'æ´–','派'=>'æ´¾','ð¯¤'=>'æµ·','流'=>'æµ','浩'=>'浩','浸'=>'浸','涅'=>'æ¶…','𣴞'=>'𣴞','洴'=>'æ´´','港'=>'港','湮'=>'æ¹®','㴳'=>'ã´³','滋'=>'滋','滇'=>'滇','ð¯¤'=>'𣻑','淹'=>'æ·¹','ð¯¤'=>'æ½®','ð¯¤'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'ã¶–','灊'=>'çŠ','災'=>'ç½','灷'=>'ç·','炭'=>'ç‚','𠔥'=>'𠔥','煅'=>'ç……','ð¯¤'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'ç‰','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'çº','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','ð¯¤'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'ç’…','瓊'=>'瓊','㼛'=>'ã¼›','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'ç•°','𢆟'=>'𢆟','瘐'=>'ç˜','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'ð¥„','㿼'=>'㿼','䀈'=>'䀈','直'=>'ç›´','ð¯¥'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'çŠ','䀹'=>'䀹','瞋'=>'çž‹','䁆'=>'ä†','䂖'=>'ä‚–','ð¯¥'=>'ð¥','硎'=>'硎','ð¯¥'=>'碌','ð¯¥'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'ç¦','秫'=>'ç§«','䄯'=>'䄯','穀'=>'ç©€','穊'=>'穊','穏'=>'ç©','𥥼'=>'𥥼','ð¯¥'=>'𥪧','𥪧'=>'𥪧','竮'=>'ç«®','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'ç³’','䊠'=>'䊠','糨'=>'糨','糣'=>'ç³£','紀'=>'ç´€','𥾆'=>'𥾆','絣'=>'çµ£','ð¯¥'=>'äŒ','緇'=>'ç·‡','縂'=>'縂','繅'=>'ç¹…','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'ä™','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'è ','𦖨'=>'𦖨','聰'=>'è°','𣍟'=>'ð£Ÿ','ð¯¦'=>'ä•','育'=>'育','脃'=>'脃','䐋'=>'ä‹','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'èˆ','舄'=>'舄','ð¯¦'=>'辞','䑫'=>'ä‘«','ð¯¦'=>'芑','ð¯¦'=>'芋','芝'=>'èŠ','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'è‹¥','茝'=>'èŒ','荣'=>'è£','莭'=>'èŽ','茣'=>'茣','ð¯¦'=>'莽','菧'=>'è§','著'=>'è‘—','荓'=>'è“','菊'=>'èŠ','菌'=>'èŒ','菜'=>'èœ','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'è”–','𧏊'=>'ð§Š','蕤'=>'蕤','ð¯¦'=>'𦼬','䕝'=>'ä•','䕡'=>'ä•¡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'ä•«','虐'=>'è™','虜'=>'虜','虧'=>'è™§','虩'=>'虩','蚩'=>'èš©','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'è¹','蜨'=>'蜨','蝫'=>'è«','螆'=>'螆','䗗'=>'ä——','蟡'=>'蟡','ð¯§'=>'è ','䗹'=>'ä—¹','衠'=>'è¡ ','衣'=>'è¡£','𧙧'=>'ð§™§','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'ã’»','𧢮'=>'ð§¢®','𧥦'=>'𧥦','ð¯§'=>'äš¾','䛇'=>'䛇','ð¯§'=>'誠','ð¯§'=>'è«','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'è³','贛'=>'è´›','起'=>'èµ·','𧼯'=>'𧼯','𠠄'=>'ð  „','跋'=>'è·‹','趼'=>'è¶¼','跰'=>'è·°','ð¯§'=>'𠣞','軔'=>'è»”','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'ð¨—','邔'=>'é‚”','郱'=>'郱','鄑'=>'é„‘','𨜮'=>'𨜮','鄛'=>'é„›','鈸'=>'鈸','鋗'=>'é‹—','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'é¹','鐕'=>'é•','ð¯§'=>'𨯺','開'=>'é–‹','䦕'=>'䦕','閷'=>'é–·','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'å¶²','霣'=>'霣','𩅅'=>'ð©……','𩈚'=>'𩈚','䩮'=>'ä©®','䩶'=>'ä©¶','韠'=>'韠','𩐊'=>'ð©Š','䪲'=>'䪲','𩒖'=>'ð©’–','頋'=>'é ‹','頋'=>'é ‹','頩'=>'é ©','ð¯¨'=>'ð©–¶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'é§‚','駾'=>'é§¾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'é±€','鳽'=>'é³½','ð¯¨'=>'䳎','䳭'=>'ä³','ð¯¨'=>'éµ§','ð¯¨'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'äµ–','黹'=>'黹','黾'=>'黾','鼅'=>'é¼…','鼏'=>'é¼','鼖'=>'é¼–','鼻'=>'é¼»','ð¯¨'=>'𪘀'); diff --git a/phpBB/includes/utf/data/utf_nfc_qc.php b/phpBB/includes/utf/data/utf_nfc_qc.php deleted file mode 100644 index ff56357ea6..0000000000 --- a/phpBB/includes/utf/data/utf_nfc_qc.php +++ /dev/null @@ -1,2 +0,0 @@ -<?php -$GLOBALS['utf_nfc_qc']=array('Í€'=>1,'Í'=>1,'̓'=>1,'Í„'=>1,'Í´'=>1,';'=>1,'·'=>1,'क़'=>1,'ख़'=>1,'ग़'=>1,'ज़'=>1,'ड़'=>1,'à¥'=>1,'फ़'=>1,'य़'=>1,'à§œ'=>1,'à§'=>1,'à§Ÿ'=>1,'ਲ਼'=>1,'ਸ਼'=>1,'à©™'=>1,'ਗ਼'=>1,'à©›'=>1,'ਫ਼'=>1,'àœ'=>1,'à'=>1,'གྷ'=>1,'à½'=>1,'དྷ'=>1,'བྷ'=>1,'ཛྷ'=>1,'ཀྵ'=>1,'ཱི'=>1,'ཱུ'=>1,'ྲྀ'=>1,'ླྀ'=>1,'à¾'=>1,'ྒྷ'=>1,'à¾'=>1,'ྡྷ'=>1,'ྦྷ'=>1,'ྫྷ'=>1,'ྐྵ'=>1,'á½±'=>1,'á½³'=>1,'á½µ'=>1,'á½·'=>1,'á½¹'=>1,'á½»'=>1,'á½½'=>1,'á¾»'=>1,'á¾¾'=>1,'Έ'=>1,'á¿‹'=>1,'á¿“'=>1,'á¿›'=>1,'á¿£'=>1,'á¿«'=>1,'á¿®'=>1,'`'=>1,'Ό'=>1,'á¿»'=>1,'´'=>1,' '=>1,'â€'=>1,'Ω'=>1,'K'=>1,'â„«'=>1,'〈'=>1,'〉'=>1,'⫝̸'=>1,'豈'=>1,'ï¤'=>1,'車'=>1,'賈'=>1,'滑'=>1,'串'=>1,'句'=>1,'龜'=>1,'龜'=>1,'契'=>1,'金'=>1,'喇'=>1,'奈'=>1,'ï¤'=>1,'癩'=>1,'ï¤'=>1,'ï¤'=>1,'螺'=>1,'裸'=>1,'邏'=>1,'樂'=>1,'洛'=>1,'烙'=>1,'珞'=>1,'落'=>1,'酪'=>1,'駱'=>1,'亂'=>1,'卵'=>1,'ï¤'=>1,'爛'=>1,'蘭'=>1,'鸞'=>1,'嵐'=>1,'濫'=>1,'藍'=>1,'襤'=>1,'拉'=>1,'臘'=>1,'蠟'=>1,'廊'=>1,'朗'=>1,'浪'=>1,'狼'=>1,'郎'=>1,'ï¤'=>1,'冷'=>1,'勞'=>1,'擄'=>1,'櫓'=>1,'爐'=>1,'盧'=>1,'老'=>1,'蘆'=>1,'虜'=>1,'路'=>1,'露'=>1,'魯'=>1,'鷺'=>1,'碌'=>1,'祿'=>1,'綠'=>1,'菉'=>1,'錄'=>1,'鹿'=>1,'ï¥'=>1,'壟'=>1,'弄'=>1,'籠'=>1,'聾'=>1,'牢'=>1,'磊'=>1,'賂'=>1,'雷'=>1,'壘'=>1,'屢'=>1,'樓'=>1,'ï¥'=>1,'漏'=>1,'ï¥'=>1,'ï¥'=>1,'陋'=>1,'勒'=>1,'肋'=>1,'凜'=>1,'凌'=>1,'稜'=>1,'綾'=>1,'菱'=>1,'陵'=>1,'讀'=>1,'拏'=>1,'樂'=>1,'ï¥'=>1,'丹'=>1,'寧'=>1,'怒'=>1,'率'=>1,'異'=>1,'北'=>1,'磻'=>1,'便'=>1,'復'=>1,'不'=>1,'泌'=>1,'數'=>1,'索'=>1,'參'=>1,'塞'=>1,'ï¥'=>1,'葉'=>1,'說'=>1,'殺'=>1,'辰'=>1,'沈'=>1,'拾'=>1,'若'=>1,'掠'=>1,'略'=>1,'亮'=>1,'兩'=>1,'凉'=>1,'梁'=>1,'糧'=>1,'良'=>1,'諒'=>1,'量'=>1,'勵'=>1,'呂'=>1,'ï¦'=>1,'廬'=>1,'旅'=>1,'濾'=>1,'礪'=>1,'閭'=>1,'驪'=>1,'麗'=>1,'黎'=>1,'力'=>1,'曆'=>1,'歷'=>1,'ï¦'=>1,'年'=>1,'ï¦'=>1,'ï¦'=>1,'撚'=>1,'漣'=>1,'煉'=>1,'璉'=>1,'秊'=>1,'練'=>1,'聯'=>1,'輦'=>1,'蓮'=>1,'連'=>1,'鍊'=>1,'列'=>1,'ï¦'=>1,'咽'=>1,'烈'=>1,'裂'=>1,'說'=>1,'廉'=>1,'念'=>1,'捻'=>1,'殮'=>1,'簾'=>1,'獵'=>1,'令'=>1,'囹'=>1,'寧'=>1,'嶺'=>1,'怜'=>1,'ï¦'=>1,'瑩'=>1,'羚'=>1,'聆'=>1,'鈴'=>1,'零'=>1,'靈'=>1,'領'=>1,'例'=>1,'禮'=>1,'醴'=>1,'隸'=>1,'惡'=>1,'了'=>1,'僚'=>1,'寮'=>1,'尿'=>1,'料'=>1,'樂'=>1,'ï§€'=>1,'ï§'=>1,'ï§‚'=>1,'遼'=>1,'ï§„'=>1,'ï§…'=>1,'阮'=>1,'劉'=>1,'杻'=>1,'柳'=>1,'ï§Š'=>1,'ï§‹'=>1,'ï§Œ'=>1,'ï§'=>1,'ï§Ž'=>1,'ï§'=>1,'ï§'=>1,'ï§‘'=>1,'ï§’'=>1,'ï§“'=>1,'ï§”'=>1,'ï§•'=>1,'ï§–'=>1,'ï§—'=>1,'律'=>1,'ï§™'=>1,'ï§š'=>1,'ï§›'=>1,'ï§œ'=>1,'ï§'=>1,'ï§ž'=>1,'ï§Ÿ'=>1,'ï§ '=>1,'ï§¡'=>1,'ï§¢'=>1,'ï§£'=>1,'理'=>1,'ï§¥'=>1,'罹'=>1,'ï§§'=>1,'裡'=>1,'ï§©'=>1,'離'=>1,'ï§«'=>1,'溺'=>1,'ï§'=>1,'ï§®'=>1,'璘'=>1,'ï§°'=>1,'ï§±'=>1,'ï§²'=>1,'ï§³'=>1,'ï§´'=>1,'ï§µ'=>1,'ï§¶'=>1,'ï§·'=>1,'笠'=>1,'ï§¹'=>1,'狀'=>1,'ï§»'=>1,'ï§¼'=>1,'ï§½'=>1,'ï§¾'=>1,'ï§¿'=>1,'切'=>1,'ï¨'=>1,'拓'=>1,'糖'=>1,'宅'=>1,'洞'=>1,'暴'=>1,'輻'=>1,'行'=>1,'降'=>1,'見'=>1,'廓'=>1,'兀'=>1,'ï¨'=>1,'ï¨'=>1,'晴'=>1,'凞'=>1,'猪'=>1,'益'=>1,'礼'=>1,'神'=>1,'祥'=>1,'福'=>1,'靖'=>1,'ï¨'=>1,'羽'=>1,'蘒'=>1,'諸'=>1,'逸'=>1,'都'=>1,'飯'=>1,'飼'=>1,'館'=>1,'ï¨'=>1,'侮'=>1,'僧'=>1,'免'=>1,'勉'=>1,'勤'=>1,'卑'=>1,'喝'=>1,'嘆'=>1,'器'=>1,'塀'=>1,'墨'=>1,'層'=>1,'屮'=>1,'悔'=>1,'慨'=>1,'憎'=>1,'ï©€'=>1,'ï©'=>1,'ï©‚'=>1,'暑'=>1,'ï©„'=>1,'ï©…'=>1,'渚'=>1,'漢'=>1,'煮'=>1,'爫'=>1,'琢'=>1,'ï©‹'=>1,'社'=>1,'ï©'=>1,'祈'=>1,'ï©'=>1,'ï©'=>1,'ï©‘'=>1,'ï©’'=>1,'ï©“'=>1,'ï©”'=>1,'ï©•'=>1,'ï©–'=>1,'ï©—'=>1,'縉'=>1,'ï©™'=>1,'署'=>1,'ï©›'=>1,'臭'=>1,'ï©'=>1,'艹'=>1,'著'=>1,'ï© '=>1,'ï©¡'=>1,'ï©¢'=>1,'ï©£'=>1,'賓'=>1,'ï©¥'=>1,'辶'=>1,'ï©§'=>1,'難'=>1,'ï©©'=>1,'頻'=>1,'ï©°'=>1,'况'=>1,'全'=>1,'侀'=>1,'ï©´'=>1,'冀'=>1,'ï©¶'=>1,'ï©·'=>1,'喝'=>1,'啕'=>1,'喙'=>1,'ï©»'=>1,'塚'=>1,'墳'=>1,'奄'=>1,'ï©¿'=>1,'婢'=>1,'ïª'=>1,'廒'=>1,'廙'=>1,'彩'=>1,'徭'=>1,'惘'=>1,'慎'=>1,'愈'=>1,'憎'=>1,'慠'=>1,'懲'=>1,'戴'=>1,'ïª'=>1,'搜'=>1,'ïª'=>1,'ïª'=>1,'晴'=>1,'朗'=>1,'望'=>1,'杖'=>1,'歹'=>1,'殺'=>1,'流'=>1,'滛'=>1,'滋'=>1,'漢'=>1,'瀞'=>1,'煮'=>1,'ïª'=>1,'爵'=>1,'犯'=>1,'猪'=>1,'瑱'=>1,'甆'=>1,'画'=>1,'瘝'=>1,'瘟'=>1,'益'=>1,'盛'=>1,'直'=>1,'睊'=>1,'着'=>1,'磌'=>1,'窱'=>1,'ïª'=>1,'类'=>1,'絛'=>1,'練'=>1,'缾'=>1,'者'=>1,'荒'=>1,'華'=>1,'蝹'=>1,'襁'=>1,'覆'=>1,'視'=>1,'調'=>1,'諸'=>1,'請'=>1,'謁'=>1,'諾'=>1,'諭'=>1,'謹'=>1,'ï«€'=>1,'ï«'=>1,'ï«‚'=>1,'遲'=>1,'ï«„'=>1,'ï«…'=>1,'陼'=>1,'難'=>1,'靖'=>1,'韛'=>1,'響'=>1,'ï«‹'=>1,'頻'=>1,'ï«'=>1,'龜'=>1,'ï«'=>1,'ï«'=>1,'ï«‘'=>1,'ï«’'=>1,'ï«“'=>1,'ï«”'=>1,'ï«•'=>1,'ï«–'=>1,'ï«—'=>1,'齃'=>1,'ï«™'=>1,'ï¬'=>1,'ײַ'=>1,'שׁ'=>1,'שׂ'=>1,'שּׁ'=>1,'ï¬'=>1,'אַ'=>1,'אָ'=>1,'אּ'=>1,'בּ'=>1,'גּ'=>1,'דּ'=>1,'הּ'=>1,'וּ'=>1,'זּ'=>1,'טּ'=>1,'יּ'=>1,'ךּ'=>1,'כּ'=>1,'לּ'=>1,'מּ'=>1,'ï€'=>1,'ï'=>1,'ïƒ'=>1,'ï„'=>1,'ï†'=>1,'ï‡'=>1,'ïˆ'=>1,'ï‰'=>1,'ïŠ'=>1,'ï‹'=>1,'ïŒ'=>1,'ï'=>1,'ïŽ'=>1,'ð…ž'=>1,'ð…Ÿ'=>1,'ð… '=>1,'ð…¡'=>1,'ð…¢'=>1,'ð…£'=>1,'ð…¤'=>1,'ð†»'=>1,'ð†¼'=>1,'ð†½'=>1,'ð†¾'=>1,'ð†¿'=>1,'ð‡€'=>1,'丽'=>1,'ð¯ '=>1,'乁'=>1,'𠄢'=>1,'你'=>1,'侮'=>1,'侻'=>1,'倂'=>1,'偺'=>1,'備'=>1,'僧'=>1,'像'=>1,'㒞'=>1,'ð¯ '=>1,'免'=>1,'ð¯ '=>1,'ð¯ '=>1,'具'=>1,'𠔜'=>1,'㒹'=>1,'內'=>1,'再'=>1,'𠕋'=>1,'冗'=>1,'冤'=>1,'仌'=>1,'冬'=>1,'况'=>1,'𩇟'=>1,'ð¯ '=>1,'刃'=>1,'㓟'=>1,'刻'=>1,'剆'=>1,'割'=>1,'剷'=>1,'㔕'=>1,'勇'=>1,'勉'=>1,'勤'=>1,'勺'=>1,'包'=>1,'匆'=>1,'北'=>1,'卉'=>1,'ð¯ '=>1,'博'=>1,'即'=>1,'卽'=>1,'卿'=>1,'卿'=>1,'卿'=>1,'𠨬'=>1,'灰'=>1,'及'=>1,'叟'=>1,'𠭣'=>1,'叫'=>1,'叱'=>1,'吆'=>1,'咞'=>1,'吸'=>1,'呈'=>1,'周'=>1,'咢'=>1,'ð¯¡'=>1,'唐'=>1,'啓'=>1,'啣'=>1,'善'=>1,'善'=>1,'喙'=>1,'喫'=>1,'喳'=>1,'嗂'=>1,'圖'=>1,'嘆'=>1,'ð¯¡'=>1,'噑'=>1,'ð¯¡'=>1,'ð¯¡'=>1,'壮'=>1,'城'=>1,'埴'=>1,'堍'=>1,'型'=>1,'堲'=>1,'報'=>1,'墬'=>1,'𡓤'=>1,'売'=>1,'壷'=>1,'夆'=>1,'ð¯¡'=>1,'夢'=>1,'奢'=>1,'𡚨'=>1,'𡛪'=>1,'姬'=>1,'娛'=>1,'娧'=>1,'姘'=>1,'婦'=>1,'㛮'=>1,'㛼'=>1,'嬈'=>1,'嬾'=>1,'嬾'=>1,'𡧈'=>1,'ð¯¡'=>1,'寘'=>1,'寧'=>1,'寳'=>1,'𡬘'=>1,'寿'=>1,'将'=>1,'当'=>1,'尢'=>1,'㞁'=>1,'屠'=>1,'屮'=>1,'峀'=>1,'岍'=>1,'𡷤'=>1,'嵃'=>1,'𡷦'=>1,'嵮'=>1,'嵫'=>1,'嵼'=>1,'ð¯¢'=>1,'巢'=>1,'㠯'=>1,'巽'=>1,'帨'=>1,'帽'=>1,'幩'=>1,'㡢'=>1,'𢆃'=>1,'㡼'=>1,'庰'=>1,'庳'=>1,'ð¯¢'=>1,'廊'=>1,'ð¯¢'=>1,'ð¯¢'=>1,'𢌱'=>1,'𢌱'=>1,'舁'=>1,'弢'=>1,'弢'=>1,'㣇'=>1,'𣊸'=>1,'𦇚'=>1,'形'=>1,'彫'=>1,'㣣'=>1,'徚'=>1,'ð¯¢'=>1,'志'=>1,'忹'=>1,'悁'=>1,'㤺'=>1,'㤜'=>1,'悔'=>1,'𢛔'=>1,'惇'=>1,'慈'=>1,'慌'=>1,'慎'=>1,'慌'=>1,'慺'=>1,'憎'=>1,'憲'=>1,'ð¯¢'=>1,'憯'=>1,'懞'=>1,'懲'=>1,'懶'=>1,'成'=>1,'戛'=>1,'扝'=>1,'抱'=>1,'拔'=>1,'捐'=>1,'𢬌'=>1,'挽'=>1,'拼'=>1,'捨'=>1,'掃'=>1,'揤'=>1,'𢯱'=>1,'搢'=>1,'揅'=>1,'ð¯£'=>1,'㨮'=>1,'摩'=>1,'摾'=>1,'撝'=>1,'摷'=>1,'㩬'=>1,'敏'=>1,'敬'=>1,'𣀊'=>1,'旣'=>1,'書'=>1,'ð¯£'=>1,'㬙'=>1,'ð¯£'=>1,'ð¯£'=>1,'㫤'=>1,'冒'=>1,'冕'=>1,'最'=>1,'暜'=>1,'肭'=>1,'䏙'=>1,'朗'=>1,'望'=>1,'朡'=>1,'杞'=>1,'杓'=>1,'ð¯£'=>1,'㭉'=>1,'柺'=>1,'枅'=>1,'桒'=>1,'梅'=>1,'𣑭'=>1,'梎'=>1,'栟'=>1,'椔'=>1,'㮝'=>1,'楂'=>1,'榣'=>1,'槪'=>1,'檨'=>1,'𣚣'=>1,'ð¯£'=>1,'㰘'=>1,'次'=>1,'𣢧'=>1,'歔'=>1,'㱎'=>1,'歲'=>1,'殟'=>1,'殺'=>1,'殻'=>1,'𣪍'=>1,'𡴋'=>1,'𣫺'=>1,'汎'=>1,'𣲼'=>1,'沿'=>1,'泍'=>1,'汧'=>1,'洖'=>1,'派'=>1,'ð¯¤'=>1,'流'=>1,'浩'=>1,'浸'=>1,'涅'=>1,'𣴞'=>1,'洴'=>1,'港'=>1,'湮'=>1,'㴳'=>1,'滋'=>1,'滇'=>1,'ð¯¤'=>1,'淹'=>1,'ð¯¤'=>1,'ð¯¤'=>1,'𣾎'=>1,'濆'=>1,'瀹'=>1,'瀞'=>1,'瀛'=>1,'㶖'=>1,'灊'=>1,'災'=>1,'灷'=>1,'炭'=>1,'𠔥'=>1,'煅'=>1,'ð¯¤'=>1,'熜'=>1,'𤎫'=>1,'爨'=>1,'爵'=>1,'牐'=>1,'𤘈'=>1,'犀'=>1,'犕'=>1,'𤜵'=>1,'𤠔'=>1,'獺'=>1,'王'=>1,'㺬'=>1,'玥'=>1,'㺸'=>1,'ð¯¤'=>1,'瑇'=>1,'瑜'=>1,'瑱'=>1,'璅'=>1,'瓊'=>1,'㼛'=>1,'甤'=>1,'𤰶'=>1,'甾'=>1,'𤲒'=>1,'異'=>1,'𢆟'=>1,'瘐'=>1,'𤾡'=>1,'𤾸'=>1,'𥁄'=>1,'㿼'=>1,'䀈'=>1,'直'=>1,'ð¯¥'=>1,'𥃲'=>1,'𥄙'=>1,'𥄳'=>1,'眞'=>1,'真'=>1,'真'=>1,'睊'=>1,'䀹'=>1,'瞋'=>1,'䁆'=>1,'䂖'=>1,'ð¯¥'=>1,'硎'=>1,'ð¯¥'=>1,'ð¯¥'=>1,'䃣'=>1,'𥘦'=>1,'祖'=>1,'𥚚'=>1,'𥛅'=>1,'福'=>1,'秫'=>1,'䄯'=>1,'穀'=>1,'穊'=>1,'穏'=>1,'𥥼'=>1,'ð¯¥'=>1,'𥪧'=>1,'竮'=>1,'䈂'=>1,'𥮫'=>1,'篆'=>1,'築'=>1,'䈧'=>1,'𥲀'=>1,'糒'=>1,'䊠'=>1,'糨'=>1,'糣'=>1,'紀'=>1,'𥾆'=>1,'絣'=>1,'ð¯¥'=>1,'緇'=>1,'縂'=>1,'繅'=>1,'䌴'=>1,'𦈨'=>1,'𦉇'=>1,'䍙'=>1,'𦋙'=>1,'罺'=>1,'𦌾'=>1,'羕'=>1,'翺'=>1,'者'=>1,'𦓚'=>1,'𦔣'=>1,'聠'=>1,'𦖨'=>1,'聰'=>1,'𣍟'=>1,'ð¯¦'=>1,'育'=>1,'脃'=>1,'䐋'=>1,'脾'=>1,'媵'=>1,'𦞧'=>1,'𦞵'=>1,'𣎓'=>1,'𣎜'=>1,'舁'=>1,'舄'=>1,'ð¯¦'=>1,'䑫'=>1,'ð¯¦'=>1,'ð¯¦'=>1,'芝'=>1,'劳'=>1,'花'=>1,'芳'=>1,'芽'=>1,'苦'=>1,'𦬼'=>1,'若'=>1,'茝'=>1,'荣'=>1,'莭'=>1,'茣'=>1,'ð¯¦'=>1,'菧'=>1,'著'=>1,'荓'=>1,'菊'=>1,'菌'=>1,'菜'=>1,'𦰶'=>1,'𦵫'=>1,'𦳕'=>1,'䔫'=>1,'蓱'=>1,'蓳'=>1,'蔖'=>1,'𧏊'=>1,'蕤'=>1,'ð¯¦'=>1,'䕝'=>1,'䕡'=>1,'𦾱'=>1,'𧃒'=>1,'䕫'=>1,'虐'=>1,'虜'=>1,'虧'=>1,'虩'=>1,'蚩'=>1,'蚈'=>1,'蜎'=>1,'蛢'=>1,'蝹'=>1,'蜨'=>1,'蝫'=>1,'螆'=>1,'䗗'=>1,'蟡'=>1,'ð¯§'=>1,'䗹'=>1,'衠'=>1,'衣'=>1,'𧙧'=>1,'裗'=>1,'裞'=>1,'䘵'=>1,'裺'=>1,'㒻'=>1,'𧢮'=>1,'𧥦'=>1,'ð¯§'=>1,'䛇'=>1,'ð¯§'=>1,'ð¯§'=>1,'變'=>1,'豕'=>1,'𧲨'=>1,'貫'=>1,'賁'=>1,'贛'=>1,'起'=>1,'𧼯'=>1,'𠠄'=>1,'跋'=>1,'趼'=>1,'跰'=>1,'ð¯§'=>1,'軔'=>1,'輸'=>1,'𨗒'=>1,'𨗭'=>1,'邔'=>1,'郱'=>1,'鄑'=>1,'𨜮'=>1,'鄛'=>1,'鈸'=>1,'鋗'=>1,'鋘'=>1,'鉼'=>1,'鏹'=>1,'鐕'=>1,'ð¯§'=>1,'開'=>1,'䦕'=>1,'閷'=>1,'𨵷'=>1,'䧦'=>1,'雃'=>1,'嶲'=>1,'霣'=>1,'𩅅'=>1,'𩈚'=>1,'䩮'=>1,'䩶'=>1,'韠'=>1,'𩐊'=>1,'䪲'=>1,'𩒖'=>1,'頋'=>1,'頋'=>1,'頩'=>1,'ð¯¨'=>1,'飢'=>1,'䬳'=>1,'餩'=>1,'馧'=>1,'駂'=>1,'駾'=>1,'䯎'=>1,'𩬰'=>1,'鬒'=>1,'鱀'=>1,'鳽'=>1,'ð¯¨'=>1,'䳭'=>1,'ð¯¨'=>1,'ð¯¨'=>1,'䳸'=>1,'𪄅'=>1,'𪈎'=>1,'𪊑'=>1,'麻'=>1,'䵖'=>1,'黹'=>1,'黾'=>1,'鼅'=>1,'鼏'=>1,'鼖'=>1,'鼻'=>1,'ð¯¨'=>1,'Ì€'=>0,'Ì'=>0,'Ì‚'=>0,'̃'=>0,'Ì„'=>0,'̆'=>0,'̇'=>0,'̈'=>0,'̉'=>0,'ÌŠ'=>0,'Ì‹'=>0,'ÌŒ'=>0,'Ì'=>0,'Ì‘'=>0,'Ì“'=>0,'Ì”'=>0,'Ì›'=>0,'Ì£'=>0,'̤'=>0,'Ì¥'=>0,'̦'=>0,'̧'=>0,'̨'=>0,'Ì'=>0,'Ì®'=>0,'̰'=>0,'̱'=>0,'̸'=>0,'Í‚'=>0,'Í…'=>0,'Ù“'=>0,'Ù”'=>0,'Ù•'=>0,'़'=>0,'া'=>0,'à§—'=>0,'ା'=>0,'à–'=>0,'à—'=>0,'ா'=>0,'ௗ'=>0,'à±–'=>0,'ೂ'=>0,'ೕ'=>0,'à³–'=>0,'à´¾'=>0,'ൗ'=>0,'à·Š'=>0,'à·'=>0,'à·Ÿ'=>0,'ီ'=>0,'á…¡'=>0,'á…¢'=>0,'á…£'=>0,'á…¤'=>0,'á…¥'=>0,'á…¦'=>0,'á…§'=>0,'á…¨'=>0,'á…©'=>0,'á…ª'=>0,'á…«'=>0,'á…¬'=>0,'á…'=>0,'á…®'=>0,'á…¯'=>0,'á…°'=>0,'á…±'=>0,'á…²'=>0,'á…³'=>0,'á…´'=>0,'á…µ'=>0,'ᆨ'=>0,'ᆩ'=>0,'ᆪ'=>0,'ᆫ'=>0,'ᆬ'=>0,'á†'=>0,'ᆮ'=>0,'ᆯ'=>0,'ᆰ'=>0,'ᆱ'=>0,'ᆲ'=>0,'ᆳ'=>0,'ᆴ'=>0,'ᆵ'=>0,'ᆶ'=>0,'ᆷ'=>0,'ᆸ'=>0,'ᆹ'=>0,'ᆺ'=>0,'ᆻ'=>0,'ᆼ'=>0,'ᆽ'=>0,'ᆾ'=>0,'ᆿ'=>0,'ᇀ'=>0,'á‡'=>0,'ᇂ'=>0,'ᬵ'=>0,'ã‚™'=>0,'゚'=>0); diff --git a/phpBB/includes/utf/data/utf_nfkc_qc.php b/phpBB/includes/utf/data/utf_nfkc_qc.php deleted file mode 100644 index 181a07b351..0000000000 --- a/phpBB/includes/utf/data/utf_nfkc_qc.php +++ /dev/null @@ -1,2 +0,0 @@ -<?php -$GLOBALS['utf_nfkc_qc']=array(' '=>1,'¨'=>1,'ª'=>1,'¯'=>1,'²'=>1,'³'=>1,'´'=>1,'µ'=>1,'¸'=>1,'¹'=>1,'º'=>1,'¼'=>1,'½'=>1,'¾'=>1,'IJ'=>1,'ij'=>1,'Ä¿'=>1,'Å€'=>1,'ʼn'=>1,'Å¿'=>1,'Ç„'=>1,'Ç…'=>1,'dž'=>1,'LJ'=>1,'Lj'=>1,'lj'=>1,'ÇŠ'=>1,'Ç‹'=>1,'ÇŒ'=>1,'DZ'=>1,'Dz'=>1,'dz'=>1,'ʰ'=>1,'ʱ'=>1,'ʲ'=>1,'ʳ'=>1,'Ê´'=>1,'ʵ'=>1,'ʶ'=>1,'Ê·'=>1,'ʸ'=>1,'˘'=>1,'Ë™'=>1,'Ëš'=>1,'Ë›'=>1,'Ëœ'=>1,'Ë'=>1,'Ë '=>1,'Ë¡'=>1,'Ë¢'=>1,'Ë£'=>1,'ˤ'=>1,'Í€'=>1,'Í'=>1,'̓'=>1,'Í„'=>1,'Í´'=>1,'ͺ'=>1,';'=>1,'΄'=>1,'Î…'=>1,'·'=>1,'Ï'=>1,'Ï‘'=>1,'Ï’'=>1,'Ï“'=>1,'Ï”'=>1,'Ï•'=>1,'Ï–'=>1,'ϰ'=>1,'ϱ'=>1,'ϲ'=>1,'Ï´'=>1,'ϵ'=>1,'Ϲ'=>1,'Ö‡'=>1,'Ùµ'=>1,'Ù¶'=>1,'Ù·'=>1,'Ù¸'=>1,'क़'=>1,'ख़'=>1,'ग़'=>1,'ज़'=>1,'ड़'=>1,'à¥'=>1,'फ़'=>1,'य़'=>1,'à§œ'=>1,'à§'=>1,'à§Ÿ'=>1,'ਲ਼'=>1,'ਸ਼'=>1,'à©™'=>1,'ਗ਼'=>1,'à©›'=>1,'ਫ਼'=>1,'àœ'=>1,'à'=>1,'ำ'=>1,'ຳ'=>1,'ໜ'=>1,'à»'=>1,'༌'=>1,'གྷ'=>1,'à½'=>1,'དྷ'=>1,'བྷ'=>1,'ཛྷ'=>1,'ཀྵ'=>1,'ཱི'=>1,'ཱུ'=>1,'ྲྀ'=>1,'ཷ'=>1,'ླྀ'=>1,'ཹ'=>1,'à¾'=>1,'ྒྷ'=>1,'à¾'=>1,'ྡྷ'=>1,'ྦྷ'=>1,'ྫྷ'=>1,'ྐྵ'=>1,'ჼ'=>1,'á´¬'=>1,'á´'=>1,'á´®'=>1,'á´°'=>1,'á´±'=>1,'á´²'=>1,'á´³'=>1,'á´´'=>1,'á´µ'=>1,'á´¶'=>1,'á´·'=>1,'á´¸'=>1,'á´¹'=>1,'á´º'=>1,'á´¼'=>1,'á´½'=>1,'á´¾'=>1,'á´¿'=>1,'áµ€'=>1,'áµ'=>1,'ᵂ'=>1,'ᵃ'=>1,'ᵄ'=>1,'áµ…'=>1,'ᵆ'=>1,'ᵇ'=>1,'ᵈ'=>1,'ᵉ'=>1,'ᵊ'=>1,'ᵋ'=>1,'ᵌ'=>1,'áµ'=>1,'áµ'=>1,'áµ'=>1,'ᵑ'=>1,'áµ’'=>1,'ᵓ'=>1,'áµ”'=>1,'ᵕ'=>1,'áµ–'=>1,'áµ—'=>1,'ᵘ'=>1,'áµ™'=>1,'ᵚ'=>1,'áµ›'=>1,'ᵜ'=>1,'áµ'=>1,'ᵞ'=>1,'ᵟ'=>1,'áµ '=>1,'ᵡ'=>1,'áµ¢'=>1,'áµ£'=>1,'ᵤ'=>1,'áµ¥'=>1,'ᵦ'=>1,'áµ§'=>1,'ᵨ'=>1,'ᵩ'=>1,'ᵪ'=>1,'ᵸ'=>1,'á¶›'=>1,'á¶œ'=>1,'á¶'=>1,'á¶ž'=>1,'á¶Ÿ'=>1,'á¶ '=>1,'á¶¡'=>1,'á¶¢'=>1,'á¶£'=>1,'ᶤ'=>1,'á¶¥'=>1,'ᶦ'=>1,'á¶§'=>1,'ᶨ'=>1,'á¶©'=>1,'ᶪ'=>1,'á¶«'=>1,'ᶬ'=>1,'á¶'=>1,'á¶®'=>1,'ᶯ'=>1,'á¶°'=>1,'á¶±'=>1,'á¶²'=>1,'á¶³'=>1,'á¶´'=>1,'á¶µ'=>1,'á¶¶'=>1,'á¶·'=>1,'ᶸ'=>1,'á¶¹'=>1,'ᶺ'=>1,'á¶»'=>1,'á¶¼'=>1,'á¶½'=>1,'á¶¾'=>1,'á¶¿'=>1,'ẚ'=>1,'ẛ'=>1,'á½±'=>1,'á½³'=>1,'á½µ'=>1,'á½·'=>1,'á½¹'=>1,'á½»'=>1,'á½½'=>1,'á¾»'=>1,'á¾½'=>1,'á¾¾'=>1,'᾿'=>1,'á¿€'=>1,'á¿'=>1,'Έ'=>1,'á¿‹'=>1,'á¿'=>1,'῎'=>1,'á¿'=>1,'á¿“'=>1,'á¿›'=>1,'á¿'=>1,'῞'=>1,'῟'=>1,'á¿£'=>1,'á¿«'=>1,'á¿'=>1,'á¿®'=>1,'`'=>1,'Ό'=>1,'á¿»'=>1,'´'=>1,'῾'=>1,' '=>1,'â€'=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,'‑'=>1,'‗'=>1,'․'=>1,'‥'=>1,'…'=>1,' '=>1,'″'=>1,'‴'=>1,'‶'=>1,'‷'=>1,'‼'=>1,'‾'=>1,'â‡'=>1,'âˆ'=>1,'â‰'=>1,'â—'=>1,'âŸ'=>1,'â°'=>1,'â±'=>1,'â´'=>1,'âµ'=>1,'â¶'=>1,'â·'=>1,'â¸'=>1,'â¹'=>1,'âº'=>1,'â»'=>1,'â¼'=>1,'â½'=>1,'â¾'=>1,'â¿'=>1,'â‚€'=>1,'â‚'=>1,'â‚‚'=>1,'₃'=>1,'â‚„'=>1,'â‚…'=>1,'₆'=>1,'₇'=>1,'₈'=>1,'₉'=>1,'₊'=>1,'â‚‹'=>1,'₌'=>1,'â‚'=>1,'₎'=>1,'â‚'=>1,'â‚‘'=>1,'â‚’'=>1,'â‚“'=>1,'â‚”'=>1,'₨'=>1,'â„€'=>1,'â„'=>1,'â„‚'=>1,'℃'=>1,'â„…'=>1,'℆'=>1,'ℇ'=>1,'℉'=>1,'ℊ'=>1,'â„‹'=>1,'ℌ'=>1,'â„'=>1,'ℎ'=>1,'â„'=>1,'â„'=>1,'â„‘'=>1,'â„’'=>1,'â„“'=>1,'â„•'=>1,'â„–'=>1,'â„™'=>1,'ℚ'=>1,'â„›'=>1,'ℜ'=>1,'â„'=>1,'â„ '=>1,'â„¡'=>1,'â„¢'=>1,'ℤ'=>1,'Ω'=>1,'ℨ'=>1,'K'=>1,'â„«'=>1,'ℬ'=>1,'â„'=>1,'ℯ'=>1,'â„°'=>1,'ℱ'=>1,'ℳ'=>1,'â„´'=>1,'ℵ'=>1,'â„¶'=>1,'â„·'=>1,'ℸ'=>1,'ℹ'=>1,'â„»'=>1,'ℼ'=>1,'ℽ'=>1,'ℾ'=>1,'â„¿'=>1,'â…€'=>1,'â……'=>1,'â…†'=>1,'â…‡'=>1,'â…ˆ'=>1,'â…‰'=>1,'â…“'=>1,'â…”'=>1,'â…•'=>1,'â…–'=>1,'â…—'=>1,'â…˜'=>1,'â…™'=>1,'â…š'=>1,'â…›'=>1,'â…œ'=>1,'â…'=>1,'â…ž'=>1,'â…Ÿ'=>1,'â… '=>1,'â…¡'=>1,'â…¢'=>1,'â…£'=>1,'â…¤'=>1,'â…¥'=>1,'â…¦'=>1,'â…§'=>1,'â…¨'=>1,'â…©'=>1,'â…ª'=>1,'â…«'=>1,'â…¬'=>1,'â…'=>1,'â…®'=>1,'â…¯'=>1,'â…°'=>1,'â…±'=>1,'â…²'=>1,'â…³'=>1,'â…´'=>1,'â…µ'=>1,'â…¶'=>1,'â…·'=>1,'â…¸'=>1,'â…¹'=>1,'â…º'=>1,'â…»'=>1,'â…¼'=>1,'â…½'=>1,'â…¾'=>1,'â…¿'=>1,'∬'=>1,'âˆ'=>1,'∯'=>1,'∰'=>1,'〈'=>1,'〉'=>1,'â‘ '=>1,'â‘¡'=>1,'â‘¢'=>1,'â‘£'=>1,'⑤'=>1,'â‘¥'=>1,'⑦'=>1,'â‘§'=>1,'⑨'=>1,'â‘©'=>1,'⑪'=>1,'â‘«'=>1,'⑬'=>1,'â‘'=>1,'â‘®'=>1,'⑯'=>1,'â‘°'=>1,'⑱'=>1,'⑲'=>1,'⑳'=>1,'â‘´'=>1,'⑵'=>1,'â‘¶'=>1,'â‘·'=>1,'⑸'=>1,'⑹'=>1,'⑺'=>1,'â‘»'=>1,'⑼'=>1,'⑽'=>1,'⑾'=>1,'â‘¿'=>1,'â’€'=>1,'â’'=>1,'â’‚'=>1,'â’ƒ'=>1,'â’„'=>1,'â’…'=>1,'â’†'=>1,'â’‡'=>1,'â’ˆ'=>1,'â’‰'=>1,'â’Š'=>1,'â’‹'=>1,'â’Œ'=>1,'â’'=>1,'â’Ž'=>1,'â’'=>1,'â’'=>1,'â’‘'=>1,'â’’'=>1,'â’“'=>1,'â’”'=>1,'â’•'=>1,'â’–'=>1,'â’—'=>1,'â’˜'=>1,'â’™'=>1,'â’š'=>1,'â’›'=>1,'â’œ'=>1,'â’'=>1,'â’ž'=>1,'â’Ÿ'=>1,'â’ '=>1,'â’¡'=>1,'â’¢'=>1,'â’£'=>1,'â’¤'=>1,'â’¥'=>1,'â’¦'=>1,'â’§'=>1,'â’¨'=>1,'â’©'=>1,'â’ª'=>1,'â’«'=>1,'â’¬'=>1,'â’'=>1,'â’®'=>1,'â’¯'=>1,'â’°'=>1,'â’±'=>1,'â’²'=>1,'â’³'=>1,'â’´'=>1,'â’µ'=>1,'â’¶'=>1,'â’·'=>1,'â’¸'=>1,'â’¹'=>1,'â’º'=>1,'â’»'=>1,'â’¼'=>1,'â’½'=>1,'â’¾'=>1,'â’¿'=>1,'â“€'=>1,'â“'=>1,'â“‚'=>1,'Ⓝ'=>1,'â“„'=>1,'â“…'=>1,'Ⓠ'=>1,'Ⓡ'=>1,'Ⓢ'=>1,'Ⓣ'=>1,'Ⓤ'=>1,'â“‹'=>1,'Ⓦ'=>1,'â“'=>1,'Ⓨ'=>1,'â“'=>1,'â“'=>1,'â“‘'=>1,'â“’'=>1,'â““'=>1,'â“”'=>1,'â“•'=>1,'â“–'=>1,'â“—'=>1,'ⓘ'=>1,'â“™'=>1,'ⓚ'=>1,'â“›'=>1,'ⓜ'=>1,'â“'=>1,'ⓞ'=>1,'ⓟ'=>1,'â“ '=>1,'â“¡'=>1,'â“¢'=>1,'â“£'=>1,'ⓤ'=>1,'â“¥'=>1,'ⓦ'=>1,'â“§'=>1,'ⓨ'=>1,'â“©'=>1,'⓪'=>1,'⨌'=>1,'â©´'=>1,'⩵'=>1,'â©¶'=>1,'⫝̸'=>1,'ⵯ'=>1,'⺟'=>1,'⻳'=>1,'â¼€'=>1,'â¼'=>1,'⼂'=>1,'⼃'=>1,'⼄'=>1,'â¼…'=>1,'⼆'=>1,'⼇'=>1,'⼈'=>1,'⼉'=>1,'⼊'=>1,'⼋'=>1,'⼌'=>1,'â¼'=>1,'⼎'=>1,'â¼'=>1,'â¼'=>1,'⼑'=>1,'â¼’'=>1,'⼓'=>1,'â¼”'=>1,'⼕'=>1,'â¼–'=>1,'â¼—'=>1,'⼘'=>1,'â¼™'=>1,'⼚'=>1,'â¼›'=>1,'⼜'=>1,'â¼'=>1,'⼞'=>1,'⼟'=>1,'â¼ '=>1,'⼡'=>1,'â¼¢'=>1,'â¼£'=>1,'⼤'=>1,'â¼¥'=>1,'⼦'=>1,'â¼§'=>1,'⼨'=>1,'⼩'=>1,'⼪'=>1,'⼫'=>1,'⼬'=>1,'â¼'=>1,'â¼®'=>1,'⼯'=>1,'â¼°'=>1,'â¼±'=>1,'â¼²'=>1,'â¼³'=>1,'â¼´'=>1,'â¼µ'=>1,'â¼¶'=>1,'â¼·'=>1,'⼸'=>1,'â¼¹'=>1,'⼺'=>1,'â¼»'=>1,'â¼¼'=>1,'â¼½'=>1,'â¼¾'=>1,'⼿'=>1,'â½€'=>1,'â½'=>1,'⽂'=>1,'⽃'=>1,'⽄'=>1,'â½…'=>1,'⽆'=>1,'⽇'=>1,'⽈'=>1,'⽉'=>1,'⽊'=>1,'⽋'=>1,'⽌'=>1,'â½'=>1,'⽎'=>1,'â½'=>1,'â½'=>1,'⽑'=>1,'â½’'=>1,'⽓'=>1,'â½”'=>1,'⽕'=>1,'â½–'=>1,'â½—'=>1,'⽘'=>1,'â½™'=>1,'⽚'=>1,'â½›'=>1,'⽜'=>1,'â½'=>1,'⽞'=>1,'⽟'=>1,'â½ '=>1,'⽡'=>1,'â½¢'=>1,'â½£'=>1,'⽤'=>1,'â½¥'=>1,'⽦'=>1,'â½§'=>1,'⽨'=>1,'⽩'=>1,'⽪'=>1,'⽫'=>1,'⽬'=>1,'â½'=>1,'â½®'=>1,'⽯'=>1,'â½°'=>1,'â½±'=>1,'â½²'=>1,'â½³'=>1,'â½´'=>1,'â½µ'=>1,'â½¶'=>1,'â½·'=>1,'⽸'=>1,'â½¹'=>1,'⽺'=>1,'â½»'=>1,'â½¼'=>1,'â½½'=>1,'â½¾'=>1,'⽿'=>1,'â¾€'=>1,'â¾'=>1,'⾂'=>1,'⾃'=>1,'⾄'=>1,'â¾…'=>1,'⾆'=>1,'⾇'=>1,'⾈'=>1,'⾉'=>1,'⾊'=>1,'⾋'=>1,'⾌'=>1,'â¾'=>1,'⾎'=>1,'â¾'=>1,'â¾'=>1,'⾑'=>1,'â¾’'=>1,'⾓'=>1,'â¾”'=>1,'⾕'=>1,'â¾–'=>1,'â¾—'=>1,'⾘'=>1,'â¾™'=>1,'⾚'=>1,'â¾›'=>1,'⾜'=>1,'â¾'=>1,'⾞'=>1,'⾟'=>1,'â¾ '=>1,'⾡'=>1,'â¾¢'=>1,'â¾£'=>1,'⾤'=>1,'â¾¥'=>1,'⾦'=>1,'â¾§'=>1,'⾨'=>1,'⾩'=>1,'⾪'=>1,'⾫'=>1,'⾬'=>1,'â¾'=>1,'â¾®'=>1,'⾯'=>1,'â¾°'=>1,'â¾±'=>1,'â¾²'=>1,'â¾³'=>1,'â¾´'=>1,'â¾µ'=>1,'â¾¶'=>1,'â¾·'=>1,'⾸'=>1,'â¾¹'=>1,'⾺'=>1,'â¾»'=>1,'â¾¼'=>1,'â¾½'=>1,'â¾¾'=>1,'⾿'=>1,'â¿€'=>1,'â¿'=>1,'â¿‚'=>1,'⿃'=>1,'â¿„'=>1,'â¿…'=>1,'⿆'=>1,'⿇'=>1,'⿈'=>1,'⿉'=>1,'⿊'=>1,'â¿‹'=>1,'⿌'=>1,'â¿'=>1,'⿎'=>1,'â¿'=>1,'â¿'=>1,'â¿‘'=>1,'â¿’'=>1,'â¿“'=>1,'â¿”'=>1,'â¿•'=>1,' '=>1,'〶'=>1,'〸'=>1,'〹'=>1,'〺'=>1,'ã‚›'=>1,'゜'=>1,'ゟ'=>1,'ヿ'=>1,'ㄱ'=>1,'ㄲ'=>1,'ㄳ'=>1,'ã„´'=>1,'ㄵ'=>1,'ã„¶'=>1,'ã„·'=>1,'ㄸ'=>1,'ㄹ'=>1,'ㄺ'=>1,'ã„»'=>1,'ㄼ'=>1,'ㄽ'=>1,'ㄾ'=>1,'ã„¿'=>1,'ã…€'=>1,'ã…'=>1,'ã…‚'=>1,'ã…ƒ'=>1,'ã…„'=>1,'ã……'=>1,'ã…†'=>1,'ã…‡'=>1,'ã…ˆ'=>1,'ã…‰'=>1,'ã…Š'=>1,'ã…‹'=>1,'ã…Œ'=>1,'ã…'=>1,'ã…Ž'=>1,'ã…'=>1,'ã…'=>1,'ã…‘'=>1,'ã…’'=>1,'ã…“'=>1,'ã…”'=>1,'ã…•'=>1,'ã…–'=>1,'ã…—'=>1,'ã…˜'=>1,'ã…™'=>1,'ã…š'=>1,'ã…›'=>1,'ã…œ'=>1,'ã…'=>1,'ã…ž'=>1,'ã…Ÿ'=>1,'ã… '=>1,'ã…¡'=>1,'ã…¢'=>1,'ã…£'=>1,'ã…¤'=>1,'ã…¥'=>1,'ã…¦'=>1,'ã…§'=>1,'ã…¨'=>1,'ã…©'=>1,'ã…ª'=>1,'ã…«'=>1,'ã…¬'=>1,'ã…'=>1,'ã…®'=>1,'ã…¯'=>1,'ã…°'=>1,'ã…±'=>1,'ã…²'=>1,'ã…³'=>1,'ã…´'=>1,'ã…µ'=>1,'ã…¶'=>1,'ã…·'=>1,'ã…¸'=>1,'ã…¹'=>1,'ã…º'=>1,'ã…»'=>1,'ã…¼'=>1,'ã…½'=>1,'ã…¾'=>1,'ã…¿'=>1,'ㆀ'=>1,'ã†'=>1,'ㆂ'=>1,'ㆃ'=>1,'ㆄ'=>1,'ㆅ'=>1,'ㆆ'=>1,'ㆇ'=>1,'ㆈ'=>1,'ㆉ'=>1,'ㆊ'=>1,'ㆋ'=>1,'ㆌ'=>1,'ã†'=>1,'ㆎ'=>1,'㆒'=>1,'㆓'=>1,'㆔'=>1,'㆕'=>1,'㆖'=>1,'㆗'=>1,'㆘'=>1,'㆙'=>1,'㆚'=>1,'㆛'=>1,'㆜'=>1,'ã†'=>1,'㆞'=>1,'㆟'=>1,'㈀'=>1,'ãˆ'=>1,'㈂'=>1,'㈃'=>1,'㈄'=>1,'㈅'=>1,'㈆'=>1,'㈇'=>1,'㈈'=>1,'㈉'=>1,'㈊'=>1,'㈋'=>1,'㈌'=>1,'ãˆ'=>1,'㈎'=>1,'ãˆ'=>1,'ãˆ'=>1,'㈑'=>1,'㈒'=>1,'㈓'=>1,'㈔'=>1,'㈕'=>1,'㈖'=>1,'㈗'=>1,'㈘'=>1,'㈙'=>1,'㈚'=>1,'㈛'=>1,'㈜'=>1,'ãˆ'=>1,'㈞'=>1,'㈠'=>1,'㈡'=>1,'㈢'=>1,'㈣'=>1,'㈤'=>1,'㈥'=>1,'㈦'=>1,'㈧'=>1,'㈨'=>1,'㈩'=>1,'㈪'=>1,'㈫'=>1,'㈬'=>1,'ãˆ'=>1,'㈮'=>1,'㈯'=>1,'㈰'=>1,'㈱'=>1,'㈲'=>1,'㈳'=>1,'㈴'=>1,'㈵'=>1,'㈶'=>1,'㈷'=>1,'㈸'=>1,'㈹'=>1,'㈺'=>1,'㈻'=>1,'㈼'=>1,'㈽'=>1,'㈾'=>1,'㈿'=>1,'㉀'=>1,'ã‰'=>1,'㉂'=>1,'㉃'=>1,'ã‰'=>1,'㉑'=>1,'㉒'=>1,'㉓'=>1,'㉔'=>1,'㉕'=>1,'㉖'=>1,'㉗'=>1,'㉘'=>1,'㉙'=>1,'㉚'=>1,'㉛'=>1,'㉜'=>1,'ã‰'=>1,'㉞'=>1,'㉟'=>1,'㉠'=>1,'㉡'=>1,'㉢'=>1,'㉣'=>1,'㉤'=>1,'㉥'=>1,'㉦'=>1,'㉧'=>1,'㉨'=>1,'㉩'=>1,'㉪'=>1,'㉫'=>1,'㉬'=>1,'ã‰'=>1,'㉮'=>1,'㉯'=>1,'㉰'=>1,'㉱'=>1,'㉲'=>1,'㉳'=>1,'㉴'=>1,'㉵'=>1,'㉶'=>1,'㉷'=>1,'㉸'=>1,'㉹'=>1,'㉺'=>1,'㉻'=>1,'㉼'=>1,'㉽'=>1,'㉾'=>1,'㊀'=>1,'ãŠ'=>1,'㊂'=>1,'㊃'=>1,'㊄'=>1,'㊅'=>1,'㊆'=>1,'㊇'=>1,'㊈'=>1,'㊉'=>1,'㊊'=>1,'㊋'=>1,'㊌'=>1,'ãŠ'=>1,'㊎'=>1,'ãŠ'=>1,'ãŠ'=>1,'㊑'=>1,'㊒'=>1,'㊓'=>1,'㊔'=>1,'㊕'=>1,'㊖'=>1,'㊗'=>1,'㊘'=>1,'㊙'=>1,'㊚'=>1,'㊛'=>1,'㊜'=>1,'ãŠ'=>1,'㊞'=>1,'㊟'=>1,'㊠'=>1,'㊡'=>1,'㊢'=>1,'㊣'=>1,'㊤'=>1,'㊥'=>1,'㊦'=>1,'㊧'=>1,'㊨'=>1,'㊩'=>1,'㊪'=>1,'㊫'=>1,'㊬'=>1,'ãŠ'=>1,'㊮'=>1,'㊯'=>1,'㊰'=>1,'㊱'=>1,'㊲'=>1,'㊳'=>1,'㊴'=>1,'㊵'=>1,'㊶'=>1,'㊷'=>1,'㊸'=>1,'㊹'=>1,'㊺'=>1,'㊻'=>1,'㊼'=>1,'㊽'=>1,'㊾'=>1,'㊿'=>1,'ã‹€'=>1,'ã‹'=>1,'ã‹‚'=>1,'㋃'=>1,'ã‹„'=>1,'ã‹…'=>1,'㋆'=>1,'㋇'=>1,'㋈'=>1,'㋉'=>1,'㋊'=>1,'ã‹‹'=>1,'㋌'=>1,'ã‹'=>1,'㋎'=>1,'ã‹'=>1,'ã‹'=>1,'ã‹‘'=>1,'ã‹’'=>1,'ã‹“'=>1,'ã‹”'=>1,'ã‹•'=>1,'ã‹–'=>1,'ã‹—'=>1,'㋘'=>1,'ã‹™'=>1,'㋚'=>1,'ã‹›'=>1,'㋜'=>1,'ã‹'=>1,'㋞'=>1,'㋟'=>1,'ã‹ '=>1,'ã‹¡'=>1,'ã‹¢'=>1,'ã‹£'=>1,'㋤'=>1,'ã‹¥'=>1,'㋦'=>1,'ã‹§'=>1,'㋨'=>1,'ã‹©'=>1,'㋪'=>1,'ã‹«'=>1,'㋬'=>1,'ã‹'=>1,'ã‹®'=>1,'㋯'=>1,'ã‹°'=>1,'㋱'=>1,'㋲'=>1,'㋳'=>1,'ã‹´'=>1,'㋵'=>1,'ã‹¶'=>1,'ã‹·'=>1,'㋸'=>1,'㋹'=>1,'㋺'=>1,'ã‹»'=>1,'㋼'=>1,'㋽'=>1,'㋾'=>1,'㌀'=>1,'ãŒ'=>1,'㌂'=>1,'㌃'=>1,'㌄'=>1,'㌅'=>1,'㌆'=>1,'㌇'=>1,'㌈'=>1,'㌉'=>1,'㌊'=>1,'㌋'=>1,'㌌'=>1,'ãŒ'=>1,'㌎'=>1,'ãŒ'=>1,'ãŒ'=>1,'㌑'=>1,'㌒'=>1,'㌓'=>1,'㌔'=>1,'㌕'=>1,'㌖'=>1,'㌗'=>1,'㌘'=>1,'㌙'=>1,'㌚'=>1,'㌛'=>1,'㌜'=>1,'ãŒ'=>1,'㌞'=>1,'㌟'=>1,'㌠'=>1,'㌡'=>1,'㌢'=>1,'㌣'=>1,'㌤'=>1,'㌥'=>1,'㌦'=>1,'㌧'=>1,'㌨'=>1,'㌩'=>1,'㌪'=>1,'㌫'=>1,'㌬'=>1,'ãŒ'=>1,'㌮'=>1,'㌯'=>1,'㌰'=>1,'㌱'=>1,'㌲'=>1,'㌳'=>1,'㌴'=>1,'㌵'=>1,'㌶'=>1,'㌷'=>1,'㌸'=>1,'㌹'=>1,'㌺'=>1,'㌻'=>1,'㌼'=>1,'㌽'=>1,'㌾'=>1,'㌿'=>1,'ã€'=>1,'ã'=>1,'ã‚'=>1,'ãƒ'=>1,'ã„'=>1,'ã…'=>1,'ã†'=>1,'ã‡'=>1,'ãˆ'=>1,'ã‰'=>1,'ãŠ'=>1,'ã‹'=>1,'ãŒ'=>1,'ã'=>1,'ãŽ'=>1,'ã'=>1,'ã'=>1,'ã‘'=>1,'ã’'=>1,'ã“'=>1,'ã”'=>1,'ã•'=>1,'ã–'=>1,'ã—'=>1,'ã˜'=>1,'ã™'=>1,'ãš'=>1,'ã›'=>1,'ãœ'=>1,'ã'=>1,'ãž'=>1,'ãŸ'=>1,'ã '=>1,'ã¡'=>1,'ã¢'=>1,'ã£'=>1,'ã¤'=>1,'ã¥'=>1,'ã¦'=>1,'ã§'=>1,'ã¨'=>1,'ã©'=>1,'ãª'=>1,'ã«'=>1,'ã¬'=>1,'ã'=>1,'ã®'=>1,'ã¯'=>1,'ã°'=>1,'ã±'=>1,'ã²'=>1,'ã³'=>1,'ã´'=>1,'ãµ'=>1,'ã¶'=>1,'ã·'=>1,'ã¸'=>1,'ã¹'=>1,'ãº'=>1,'ã»'=>1,'ã¼'=>1,'ã½'=>1,'ã¾'=>1,'ã¿'=>1,'㎀'=>1,'ãŽ'=>1,'㎂'=>1,'㎃'=>1,'㎄'=>1,'㎅'=>1,'㎆'=>1,'㎇'=>1,'㎈'=>1,'㎉'=>1,'㎊'=>1,'㎋'=>1,'㎌'=>1,'ãŽ'=>1,'㎎'=>1,'ãŽ'=>1,'ãŽ'=>1,'㎑'=>1,'㎒'=>1,'㎓'=>1,'㎔'=>1,'㎕'=>1,'㎖'=>1,'㎗'=>1,'㎘'=>1,'㎙'=>1,'㎚'=>1,'㎛'=>1,'㎜'=>1,'ãŽ'=>1,'㎞'=>1,'㎟'=>1,'㎠'=>1,'㎡'=>1,'㎢'=>1,'㎣'=>1,'㎤'=>1,'㎥'=>1,'㎦'=>1,'㎧'=>1,'㎨'=>1,'㎩'=>1,'㎪'=>1,'㎫'=>1,'㎬'=>1,'ãŽ'=>1,'㎮'=>1,'㎯'=>1,'㎰'=>1,'㎱'=>1,'㎲'=>1,'㎳'=>1,'㎴'=>1,'㎵'=>1,'㎶'=>1,'㎷'=>1,'㎸'=>1,'㎹'=>1,'㎺'=>1,'㎻'=>1,'㎼'=>1,'㎽'=>1,'㎾'=>1,'㎿'=>1,'ã€'=>1,'ã'=>1,'ã‚'=>1,'ãƒ'=>1,'ã„'=>1,'ã…'=>1,'ã†'=>1,'ã‡'=>1,'ãˆ'=>1,'ã‰'=>1,'ãŠ'=>1,'ã‹'=>1,'ãŒ'=>1,'ã'=>1,'ãŽ'=>1,'ã'=>1,'ã'=>1,'ã‘'=>1,'ã’'=>1,'ã“'=>1,'ã”'=>1,'ã•'=>1,'ã–'=>1,'ã—'=>1,'ã˜'=>1,'ã™'=>1,'ãš'=>1,'ã›'=>1,'ãœ'=>1,'ã'=>1,'ãž'=>1,'ãŸ'=>1,'ã '=>1,'ã¡'=>1,'ã¢'=>1,'ã£'=>1,'ã¤'=>1,'ã¥'=>1,'ã¦'=>1,'ã§'=>1,'ã¨'=>1,'ã©'=>1,'ãª'=>1,'ã«'=>1,'ã¬'=>1,'ã'=>1,'ã®'=>1,'ã¯'=>1,'ã°'=>1,'ã±'=>1,'ã²'=>1,'ã³'=>1,'ã´'=>1,'ãµ'=>1,'ã¶'=>1,'ã·'=>1,'ã¸'=>1,'ã¹'=>1,'ãº'=>1,'ã»'=>1,'ã¼'=>1,'ã½'=>1,'ã¾'=>1,'ã¿'=>1,'豈'=>1,'ï¤'=>1,'車'=>1,'賈'=>1,'滑'=>1,'串'=>1,'句'=>1,'龜'=>1,'龜'=>1,'契'=>1,'金'=>1,'喇'=>1,'奈'=>1,'ï¤'=>1,'癩'=>1,'ï¤'=>1,'ï¤'=>1,'螺'=>1,'裸'=>1,'邏'=>1,'樂'=>1,'洛'=>1,'烙'=>1,'珞'=>1,'落'=>1,'酪'=>1,'駱'=>1,'亂'=>1,'卵'=>1,'ï¤'=>1,'爛'=>1,'蘭'=>1,'鸞'=>1,'嵐'=>1,'濫'=>1,'藍'=>1,'襤'=>1,'拉'=>1,'臘'=>1,'蠟'=>1,'廊'=>1,'朗'=>1,'浪'=>1,'狼'=>1,'郎'=>1,'ï¤'=>1,'冷'=>1,'勞'=>1,'擄'=>1,'櫓'=>1,'爐'=>1,'盧'=>1,'老'=>1,'蘆'=>1,'虜'=>1,'路'=>1,'露'=>1,'魯'=>1,'鷺'=>1,'碌'=>1,'祿'=>1,'綠'=>1,'菉'=>1,'錄'=>1,'鹿'=>1,'ï¥'=>1,'壟'=>1,'弄'=>1,'籠'=>1,'聾'=>1,'牢'=>1,'磊'=>1,'賂'=>1,'雷'=>1,'壘'=>1,'屢'=>1,'樓'=>1,'ï¥'=>1,'漏'=>1,'ï¥'=>1,'ï¥'=>1,'陋'=>1,'勒'=>1,'肋'=>1,'凜'=>1,'凌'=>1,'稜'=>1,'綾'=>1,'菱'=>1,'陵'=>1,'讀'=>1,'拏'=>1,'樂'=>1,'ï¥'=>1,'丹'=>1,'寧'=>1,'怒'=>1,'率'=>1,'異'=>1,'北'=>1,'磻'=>1,'便'=>1,'復'=>1,'不'=>1,'泌'=>1,'數'=>1,'索'=>1,'參'=>1,'塞'=>1,'ï¥'=>1,'葉'=>1,'說'=>1,'殺'=>1,'辰'=>1,'沈'=>1,'拾'=>1,'若'=>1,'掠'=>1,'略'=>1,'亮'=>1,'兩'=>1,'凉'=>1,'梁'=>1,'糧'=>1,'良'=>1,'諒'=>1,'量'=>1,'勵'=>1,'呂'=>1,'ï¦'=>1,'廬'=>1,'旅'=>1,'濾'=>1,'礪'=>1,'閭'=>1,'驪'=>1,'麗'=>1,'黎'=>1,'力'=>1,'曆'=>1,'歷'=>1,'ï¦'=>1,'年'=>1,'ï¦'=>1,'ï¦'=>1,'撚'=>1,'漣'=>1,'煉'=>1,'璉'=>1,'秊'=>1,'練'=>1,'聯'=>1,'輦'=>1,'蓮'=>1,'連'=>1,'鍊'=>1,'列'=>1,'ï¦'=>1,'咽'=>1,'烈'=>1,'裂'=>1,'說'=>1,'廉'=>1,'念'=>1,'捻'=>1,'殮'=>1,'簾'=>1,'獵'=>1,'令'=>1,'囹'=>1,'寧'=>1,'嶺'=>1,'怜'=>1,'ï¦'=>1,'瑩'=>1,'羚'=>1,'聆'=>1,'鈴'=>1,'零'=>1,'靈'=>1,'領'=>1,'例'=>1,'禮'=>1,'醴'=>1,'隸'=>1,'惡'=>1,'了'=>1,'僚'=>1,'寮'=>1,'尿'=>1,'料'=>1,'樂'=>1,'ï§€'=>1,'ï§'=>1,'ï§‚'=>1,'遼'=>1,'ï§„'=>1,'ï§…'=>1,'阮'=>1,'劉'=>1,'杻'=>1,'柳'=>1,'ï§Š'=>1,'ï§‹'=>1,'ï§Œ'=>1,'ï§'=>1,'ï§Ž'=>1,'ï§'=>1,'ï§'=>1,'ï§‘'=>1,'ï§’'=>1,'ï§“'=>1,'ï§”'=>1,'ï§•'=>1,'ï§–'=>1,'ï§—'=>1,'律'=>1,'ï§™'=>1,'ï§š'=>1,'ï§›'=>1,'ï§œ'=>1,'ï§'=>1,'ï§ž'=>1,'ï§Ÿ'=>1,'ï§ '=>1,'ï§¡'=>1,'ï§¢'=>1,'ï§£'=>1,'理'=>1,'ï§¥'=>1,'罹'=>1,'ï§§'=>1,'裡'=>1,'ï§©'=>1,'離'=>1,'ï§«'=>1,'溺'=>1,'ï§'=>1,'ï§®'=>1,'璘'=>1,'ï§°'=>1,'ï§±'=>1,'ï§²'=>1,'ï§³'=>1,'ï§´'=>1,'ï§µ'=>1,'ï§¶'=>1,'ï§·'=>1,'笠'=>1,'ï§¹'=>1,'狀'=>1,'ï§»'=>1,'ï§¼'=>1,'ï§½'=>1,'ï§¾'=>1,'ï§¿'=>1,'切'=>1,'ï¨'=>1,'拓'=>1,'糖'=>1,'宅'=>1,'洞'=>1,'暴'=>1,'輻'=>1,'行'=>1,'降'=>1,'見'=>1,'廓'=>1,'兀'=>1,'ï¨'=>1,'ï¨'=>1,'晴'=>1,'凞'=>1,'猪'=>1,'益'=>1,'礼'=>1,'神'=>1,'祥'=>1,'福'=>1,'靖'=>1,'ï¨'=>1,'羽'=>1,'蘒'=>1,'諸'=>1,'逸'=>1,'都'=>1,'飯'=>1,'飼'=>1,'館'=>1,'ï¨'=>1,'侮'=>1,'僧'=>1,'免'=>1,'勉'=>1,'勤'=>1,'卑'=>1,'喝'=>1,'嘆'=>1,'器'=>1,'塀'=>1,'墨'=>1,'層'=>1,'屮'=>1,'悔'=>1,'慨'=>1,'憎'=>1,'ï©€'=>1,'ï©'=>1,'ï©‚'=>1,'暑'=>1,'ï©„'=>1,'ï©…'=>1,'渚'=>1,'漢'=>1,'煮'=>1,'爫'=>1,'琢'=>1,'ï©‹'=>1,'社'=>1,'ï©'=>1,'祈'=>1,'ï©'=>1,'ï©'=>1,'ï©‘'=>1,'ï©’'=>1,'ï©“'=>1,'ï©”'=>1,'ï©•'=>1,'ï©–'=>1,'ï©—'=>1,'縉'=>1,'ï©™'=>1,'署'=>1,'ï©›'=>1,'臭'=>1,'ï©'=>1,'艹'=>1,'著'=>1,'ï© '=>1,'ï©¡'=>1,'ï©¢'=>1,'ï©£'=>1,'賓'=>1,'ï©¥'=>1,'辶'=>1,'ï©§'=>1,'難'=>1,'ï©©'=>1,'頻'=>1,'ï©°'=>1,'况'=>1,'全'=>1,'侀'=>1,'ï©´'=>1,'冀'=>1,'ï©¶'=>1,'ï©·'=>1,'喝'=>1,'啕'=>1,'喙'=>1,'ï©»'=>1,'塚'=>1,'墳'=>1,'奄'=>1,'ï©¿'=>1,'婢'=>1,'ïª'=>1,'廒'=>1,'廙'=>1,'彩'=>1,'徭'=>1,'惘'=>1,'慎'=>1,'愈'=>1,'憎'=>1,'慠'=>1,'懲'=>1,'戴'=>1,'ïª'=>1,'搜'=>1,'ïª'=>1,'ïª'=>1,'晴'=>1,'朗'=>1,'望'=>1,'杖'=>1,'歹'=>1,'殺'=>1,'流'=>1,'滛'=>1,'滋'=>1,'漢'=>1,'瀞'=>1,'煮'=>1,'ïª'=>1,'爵'=>1,'犯'=>1,'猪'=>1,'瑱'=>1,'甆'=>1,'画'=>1,'瘝'=>1,'瘟'=>1,'益'=>1,'盛'=>1,'直'=>1,'睊'=>1,'着'=>1,'磌'=>1,'窱'=>1,'ïª'=>1,'类'=>1,'絛'=>1,'練'=>1,'缾'=>1,'者'=>1,'荒'=>1,'華'=>1,'蝹'=>1,'襁'=>1,'覆'=>1,'視'=>1,'調'=>1,'諸'=>1,'請'=>1,'謁'=>1,'諾'=>1,'諭'=>1,'謹'=>1,'ï«€'=>1,'ï«'=>1,'ï«‚'=>1,'遲'=>1,'ï«„'=>1,'ï«…'=>1,'陼'=>1,'難'=>1,'靖'=>1,'韛'=>1,'響'=>1,'ï«‹'=>1,'頻'=>1,'ï«'=>1,'龜'=>1,'ï«'=>1,'ï«'=>1,'ï«‘'=>1,'ï«’'=>1,'ï«“'=>1,'ï«”'=>1,'ï«•'=>1,'ï«–'=>1,'ï«—'=>1,'齃'=>1,'ï«™'=>1,'ff'=>1,'ï¬'=>1,'fl'=>1,'ffi'=>1,'ffl'=>1,'ſt'=>1,'st'=>1,'ﬓ'=>1,'ﬔ'=>1,'ﬕ'=>1,'ﬖ'=>1,'ﬗ'=>1,'ï¬'=>1,'ײַ'=>1,'ﬠ'=>1,'ﬡ'=>1,'ﬢ'=>1,'ﬣ'=>1,'ﬤ'=>1,'ﬥ'=>1,'ﬦ'=>1,'ﬧ'=>1,'ﬨ'=>1,'﬩'=>1,'שׁ'=>1,'שׂ'=>1,'שּׁ'=>1,'ï¬'=>1,'אַ'=>1,'אָ'=>1,'אּ'=>1,'בּ'=>1,'גּ'=>1,'דּ'=>1,'הּ'=>1,'וּ'=>1,'זּ'=>1,'טּ'=>1,'יּ'=>1,'ךּ'=>1,'כּ'=>1,'לּ'=>1,'מּ'=>1,'ï€'=>1,'ï'=>1,'ïƒ'=>1,'ï„'=>1,'ï†'=>1,'ï‡'=>1,'ïˆ'=>1,'ï‰'=>1,'ïŠ'=>1,'ï‹'=>1,'ïŒ'=>1,'ï'=>1,'ïŽ'=>1,'ï'=>1,'ï'=>1,'ï‘'=>1,'ï’'=>1,'ï“'=>1,'ï”'=>1,'ï•'=>1,'ï–'=>1,'ï—'=>1,'ï˜'=>1,'ï™'=>1,'ïš'=>1,'ï›'=>1,'ïœ'=>1,'ï'=>1,'ïž'=>1,'ïŸ'=>1,'ï '=>1,'ï¡'=>1,'ï¢'=>1,'ï£'=>1,'ï¤'=>1,'ï¥'=>1,'ï¦'=>1,'ï§'=>1,'ï¨'=>1,'ï©'=>1,'ïª'=>1,'ï«'=>1,'ï¬'=>1,'ï'=>1,'ï®'=>1,'ï¯'=>1,'ï°'=>1,'ï±'=>1,'ï²'=>1,'ï³'=>1,'ï´'=>1,'ïµ'=>1,'ï¶'=>1,'ï·'=>1,'ï¸'=>1,'ï¹'=>1,'ïº'=>1,'ï»'=>1,'ï¼'=>1,'ï½'=>1,'ï¾'=>1,'ï¿'=>1,'ﮀ'=>1,'ï®'=>1,'ﮂ'=>1,'ﮃ'=>1,'ﮄ'=>1,'ï®…'=>1,'ﮆ'=>1,'ﮇ'=>1,'ﮈ'=>1,'ﮉ'=>1,'ﮊ'=>1,'ﮋ'=>1,'ﮌ'=>1,'ï®'=>1,'ﮎ'=>1,'ï®'=>1,'ï®'=>1,'ﮑ'=>1,'ï®’'=>1,'ﮓ'=>1,'ï®”'=>1,'ﮕ'=>1,'ï®–'=>1,'ï®—'=>1,'ﮘ'=>1,'ï®™'=>1,'ﮚ'=>1,'ï®›'=>1,'ﮜ'=>1,'ï®'=>1,'ﮞ'=>1,'ﮟ'=>1,'ï® '=>1,'ﮡ'=>1,'ﮢ'=>1,'ﮣ'=>1,'ﮤ'=>1,'ﮥ'=>1,'ﮦ'=>1,'ï®§'=>1,'ﮨ'=>1,'ﮩ'=>1,'ﮪ'=>1,'ﮫ'=>1,'ﮬ'=>1,'ï®'=>1,'ï®®'=>1,'ﮯ'=>1,'ï®°'=>1,'ï®±'=>1,'ﯓ'=>1,'ﯔ'=>1,'ﯕ'=>1,'ﯖ'=>1,'ﯗ'=>1,'ﯘ'=>1,'ﯙ'=>1,'ﯚ'=>1,'ﯛ'=>1,'ﯜ'=>1,'ï¯'=>1,'ﯞ'=>1,'ﯟ'=>1,'ﯠ'=>1,'ﯡ'=>1,'ﯢ'=>1,'ﯣ'=>1,'ﯤ'=>1,'ﯥ'=>1,'ﯦ'=>1,'ﯧ'=>1,'ﯨ'=>1,'ﯩ'=>1,'ﯪ'=>1,'ﯫ'=>1,'ﯬ'=>1,'ï¯'=>1,'ﯮ'=>1,'ﯯ'=>1,'ﯰ'=>1,'ﯱ'=>1,'ﯲ'=>1,'ﯳ'=>1,'ﯴ'=>1,'ﯵ'=>1,'ﯶ'=>1,'ﯷ'=>1,'ﯸ'=>1,'ﯹ'=>1,'ﯺ'=>1,'ﯻ'=>1,'ﯼ'=>1,'ﯽ'=>1,'ﯾ'=>1,'ﯿ'=>1,'ï°€'=>1,'ï°'=>1,'ï°‚'=>1,'ï°ƒ'=>1,'ï°„'=>1,'ï°…'=>1,'ï°†'=>1,'ï°‡'=>1,'ï°ˆ'=>1,'ï°‰'=>1,'ï°Š'=>1,'ï°‹'=>1,'ï°Œ'=>1,'ï°'=>1,'ï°Ž'=>1,'ï°'=>1,'ï°'=>1,'ï°‘'=>1,'ï°’'=>1,'ï°“'=>1,'ï°”'=>1,'ï°•'=>1,'ï°–'=>1,'ï°—'=>1,'ï°˜'=>1,'ï°™'=>1,'ï°š'=>1,'ï°›'=>1,'ï°œ'=>1,'ï°'=>1,'ï°ž'=>1,'ï°Ÿ'=>1,'ï° '=>1,'ï°¡'=>1,'ï°¢'=>1,'ï°£'=>1,'ï°¤'=>1,'ï°¥'=>1,'ï°¦'=>1,'ï°§'=>1,'ï°¨'=>1,'ï°©'=>1,'ï°ª'=>1,'ï°«'=>1,'ï°¬'=>1,'ï°'=>1,'ï°®'=>1,'ï°¯'=>1,'ï°°'=>1,'ï°±'=>1,'ï°²'=>1,'ï°³'=>1,'ï°´'=>1,'ï°µ'=>1,'ï°¶'=>1,'ï°·'=>1,'ï°¸'=>1,'ï°¹'=>1,'ï°º'=>1,'ï°»'=>1,'ï°¼'=>1,'ï°½'=>1,'ï°¾'=>1,'ï°¿'=>1,'ï±€'=>1,'ï±'=>1,'ﱂ'=>1,'ﱃ'=>1,'ﱄ'=>1,'ï±…'=>1,'ﱆ'=>1,'ﱇ'=>1,'ﱈ'=>1,'ﱉ'=>1,'ﱊ'=>1,'ﱋ'=>1,'ﱌ'=>1,'ï±'=>1,'ﱎ'=>1,'ï±'=>1,'ï±'=>1,'ﱑ'=>1,'ï±’'=>1,'ﱓ'=>1,'ï±”'=>1,'ﱕ'=>1,'ï±–'=>1,'ï±—'=>1,'ﱘ'=>1,'ï±™'=>1,'ﱚ'=>1,'ï±›'=>1,'ﱜ'=>1,'ï±'=>1,'ﱞ'=>1,'ﱟ'=>1,'ï± '=>1,'ﱡ'=>1,'ï±¢'=>1,'ï±£'=>1,'ﱤ'=>1,'ï±¥'=>1,'ﱦ'=>1,'ï±§'=>1,'ﱨ'=>1,'ﱩ'=>1,'ﱪ'=>1,'ﱫ'=>1,'ﱬ'=>1,'ï±'=>1,'ï±®'=>1,'ﱯ'=>1,'ï±°'=>1,'ï±±'=>1,'ï±²'=>1,'ï±³'=>1,'ï±´'=>1,'ï±µ'=>1,'ï±¶'=>1,'ï±·'=>1,'ﱸ'=>1,'ï±¹'=>1,'ﱺ'=>1,'ï±»'=>1,'ï±¼'=>1,'ï±½'=>1,'ï±¾'=>1,'ﱿ'=>1,'ï²€'=>1,'ï²'=>1,'ﲂ'=>1,'ﲃ'=>1,'ﲄ'=>1,'ï²…'=>1,'ﲆ'=>1,'ﲇ'=>1,'ﲈ'=>1,'ﲉ'=>1,'ﲊ'=>1,'ﲋ'=>1,'ﲌ'=>1,'ï²'=>1,'ﲎ'=>1,'ï²'=>1,'ï²'=>1,'ﲑ'=>1,'ï²’'=>1,'ﲓ'=>1,'ï²”'=>1,'ﲕ'=>1,'ï²–'=>1,'ï²—'=>1,'ﲘ'=>1,'ï²™'=>1,'ﲚ'=>1,'ï²›'=>1,'ﲜ'=>1,'ï²'=>1,'ﲞ'=>1,'ﲟ'=>1,'ï² '=>1,'ﲡ'=>1,'ï²¢'=>1,'ï²£'=>1,'ﲤ'=>1,'ï²¥'=>1,'ﲦ'=>1,'ï²§'=>1,'ﲨ'=>1,'ﲩ'=>1,'ﲪ'=>1,'ﲫ'=>1,'ﲬ'=>1,'ï²'=>1,'ï²®'=>1,'ﲯ'=>1,'ï²°'=>1,'ï²±'=>1,'ï²²'=>1,'ï²³'=>1,'ï²´'=>1,'ï²µ'=>1,'ï²¶'=>1,'ï²·'=>1,'ﲸ'=>1,'ï²¹'=>1,'ﲺ'=>1,'ï²»'=>1,'ï²¼'=>1,'ï²½'=>1,'ï²¾'=>1,'ﲿ'=>1,'ï³€'=>1,'ï³'=>1,'ﳂ'=>1,'ﳃ'=>1,'ﳄ'=>1,'ï³…'=>1,'ﳆ'=>1,'ﳇ'=>1,'ﳈ'=>1,'ﳉ'=>1,'ﳊ'=>1,'ﳋ'=>1,'ﳌ'=>1,'ï³'=>1,'ﳎ'=>1,'ï³'=>1,'ï³'=>1,'ﳑ'=>1,'ï³’'=>1,'ﳓ'=>1,'ï³”'=>1,'ﳕ'=>1,'ï³–'=>1,'ï³—'=>1,'ﳘ'=>1,'ï³™'=>1,'ﳚ'=>1,'ï³›'=>1,'ﳜ'=>1,'ï³'=>1,'ﳞ'=>1,'ﳟ'=>1,'ï³ '=>1,'ﳡ'=>1,'ï³¢'=>1,'ï³£'=>1,'ﳤ'=>1,'ï³¥'=>1,'ﳦ'=>1,'ï³§'=>1,'ﳨ'=>1,'ﳩ'=>1,'ﳪ'=>1,'ﳫ'=>1,'ﳬ'=>1,'ï³'=>1,'ï³®'=>1,'ﳯ'=>1,'ï³°'=>1,'ï³±'=>1,'ï³²'=>1,'ï³³'=>1,'ï³´'=>1,'ï³µ'=>1,'ï³¶'=>1,'ï³·'=>1,'ﳸ'=>1,'ï³¹'=>1,'ﳺ'=>1,'ï³»'=>1,'ï³¼'=>1,'ï³½'=>1,'ï³¾'=>1,'ﳿ'=>1,'ï´€'=>1,'ï´'=>1,'ï´‚'=>1,'ï´ƒ'=>1,'ï´„'=>1,'ï´…'=>1,'ï´†'=>1,'ï´‡'=>1,'ï´ˆ'=>1,'ï´‰'=>1,'ï´Š'=>1,'ï´‹'=>1,'ï´Œ'=>1,'ï´'=>1,'ï´Ž'=>1,'ï´'=>1,'ï´'=>1,'ï´‘'=>1,'ï´’'=>1,'ï´“'=>1,'ï´”'=>1,'ï´•'=>1,'ï´–'=>1,'ï´—'=>1,'ï´˜'=>1,'ï´™'=>1,'ï´š'=>1,'ï´›'=>1,'ï´œ'=>1,'ï´'=>1,'ï´ž'=>1,'ï´Ÿ'=>1,'ï´ '=>1,'ï´¡'=>1,'ï´¢'=>1,'ï´£'=>1,'ï´¤'=>1,'ï´¥'=>1,'ï´¦'=>1,'ï´§'=>1,'ï´¨'=>1,'ï´©'=>1,'ï´ª'=>1,'ï´«'=>1,'ï´¬'=>1,'ï´'=>1,'ï´®'=>1,'ï´¯'=>1,'ï´°'=>1,'ï´±'=>1,'ï´²'=>1,'ï´³'=>1,'ï´´'=>1,'ï´µ'=>1,'ï´¶'=>1,'ï´·'=>1,'ï´¸'=>1,'ï´¹'=>1,'ï´º'=>1,'ï´»'=>1,'ï´¼'=>1,'ï´½'=>1,'ïµ'=>1,'ﵑ'=>1,'ïµ’'=>1,'ﵓ'=>1,'ïµ”'=>1,'ﵕ'=>1,'ïµ–'=>1,'ïµ—'=>1,'ﵘ'=>1,'ïµ™'=>1,'ﵚ'=>1,'ïµ›'=>1,'ﵜ'=>1,'ïµ'=>1,'ﵞ'=>1,'ﵟ'=>1,'ïµ '=>1,'ﵡ'=>1,'ïµ¢'=>1,'ïµ£'=>1,'ﵤ'=>1,'ïµ¥'=>1,'ﵦ'=>1,'ïµ§'=>1,'ﵨ'=>1,'ﵩ'=>1,'ﵪ'=>1,'ﵫ'=>1,'ﵬ'=>1,'ïµ'=>1,'ïµ®'=>1,'ﵯ'=>1,'ïµ°'=>1,'ïµ±'=>1,'ïµ²'=>1,'ïµ³'=>1,'ïµ´'=>1,'ïµµ'=>1,'ïµ¶'=>1,'ïµ·'=>1,'ﵸ'=>1,'ïµ¹'=>1,'ﵺ'=>1,'ïµ»'=>1,'ïµ¼'=>1,'ïµ½'=>1,'ïµ¾'=>1,'ﵿ'=>1,'ï¶€'=>1,'ï¶'=>1,'ï¶‚'=>1,'ﶃ'=>1,'ï¶„'=>1,'ï¶…'=>1,'ﶆ'=>1,'ﶇ'=>1,'ﶈ'=>1,'ﶉ'=>1,'ï¶Š'=>1,'ï¶‹'=>1,'ï¶Œ'=>1,'ï¶'=>1,'ï¶Ž'=>1,'ï¶'=>1,'ï¶’'=>1,'ï¶“'=>1,'ï¶”'=>1,'ï¶•'=>1,'ï¶–'=>1,'ï¶—'=>1,'ﶘ'=>1,'ï¶™'=>1,'ï¶š'=>1,'ï¶›'=>1,'ï¶œ'=>1,'ï¶'=>1,'ï¶ž'=>1,'ï¶Ÿ'=>1,'ï¶ '=>1,'ï¶¡'=>1,'ï¶¢'=>1,'ï¶£'=>1,'ﶤ'=>1,'ï¶¥'=>1,'ﶦ'=>1,'ï¶§'=>1,'ﶨ'=>1,'ï¶©'=>1,'ﶪ'=>1,'ï¶«'=>1,'ﶬ'=>1,'ï¶'=>1,'ï¶®'=>1,'ﶯ'=>1,'ï¶°'=>1,'ï¶±'=>1,'ï¶²'=>1,'ï¶³'=>1,'ï¶´'=>1,'ï¶µ'=>1,'ï¶¶'=>1,'ï¶·'=>1,'ﶸ'=>1,'ï¶¹'=>1,'ﶺ'=>1,'ï¶»'=>1,'ï¶¼'=>1,'ï¶½'=>1,'ï¶¾'=>1,'ï¶¿'=>1,'ï·€'=>1,'ï·'=>1,'ï·‚'=>1,'ï·ƒ'=>1,'ï·„'=>1,'ï·…'=>1,'ï·†'=>1,'ï·‡'=>1,'ï·°'=>1,'ï·±'=>1,'ï·²'=>1,'ï·³'=>1,'ï·´'=>1,'ï·µ'=>1,'ï·¶'=>1,'ï··'=>1,'ï·¸'=>1,'ï·¹'=>1,'ï·º'=>1,'ï·»'=>1,'ï·¼'=>1,'ï¸'=>1,'︑'=>1,'︒'=>1,'︓'=>1,'︔'=>1,'︕'=>1,'︖'=>1,'︗'=>1,'︘'=>1,'︙'=>1,'︰'=>1,'︱'=>1,'︲'=>1,'︳'=>1,'︴'=>1,'︵'=>1,'︶'=>1,'︷'=>1,'︸'=>1,'︹'=>1,'︺'=>1,'︻'=>1,'︼'=>1,'︽'=>1,'︾'=>1,'︿'=>1,'ï¹€'=>1,'ï¹'=>1,'﹂'=>1,'﹃'=>1,'﹄'=>1,'﹇'=>1,'﹈'=>1,'﹉'=>1,'﹊'=>1,'﹋'=>1,'﹌'=>1,'ï¹'=>1,'﹎'=>1,'ï¹'=>1,'ï¹'=>1,'﹑'=>1,'ï¹’'=>1,'ï¹”'=>1,'﹕'=>1,'ï¹–'=>1,'ï¹—'=>1,'﹘'=>1,'ï¹™'=>1,'﹚'=>1,'ï¹›'=>1,'﹜'=>1,'ï¹'=>1,'﹞'=>1,'﹟'=>1,'ï¹ '=>1,'﹡'=>1,'ï¹¢'=>1,'ï¹£'=>1,'﹤'=>1,'ï¹¥'=>1,'﹦'=>1,'﹨'=>1,'﹩'=>1,'﹪'=>1,'﹫'=>1,'ï¹°'=>1,'ï¹±'=>1,'ï¹²'=>1,'ï¹´'=>1,'ï¹¶'=>1,'ï¹·'=>1,'ﹸ'=>1,'ï¹¹'=>1,'ﹺ'=>1,'ï¹»'=>1,'ï¹¼'=>1,'ï¹½'=>1,'ï¹¾'=>1,'ﹿ'=>1,'ﺀ'=>1,'ïº'=>1,'ﺂ'=>1,'ﺃ'=>1,'ﺄ'=>1,'ﺅ'=>1,'ﺆ'=>1,'ﺇ'=>1,'ﺈ'=>1,'ﺉ'=>1,'ﺊ'=>1,'ﺋ'=>1,'ﺌ'=>1,'ïº'=>1,'ﺎ'=>1,'ïº'=>1,'ïº'=>1,'ﺑ'=>1,'ﺒ'=>1,'ﺓ'=>1,'ﺔ'=>1,'ﺕ'=>1,'ﺖ'=>1,'ﺗ'=>1,'ﺘ'=>1,'ﺙ'=>1,'ﺚ'=>1,'ﺛ'=>1,'ﺜ'=>1,'ïº'=>1,'ﺞ'=>1,'ﺟ'=>1,'ﺠ'=>1,'ﺡ'=>1,'ﺢ'=>1,'ﺣ'=>1,'ﺤ'=>1,'ﺥ'=>1,'ﺦ'=>1,'ﺧ'=>1,'ﺨ'=>1,'ﺩ'=>1,'ﺪ'=>1,'ﺫ'=>1,'ﺬ'=>1,'ïº'=>1,'ﺮ'=>1,'ﺯ'=>1,'ﺰ'=>1,'ﺱ'=>1,'ﺲ'=>1,'ﺳ'=>1,'ﺴ'=>1,'ﺵ'=>1,'ﺶ'=>1,'ﺷ'=>1,'ﺸ'=>1,'ﺹ'=>1,'ﺺ'=>1,'ﺻ'=>1,'ﺼ'=>1,'ﺽ'=>1,'ﺾ'=>1,'ﺿ'=>1,'ﻀ'=>1,'ï»'=>1,'ﻂ'=>1,'ﻃ'=>1,'ﻄ'=>1,'ï»…'=>1,'ﻆ'=>1,'ﻇ'=>1,'ﻈ'=>1,'ﻉ'=>1,'ﻊ'=>1,'ﻋ'=>1,'ﻌ'=>1,'ï»'=>1,'ﻎ'=>1,'ï»'=>1,'ï»'=>1,'ﻑ'=>1,'ï»’'=>1,'ﻓ'=>1,'ï»”'=>1,'ﻕ'=>1,'ï»–'=>1,'ï»—'=>1,'ﻘ'=>1,'ï»™'=>1,'ﻚ'=>1,'ï»›'=>1,'ﻜ'=>1,'ï»'=>1,'ﻞ'=>1,'ﻟ'=>1,'ï» '=>1,'ﻡ'=>1,'ﻢ'=>1,'ﻣ'=>1,'ﻤ'=>1,'ﻥ'=>1,'ﻦ'=>1,'ï»§'=>1,'ﻨ'=>1,'ﻩ'=>1,'ﻪ'=>1,'ﻫ'=>1,'ﻬ'=>1,'ï»'=>1,'ï»®'=>1,'ﻯ'=>1,'ï»°'=>1,'ï»±'=>1,'ﻲ'=>1,'ﻳ'=>1,'ï»´'=>1,'ﻵ'=>1,'ï»¶'=>1,'ï»·'=>1,'ﻸ'=>1,'ﻹ'=>1,'ﻺ'=>1,'ï»»'=>1,'ﻼ'=>1,'ï¼'=>1,'"'=>1,'#'=>1,'$'=>1,'ï¼…'=>1,'&'=>1,'''=>1,'('=>1,')'=>1,'*'=>1,'+'=>1,','=>1,'ï¼'=>1,'.'=>1,'ï¼'=>1,'ï¼'=>1,'1'=>1,'ï¼’'=>1,'3'=>1,'ï¼”'=>1,'5'=>1,'ï¼–'=>1,'ï¼—'=>1,'8'=>1,'ï¼™'=>1,':'=>1,'ï¼›'=>1,'<'=>1,'ï¼'=>1,'>'=>1,'?'=>1,'ï¼ '=>1,'A'=>1,'ï¼¢'=>1,'ï¼£'=>1,'D'=>1,'ï¼¥'=>1,'F'=>1,'ï¼§'=>1,'H'=>1,'I'=>1,'J'=>1,'K'=>1,'L'=>1,'ï¼'=>1,'ï¼®'=>1,'O'=>1,'ï¼°'=>1,'ï¼±'=>1,'ï¼²'=>1,'ï¼³'=>1,'ï¼´'=>1,'ï¼µ'=>1,'ï¼¶'=>1,'ï¼·'=>1,'X'=>1,'ï¼¹'=>1,'Z'=>1,'ï¼»'=>1,'ï¼¼'=>1,'ï¼½'=>1,'ï¼¾'=>1,'_'=>1,'ï½€'=>1,'ï½'=>1,'b'=>1,'c'=>1,'d'=>1,'ï½…'=>1,'f'=>1,'g'=>1,'h'=>1,'i'=>1,'j'=>1,'k'=>1,'l'=>1,'ï½'=>1,'n'=>1,'ï½'=>1,'ï½'=>1,'q'=>1,'ï½’'=>1,'s'=>1,'ï½”'=>1,'u'=>1,'ï½–'=>1,'ï½—'=>1,'x'=>1,'ï½™'=>1,'z'=>1,'ï½›'=>1,'|'=>1,'ï½'=>1,'~'=>1,'⦅'=>1,'ï½ '=>1,'。'=>1,'ï½¢'=>1,'ï½£'=>1,'、'=>1,'ï½¥'=>1,'ヲ'=>1,'ï½§'=>1,'ィ'=>1,'ゥ'=>1,'ェ'=>1,'ォ'=>1,'ャ'=>1,'ï½'=>1,'ï½®'=>1,'ッ'=>1,'ï½°'=>1,'ï½±'=>1,'ï½²'=>1,'ï½³'=>1,'ï½´'=>1,'ï½µ'=>1,'ï½¶'=>1,'ï½·'=>1,'ク'=>1,'ï½¹'=>1,'コ'=>1,'ï½»'=>1,'ï½¼'=>1,'ï½½'=>1,'ï½¾'=>1,'ソ'=>1,'ï¾€'=>1,'ï¾'=>1,'ツ'=>1,'テ'=>1,'ト'=>1,'ï¾…'=>1,'ニ'=>1,'ヌ'=>1,'ネ'=>1,'ノ'=>1,'ハ'=>1,'ヒ'=>1,'フ'=>1,'ï¾'=>1,'ホ'=>1,'ï¾'=>1,'ï¾'=>1,'ム'=>1,'ï¾’'=>1,'モ'=>1,'ï¾”'=>1,'ユ'=>1,'ï¾–'=>1,'ï¾—'=>1,'リ'=>1,'ï¾™'=>1,'レ'=>1,'ï¾›'=>1,'ワ'=>1,'ï¾'=>1,'゙'=>1,'゚'=>1,'ï¾ '=>1,'ᄀ'=>1,'ï¾¢'=>1,'ï¾£'=>1,'ᄂ'=>1,'ï¾¥'=>1,'ᆭ'=>1,'ï¾§'=>1,'ᄄ'=>1,'ᄅ'=>1,'ᆰ'=>1,'ᆱ'=>1,'ᆲ'=>1,'ï¾'=>1,'ï¾®'=>1,'ᆵ'=>1,'ï¾°'=>1,'ï¾±'=>1,'ï¾²'=>1,'ï¾³'=>1,'ï¾´'=>1,'ï¾µ'=>1,'ï¾¶'=>1,'ï¾·'=>1,'ᄌ'=>1,'ï¾¹'=>1,'ᄎ'=>1,'ï¾»'=>1,'ï¾¼'=>1,'ï¾½'=>1,'ï¾¾'=>1,'ï¿‚'=>1,'ᅢ'=>1,'ï¿„'=>1,'ï¿…'=>1,'ᅥ'=>1,'ᅦ'=>1,'ᅧ'=>1,'ï¿‹'=>1,'ᅩ'=>1,'ï¿'=>1,'ᅫ'=>1,'ï¿'=>1,'ï¿’'=>1,'ï¿“'=>1,'ï¿”'=>1,'ï¿•'=>1,'ï¿–'=>1,'ï¿—'=>1,'ᅳ'=>1,'ï¿›'=>1,'ᅵ'=>1,'ï¿ '=>1,'ï¿¡'=>1,'ï¿¢'=>1,'ï¿£'=>1,'¦'=>1,'ï¿¥'=>1,'₩'=>1,'│'=>1,'ï¿©'=>1,'↑'=>1,'ï¿«'=>1,'↓'=>1,'ï¿'=>1,'ï¿®'=>1,'ð…ž'=>1,'ð…Ÿ'=>1,'ð… '=>1,'ð…¡'=>1,'ð…¢'=>1,'ð…£'=>1,'ð…¤'=>1,'ð†»'=>1,'ð†¼'=>1,'ð†½'=>1,'ð†¾'=>1,'ð†¿'=>1,'ð‡€'=>1,'ð€'=>1,'ð'=>1,'ð‚'=>1,'ðƒ'=>1,'ð„'=>1,'ð…'=>1,'ð†'=>1,'ð‡'=>1,'ðˆ'=>1,'ð‰'=>1,'ðŠ'=>1,'ð‹'=>1,'ðŒ'=>1,'ð'=>1,'ðŽ'=>1,'ð'=>1,'ð'=>1,'ð‘'=>1,'ð’'=>1,'ð“'=>1,'ð”'=>1,'ð•'=>1,'ð–'=>1,'ð—'=>1,'ð˜'=>1,'ð™'=>1,'ðš'=>1,'ð›'=>1,'ðœ'=>1,'ð'=>1,'ðž'=>1,'ðŸ'=>1,'ð '=>1,'ð¡'=>1,'ð¢'=>1,'ð£'=>1,'ð¤'=>1,'ð¥'=>1,'ð¦'=>1,'ð§'=>1,'ð¨'=>1,'ð©'=>1,'ðª'=>1,'ð«'=>1,'ð¬'=>1,'ð'=>1,'ð®'=>1,'ð¯'=>1,'ð°'=>1,'ð±'=>1,'ð²'=>1,'ð³'=>1,'ð´'=>1,'ðµ'=>1,'ð¶'=>1,'ð·'=>1,'ð¸'=>1,'ð¹'=>1,'ðº'=>1,'ð»'=>1,'ð¼'=>1,'ð½'=>1,'ð¾'=>1,'ð¿'=>1,'ð‘€'=>1,'ð‘'=>1,'ð‘‚'=>1,'ð‘ƒ'=>1,'ð‘„'=>1,'ð‘…'=>1,'ð‘†'=>1,'ð‘‡'=>1,'ð‘ˆ'=>1,'ð‘‰'=>1,'ð‘Š'=>1,'ð‘‹'=>1,'ð‘Œ'=>1,'ð‘'=>1,'ð‘Ž'=>1,'ð‘'=>1,'ð‘'=>1,'ð‘‘'=>1,'ð‘’'=>1,'ð‘“'=>1,'ð‘”'=>1,'ð‘–'=>1,'ð‘—'=>1,'ð‘˜'=>1,'ð‘™'=>1,'ð‘š'=>1,'ð‘›'=>1,'ð‘œ'=>1,'ð‘'=>1,'ð‘ž'=>1,'ð‘Ÿ'=>1,'ð‘ '=>1,'ð‘¡'=>1,'ð‘¢'=>1,'ð‘£'=>1,'ð‘¤'=>1,'ð‘¥'=>1,'ð‘¦'=>1,'ð‘§'=>1,'ð‘¨'=>1,'ð‘©'=>1,'ð‘ª'=>1,'ð‘«'=>1,'ð‘¬'=>1,'ð‘'=>1,'ð‘®'=>1,'ð‘¯'=>1,'ð‘°'=>1,'ð‘±'=>1,'ð‘²'=>1,'ð‘³'=>1,'ð‘´'=>1,'ð‘µ'=>1,'ð‘¶'=>1,'ð‘·'=>1,'ð‘¸'=>1,'ð‘¹'=>1,'ð‘º'=>1,'ð‘»'=>1,'ð‘¼'=>1,'ð‘½'=>1,'ð‘¾'=>1,'ð‘¿'=>1,'ð’€'=>1,'ð’'=>1,'ð’‚'=>1,'ð’ƒ'=>1,'ð’„'=>1,'ð’…'=>1,'ð’†'=>1,'ð’‡'=>1,'ð’ˆ'=>1,'ð’‰'=>1,'ð’Š'=>1,'ð’‹'=>1,'ð’Œ'=>1,'ð’'=>1,'ð’Ž'=>1,'ð’'=>1,'ð’'=>1,'ð’‘'=>1,'ð’’'=>1,'ð’“'=>1,'ð’”'=>1,'ð’•'=>1,'ð’–'=>1,'ð’—'=>1,'ð’˜'=>1,'ð’™'=>1,'ð’š'=>1,'ð’›'=>1,'ð’œ'=>1,'ð’ž'=>1,'ð’Ÿ'=>1,'ð’¢'=>1,'ð’¥'=>1,'ð’¦'=>1,'ð’©'=>1,'ð’ª'=>1,'ð’«'=>1,'ð’¬'=>1,'ð’®'=>1,'ð’¯'=>1,'ð’°'=>1,'ð’±'=>1,'ð’²'=>1,'ð’³'=>1,'ð’´'=>1,'ð’µ'=>1,'ð’¶'=>1,'ð’·'=>1,'ð’¸'=>1,'ð’¹'=>1,'ð’»'=>1,'ð’½'=>1,'ð’¾'=>1,'ð’¿'=>1,'ð“€'=>1,'ð“'=>1,'ð“‚'=>1,'ð“ƒ'=>1,'ð“…'=>1,'ð“†'=>1,'ð“‡'=>1,'ð“ˆ'=>1,'ð“‰'=>1,'ð“Š'=>1,'ð“‹'=>1,'ð“Œ'=>1,'ð“'=>1,'ð“Ž'=>1,'ð“'=>1,'ð“'=>1,'ð“‘'=>1,'ð“’'=>1,'ð““'=>1,'ð“”'=>1,'ð“•'=>1,'ð“–'=>1,'ð“—'=>1,'ð“˜'=>1,'ð“™'=>1,'ð“š'=>1,'ð“›'=>1,'ð“œ'=>1,'ð“'=>1,'ð“ž'=>1,'ð“Ÿ'=>1,'ð“ '=>1,'ð“¡'=>1,'ð“¢'=>1,'ð“£'=>1,'ð“¤'=>1,'ð“¥'=>1,'ð“¦'=>1,'ð“§'=>1,'ð“¨'=>1,'ð“©'=>1,'ð“ª'=>1,'ð“«'=>1,'ð“¬'=>1,'ð“'=>1,'ð“®'=>1,'ð“¯'=>1,'ð“°'=>1,'ð“±'=>1,'ð“²'=>1,'ð“³'=>1,'ð“´'=>1,'ð“µ'=>1,'ð“¶'=>1,'ð“·'=>1,'ð“¸'=>1,'ð“¹'=>1,'ð“º'=>1,'ð“»'=>1,'ð“¼'=>1,'ð“½'=>1,'ð“¾'=>1,'ð“¿'=>1,'ð”€'=>1,'ð”'=>1,'ð”‚'=>1,'ð”ƒ'=>1,'ð”„'=>1,'ð”…'=>1,'ð”‡'=>1,'ð”ˆ'=>1,'ð”‰'=>1,'ð”Š'=>1,'ð”'=>1,'ð”Ž'=>1,'ð”'=>1,'ð”'=>1,'ð”‘'=>1,'ð”’'=>1,'ð”“'=>1,'ð””'=>1,'ð”–'=>1,'ð”—'=>1,'ð”˜'=>1,'ð”™'=>1,'ð”š'=>1,'ð”›'=>1,'ð”œ'=>1,'ð”ž'=>1,'ð”Ÿ'=>1,'ð” '=>1,'ð”¡'=>1,'ð”¢'=>1,'ð”£'=>1,'ð”¤'=>1,'ð”¥'=>1,'ð”¦'=>1,'ð”§'=>1,'ð”¨'=>1,'ð”©'=>1,'ð”ª'=>1,'ð”«'=>1,'ð”¬'=>1,'ð”'=>1,'ð”®'=>1,'ð”¯'=>1,'ð”°'=>1,'ð”±'=>1,'ð”²'=>1,'ð”³'=>1,'ð”´'=>1,'ð”µ'=>1,'ð”¶'=>1,'ð”·'=>1,'ð”¸'=>1,'ð”¹'=>1,'ð”»'=>1,'ð”¼'=>1,'ð”½'=>1,'ð”¾'=>1,'ð•€'=>1,'ð•'=>1,'ð•‚'=>1,'ð•ƒ'=>1,'ð•„'=>1,'ð•†'=>1,'ð•Š'=>1,'ð•‹'=>1,'ð•Œ'=>1,'ð•'=>1,'ð•Ž'=>1,'ð•'=>1,'ð•'=>1,'ð•’'=>1,'ð•“'=>1,'ð•”'=>1,'ð••'=>1,'ð•–'=>1,'ð•—'=>1,'ð•˜'=>1,'ð•™'=>1,'ð•š'=>1,'ð•›'=>1,'ð•œ'=>1,'ð•'=>1,'ð•ž'=>1,'ð•Ÿ'=>1,'ð• '=>1,'ð•¡'=>1,'ð•¢'=>1,'ð•£'=>1,'ð•¤'=>1,'ð•¥'=>1,'ð•¦'=>1,'ð•§'=>1,'ð•¨'=>1,'ð•©'=>1,'ð•ª'=>1,'ð•«'=>1,'ð•¬'=>1,'ð•'=>1,'ð•®'=>1,'ð•¯'=>1,'ð•°'=>1,'ð•±'=>1,'ð•²'=>1,'ð•³'=>1,'ð•´'=>1,'ð•µ'=>1,'ð•¶'=>1,'ð•·'=>1,'ð•¸'=>1,'ð•¹'=>1,'ð•º'=>1,'ð•»'=>1,'ð•¼'=>1,'ð•½'=>1,'ð•¾'=>1,'ð•¿'=>1,'ð–€'=>1,'ð–'=>1,'ð–‚'=>1,'ð–ƒ'=>1,'ð–„'=>1,'ð–…'=>1,'ð–†'=>1,'ð–‡'=>1,'ð–ˆ'=>1,'ð–‰'=>1,'ð–Š'=>1,'ð–‹'=>1,'ð–Œ'=>1,'ð–'=>1,'ð–Ž'=>1,'ð–'=>1,'ð–'=>1,'ð–‘'=>1,'ð–’'=>1,'ð–“'=>1,'ð–”'=>1,'ð–•'=>1,'ð––'=>1,'ð–—'=>1,'ð–˜'=>1,'ð–™'=>1,'ð–š'=>1,'ð–›'=>1,'ð–œ'=>1,'ð–'=>1,'ð–ž'=>1,'ð–Ÿ'=>1,'ð– '=>1,'ð–¡'=>1,'ð–¢'=>1,'ð–£'=>1,'ð–¤'=>1,'ð–¥'=>1,'ð–¦'=>1,'ð–§'=>1,'ð–¨'=>1,'ð–©'=>1,'ð–ª'=>1,'ð–«'=>1,'ð–¬'=>1,'ð–'=>1,'ð–®'=>1,'ð–¯'=>1,'ð–°'=>1,'ð–±'=>1,'ð–²'=>1,'ð–³'=>1,'ð–´'=>1,'ð–µ'=>1,'ð–¶'=>1,'ð–·'=>1,'ð–¸'=>1,'ð–¹'=>1,'ð–º'=>1,'ð–»'=>1,'ð–¼'=>1,'ð–½'=>1,'ð–¾'=>1,'ð–¿'=>1,'ð—€'=>1,'ð—'=>1,'ð—‚'=>1,'ð—ƒ'=>1,'ð—„'=>1,'ð—…'=>1,'ð—†'=>1,'ð—‡'=>1,'ð—ˆ'=>1,'ð—‰'=>1,'ð—Š'=>1,'ð—‹'=>1,'ð—Œ'=>1,'ð—'=>1,'ð—Ž'=>1,'ð—'=>1,'ð—'=>1,'ð—‘'=>1,'ð—’'=>1,'ð—“'=>1,'ð—”'=>1,'ð—•'=>1,'ð—–'=>1,'ð——'=>1,'ð—˜'=>1,'ð—™'=>1,'ð—š'=>1,'ð—›'=>1,'ð—œ'=>1,'ð—'=>1,'ð—ž'=>1,'ð—Ÿ'=>1,'ð— '=>1,'ð—¡'=>1,'ð—¢'=>1,'ð—£'=>1,'ð—¤'=>1,'ð—¥'=>1,'ð—¦'=>1,'ð—§'=>1,'ð—¨'=>1,'ð—©'=>1,'ð—ª'=>1,'ð—«'=>1,'ð—¬'=>1,'ð—'=>1,'ð—®'=>1,'ð—¯'=>1,'ð—°'=>1,'ð—±'=>1,'ð—²'=>1,'ð—³'=>1,'ð—´'=>1,'ð—µ'=>1,'ð—¶'=>1,'ð—·'=>1,'ð—¸'=>1,'ð—¹'=>1,'ð—º'=>1,'ð—»'=>1,'ð—¼'=>1,'ð—½'=>1,'ð—¾'=>1,'ð—¿'=>1,'ð˜€'=>1,'ð˜'=>1,'ð˜‚'=>1,'ð˜ƒ'=>1,'ð˜„'=>1,'ð˜…'=>1,'ð˜†'=>1,'ð˜‡'=>1,'ð˜ˆ'=>1,'ð˜‰'=>1,'ð˜Š'=>1,'ð˜‹'=>1,'ð˜Œ'=>1,'ð˜'=>1,'ð˜Ž'=>1,'ð˜'=>1,'ð˜'=>1,'ð˜‘'=>1,'ð˜’'=>1,'ð˜“'=>1,'ð˜”'=>1,'ð˜•'=>1,'ð˜–'=>1,'ð˜—'=>1,'ð˜˜'=>1,'ð˜™'=>1,'ð˜š'=>1,'ð˜›'=>1,'ð˜œ'=>1,'ð˜'=>1,'ð˜ž'=>1,'ð˜Ÿ'=>1,'ð˜ '=>1,'ð˜¡'=>1,'ð˜¢'=>1,'ð˜£'=>1,'ð˜¤'=>1,'ð˜¥'=>1,'ð˜¦'=>1,'ð˜§'=>1,'ð˜¨'=>1,'ð˜©'=>1,'ð˜ª'=>1,'ð˜«'=>1,'ð˜¬'=>1,'ð˜'=>1,'ð˜®'=>1,'ð˜¯'=>1,'ð˜°'=>1,'ð˜±'=>1,'ð˜²'=>1,'ð˜³'=>1,'ð˜´'=>1,'ð˜µ'=>1,'ð˜¶'=>1,'ð˜·'=>1,'ð˜¸'=>1,'ð˜¹'=>1,'ð˜º'=>1,'ð˜»'=>1,'ð˜¼'=>1,'ð˜½'=>1,'ð˜¾'=>1,'ð˜¿'=>1,'ð™€'=>1,'ð™'=>1,'ð™‚'=>1,'ð™ƒ'=>1,'ð™„'=>1,'ð™…'=>1,'ð™†'=>1,'ð™‡'=>1,'ð™ˆ'=>1,'ð™‰'=>1,'ð™Š'=>1,'ð™‹'=>1,'ð™Œ'=>1,'ð™'=>1,'ð™Ž'=>1,'ð™'=>1,'ð™'=>1,'ð™‘'=>1,'ð™’'=>1,'ð™“'=>1,'ð™”'=>1,'ð™•'=>1,'ð™–'=>1,'ð™—'=>1,'ð™˜'=>1,'ð™™'=>1,'ð™š'=>1,'ð™›'=>1,'ð™œ'=>1,'ð™'=>1,'ð™ž'=>1,'ð™Ÿ'=>1,'ð™ '=>1,'ð™¡'=>1,'ð™¢'=>1,'ð™£'=>1,'ð™¤'=>1,'ð™¥'=>1,'ð™¦'=>1,'ð™§'=>1,'ð™¨'=>1,'ð™©'=>1,'ð™ª'=>1,'ð™«'=>1,'ð™¬'=>1,'ð™'=>1,'ð™®'=>1,'ð™¯'=>1,'ð™°'=>1,'ð™±'=>1,'ð™²'=>1,'ð™³'=>1,'ð™´'=>1,'ð™µ'=>1,'ð™¶'=>1,'ð™·'=>1,'ð™¸'=>1,'ð™¹'=>1,'ð™º'=>1,'ð™»'=>1,'ð™¼'=>1,'ð™½'=>1,'ð™¾'=>1,'ð™¿'=>1,'ðš€'=>1,'ðš'=>1,'ðš‚'=>1,'ðšƒ'=>1,'ðš„'=>1,'ðš…'=>1,'ðš†'=>1,'ðš‡'=>1,'ðšˆ'=>1,'ðš‰'=>1,'ðšŠ'=>1,'ðš‹'=>1,'ðšŒ'=>1,'ðš'=>1,'ðšŽ'=>1,'ðš'=>1,'ðš'=>1,'ðš‘'=>1,'ðš’'=>1,'ðš“'=>1,'ðš”'=>1,'ðš•'=>1,'ðš–'=>1,'ðš—'=>1,'ðš˜'=>1,'ðš™'=>1,'ðšš'=>1,'ðš›'=>1,'ðšœ'=>1,'ðš'=>1,'ðšž'=>1,'ðšŸ'=>1,'ðš '=>1,'ðš¡'=>1,'ðš¢'=>1,'ðš£'=>1,'ðš¤'=>1,'ðš¥'=>1,'ðš¨'=>1,'ðš©'=>1,'ðšª'=>1,'ðš«'=>1,'ðš¬'=>1,'ðš'=>1,'ðš®'=>1,'ðš¯'=>1,'ðš°'=>1,'ðš±'=>1,'ðš²'=>1,'ðš³'=>1,'ðš´'=>1,'ðšµ'=>1,'ðš¶'=>1,'ðš·'=>1,'ðš¸'=>1,'ðš¹'=>1,'ðšº'=>1,'ðš»'=>1,'ðš¼'=>1,'ðš½'=>1,'ðš¾'=>1,'ðš¿'=>1,'ð›€'=>1,'ð›'=>1,'ð›‚'=>1,'ð›ƒ'=>1,'ð›„'=>1,'ð›…'=>1,'ð›†'=>1,'ð›‡'=>1,'ð›ˆ'=>1,'ð›‰'=>1,'ð›Š'=>1,'ð›‹'=>1,'ð›Œ'=>1,'ð›'=>1,'ð›Ž'=>1,'ð›'=>1,'ð›'=>1,'ð›‘'=>1,'ð›’'=>1,'ð›“'=>1,'ð›”'=>1,'ð›•'=>1,'ð›–'=>1,'ð›—'=>1,'ð›˜'=>1,'ð›™'=>1,'ð›š'=>1,'ð››'=>1,'ð›œ'=>1,'ð›'=>1,'ð›ž'=>1,'ð›Ÿ'=>1,'ð› '=>1,'ð›¡'=>1,'ð›¢'=>1,'ð›£'=>1,'ð›¤'=>1,'ð›¥'=>1,'ð›¦'=>1,'ð›§'=>1,'ð›¨'=>1,'ð›©'=>1,'ð›ª'=>1,'ð›«'=>1,'ð›¬'=>1,'ð›'=>1,'ð›®'=>1,'ð›¯'=>1,'ð›°'=>1,'ð›±'=>1,'ð›²'=>1,'ð›³'=>1,'ð›´'=>1,'ð›µ'=>1,'ð›¶'=>1,'ð›·'=>1,'ð›¸'=>1,'ð›¹'=>1,'ð›º'=>1,'ð›»'=>1,'ð›¼'=>1,'ð›½'=>1,'ð›¾'=>1,'ð›¿'=>1,'ðœ€'=>1,'ðœ'=>1,'ðœ‚'=>1,'ðœƒ'=>1,'ðœ„'=>1,'ðœ…'=>1,'ðœ†'=>1,'ðœ‡'=>1,'ðœˆ'=>1,'ðœ‰'=>1,'ðœŠ'=>1,'ðœ‹'=>1,'ðœŒ'=>1,'ðœ'=>1,'ðœŽ'=>1,'ðœ'=>1,'ðœ'=>1,'ðœ‘'=>1,'ðœ’'=>1,'ðœ“'=>1,'ðœ”'=>1,'ðœ•'=>1,'ðœ–'=>1,'ðœ—'=>1,'ðœ˜'=>1,'ðœ™'=>1,'ðœš'=>1,'ðœ›'=>1,'ðœœ'=>1,'ðœ'=>1,'ðœž'=>1,'ðœŸ'=>1,'ðœ '=>1,'ðœ¡'=>1,'ðœ¢'=>1,'ðœ£'=>1,'ðœ¤'=>1,'ðœ¥'=>1,'ðœ¦'=>1,'ðœ§'=>1,'ðœ¨'=>1,'ðœ©'=>1,'ðœª'=>1,'ðœ«'=>1,'ðœ¬'=>1,'ðœ'=>1,'ðœ®'=>1,'ðœ¯'=>1,'ðœ°'=>1,'ðœ±'=>1,'ðœ²'=>1,'ðœ³'=>1,'ðœ´'=>1,'ðœµ'=>1,'ðœ¶'=>1,'ðœ·'=>1,'ðœ¸'=>1,'ðœ¹'=>1,'ðœº'=>1,'ðœ»'=>1,'ðœ¼'=>1,'ðœ½'=>1,'ðœ¾'=>1,'ðœ¿'=>1,'ð€'=>1,'ð'=>1,'ð‚'=>1,'ðƒ'=>1,'ð„'=>1,'ð…'=>1,'ð†'=>1,'ð‡'=>1,'ðˆ'=>1,'ð‰'=>1,'ðŠ'=>1,'ð‹'=>1,'ðŒ'=>1,'ð'=>1,'ðŽ'=>1,'ð'=>1,'ð'=>1,'ð‘'=>1,'ð’'=>1,'ð“'=>1,'ð”'=>1,'ð•'=>1,'ð–'=>1,'ð—'=>1,'ð˜'=>1,'ð™'=>1,'ðš'=>1,'ð›'=>1,'ðœ'=>1,'ð'=>1,'ðž'=>1,'ðŸ'=>1,'ð '=>1,'ð¡'=>1,'ð¢'=>1,'ð£'=>1,'ð¤'=>1,'ð¥'=>1,'ð¦'=>1,'ð§'=>1,'ð¨'=>1,'ð©'=>1,'ðª'=>1,'ð«'=>1,'ð¬'=>1,'ð'=>1,'ð®'=>1,'ð¯'=>1,'ð°'=>1,'ð±'=>1,'ð²'=>1,'ð³'=>1,'ð´'=>1,'ðµ'=>1,'ð¶'=>1,'ð·'=>1,'ð¸'=>1,'ð¹'=>1,'ðº'=>1,'ð»'=>1,'ð¼'=>1,'ð½'=>1,'ð¾'=>1,'ð¿'=>1,'ðž€'=>1,'ðž'=>1,'ðž‚'=>1,'ðžƒ'=>1,'ðž„'=>1,'ðž…'=>1,'ðž†'=>1,'ðž‡'=>1,'ðžˆ'=>1,'ðž‰'=>1,'ðžŠ'=>1,'ðž‹'=>1,'ðžŒ'=>1,'ðž'=>1,'ðžŽ'=>1,'ðž'=>1,'ðž'=>1,'ðž‘'=>1,'ðž’'=>1,'ðž“'=>1,'ðž”'=>1,'ðž•'=>1,'ðž–'=>1,'ðž—'=>1,'ðž˜'=>1,'ðž™'=>1,'ðžš'=>1,'ðž›'=>1,'ðžœ'=>1,'ðž'=>1,'ðžž'=>1,'ðžŸ'=>1,'ðž '=>1,'ðž¡'=>1,'ðž¢'=>1,'ðž£'=>1,'ðž¤'=>1,'ðž¥'=>1,'ðž¦'=>1,'ðž§'=>1,'ðž¨'=>1,'ðž©'=>1,'ðžª'=>1,'ðž«'=>1,'ðž¬'=>1,'ðž'=>1,'ðž®'=>1,'ðž¯'=>1,'ðž°'=>1,'ðž±'=>1,'ðž²'=>1,'ðž³'=>1,'ðž´'=>1,'ðžµ'=>1,'ðž¶'=>1,'ðž·'=>1,'ðž¸'=>1,'ðž¹'=>1,'ðžº'=>1,'ðž»'=>1,'ðž¼'=>1,'ðž½'=>1,'ðž¾'=>1,'ðž¿'=>1,'ðŸ€'=>1,'ðŸ'=>1,'ðŸ‚'=>1,'ðŸƒ'=>1,'ðŸ„'=>1,'ðŸ…'=>1,'ðŸ†'=>1,'ðŸ‡'=>1,'ðŸˆ'=>1,'ðŸ‰'=>1,'ðŸŠ'=>1,'ðŸ‹'=>1,'ðŸŽ'=>1,'ðŸ'=>1,'ðŸ'=>1,'ðŸ‘'=>1,'ðŸ’'=>1,'ðŸ“'=>1,'ðŸ”'=>1,'ðŸ•'=>1,'ðŸ–'=>1,'ðŸ—'=>1,'ðŸ˜'=>1,'ðŸ™'=>1,'ðŸš'=>1,'ðŸ›'=>1,'ðŸœ'=>1,'ðŸ'=>1,'ðŸž'=>1,'ðŸŸ'=>1,'ðŸ '=>1,'ðŸ¡'=>1,'ðŸ¢'=>1,'ðŸ£'=>1,'ðŸ¤'=>1,'ðŸ¥'=>1,'ðŸ¦'=>1,'ðŸ§'=>1,'ðŸ¨'=>1,'ðŸ©'=>1,'ðŸª'=>1,'ðŸ«'=>1,'ðŸ¬'=>1,'ðŸ'=>1,'ðŸ®'=>1,'ðŸ¯'=>1,'ðŸ°'=>1,'ðŸ±'=>1,'ðŸ²'=>1,'ðŸ³'=>1,'ðŸ´'=>1,'ðŸµ'=>1,'ðŸ¶'=>1,'ðŸ·'=>1,'ðŸ¸'=>1,'ðŸ¹'=>1,'ðŸº'=>1,'ðŸ»'=>1,'ðŸ¼'=>1,'ðŸ½'=>1,'ðŸ¾'=>1,'ðŸ¿'=>1,'丽'=>1,'ð¯ '=>1,'乁'=>1,'𠄢'=>1,'你'=>1,'侮'=>1,'侻'=>1,'倂'=>1,'偺'=>1,'備'=>1,'僧'=>1,'像'=>1,'㒞'=>1,'ð¯ '=>1,'免'=>1,'ð¯ '=>1,'ð¯ '=>1,'具'=>1,'𠔜'=>1,'㒹'=>1,'內'=>1,'再'=>1,'𠕋'=>1,'冗'=>1,'冤'=>1,'仌'=>1,'冬'=>1,'况'=>1,'𩇟'=>1,'ð¯ '=>1,'刃'=>1,'㓟'=>1,'刻'=>1,'剆'=>1,'割'=>1,'剷'=>1,'㔕'=>1,'勇'=>1,'勉'=>1,'勤'=>1,'勺'=>1,'包'=>1,'匆'=>1,'北'=>1,'卉'=>1,'ð¯ '=>1,'博'=>1,'即'=>1,'卽'=>1,'卿'=>1,'卿'=>1,'卿'=>1,'𠨬'=>1,'灰'=>1,'及'=>1,'叟'=>1,'𠭣'=>1,'叫'=>1,'叱'=>1,'吆'=>1,'咞'=>1,'吸'=>1,'呈'=>1,'周'=>1,'咢'=>1,'ð¯¡'=>1,'唐'=>1,'啓'=>1,'啣'=>1,'善'=>1,'善'=>1,'喙'=>1,'喫'=>1,'喳'=>1,'嗂'=>1,'圖'=>1,'嘆'=>1,'ð¯¡'=>1,'噑'=>1,'ð¯¡'=>1,'ð¯¡'=>1,'壮'=>1,'城'=>1,'埴'=>1,'堍'=>1,'型'=>1,'堲'=>1,'報'=>1,'墬'=>1,'𡓤'=>1,'売'=>1,'壷'=>1,'夆'=>1,'ð¯¡'=>1,'夢'=>1,'奢'=>1,'𡚨'=>1,'𡛪'=>1,'姬'=>1,'娛'=>1,'娧'=>1,'姘'=>1,'婦'=>1,'㛮'=>1,'㛼'=>1,'嬈'=>1,'嬾'=>1,'嬾'=>1,'𡧈'=>1,'ð¯¡'=>1,'寘'=>1,'寧'=>1,'寳'=>1,'𡬘'=>1,'寿'=>1,'将'=>1,'当'=>1,'尢'=>1,'㞁'=>1,'屠'=>1,'屮'=>1,'峀'=>1,'岍'=>1,'𡷤'=>1,'嵃'=>1,'𡷦'=>1,'嵮'=>1,'嵫'=>1,'嵼'=>1,'ð¯¢'=>1,'巢'=>1,'㠯'=>1,'巽'=>1,'帨'=>1,'帽'=>1,'幩'=>1,'㡢'=>1,'𢆃'=>1,'㡼'=>1,'庰'=>1,'庳'=>1,'ð¯¢'=>1,'廊'=>1,'ð¯¢'=>1,'ð¯¢'=>1,'𢌱'=>1,'𢌱'=>1,'舁'=>1,'弢'=>1,'弢'=>1,'㣇'=>1,'𣊸'=>1,'𦇚'=>1,'形'=>1,'彫'=>1,'㣣'=>1,'徚'=>1,'ð¯¢'=>1,'志'=>1,'忹'=>1,'悁'=>1,'㤺'=>1,'㤜'=>1,'悔'=>1,'𢛔'=>1,'惇'=>1,'慈'=>1,'慌'=>1,'慎'=>1,'慌'=>1,'慺'=>1,'憎'=>1,'憲'=>1,'ð¯¢'=>1,'憯'=>1,'懞'=>1,'懲'=>1,'懶'=>1,'成'=>1,'戛'=>1,'扝'=>1,'抱'=>1,'拔'=>1,'捐'=>1,'𢬌'=>1,'挽'=>1,'拼'=>1,'捨'=>1,'掃'=>1,'揤'=>1,'𢯱'=>1,'搢'=>1,'揅'=>1,'ð¯£'=>1,'㨮'=>1,'摩'=>1,'摾'=>1,'撝'=>1,'摷'=>1,'㩬'=>1,'敏'=>1,'敬'=>1,'𣀊'=>1,'旣'=>1,'書'=>1,'ð¯£'=>1,'㬙'=>1,'ð¯£'=>1,'ð¯£'=>1,'㫤'=>1,'冒'=>1,'冕'=>1,'最'=>1,'暜'=>1,'肭'=>1,'䏙'=>1,'朗'=>1,'望'=>1,'朡'=>1,'杞'=>1,'杓'=>1,'ð¯£'=>1,'㭉'=>1,'柺'=>1,'枅'=>1,'桒'=>1,'梅'=>1,'𣑭'=>1,'梎'=>1,'栟'=>1,'椔'=>1,'㮝'=>1,'楂'=>1,'榣'=>1,'槪'=>1,'檨'=>1,'𣚣'=>1,'ð¯£'=>1,'㰘'=>1,'次'=>1,'𣢧'=>1,'歔'=>1,'㱎'=>1,'歲'=>1,'殟'=>1,'殺'=>1,'殻'=>1,'𣪍'=>1,'𡴋'=>1,'𣫺'=>1,'汎'=>1,'𣲼'=>1,'沿'=>1,'泍'=>1,'汧'=>1,'洖'=>1,'派'=>1,'ð¯¤'=>1,'流'=>1,'浩'=>1,'浸'=>1,'涅'=>1,'𣴞'=>1,'洴'=>1,'港'=>1,'湮'=>1,'㴳'=>1,'滋'=>1,'滇'=>1,'ð¯¤'=>1,'淹'=>1,'ð¯¤'=>1,'ð¯¤'=>1,'𣾎'=>1,'濆'=>1,'瀹'=>1,'瀞'=>1,'瀛'=>1,'㶖'=>1,'灊'=>1,'災'=>1,'灷'=>1,'炭'=>1,'𠔥'=>1,'煅'=>1,'ð¯¤'=>1,'熜'=>1,'𤎫'=>1,'爨'=>1,'爵'=>1,'牐'=>1,'𤘈'=>1,'犀'=>1,'犕'=>1,'𤜵'=>1,'𤠔'=>1,'獺'=>1,'王'=>1,'㺬'=>1,'玥'=>1,'㺸'=>1,'ð¯¤'=>1,'瑇'=>1,'瑜'=>1,'瑱'=>1,'璅'=>1,'瓊'=>1,'㼛'=>1,'甤'=>1,'𤰶'=>1,'甾'=>1,'𤲒'=>1,'異'=>1,'𢆟'=>1,'瘐'=>1,'𤾡'=>1,'𤾸'=>1,'𥁄'=>1,'㿼'=>1,'䀈'=>1,'直'=>1,'ð¯¥'=>1,'𥃲'=>1,'𥄙'=>1,'𥄳'=>1,'眞'=>1,'真'=>1,'真'=>1,'睊'=>1,'䀹'=>1,'瞋'=>1,'䁆'=>1,'䂖'=>1,'ð¯¥'=>1,'硎'=>1,'ð¯¥'=>1,'ð¯¥'=>1,'䃣'=>1,'𥘦'=>1,'祖'=>1,'𥚚'=>1,'𥛅'=>1,'福'=>1,'秫'=>1,'䄯'=>1,'穀'=>1,'穊'=>1,'穏'=>1,'𥥼'=>1,'ð¯¥'=>1,'𥪧'=>1,'竮'=>1,'䈂'=>1,'𥮫'=>1,'篆'=>1,'築'=>1,'䈧'=>1,'𥲀'=>1,'糒'=>1,'䊠'=>1,'糨'=>1,'糣'=>1,'紀'=>1,'𥾆'=>1,'絣'=>1,'ð¯¥'=>1,'緇'=>1,'縂'=>1,'繅'=>1,'䌴'=>1,'𦈨'=>1,'𦉇'=>1,'䍙'=>1,'𦋙'=>1,'罺'=>1,'𦌾'=>1,'羕'=>1,'翺'=>1,'者'=>1,'𦓚'=>1,'𦔣'=>1,'聠'=>1,'𦖨'=>1,'聰'=>1,'𣍟'=>1,'ð¯¦'=>1,'育'=>1,'脃'=>1,'䐋'=>1,'脾'=>1,'媵'=>1,'𦞧'=>1,'𦞵'=>1,'𣎓'=>1,'𣎜'=>1,'舁'=>1,'舄'=>1,'ð¯¦'=>1,'䑫'=>1,'ð¯¦'=>1,'ð¯¦'=>1,'芝'=>1,'劳'=>1,'花'=>1,'芳'=>1,'芽'=>1,'苦'=>1,'𦬼'=>1,'若'=>1,'茝'=>1,'荣'=>1,'莭'=>1,'茣'=>1,'ð¯¦'=>1,'菧'=>1,'著'=>1,'荓'=>1,'菊'=>1,'菌'=>1,'菜'=>1,'𦰶'=>1,'𦵫'=>1,'𦳕'=>1,'䔫'=>1,'蓱'=>1,'蓳'=>1,'蔖'=>1,'𧏊'=>1,'蕤'=>1,'ð¯¦'=>1,'䕝'=>1,'䕡'=>1,'𦾱'=>1,'𧃒'=>1,'䕫'=>1,'虐'=>1,'虜'=>1,'虧'=>1,'虩'=>1,'蚩'=>1,'蚈'=>1,'蜎'=>1,'蛢'=>1,'蝹'=>1,'蜨'=>1,'蝫'=>1,'螆'=>1,'䗗'=>1,'蟡'=>1,'ð¯§'=>1,'䗹'=>1,'衠'=>1,'衣'=>1,'𧙧'=>1,'裗'=>1,'裞'=>1,'䘵'=>1,'裺'=>1,'㒻'=>1,'𧢮'=>1,'𧥦'=>1,'ð¯§'=>1,'䛇'=>1,'ð¯§'=>1,'ð¯§'=>1,'變'=>1,'豕'=>1,'𧲨'=>1,'貫'=>1,'賁'=>1,'贛'=>1,'起'=>1,'𧼯'=>1,'𠠄'=>1,'跋'=>1,'趼'=>1,'跰'=>1,'ð¯§'=>1,'軔'=>1,'輸'=>1,'𨗒'=>1,'𨗭'=>1,'邔'=>1,'郱'=>1,'鄑'=>1,'𨜮'=>1,'鄛'=>1,'鈸'=>1,'鋗'=>1,'鋘'=>1,'鉼'=>1,'鏹'=>1,'鐕'=>1,'ð¯§'=>1,'開'=>1,'䦕'=>1,'閷'=>1,'𨵷'=>1,'䧦'=>1,'雃'=>1,'嶲'=>1,'霣'=>1,'𩅅'=>1,'𩈚'=>1,'䩮'=>1,'䩶'=>1,'韠'=>1,'𩐊'=>1,'䪲'=>1,'𩒖'=>1,'頋'=>1,'頋'=>1,'頩'=>1,'ð¯¨'=>1,'飢'=>1,'䬳'=>1,'餩'=>1,'馧'=>1,'駂'=>1,'駾'=>1,'䯎'=>1,'𩬰'=>1,'鬒'=>1,'鱀'=>1,'鳽'=>1,'ð¯¨'=>1,'䳭'=>1,'ð¯¨'=>1,'ð¯¨'=>1,'䳸'=>1,'𪄅'=>1,'𪈎'=>1,'𪊑'=>1,'麻'=>1,'䵖'=>1,'黹'=>1,'黾'=>1,'鼅'=>1,'鼏'=>1,'鼖'=>1,'鼻'=>1,'ð¯¨'=>1,'Ì€'=>0,'Ì'=>0,'Ì‚'=>0,'̃'=>0,'Ì„'=>0,'̆'=>0,'̇'=>0,'̈'=>0,'̉'=>0,'ÌŠ'=>0,'Ì‹'=>0,'ÌŒ'=>0,'Ì'=>0,'Ì‘'=>0,'Ì“'=>0,'Ì”'=>0,'Ì›'=>0,'Ì£'=>0,'̤'=>0,'Ì¥'=>0,'̦'=>0,'̧'=>0,'̨'=>0,'Ì'=>0,'Ì®'=>0,'̰'=>0,'̱'=>0,'̸'=>0,'Í‚'=>0,'Í…'=>0,'Ù“'=>0,'Ù”'=>0,'Ù•'=>0,'़'=>0,'া'=>0,'à§—'=>0,'ା'=>0,'à–'=>0,'à—'=>0,'ா'=>0,'ௗ'=>0,'à±–'=>0,'ೂ'=>0,'ೕ'=>0,'à³–'=>0,'à´¾'=>0,'ൗ'=>0,'à·Š'=>0,'à·'=>0,'à·Ÿ'=>0,'ီ'=>0,'á…¡'=>0,'á…¢'=>0,'á…£'=>0,'á…¤'=>0,'á…¥'=>0,'á…¦'=>0,'á…§'=>0,'á…¨'=>0,'á…©'=>0,'á…ª'=>0,'á…«'=>0,'á…¬'=>0,'á…'=>0,'á…®'=>0,'á…¯'=>0,'á…°'=>0,'á…±'=>0,'á…²'=>0,'á…³'=>0,'á…´'=>0,'á…µ'=>0,'ᆨ'=>0,'ᆩ'=>0,'ᆪ'=>0,'ᆫ'=>0,'ᆬ'=>0,'á†'=>0,'ᆮ'=>0,'ᆯ'=>0,'ᆰ'=>0,'ᆱ'=>0,'ᆲ'=>0,'ᆳ'=>0,'ᆴ'=>0,'ᆵ'=>0,'ᆶ'=>0,'ᆷ'=>0,'ᆸ'=>0,'ᆹ'=>0,'ᆺ'=>0,'ᆻ'=>0,'ᆼ'=>0,'ᆽ'=>0,'ᆾ'=>0,'ᆿ'=>0,'ᇀ'=>0,'á‡'=>0,'ᇂ'=>0,'ᬵ'=>0,'ã‚™'=>0,'゚'=>0); diff --git a/phpBB/includes/utf/data/utf_normalizer_common.php b/phpBB/includes/utf/data/utf_normalizer_common.php deleted file mode 100644 index 2eb7feac69..0000000000 --- a/phpBB/includes/utf/data/utf_normalizer_common.php +++ /dev/null @@ -1,4 +0,0 @@ -<?php -$GLOBALS['utf_jamo_index']=array('á„€'=>44032,'á„'=>44620,'á„‚'=>45208,'ᄃ'=>45796,'á„„'=>46384,'á„…'=>46972,'ᄆ'=>47560,'ᄇ'=>48148,'ᄈ'=>48736,'ᄉ'=>49324,'ᄊ'=>49912,'á„‹'=>50500,'ᄌ'=>51088,'á„'=>51676,'ᄎ'=>52264,'á„'=>52852,'á„'=>53440,'á„‘'=>54028,'á„’'=>54616,'á…¡'=>0,'á…¢'=>28,'á…£'=>56,'á…¤'=>84,'á…¥'=>112,'á…¦'=>140,'á…§'=>168,'á…¨'=>196,'á…©'=>224,'á…ª'=>252,'á…«'=>280,'á…¬'=>308,'á…'=>336,'á…®'=>364,'á…¯'=>392,'á…°'=>420,'á…±'=>448,'á…²'=>476,'á…³'=>504,'á…´'=>532,'á…µ'=>560,'ᆧ'=>0,'ᆨ'=>1,'ᆩ'=>2,'ᆪ'=>3,'ᆫ'=>4,'ᆬ'=>5,'á†'=>6,'ᆮ'=>7,'ᆯ'=>8,'ᆰ'=>9,'ᆱ'=>10,'ᆲ'=>11,'ᆳ'=>12,'ᆴ'=>13,'ᆵ'=>14,'ᆶ'=>15,'ᆷ'=>16,'ᆸ'=>17,'ᆹ'=>18,'ᆺ'=>19,'ᆻ'=>20,'ᆼ'=>21,'ᆽ'=>22,'ᆾ'=>23,'ᆿ'=>24,'ᇀ'=>25,'á‡'=>26,'ᇂ'=>27); -$GLOBALS['utf_jamo_type']=array('á„€'=>0,'á„'=>0,'á„‚'=>0,'ᄃ'=>0,'á„„'=>0,'á„…'=>0,'ᄆ'=>0,'ᄇ'=>0,'ᄈ'=>0,'ᄉ'=>0,'ᄊ'=>0,'á„‹'=>0,'ᄌ'=>0,'á„'=>0,'ᄎ'=>0,'á„'=>0,'á„'=>0,'á„‘'=>0,'á„’'=>0,'á…¡'=>1,'á…¢'=>1,'á…£'=>1,'á…¤'=>1,'á…¥'=>1,'á…¦'=>1,'á…§'=>1,'á…¨'=>1,'á…©'=>1,'á…ª'=>1,'á…«'=>1,'á…¬'=>1,'á…'=>1,'á…®'=>1,'á…¯'=>1,'á…°'=>1,'á…±'=>1,'á…²'=>1,'á…³'=>1,'á…´'=>1,'á…µ'=>1,'ᆧ'=>2,'ᆨ'=>2,'ᆩ'=>2,'ᆪ'=>2,'ᆫ'=>2,'ᆬ'=>2,'á†'=>2,'ᆮ'=>2,'ᆯ'=>2,'ᆰ'=>2,'ᆱ'=>2,'ᆲ'=>2,'ᆳ'=>2,'ᆴ'=>2,'ᆵ'=>2,'ᆶ'=>2,'ᆷ'=>2,'ᆸ'=>2,'ᆹ'=>2,'ᆺ'=>2,'ᆻ'=>2,'ᆼ'=>2,'ᆽ'=>2,'ᆾ'=>2,'ᆿ'=>2,'ᇀ'=>2,'á‡'=>2,'ᇂ'=>2); -$GLOBALS['utf_combining_class']=array('Ì€'=>230,'Ì'=>230,'Ì‚'=>230,'̃'=>230,'Ì„'=>230,'Ì…'=>230,'̆'=>230,'̇'=>230,'̈'=>230,'̉'=>230,'ÌŠ'=>230,'Ì‹'=>230,'ÌŒ'=>230,'Ì'=>230,'ÌŽ'=>230,'Ì'=>230,'Ì'=>230,'Ì‘'=>230,'Ì’'=>230,'Ì“'=>230,'Ì”'=>230,'Ì•'=>232,'Ì–'=>220,'Ì—'=>220,'̘'=>220,'Ì™'=>220,'Ìš'=>232,'Ì›'=>216,'Ìœ'=>220,'Ì'=>220,'Ìž'=>220,'ÌŸ'=>220,'Ì '=>220,'Ì¡'=>202,'Ì¢'=>202,'Ì£'=>220,'̤'=>220,'Ì¥'=>220,'̦'=>220,'̧'=>202,'̨'=>202,'Ì©'=>220,'̪'=>220,'Ì«'=>220,'̬'=>220,'Ì'=>220,'Ì®'=>220,'̯'=>220,'̰'=>220,'̱'=>220,'̲'=>220,'̳'=>220,'Ì´'=>1,'̵'=>1,'̶'=>1,'Ì·'=>1,'̸'=>1,'̹'=>220,'̺'=>220,'Ì»'=>220,'̼'=>220,'̽'=>230,'̾'=>230,'Ì¿'=>230,'Í€'=>230,'Í'=>230,'Í‚'=>230,'̓'=>230,'Í„'=>230,'Í…'=>240,'͆'=>230,'͇'=>220,'͈'=>220,'͉'=>220,'ÍŠ'=>230,'Í‹'=>230,'ÍŒ'=>230,'Í'=>220,'ÍŽ'=>220,'Í'=>230,'Í‘'=>230,'Í’'=>230,'Í“'=>220,'Í”'=>220,'Í•'=>220,'Í–'=>220,'Í—'=>230,'͘'=>232,'Í™'=>220,'Íš'=>220,'Í›'=>230,'Íœ'=>233,'Í'=>234,'Íž'=>234,'ÍŸ'=>233,'Í '=>234,'Í¡'=>234,'Í¢'=>233,'Í£'=>230,'ͤ'=>230,'Í¥'=>230,'ͦ'=>230,'ͧ'=>230,'ͨ'=>230,'Í©'=>230,'ͪ'=>230,'Í«'=>230,'ͬ'=>230,'Í'=>230,'Í®'=>230,'ͯ'=>230,'Òƒ'=>230,'Ò„'=>230,'Ò…'=>230,'Ò†'=>230,'Ö‘'=>220,'Ö’'=>230,'Ö“'=>230,'Ö”'=>230,'Ö•'=>230,'Ö–'=>220,'Ö—'=>230,'Ö˜'=>230,'Ö™'=>230,'Öš'=>222,'Ö›'=>220,'Öœ'=>230,'Ö'=>230,'Öž'=>230,'ÖŸ'=>230,'Ö '=>230,'Ö¡'=>230,'Ö¢'=>220,'Ö£'=>220,'Ö¤'=>220,'Ö¥'=>220,'Ö¦'=>220,'Ö§'=>220,'Ö¨'=>230,'Ö©'=>230,'Öª'=>220,'Ö«'=>230,'Ö¬'=>230,'Ö'=>222,'Ö®'=>228,'Ö¯'=>230,'Ö°'=>10,'Ö±'=>11,'Ö²'=>12,'Ö³'=>13,'Ö´'=>14,'Öµ'=>15,'Ö¶'=>16,'Ö·'=>17,'Ö¸'=>18,'Ö¹'=>19,'Öº'=>19,'Ö»'=>20,'Ö¼'=>21,'Ö½'=>22,'Ö¿'=>23,'×'=>24,'ׂ'=>25,'ׄ'=>230,'×…'=>220,'ׇ'=>18,'Ø'=>230,'Ø‘'=>230,'Ø’'=>230,'Ø“'=>230,'Ø”'=>230,'Ø•'=>230,'Ù‹'=>27,'ÙŒ'=>28,'Ù'=>29,'ÙŽ'=>30,'Ù'=>31,'Ù'=>32,'Ù‘'=>33,'Ù’'=>34,'Ù“'=>230,'Ù”'=>230,'Ù•'=>220,'Ù–'=>220,'Ù—'=>230,'Ù˜'=>230,'Ù™'=>230,'Ùš'=>230,'Ù›'=>230,'Ùœ'=>220,'Ù'=>230,'Ùž'=>230,'Ù°'=>35,'Û–'=>230,'Û—'=>230,'Û˜'=>230,'Û™'=>230,'Ûš'=>230,'Û›'=>230,'Ûœ'=>230,'ÛŸ'=>230,'Û '=>230,'Û¡'=>230,'Û¢'=>230,'Û£'=>220,'Û¤'=>230,'Û§'=>230,'Û¨'=>230,'Ûª'=>220,'Û«'=>230,'Û¬'=>230,'Û'=>220,'Ü‘'=>36,'ܰ'=>230,'ܱ'=>220,'ܲ'=>230,'ܳ'=>230,'Ü´'=>220,'ܵ'=>230,'ܶ'=>230,'Ü·'=>220,'ܸ'=>220,'ܹ'=>220,'ܺ'=>230,'Ü»'=>220,'ܼ'=>220,'ܽ'=>230,'ܾ'=>220,'Ü¿'=>230,'Ý€'=>230,'Ý'=>230,'Ý‚'=>220,'݃'=>230,'Ý„'=>220,'Ý…'=>230,'݆'=>220,'݇'=>230,'݈'=>220,'݉'=>230,'ÝŠ'=>230,'ß«'=>230,'߬'=>230,'ß'=>230,'ß®'=>230,'߯'=>230,'ß°'=>230,'ß±'=>230,'ß²'=>220,'ß³'=>230,'़'=>7,'à¥'=>9,'॑'=>230,'॒'=>220,'॓'=>230,'॔'=>230,'়'=>7,'à§'=>9,'਼'=>7,'à©'=>9,'઼'=>7,'à«'=>9,'଼'=>7,'à'=>9,'à¯'=>9,'à±'=>9,'ౕ'=>84,'à±–'=>91,'಼'=>7,'à³'=>9,'àµ'=>9,'à·Š'=>9,'ุ'=>103,'ู'=>103,'ฺ'=>9,'่'=>107,'้'=>107,'๊'=>107,'๋'=>107,'ຸ'=>118,'ູ'=>118,'່'=>122,'້'=>122,'໊'=>122,'໋'=>122,'༘'=>220,'༙'=>220,'༵'=>220,'༷'=>220,'༹'=>216,'ཱ'=>129,'ི'=>130,'ུ'=>132,'ེ'=>130,'ཻ'=>130,'ོ'=>130,'ཽ'=>130,'ྀ'=>130,'ྂ'=>230,'ྃ'=>230,'྄'=>9,'྆'=>230,'྇'=>230,'࿆'=>220,'့'=>7,'္'=>9,'áŸ'=>230,'᜔'=>9,'᜴'=>9,'្'=>9,'áŸ'=>230,'ᢩ'=>228,'᤹'=>222,'᤺'=>230,'᤻'=>220,'ᨗ'=>230,'ᨘ'=>220,'᬴'=>7,'á„'=>9,'á«'=>230,'á¬'=>220,'á'=>230,'á®'=>230,'á¯'=>230,'á°'=>230,'á±'=>230,'á²'=>230,'á³'=>230,'á·€'=>230,'á·'=>230,'á·‚'=>220,'á·ƒ'=>230,'á·„'=>230,'á·…'=>230,'á·†'=>230,'á·‡'=>230,'á·ˆ'=>230,'á·‰'=>230,'á·Š'=>220,'á·¾'=>230,'á·¿'=>220,'âƒ'=>230,'⃑'=>230,'⃒'=>1,'⃓'=>1,'⃔'=>230,'⃕'=>230,'⃖'=>230,'⃗'=>230,'⃘'=>1,'⃙'=>1,'⃚'=>1,'⃛'=>230,'⃜'=>230,'⃡'=>230,'⃥'=>1,'⃦'=>1,'⃧'=>230,'⃨'=>220,'⃩'=>230,'⃪'=>1,'⃫'=>1,'⃬'=>220,'âƒ'=>220,'⃮'=>220,'⃯'=>220,'〪'=>218,'〫'=>228,'〬'=>232,'ã€'=>222,'〮'=>224,'〯'=>224,'ã‚™'=>8,'゚'=>8,'ê †'=>9,'ﬞ'=>26,'︠'=>230,'︡'=>230,'︢'=>230,'︣'=>230,'ð¨'=>220,'ð¨'=>230,'ð¨¸'=>230,'ð¨¹'=>1,'ð¨º'=>220,'ð¨¿'=>9,'ð…¥'=>216,'ð…¦'=>216,'ð…§'=>1,'ð…¨'=>1,'ð…©'=>1,'ð…'=>226,'ð…®'=>216,'ð…¯'=>216,'ð…°'=>216,'ð…±'=>216,'ð…²'=>216,'ð…»'=>220,'ð…¼'=>220,'ð…½'=>220,'ð…¾'=>220,'ð…¿'=>220,'ð†€'=>220,'ð†'=>220,'ð†‚'=>220,'ð†…'=>230,'ð††'=>230,'ð†‡'=>230,'ð†ˆ'=>230,'ð†‰'=>230,'ð†Š'=>220,'ð†‹'=>220,'ð†ª'=>230,'ð†«'=>230,'ð†¬'=>230,'ð†'=>230,'ð‰‚'=>230,'ð‰ƒ'=>230,'ð‰„'=>230); diff --git a/phpBB/includes/utf/utf_normalizer.php b/phpBB/includes/utf/utf_normalizer.php deleted file mode 100644 index bbb23a6617..0000000000 --- a/phpBB/includes/utf/utf_normalizer.php +++ /dev/null @@ -1,1509 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/** -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* Some Unicode characters encoded in UTF-8 -* -* Preserved for compatibility -*/ -define('UTF8_REPLACEMENT', "\xEF\xBF\xBD"); -define('UTF8_MAX', "\xF4\x8F\xBF\xBF"); -define('UTF8_FFFE', "\xEF\xBF\xBE"); -define('UTF8_FFFF', "\xEF\xBF\xBF"); -define('UTF8_SURROGATE_FIRST', "\xED\xA0\x80"); -define('UTF8_SURROGATE_LAST', "\xED\xBF\xBF"); -define('UTF8_HANGUL_FIRST', "\xEA\xB0\x80"); -define('UTF8_HANGUL_LAST', "\xED\x9E\xA3"); - -define('UTF8_CJK_FIRST', "\xE4\xB8\x80"); -define('UTF8_CJK_LAST', "\xE9\xBE\xBB"); -define('UTF8_CJK_B_FIRST', "\xF0\xA0\x80\x80"); -define('UTF8_CJK_B_LAST', "\xF0\xAA\x9B\x96"); - -// Unset global variables -unset($GLOBALS['utf_jamo_index'], $GLOBALS['utf_jamo_type'], $GLOBALS['utf_nfc_qc'], $GLOBALS['utf_combining_class'], $GLOBALS['utf_canonical_comp'], $GLOBALS['utf_canonical_decomp'], $GLOBALS['utf_nfkc_qc'], $GLOBALS['utf_compatibility_decomp']); - -// NFC_QC and NFKC_QC values -define('UNICODE_QC_MAYBE', 0); -define('UNICODE_QC_NO', 1); - -// Contains all the ASCII characters appearing in UTF-8, sorted by frequency -define('UTF8_ASCII_RANGE', "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"); - -// Contains all the tail bytes that can appear in the composition of a UTF-8 char -define('UTF8_TRAILING_BYTES', "\xA9\xA0\xA8\x80\xAA\x99\xA7\xBB\xAB\x89\x94\x82\xB4\xA2\xAE\x83\xB0\xB9\xB8\x93\xAF\xBC\xB3\x81\xA4\xB2\x9C\xA1\xB5\xBE\xBD\xBA\x98\xAD\xB1\x84\x95\xA6\xB6\x88\x8D\x90\xB7\xBF\x92\x85\xA5\x97\x8C\x86\xA3\x8E\x9F\x8F\x87\x91\x9D\xAC\x9E\x8B\x96\x9B\x8A\x9A"); - -// Constants used by the Hangul [de]composition algorithms -define('UNICODE_HANGUL_SBASE', 0xAC00); -define('UNICODE_HANGUL_LBASE', 0x1100); -define('UNICODE_HANGUL_VBASE', 0x1161); -define('UNICODE_HANGUL_TBASE', 0x11A7); -define('UNICODE_HANGUL_SCOUNT', 11172); -define('UNICODE_HANGUL_LCOUNT', 19); -define('UNICODE_HANGUL_VCOUNT', 21); -define('UNICODE_HANGUL_TCOUNT', 28); -define('UNICODE_HANGUL_NCOUNT', 588); -define('UNICODE_JAMO_L', 0); -define('UNICODE_JAMO_V', 1); -define('UNICODE_JAMO_T', 2); - -/** -* Unicode normalization routines -*/ -class utf_normalizer -{ -	/** -	* Validate, cleanup and normalize a string -	* -	* The ultimate convenience function! Clean up invalid UTF-8 sequences, -	* and convert to Normal Form C, canonical composition. -	* -	* @param	string	&$str	The dirty string -	* @return	string			The same string, all shiny and cleaned-up -	*/ -	static function cleanup(&$str) -	{ -		// The string below is the list of all autorized characters, sorted by frequency in latin text -		$pos = strspn($str, "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x0D"); -		$len = strlen($str); - -		if ($pos == $len) -		{ -			// ASCII strings with no special chars return immediately -			return; -		} - -		// Note: we do not check for $GLOBALS['utf_canonical_decomp']. It is assumed they are always loaded together -		if (!isset($GLOBALS['utf_nfc_qc'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_nfc_qc.' . $phpEx); -		} - -		if (!isset($GLOBALS['utf_canonical_decomp'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_canonical_decomp.' . $phpEx); -		} - -		// Replace any byte in the range 0x00..0x1F, except for \r, \n and \t -		// We replace those characters with a 0xFF byte, which is illegal in UTF-8 and will in turn be replaced with a UTF replacement char -		$str = strtr( -			$str, -			"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", -			"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" -		); - -		$str = utf_normalizer::recompose($str, $pos, $len, $GLOBALS['utf_nfc_qc'], $GLOBALS['utf_canonical_decomp']); -	} - -	/** -	* Validate and normalize a UTF string to NFC -	* -	* @param	string	&$str	Unchecked UTF string -	* @return	string			The string, validated and in normal form -	*/ -	static function nfc(&$str) -	{ -		$pos = strspn($str, UTF8_ASCII_RANGE); -		$len = strlen($str); - -		if ($pos == $len) -		{ -			// ASCII strings return immediately -			return; -		} - -		if (!isset($GLOBALS['utf_nfc_qc'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_nfc_qc.' . $phpEx); -		} - -		if (!isset($GLOBALS['utf_canonical_decomp'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_canonical_decomp.' . $phpEx); -		} - -		$str = utf_normalizer::recompose($str, $pos, $len, $GLOBALS['utf_nfc_qc'], $GLOBALS['utf_canonical_decomp']); -	} - -	/** -	* Validate and normalize a UTF string to NFKC -	* -	* @param	string	&$str	Unchecked UTF string -	* @return	string			The string, validated and in normal form -	*/ -	static function nfkc(&$str) -	{ -		$pos = strspn($str, UTF8_ASCII_RANGE); -		$len = strlen($str); - -		if ($pos == $len) -		{ -			// ASCII strings return immediately -			return; -		} - -		if (!isset($GLOBALS['utf_nfkc_qc'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_nfkc_qc.' . $phpEx); -		} - -		if (!isset($GLOBALS['utf_compatibility_decomp'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_compatibility_decomp.' . $phpEx); -		} - -		$str = utf_normalizer::recompose($str, $pos, $len, $GLOBALS['utf_nfkc_qc'], $GLOBALS['utf_compatibility_decomp']); -	} - -	/** -	* Validate and normalize a UTF string to NFD -	* -	* @param	string	&$str	Unchecked UTF string -	* @return	string			The string, validated and in normal form -	*/ -	static function nfd(&$str) -	{ -		$pos = strspn($str, UTF8_ASCII_RANGE); -		$len = strlen($str); - -		if ($pos == $len) -		{ -			// ASCII strings return immediately -			return; -		} - -		if (!isset($GLOBALS['utf_canonical_decomp'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_canonical_decomp.' . $phpEx); -		} - -		$str = utf_normalizer::decompose($str, $pos, $len, $GLOBALS['utf_canonical_decomp']); -	} - -	/** -	* Validate and normalize a UTF string to NFKD -	* -	* @param	string	&$str	Unchecked UTF string -	* @return	string			The string, validated and in normal form -	*/ -	static function nfkd(&$str) -	{ -		$pos = strspn($str, UTF8_ASCII_RANGE); -		$len = strlen($str); - -		if ($pos == $len) -		{ -			// ASCII strings return immediately -			return; -		} - -		if (!isset($GLOBALS['utf_compatibility_decomp'])) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_compatibility_decomp.' . $phpEx); -		} - -		$str = utf_normalizer::decompose($str, $pos, $len, $GLOBALS['utf_compatibility_decomp']); -	} - - -	/** -	* Recompose a UTF string -	* -	* @param	string	$str			Unchecked UTF string -	* @param	integer	$pos			Position of the first UTF char (in bytes) -	* @param	integer	$len			Length of the string (in bytes) -	* @param	array	&$qc			Quick-check array, passed by reference but never modified -	* @param	array	&$decomp_map	Decomposition mapping, passed by reference but never modified -	* @return	string					The string, validated and recomposed -	* -	* @access	private -	*/ -	static function recompose($str, $pos, $len, &$qc, &$decomp_map) -	{ -		global $utf_combining_class, $utf_canonical_comp, $utf_jamo_type, $utf_jamo_index; - -		// Load some commonly-used tables -		if (!isset($utf_jamo_index, $utf_jamo_type, $utf_combining_class)) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_normalizer_common.' . $phpEx); -		} - -		// Load the canonical composition table -		if (!isset($utf_canonical_comp)) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_canonical_comp.' . $phpEx); -		} - -		// Buffer the last ASCII char before the UTF-8 stuff if applicable -		$tmp = ''; -		$i = $tmp_pos = $last_cc = 0; - -		$buffer = ($pos) ? array(++$i => $str[$pos - 1]) : array(); - -		// UTF char length array -		// This array is used to determine the length of a UTF character. -		// Be $c the result of ($str[$pos] & "\xF0") --where $str is the string we're operating on and $pos -		// the position of the cursor--, if $utf_len_mask[$c] does not exist, the byte is an ASCII char. -		// Otherwise, if $utf_len_mask[$c] is greater than 0, we have a the leading byte of a multibyte character -		// whose length is $utf_len_mask[$c] and if it is equal to 0, the byte is a trailing byte. -		$utf_len_mask = array( -			// Leading bytes masks -			"\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4, -			// Trailing bytes masks -			"\x80" => 0, "\x90" => 0, "\xA0" => 0, "\xB0" => 0 -		); - -		$extra_check = array( -			"\xED" => 1, "\xEF" => 1, "\xC0" => 1, "\xC1" => 1, "\xE0" => 1, "\xF0" => 1, -			"\xF4" => 1, "\xF5" => 1, "\xF6" => 1, "\xF7" => 1, "\xF8" => 1, "\xF9" => 1, -			"\xFA" => 1, "\xFB" => 1, "\xFC" => 1, "\xFD" => 1, "\xFE" => 1, "\xFF" => 1 -		); - -		$utf_validation_mask = array( -			2	=> "\xE0\xC0", -			3	=> "\xF0\xC0\xC0", -			4	=> "\xF8\xC0\xC0\xC0" -		); - -		$utf_validation_check = array( -			2	=> "\xC0\x80", -			3	=> "\xE0\x80\x80", -			4	=> "\xF0\x80\x80\x80" -		); - -		// Main loop -		do -		{ -			// STEP 0: Capture the current char and buffer it -			$c = $str[$pos]; -			$c_mask = $c & "\xF0"; - -			if (isset($utf_len_mask[$c_mask])) -			{ -				// Byte at $pos is either a leading byte or a missplaced trailing byte -				if ($utf_len = $utf_len_mask[$c_mask]) -				{ -					// Capture the char -					$buffer[++$i & 7] = $utf_char = substr($str, $pos, $utf_len); - -					// Let's find out if a thorough check is needed -					if (isset($qc[$utf_char])) -					{ -						// If the UTF char is in the qc array then it may not be in normal form. We do nothing here, the actual processing is below this "if" block -					} -					else if (isset($utf_combining_class[$utf_char])) -					{ -						if ($utf_combining_class[$utf_char] < $last_cc) -						{ -							// A combining character that is NOT canonically ordered -						} -						else -						{ -							// A combining character that IS canonically ordered, skip to the next char -							$last_cc = $utf_combining_class[$utf_char]; - -							$pos += $utf_len; -							continue; -						} -					} -					else -					{ -						// At this point, $utf_char holds a UTF char that we know is not a NF[K]C_QC and is not a combining character. -						// It can be a singleton, a canonical composite, a replacement char or an even an ill-formed bunch of bytes. Let's find out -						$last_cc = 0; - -						// Check that we have the correct number of trailing bytes -						if (($utf_char & $utf_validation_mask[$utf_len]) != $utf_validation_check[$utf_len]) -						{ -							// Current char isn't well-formed or legal: either one or several trailing bytes are missing, or the Unicode char -							// has been encoded in a five- or six- byte sequence -							if ($utf_char[0] >= "\xF8") -							{ -								if ($utf_char[0] < "\xFC") -								{ -									$trailing_bytes = 4; -								} -								else if ($utf_char[0] > "\xFD") -								{ -									$trailing_bytes = 0; -								} -								else -								{ -									$trailing_bytes = 5; -								} -							} -							else -							{ -								$trailing_bytes = $utf_len - 1; -							} - -							$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -							$pos += strspn($str, UTF8_TRAILING_BYTES, ++$pos, $trailing_bytes); -							$tmp_pos = $pos; - -							continue; -						} - -						if (isset($extra_check[$c])) -						{ -							switch ($c) -							{ -								// Note: 0xED is quite common in Korean -								case "\xED": -									if ($utf_char >= "\xED\xA0\x80") -									{ -										// Surrogates (U+D800..U+DFFF) are not allowed in UTF-8 (UTF sequence 0xEDA080..0xEDBFBF) -										$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -										$pos += $utf_len; -										$tmp_pos = $pos; -										continue 2; -									} -								break; - -								// Note: 0xEF is quite common in Japanese -								case "\xEF": -									if ($utf_char == "\xEF\xBF\xBE" || $utf_char == "\xEF\xBF\xBF") -									{ -										// U+FFFE and U+FFFF are explicitly disallowed (UTF sequence 0xEFBFBE..0xEFBFBF) -										$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -										$pos += $utf_len; -										$tmp_pos = $pos; -										continue 2; -									} -								break; - -								case "\xC0": -								case "\xC1": -									if ($utf_char <= "\xC1\xBF") -									{ -										// Overlong sequence: Unicode char U+0000..U+007F encoded as a double-byte UTF char -										$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -										$pos += $utf_len; -										$tmp_pos = $pos; -										continue 2; -									} -								break; - -								case "\xE0": -									if ($utf_char <= "\xE0\x9F\xBF") -									{ -										// Unicode char U+0000..U+07FF encoded in 3 bytes -										$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -										$pos += $utf_len; -										$tmp_pos = $pos; -										continue 2; -									} -								break; - -								case "\xF0": -									if ($utf_char <= "\xF0\x8F\xBF\xBF") -									{ -										// Unicode char U+0000..U+FFFF encoded in 4 bytes -										$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -										$pos += $utf_len; -										$tmp_pos = $pos; -										continue 2; -									} -								break; - -								default: -									// Five- and six- byte sequences do not need being checked for here anymore -									if ($utf_char > UTF8_MAX) -									{ -										// Out of the Unicode range -										if ($utf_char[0] < "\xF8") -										{ -											$trailing_bytes = 3; -										} -										else if ($utf_char[0] < "\xFC") -										{ -											$trailing_bytes = 4; -										} -										else if ($utf_char[0] > "\xFD") -										{ -											$trailing_bytes = 0; -										} -										else -										{ -											$trailing_bytes = 5; -										} - -										$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . UTF8_REPLACEMENT; -										$pos += strspn($str, UTF8_TRAILING_BYTES, ++$pos, $trailing_bytes); -										$tmp_pos = $pos; -										continue 2; -									} -								break; -							} -						} - -						// The char is a valid starter, move the cursor and go on -						$pos += $utf_len; -						continue; -					} -				} -				else -				{ -					// A trailing byte came out of nowhere, we will advance the cursor and treat the this byte and all following trailing bytes as if -					// each of them was a Unicode replacement char -					$spn = strspn($str, UTF8_TRAILING_BYTES, $pos); -					$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . str_repeat(UTF8_REPLACEMENT, $spn); - -					$pos += $spn; -					$tmp_pos = $pos; -					continue; -				} - -				// STEP 1: Decompose current char - -				// We have found a character that is either: -				//  - in the NFC_QC/NFKC_QC list -				//  - a non-starter char that is not canonically ordered -				// -				// We are going to capture the shortest UTF sequence that satisfies these two conditions: -				// -				//  1 - If the sequence does not start at the begginning of the string, it must begin with a starter, -				// and that starter must not have the NF[K]C_QC property equal to "MAYBE" -				// -				//  2 - If the sequence does not end at the end of the string, it must end with a non-starter and be -				// immediately followed by a starter that is not on the QC list -				// -				$utf_seq = array(); -				$last_cc = 0; -				$lpos = $pos; -				$pos += $utf_len; - -				if (isset($decomp_map[$utf_char])) -				{ -					$_pos = 0; -					$_len = strlen($decomp_map[$utf_char]); - -					do -					{ -						$_utf_len =& $utf_len_mask[$decomp_map[$utf_char][$_pos] & "\xF0"]; - -						if (isset($_utf_len)) -						{ -							$utf_seq[] = substr($decomp_map[$utf_char], $_pos, $_utf_len); -							$_pos += $_utf_len; -						} -						else -						{ -							$utf_seq[] = $decomp_map[$utf_char][$_pos]; -							++$_pos; -						} -					} -					while ($_pos < $_len); -				} -				else -				{ -					// The char is not decomposable -					$utf_seq = array($utf_char); -				} - -				// STEP 2: Capture the starter - -				// Check out the combining class of the first character of the UTF sequence -				$k = 0; -				if (isset($utf_combining_class[$utf_seq[0]]) || $qc[$utf_char] == UNICODE_QC_MAYBE) -				{ -					// Not a starter, inspect previous characters -					// The last 8 characters are kept in a buffer so that we don't have to capture them everytime. -					// This is enough for all real-life strings but even if it wasn't, we can capture characters in backward mode, -					// although it is slower than this method. -					// -					// In the following loop, $j starts at the previous buffered character ($i - 1, because current character is -					// at offset $i) and process them in backward mode until we find a starter. -					// -					// $k is the index on each UTF character inside of our UTF sequence. At this time, $utf_seq contains one or more -					// characters numbered 0 to n. $k starts at 0 and for each char we prepend we pre-decrement it and for numbering -					$starter_found = 0; -					$j_min = max(1, $i - 7); - -					for ($j = $i - 1; $j >= $j_min && $lpos > $tmp_pos; --$j) -					{ -						$utf_char = $buffer[$j & 7]; -						$lpos -= strlen($utf_char); - -						if (isset($decomp_map[$utf_char])) -						{ -							// The char is a composite, decompose for storage -							$decomp_seq = array(); -							$_pos = 0; -							$_len = strlen($decomp_map[$utf_char]); - -							do -							{ -								$c = $decomp_map[$utf_char][$_pos]; -								$_utf_len =& $utf_len_mask[$c & "\xF0"]; - -								if (isset($_utf_len)) -								{ -									$decomp_seq[] = substr($decomp_map[$utf_char], $_pos, $_utf_len); -									$_pos += $_utf_len; -								} -								else -								{ -									$decomp_seq[] = $c; -									++$_pos; -								} -							} -							while ($_pos < $_len); - -							// Prepend the UTF sequence with our decomposed sequence -							if (isset($decomp_seq[1])) -							{ -								// The char expanded into several chars -								$decomp_cnt = sizeof($decomp_seq); - -								foreach ($decomp_seq as $decomp_i => $decomp_char) -								{ -									$utf_seq[$k + $decomp_i - $decomp_cnt] = $decomp_char; -								} -								$k -= $decomp_cnt; -							} -							else -							{ -								// Decomposed to a single char, easier to prepend -								$utf_seq[--$k] = $decomp_seq[0]; -							} -						} -						else -						{ -							$utf_seq[--$k] = $utf_char; -						} - -						if (!isset($utf_combining_class[$utf_seq[$k]])) -						{ -							// We have found our starter -							$starter_found = 1; -							break; -						} -					} - -					if (!$starter_found && $lpos > $tmp_pos) -					{ -						// The starter was not found in the buffer, let's rewind some more -						do -						{ -							// $utf_len_mask contains the masks of both leading bytes and trailing bytes. If $utf_en > 0 then it's a leading byte, otherwise it's a trailing byte. -							$c = $str[--$lpos]; -							$c_mask = $c & "\xF0"; - -							if (isset($utf_len_mask[$c_mask])) -							{ -								// UTF byte -								if ($utf_len = $utf_len_mask[$c_mask]) -								{ -									// UTF *leading* byte -									$utf_char = substr($str, $lpos, $utf_len); - -									if (isset($decomp_map[$utf_char])) -									{ -										// Decompose the character -										$decomp_seq = array(); -										$_pos = 0; -										$_len = strlen($decomp_map[$utf_char]); - -										do -										{ -											$c = $decomp_map[$utf_char][$_pos]; -											$_utf_len =& $utf_len_mask[$c & "\xF0"]; - -											if (isset($_utf_len)) -											{ -												$decomp_seq[] = substr($decomp_map[$utf_char], $_pos, $_utf_len); -												$_pos += $_utf_len; -											} -											else -											{ -												$decomp_seq[] = $c; -												++$_pos; -											} -										} -										while ($_pos < $_len); - -										// Prepend the UTF sequence with our decomposed sequence -										if (isset($decomp_seq[1])) -										{ -											// The char expanded into several chars -											$decomp_cnt = sizeof($decomp_seq); -											foreach ($decomp_seq as $decomp_i => $utf_char) -											{ -												$utf_seq[$k + $decomp_i - $decomp_cnt] = $utf_char; -											} -											$k -= $decomp_cnt; -										} -										else -										{ -											// Decomposed to a single char, easier to prepend -											$utf_seq[--$k] = $decomp_seq[0]; -										} -									} -									else -									{ -										$utf_seq[--$k] = $utf_char; -									} -								} -							} -							else -							{ -								// ASCII char -								$utf_seq[--$k] = $c; -							} -						} -						while ($lpos > $tmp_pos); -					} -				} - -				// STEP 3: Capture following combining modifiers - -				while ($pos < $len) -				{ -					$c_mask = $str[$pos] & "\xF0"; - -					if (isset($utf_len_mask[$c_mask])) -					{ -						if ($utf_len = $utf_len_mask[$c_mask]) -						{ -							$utf_char = substr($str, $pos, $utf_len); -						} -						else -						{ -							// A trailing byte came out of nowhere -							// Trailing bytes are replaced with Unicode replacement chars, we will just ignore it for now, break out of the loop -							// as if it was a starter (replacement chars ARE starters) and let the next loop replace it -							break; -						} - -						if (isset($utf_combining_class[$utf_char]) || isset($qc[$utf_char])) -						{ -							// Combining character, add it to the sequence and move the cursor -							if (isset($decomp_map[$utf_char])) -							{ -								// Decompose the character -								$_pos = 0; -								$_len = strlen($decomp_map[$utf_char]); - -								do -								{ -									$c = $decomp_map[$utf_char][$_pos]; -									$_utf_len =& $utf_len_mask[$c & "\xF0"]; - -									if (isset($_utf_len)) -									{ -										$utf_seq[] = substr($decomp_map[$utf_char], $_pos, $_utf_len); -										$_pos += $_utf_len; -									} -									else -									{ -										$utf_seq[] = $c; -										++$_pos; -									} -								} -								while ($_pos < $_len); -							} -							else -							{ -								$utf_seq[] = $utf_char; -							} - -							$pos += $utf_len; -						} -						else -						{ -							// Combining class 0 and no QC, break out of the loop -							// Note: we do not know if that character is valid. If it's not, the next iteration will replace it -							break; -						} -					} -					else -					{ -						// ASCII chars are starters -						break; -					} -				} - -				// STEP 4: Sort and combine - -				// Here we sort... -				$k_max = $k + sizeof($utf_seq); - -				if (!$k && $k_max == 1) -				{ -					// There is only one char in the UTF sequence, add it then jump to the next iteration of main loop -						// Note: the two commented lines below can be enabled under PHP5 for a very small performance gain in most cases -//						if (substr_compare($str, $utf_seq[0], $lpos, $pos - $lpos)) -//						{ -						$tmp .= substr($str, $tmp_pos, $lpos - $tmp_pos) . $utf_seq[0]; -						$tmp_pos = $pos; -//						} - -					continue; -				} - -				// ...there we combine -				if (isset($utf_combining_class[$utf_seq[$k]])) -				{ -					$starter = $nf_seq = ''; -				} -				else -				{ -					$starter = $utf_seq[$k++]; -					$nf_seq = ''; -				} -				$utf_sort = array(); - -				// We add an empty char at the end of the UTF char sequence. It will act as a starter and trigger the sort/combine routine -				// at the end of the string without altering it -				$utf_seq[] = ''; - -				do -				{ -					$utf_char = $utf_seq[$k++]; - -					if (isset($utf_combining_class[$utf_char])) -					{ -						$utf_sort[$utf_combining_class[$utf_char]][] = $utf_char; -					} -					else -					{ -						if (empty($utf_sort)) -						{ -							// No combining characters... check for a composite of the two starters -							if (isset($utf_canonical_comp[$starter . $utf_char])) -							{ -								// Good ol' composite character -								$starter = $utf_canonical_comp[$starter . $utf_char]; -							} -							else if (isset($utf_jamo_type[$utf_char])) -							{ -								// Current char is a composable jamo -								if (isset($utf_jamo_type[$starter]) && $utf_jamo_type[$starter] == UNICODE_JAMO_L && $utf_jamo_type[$utf_char] == UNICODE_JAMO_V) -								{ -									// We have a L jamo followed by a V jamo, we are going to prefetch the next char to see if it's a T jamo -									if (isset($utf_jamo_type[$utf_seq[$k]]) && $utf_jamo_type[$utf_seq[$k]] == UNICODE_JAMO_T) -									{ -										// L+V+T jamos, combine to a LVT Hangul syllable ($k is incremented) -										$cp = $utf_jamo_index[$starter] + $utf_jamo_index[$utf_char] + $utf_jamo_index[$utf_seq[$k]]; -										++$k; -									} -									else -									{ -										// L+V jamos, combine to a LV Hangul syllable -										$cp = $utf_jamo_index[$starter] + $utf_jamo_index[$utf_char]; -									} - -									$starter = chr(0xE0 | ($cp >> 12)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F)); -								} -								else -								{ -									// Non-composable jamo, just add it to the sequence -									$nf_seq .= $starter; -									$starter = $utf_char; -								} -							} -							else -							{ -								// No composite, just add the first starter to the sequence then continue with the other one -								$nf_seq .= $starter; -								$starter = $utf_char; -							} -						} -						else -						{ -							ksort($utf_sort); - -							// For each class of combining characters -							foreach ($utf_sort as $cc => $utf_chars) -							{ -								$j = 0; - -								do -								{ -									// Look for a composite -									if (isset($utf_canonical_comp[$starter . $utf_chars[$j]])) -									{ -										// Found a composite, replace the starter -										$starter = $utf_canonical_comp[$starter . $utf_chars[$j]]; -										unset($utf_sort[$cc][$j]); -									} -									else -									{ -										// No composite, all following characters in that class are blocked -										break; -									} -								} -								while (isset($utf_sort[$cc][++$j])); -							} - -							// Add the starter to the normalized sequence, followed by non-starters in canonical order -							$nf_seq .= $starter; - -							foreach ($utf_sort as $utf_chars) -							{ -								if (!empty($utf_chars)) -								{ -									$nf_seq .= implode('', $utf_chars); -								} -							} - -							// Reset the array and go on -							$utf_sort = array(); -							$starter = $utf_char; -						} -					} -				} -				while ($k <= $k_max); - -				$tmp .= substr($str, $tmp_pos, $lpos - $tmp_pos) . $nf_seq; -				$tmp_pos = $pos; -			} -			else -			{ -				// Only a ASCII char can make the program get here -				// -				// First we skip the current byte with ++$pos, then we quickly skip following ASCII chars with strspn(). -				// -				// The first two "if"'s here can be removed, with the consequences of being faster on latin text (lots of ASCII) and slower on -				// multi-byte text (where the only ASCII chars are spaces and punctuation) -				if (++$pos != $len) -				{ -					if ($str[$pos] < "\x80") -					{ -						$pos += strspn($str, UTF8_ASCII_RANGE, ++$pos); -						$buffer[++$i & 7] = $str[$pos - 1]; -					} -					else -					{ -						$buffer[++$i & 7] = $c; -					} -				} -			} -		} -		while ($pos < $len); - -		// Now is time to return the string -		if ($tmp_pos) -		{ -			// If the $tmp_pos cursor is not at the beggining of the string then at least one character was not in normal form. Replace $str with the fixed version -			if ($tmp_pos == $len) -			{ -				// The $tmp_pos cursor is at the end of $str, therefore $tmp holds the whole $str -				return $tmp; -			} -			else -			{ -				// The rightmost chunk of $str has not been appended to $tmp yet -				return $tmp . substr($str, $tmp_pos); -			} -		} - -		// The string was already in normal form -		return $str; -	} - -	/** -	* Decompose a UTF string -	* -	* @param	string	$str			UTF string -	* @param	integer	$pos			Position of the first UTF char (in bytes) -	* @param	integer	$len			Length of the string (in bytes) -	* @param	array	&$decomp_map	Decomposition mapping, passed by reference but never modified -	* @return	string					The string, decomposed and sorted canonically -	* -	* @access	private -	*/ -	static function decompose($str, $pos, $len, &$decomp_map) -	{ -		global $utf_combining_class; - -		// Load some commonly-used tables -		if (!isset($utf_combining_class)) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/data/utf_normalizer_common.' . $phpEx); -		} - -		// UTF char length array -		$utf_len_mask = array( -			// Leading bytes masks -			"\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4, -			// Trailing bytes masks -			"\x80" => 0, "\x90" => 0, "\xA0" => 0, "\xB0" => 0 -		); - -		// Some extra checks are triggered on the first byte of a UTF sequence -		$extra_check = array( -			"\xED" => 1, "\xEF" => 1, "\xC0" => 1, "\xC1" => 1, "\xE0" => 1, "\xF0" => 1, -			"\xF4" => 1, "\xF5" => 1, "\xF6" => 1, "\xF7" => 1, "\xF8" => 1, "\xF9" => 1, -			"\xFA" => 1, "\xFB" => 1, "\xFC" => 1, "\xFD" => 1, "\xFE" => 1, "\xFF" => 1 -		); - -		// These masks are used to check if a UTF sequence is well formed. Here are the only 3 lengths we acknowledge: -		//   - 2-byte: 110? ???? 10?? ???? -		//   - 3-byte: 1110 ???? 10?? ???? 10?? ???? -		//   - 4-byte: 1111 0??? 10?? ???? 10?? ???? 10?? ???? -		// Note that 5- and 6- byte sequences are automatically discarded -		$utf_validation_mask = array( -			2	=> "\xE0\xC0", -			3	=> "\xF0\xC0\xC0", -			4	=> "\xF8\xC0\xC0\xC0" -		); - -		$utf_validation_check = array( -			2	=> "\xC0\x80", -			3	=> "\xE0\x80\x80", -			4	=> "\xF0\x80\x80\x80" -		); - -		$tmp = ''; -		$starter_pos = $pos; -		$tmp_pos = $last_cc = $sort = $dump = 0; -		$utf_sort = array(); - -		// Main loop -		do -		{ -			// STEP 0: Capture the current char - -			$cur_mask = $str[$pos] & "\xF0"; -			if (isset($utf_len_mask[$cur_mask])) -			{ -				if ($utf_len = $utf_len_mask[$cur_mask]) -				{ -					// Multibyte char -					$utf_char = substr($str, $pos, $utf_len); -					$pos += $utf_len; -				} -				else -				{ -					// A trailing byte came out of nowhere, we will treat it and all following trailing bytes as if each of them was a Unicode -					// replacement char and we will advance the cursor -					$spn = strspn($str, UTF8_TRAILING_BYTES, $pos); - -					if ($dump) -					{ -						$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -						// Dump combiners -						if (!empty($utf_sort)) -						{ -							if ($sort) -							{ -								ksort($utf_sort); -							} - -							foreach ($utf_sort as $utf_chars) -							{ -								$tmp .= implode('', $utf_chars); -							} -						} - -						$tmp .= str_repeat(UTF8_REPLACEMENT, $spn); -						$dump = $sort = 0; -					} -					else -					{ -						$tmp .= substr($str, $tmp_pos, $pos - $tmp_pos) . str_repeat(UTF8_REPLACEMENT, $spn); -					} - -					$pos += $spn; -					$tmp_pos = $starter_pos = $pos; - -					$utf_sort = array(); -					$last_cc = 0; - -					continue; -				} - -				// STEP 1: Decide what to do with current char - -				// Now, in that order: -				//  - check if that character is decomposable -				//  - check if that character is a non-starter -				//  - check if that character requires extra checks to be performed -				if (isset($decomp_map[$utf_char])) -				{ -					// Decompose the char -					$_pos = 0; -					$_len = strlen($decomp_map[$utf_char]); - -					do -					{ -						$c = $decomp_map[$utf_char][$_pos]; -						$_utf_len =& $utf_len_mask[$c & "\xF0"]; - -						if (isset($_utf_len)) -						{ -							$_utf_char = substr($decomp_map[$utf_char], $_pos, $_utf_len); -							$_pos += $_utf_len; - -							if (isset($utf_combining_class[$_utf_char])) -							{ -								// The character decomposed to a non-starter, buffer it for sorting -								$utf_sort[$utf_combining_class[$_utf_char]][] = $_utf_char; - -								if ($utf_combining_class[$_utf_char] < $last_cc) -								{ -									// Not canonically ordered, will require sorting -									$sort = $dump = 1; -								} -								else -								{ -									$dump = 1; -									$last_cc = $utf_combining_class[$_utf_char]; -								} -							} -							else -							{ -								// This character decomposition contains a starter, dump the buffer and continue -								if ($dump) -								{ -									$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -									// Dump combiners -									if (!empty($utf_sort)) -									{ -										if ($sort) -										{ -											ksort($utf_sort); -										} - -										foreach ($utf_sort as $utf_chars) -										{ -											$tmp .= implode('', $utf_chars); -										} -									} - -									$tmp .= $_utf_char; -									$dump = $sort = 0; -								} -								else -								{ -									$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos) . $_utf_char; -								} - -								$tmp_pos = $starter_pos = $pos; -								$utf_sort = array(); -								$last_cc = 0; -							} -						} -						else -						{ -							// This character decomposition contains an ASCII char, which is a starter. Dump the buffer and continue -							++$_pos; - -							if ($dump) -							{ -								$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -								// Dump combiners -								if (!empty($utf_sort)) -								{ -									if ($sort) -									{ -										ksort($utf_sort); -									} - -									foreach ($utf_sort as $utf_chars) -									{ -										$tmp .= implode('', $utf_chars); -									} -								} - -								$tmp .= $c; -								$dump = $sort = 0; -							} -							else -							{ -								$tmp .= substr($str, $tmp_pos, $pos - $utf_len - $tmp_pos) . $c; -							} - -							$tmp_pos = $starter_pos = $pos; -							$utf_sort = array(); -							$last_cc = 0; -						} -					} -					while ($_pos < $_len); -				} -				else if (isset($utf_combining_class[$utf_char])) -				{ -					// Combining character -					if ($utf_combining_class[$utf_char] < $last_cc) -					{ -						// Not in canonical order -						$sort = $dump = 1; -					} -					else -					{ -						$last_cc = $utf_combining_class[$utf_char]; -					} - -					$utf_sort[$utf_combining_class[$utf_char]][] = $utf_char; -				} -				else -				{ -					// Non-decomposable starter, check out if it's a Hangul syllable -					if ($utf_char < UTF8_HANGUL_FIRST || $utf_char > UTF8_HANGUL_LAST) -					{ -						// Nope, regular UTF char, check that we have the correct number of trailing bytes -						if (($utf_char & $utf_validation_mask[$utf_len]) != $utf_validation_check[$utf_len]) -						{ -							// Current char isn't well-formed or legal: either one or several trailing bytes are missing, or the Unicode char -							// has been encoded in a five- or six- byte sequence. -							// Move the cursor back to its original position then advance it to the position it should really be at -							$pos -= $utf_len; -							$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -							if (!empty($utf_sort)) -							{ -								ksort($utf_sort); - -								foreach ($utf_sort as $utf_chars) -								{ -									$tmp .= implode('', $utf_chars); -								} -								$utf_sort = array(); -							} - -							// Add a replacement char then another replacement char for every trailing byte. -							// -							// @todo I'm not entirely sure that's how we're supposed to mark invalidated byte sequences, check this -							$spn = strspn($str, UTF8_TRAILING_BYTES, ++$pos); -							$tmp .= str_repeat(UTF8_REPLACEMENT, $spn + 1); - -							$dump = $sort = 0; - -							$pos += $spn; -							$tmp_pos = $pos; -							continue; -						} - -						if (isset($extra_check[$utf_char[0]])) -						{ -							switch ($utf_char[0]) -							{ -								// Note: 0xED is quite common in Korean -								case "\xED": -									if ($utf_char >= "\xED\xA0\x80") -									{ -										// Surrogates (U+D800..U+DFFF) are not allowed in UTF-8 (UTF sequence 0xEDA080..0xEDBFBF) -										$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -										if (!empty($utf_sort)) -										{ -											ksort($utf_sort); - -											foreach ($utf_sort as $utf_chars) -											{ -												$tmp .= implode('', $utf_chars); -											} -											$utf_sort = array(); -										} - -										$tmp .= UTF8_REPLACEMENT; -										$dump = $sort = 0; - -										$tmp_pos = $starter_pos = $pos; -										continue 2; -									} -								break; - -								// Note: 0xEF is quite common in Japanese -								case "\xEF": -									if ($utf_char == "\xEF\xBF\xBE" || $utf_char == "\xEF\xBF\xBF") -									{ -										// U+FFFE and U+FFFF are explicitly disallowed (UTF sequence 0xEFBFBE..0xEFBFBF) -										$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -										if (!empty($utf_sort)) -										{ -											ksort($utf_sort); - -											foreach ($utf_sort as $utf_chars) -											{ -												$tmp .= implode('', $utf_chars); -											} -											$utf_sort = array(); -										} - -										$tmp .= UTF8_REPLACEMENT; -										$dump = $sort = 0; - -										$tmp_pos = $starter_pos = $pos; -										continue 2; -									} -								break; - -								case "\xC0": -								case "\xC1": -									if ($utf_char <= "\xC1\xBF") -									{ -										// Overlong sequence: Unicode char U+0000..U+007F encoded as a double-byte UTF char -										$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -										if (!empty($utf_sort)) -										{ -											ksort($utf_sort); - -											foreach ($utf_sort as $utf_chars) -											{ -												$tmp .= implode('', $utf_chars); -											} -											$utf_sort = array(); -										} - -										$tmp .= UTF8_REPLACEMENT; -										$dump = $sort = 0; - -										$tmp_pos = $starter_pos = $pos; -										continue 2; -									} -								break; - -								case "\xE0": -									if ($utf_char <= "\xE0\x9F\xBF") -									{ -										// Unicode char U+0000..U+07FF encoded in 3 bytes -										$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -										if (!empty($utf_sort)) -										{ -											ksort($utf_sort); - -											foreach ($utf_sort as $utf_chars) -											{ -												$tmp .= implode('', $utf_chars); -											} -											$utf_sort = array(); -										} - -										$tmp .= UTF8_REPLACEMENT; -										$dump = $sort = 0; - -										$tmp_pos = $starter_pos = $pos; -										continue 2; -									} -								break; - -								case "\xF0": -									if ($utf_char <= "\xF0\x8F\xBF\xBF") -									{ -										// Unicode char U+0000..U+FFFF encoded in 4 bytes -										$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -										if (!empty($utf_sort)) -										{ -											ksort($utf_sort); - -											foreach ($utf_sort as $utf_chars) -											{ -												$tmp .= implode('', $utf_chars); -											} -											$utf_sort = array(); -										} - -										$tmp .= UTF8_REPLACEMENT; -										$dump = $sort = 0; - -										$tmp_pos = $starter_pos = $pos; -										continue 2; -									} -								break; - -								default: -									if ($utf_char > UTF8_MAX) -									{ -										// Out of the Unicode range -										$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -										if (!empty($utf_sort)) -										{ -											ksort($utf_sort); - -											foreach ($utf_sort as $utf_chars) -											{ -												$tmp .= implode('', $utf_chars); -											} -											$utf_sort = array(); -										} - -										$tmp .= UTF8_REPLACEMENT; -										$dump = $sort = 0; - -										$tmp_pos = $starter_pos = $pos; -										continue 2; -									} -								break; -							} -						} -					} -					else -					{ -						// Hangul syllable -						$idx = (((ord($utf_char[0]) & 0x0F) << 12) | ((ord($utf_char[1]) & 0x3F) << 6) | (ord($utf_char[2]) & 0x3F)) - UNICODE_HANGUL_SBASE; - -						// LIndex can only range from 0 to 18, therefore it cannot influence the first two bytes of the L Jamo, which allows us to hardcode them (based on LBase). -						// -						// The same goes for VIndex, but for TIndex there's a catch: the value of the third byte could exceed 0xBF and we would have to increment the second byte -						if ($t_index = $idx % UNICODE_HANGUL_TCOUNT) -						{ -							if ($t_index < 25) -							{ -								$utf_char = "\xE1\x84\x00\xE1\x85\x00\xE1\x86\x00"; -								$utf_char[8] = chr(0xA7 + $t_index); -							} -							else -							{ -								$utf_char = "\xE1\x84\x00\xE1\x85\x00\xE1\x87\x00"; -								$utf_char[8] = chr(0x67 + $t_index); -							} -						} -						else -						{ -							$utf_char = "\xE1\x84\x00\xE1\x85\x00"; -						} - -						$utf_char[2] = chr(0x80 + (int) ($idx / UNICODE_HANGUL_NCOUNT)); -						$utf_char[5] = chr(0xA1 + (int) (($idx % UNICODE_HANGUL_NCOUNT) / UNICODE_HANGUL_TCOUNT)); - -						// Just like other decompositions, the resulting Jamos must be dumped to the tmp string -						$dump = 1; -					} - -					// Do we need to dump stuff to the tmp string? -					if ($dump) -					{ -						$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -						// Dump combiners -						if (!empty($utf_sort)) -						{ -							if ($sort) -							{ -								ksort($utf_sort); -							} - -							foreach ($utf_sort as $utf_chars) -							{ -								$tmp .= implode('', $utf_chars); -							} -						} - -						$tmp .= $utf_char; -						$dump = $sort = 0; -						$tmp_pos = $pos; -					} - -					$last_cc = 0; -					$utf_sort = array(); -					$starter_pos = $pos; -				} -			} -			else -			{ -				// ASCII char, which happens to be a starter (as any other ASCII char) -				if ($dump) -				{ -					$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -					// Dump combiners -					if (!empty($utf_sort)) -					{ -						if ($sort) -						{ -							ksort($utf_sort); -						} - -						foreach ($utf_sort as $utf_chars) -						{ -							$tmp .= implode('', $utf_chars); -						} -					} - -					$tmp .= $str[$pos]; -					$dump = $sort = 0; -					$tmp_pos = ++$pos; - -					$pos += strspn($str, UTF8_ASCII_RANGE, $pos); -				} -				else -				{ -					$pos += strspn($str, UTF8_ASCII_RANGE, ++$pos); -				} - -				$last_cc = 0; -				$utf_sort = array(); -				$starter_pos = $pos; -			} -		} -		while ($pos < $len); - -		// Now is time to return the string -		if ($dump) -		{ -			$tmp .= substr($str, $tmp_pos, $starter_pos - $tmp_pos); - -			// Dump combiners -			if (!empty($utf_sort)) -			{ -				if ($sort) -				{ -					ksort($utf_sort); -				} - -				foreach ($utf_sort as $utf_chars) -				{ -					$tmp .= implode('', $utf_chars); -				} -			} - -			return $tmp; -		} -		else if ($tmp_pos) -		{ -			// If the $tmp_pos cursor was moved then at least one character was not in normal form. Replace $str with the fixed version -			if ($tmp_pos == $len) -			{ -				// The $tmp_pos cursor is at the end of $str, therefore $tmp holds the whole $str -				return $tmp; -			} -			else -			{ -				// The rightmost chunk of $str has not been appended to $tmp yet -				return $tmp . substr($str, $tmp_pos); -			} -		} - -		// The string was already in normal form -		return $str; -	} -} diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php index e60a40a195..da241b2cbd 100644 --- a/phpBB/includes/utf/utf_tools.php +++ b/phpBB/includes/utf/utf_tools.php @@ -22,6 +22,13 @@ if (!defined('IN_PHPBB'))  setlocale(LC_CTYPE, 'C');  /** +* Setup the UTF-8 portability layer +*/ +Patchwork\Utf8\Bootup::initUtf8Encode(); +Patchwork\Utf8\Bootup::initMbstring(); +Patchwork\Utf8\Bootup::initIntl(); + +/**  * UTF-8 tools  *  * Whenever possible, these functions will try to use PHP's built-in functions or @@ -29,544 +36,85 @@ setlocale(LC_CTYPE, 'C');  *  */ -if (!extension_loaded('xml')) -{ -	/** -	* Implementation of PHP's native utf8_encode for people without XML support -	* This function exploits some nice things that ISO-8859-1 and UTF-8 have in common -	* -	* @param string $str ISO-8859-1 encoded data -	* @return string UTF-8 encoded data -	*/ -	function utf8_encode($str) -	{ -		$out = ''; -		for ($i = 0, $len = strlen($str); $i < $len; $i++) -		{ -			$letter = $str[$i]; -			$num = ord($letter); -			if ($num < 0x80) -			{ -				$out .= $letter; -			} -			else if ($num < 0xC0) -			{ -				$out .= "\xC2" . $letter; -			} -			else -			{ -				$out .= "\xC3" . chr($num - 64); -			} -		} -		return $out; -	} - -	/** -	* Implementation of PHP's native utf8_decode for people without XML support -	* -	* @param string $str UTF-8 encoded data -	* @return string ISO-8859-1 encoded data -	*/ -	function utf8_decode($str) -	{ -		$pos = 0; -		$len = strlen($str); -		$ret = ''; - -		while ($pos < $len) -		{ -			$ord = ord($str[$pos]) & 0xF0; -			if ($ord === 0xC0 || $ord === 0xD0) -			{ -				$charval = ((ord($str[$pos]) & 0x1F) << 6) | (ord($str[$pos + 1]) & 0x3F); -				$pos += 2; -				$ret .= (($charval < 256) ? chr($charval) : '?'); -			} -			else if ($ord === 0xE0) -			{ -				$ret .= '?'; -				$pos += 3; -			} -			else if ($ord === 0xF0) -			{ -				$ret .= '?'; -				$pos += 4; -			} -			else -			{ -				$ret .= $str[$pos]; -				++$pos; -			} -		} -		return $ret; -	} -} - -// mbstring is old and has it's functions around for older versions of PHP. -// if mbstring is not loaded, we go into native mode. -if (extension_loaded('mbstring')) +/** +* UTF-8 aware alternative to strrpos +* @ignore +*/ +function utf8_strrpos($str,	$needle, $offset = null)  { -	mb_internal_encoding('UTF-8'); - -	/** -	* UTF-8 aware alternative to strrpos -	* Find position of last occurrence of a char in a string -	*/ -	/** -	* UTF-8 aware alternative to strrpos -	* @ignore -	*/ -	function utf8_strrpos($str,	$needle, $offset = null) +	// Emulate behaviour of strrpos rather than raising warning +	if (empty($str))  	{ -		// Emulate behaviour of strrpos rather than raising warning -		if (empty($str)) -		{ -			return false; -		} - -		if (is_null($offset)) -		{ -			return mb_strrpos($str, $needle); -		} -		else -		{ -			return mb_strrpos($str, $needle, $offset); -		} -	} - -	/** -	* UTF-8 aware alternative to strpos -	* @ignore -	*/ -	function utf8_strpos($str, $needle, $offset = null) -	{ -		if (is_null($offset)) -		{ -			return mb_strpos($str, $needle); -		} -		else -		{ -			return mb_strpos($str, $needle, $offset); -		} +		return false;  	} -	/** -	* UTF-8 aware alternative to strtolower -	* @ignore -	*/ -	function utf8_strtolower($str) +	if (is_null($offset))  	{ -		return mb_strtolower($str); +		return mb_strrpos($str, $needle);  	} - -	/** -	* UTF-8 aware alternative to strtoupper -	* @ignore -	*/ -	function utf8_strtoupper($str) +	else  	{ -		return mb_strtoupper($str); +		return mb_strrpos($str, $needle, $offset);  	} +} -	/** -	* UTF-8 aware alternative to substr -	* @ignore -	*/ -	function utf8_substr($str, $offset, $length = null) +/** +* UTF-8 aware alternative to strpos +* @ignore +*/ +function utf8_strpos($str, $needle, $offset = null) +{ +	if (is_null($offset))  	{ -		if (is_null($length)) -		{ -			return mb_substr($str, $offset); -		} -		else -		{ -			return mb_substr($str, $offset, $length); -		} +		return mb_strpos($str, $needle);  	} - -	/** -	* Return the length (in characters) of a UTF-8 string -	* @ignore -	*/ -	function utf8_strlen($text) +	else  	{ -		return mb_strlen($text, 'utf-8'); +		return mb_strpos($str, $needle, $offset);  	}  } -else -{ -	/** -	* UTF-8 aware alternative to strrpos -	* Find position of last occurrence of a char in a string -	* -	* @author Harry Fuecks -	* @param string $str haystack -	* @param string $needle needle -	* @param integer $offset (optional) offset (from left) -	* @return mixed integer position or FALSE on failure -	*/ -	function utf8_strrpos($str,	$needle, $offset = null) -	{ -		if (is_null($offset)) -		{ -			$ar	= explode($needle, $str); - -			if (sizeof($ar) > 1) -			{ -				// Pop off the end of the string where the last	match was made -				array_pop($ar); -				$str = join($needle, $ar); - -				return utf8_strlen($str); -			} -			return false; -		} -		else -		{ -			if (!is_int($offset)) -			{ -				trigger_error('utf8_strrpos	expects	parameter 3	to be long', E_USER_ERROR); -				return false; -			} - -			$str = utf8_substr($str, $offset); - -			if (false !== ($pos = utf8_strrpos($str, $needle))) -			{ -				return $pos	+ $offset; -			} - -			return false; -		} -	} -	/** -	* UTF-8 aware alternative to strpos -	* Find position of first occurrence of a string -	* -	* @author Harry Fuecks -	* @param string $str haystack -	* @param string $needle needle -	* @param integer $offset offset in characters (from left) -	* @return mixed integer position or FALSE on failure -	*/ -	function utf8_strpos($str, $needle, $offset = null) -	{ -		if (is_null($offset)) -		{ -			$ar = explode($needle, $str); -			if (sizeof($ar) > 1) -			{ -				return utf8_strlen($ar[0]); -			} -			return false; -		} -		else -		{ -			if (!is_int($offset)) -			{ -				trigger_error('utf8_strpos:  Offset must  be an integer', E_USER_ERROR); -				return false; -			} - -			$str = utf8_substr($str, $offset); - -			if (false !== ($pos = utf8_strpos($str, $needle))) -			{ -				return $pos + $offset; -			} +/** +* UTF-8 aware alternative to strtolower +* @ignore +*/ +function utf8_strtolower($str) +{ +	return mb_strtolower($str); +} -			return false; -		} -	} +/** +* UTF-8 aware alternative to strtoupper +* @ignore +*/ +function utf8_strtoupper($str) +{ +	return mb_strtoupper($str); +} -	/** -	* UTF-8 aware alternative to strtolower -	* Make a string lowercase -	* Note: The concept of a characters "case" only exists is some alphabets -	* such as Latin, Greek, Cyrillic, Armenian and archaic Georgian - it does -	* not exist in the Chinese alphabet, for example. See Unicode Standard -	* Annex #21: Case Mappings -	* -	* @param string -	* @return string string in lowercase -	*/ -	function utf8_strtolower($string) +/** +* UTF-8 aware alternative to substr +* @ignore +*/ +function utf8_substr($str, $offset, $length = null) +{ +	if (is_null($length))  	{ -		static $utf8_upper_to_lower = array( -			"\xC3\x80" => "\xC3\xA0", "\xC3\x81" => "\xC3\xA1", -			"\xC3\x82" => "\xC3\xA2", "\xC3\x83" => "\xC3\xA3", "\xC3\x84" => "\xC3\xA4", "\xC3\x85" => "\xC3\xA5", -			"\xC3\x86" => "\xC3\xA6", "\xC3\x87" => "\xC3\xA7", "\xC3\x88" => "\xC3\xA8", "\xC3\x89" => "\xC3\xA9", -			"\xC3\x8A" => "\xC3\xAA", "\xC3\x8B" => "\xC3\xAB", "\xC3\x8C" => "\xC3\xAC", "\xC3\x8D" => "\xC3\xAD", -			"\xC3\x8E" => "\xC3\xAE", "\xC3\x8F" => "\xC3\xAF", "\xC3\x90" => "\xC3\xB0", "\xC3\x91" => "\xC3\xB1", -			"\xC3\x92" => "\xC3\xB2", "\xC3\x93" => "\xC3\xB3", "\xC3\x94" => "\xC3\xB4", "\xC3\x95" => "\xC3\xB5", -			"\xC3\x96" => "\xC3\xB6", "\xC3\x98" => "\xC3\xB8", "\xC3\x99" => "\xC3\xB9", "\xC3\x9A" => "\xC3\xBA", -			"\xC3\x9B" => "\xC3\xBB", "\xC3\x9C" => "\xC3\xBC", "\xC3\x9D" => "\xC3\xBD", "\xC3\x9E" => "\xC3\xBE", -			"\xC4\x80" => "\xC4\x81", "\xC4\x82" => "\xC4\x83", "\xC4\x84" => "\xC4\x85", "\xC4\x86" => "\xC4\x87", -			"\xC4\x88" => "\xC4\x89", "\xC4\x8A" => "\xC4\x8B", "\xC4\x8C" => "\xC4\x8D", "\xC4\x8E" => "\xC4\x8F", -			"\xC4\x90" => "\xC4\x91", "\xC4\x92" => "\xC4\x93", "\xC4\x96" => "\xC4\x97", "\xC4\x98" => "\xC4\x99", -			"\xC4\x9A" => "\xC4\x9B", "\xC4\x9C" => "\xC4\x9D", "\xC4\x9E" => "\xC4\x9F", "\xC4\xA0" => "\xC4\xA1", -			"\xC4\xA2" => "\xC4\xA3", "\xC4\xA4" => "\xC4\xA5", "\xC4\xA6" => "\xC4\xA7", "\xC4\xA8" => "\xC4\xA9", -			"\xC4\xAA" => "\xC4\xAB", "\xC4\xAE" => "\xC4\xAF", "\xC4\xB4" => "\xC4\xB5", "\xC4\xB6" => "\xC4\xB7", -			"\xC4\xB9" => "\xC4\xBA", "\xC4\xBB" => "\xC4\xBC", "\xC4\xBD" => "\xC4\xBE", "\xC5\x81" => "\xC5\x82", -			"\xC5\x83" => "\xC5\x84", "\xC5\x85" => "\xC5\x86", "\xC5\x87" => "\xC5\x88", "\xC5\x8A" => "\xC5\x8B", -			"\xC5\x8C" => "\xC5\x8D", "\xC5\x90" => "\xC5\x91", "\xC5\x94" => "\xC5\x95", "\xC5\x96" => "\xC5\x97", -			"\xC5\x98" => "\xC5\x99", "\xC5\x9A" => "\xC5\x9B", "\xC5\x9C" => "\xC5\x9D", "\xC5\x9E" => "\xC5\x9F", -			"\xC5\xA0" => "\xC5\xA1", "\xC5\xA2" => "\xC5\xA3", "\xC5\xA4" => "\xC5\xA5", "\xC5\xA6" => "\xC5\xA7", -			"\xC5\xA8" => "\xC5\xA9", "\xC5\xAA" => "\xC5\xAB", "\xC5\xAC" => "\xC5\xAD", "\xC5\xAE" => "\xC5\xAF", -			"\xC5\xB0" => "\xC5\xB1", "\xC5\xB2" => "\xC5\xB3", "\xC5\xB4" => "\xC5\xB5", "\xC5\xB6" => "\xC5\xB7", -			"\xC5\xB8" => "\xC3\xBF", "\xC5\xB9" => "\xC5\xBA", "\xC5\xBB" => "\xC5\xBC", "\xC5\xBD" => "\xC5\xBE", -			"\xC6\xA0" => "\xC6\xA1", "\xC6\xAF" => "\xC6\xB0", "\xC8\x98" => "\xC8\x99", "\xC8\x9A" => "\xC8\x9B", -			"\xCE\x86" => "\xCE\xAC", "\xCE\x88" => "\xCE\xAD", "\xCE\x89" => "\xCE\xAE", "\xCE\x8A" => "\xCE\xAF", -			"\xCE\x8C" => "\xCF\x8C", "\xCE\x8E" => "\xCF\x8D", "\xCE\x8F" => "\xCF\x8E", "\xCE\x91" => "\xCE\xB1", -			"\xCE\x92" => "\xCE\xB2", "\xCE\x93" => "\xCE\xB3", "\xCE\x94" => "\xCE\xB4", "\xCE\x95" => "\xCE\xB5", -			"\xCE\x96" => "\xCE\xB6", "\xCE\x97" => "\xCE\xB7", "\xCE\x98" => "\xCE\xB8", "\xCE\x99" => "\xCE\xB9", -			"\xCE\x9A" => "\xCE\xBA", "\xCE\x9B" => "\xCE\xBB", "\xCE\x9C" => "\xCE\xBC", "\xCE\x9D" => "\xCE\xBD", -			"\xCE\x9E" => "\xCE\xBE", "\xCE\x9F" => "\xCE\xBF", "\xCE\xA0" => "\xCF\x80", "\xCE\xA1" => "\xCF\x81", -			"\xCE\xA3" => "\xCF\x83", "\xCE\xA4" => "\xCF\x84", "\xCE\xA5" => "\xCF\x85", "\xCE\xA6" => "\xCF\x86", -			"\xCE\xA7" => "\xCF\x87", "\xCE\xA8" => "\xCF\x88", "\xCE\xA9" => "\xCF\x89", "\xCE\xAA" => "\xCF\x8A", -			"\xCE\xAB" => "\xCF\x8B", "\xD0\x81" => "\xD1\x91", "\xD0\x82" => "\xD1\x92", "\xD0\x83" => "\xD1\x93", -			"\xD0\x84" => "\xD1\x94", "\xD0\x85" => "\xD1\x95", "\xD0\x86" => "\xD1\x96", "\xD0\x87" => "\xD1\x97", -			"\xD0\x88" => "\xD1\x98", "\xD0\x89" => "\xD1\x99", "\xD0\x8A" => "\xD1\x9A", "\xD0\x8B" => "\xD1\x9B", -			"\xD0\x8C" => "\xD1\x9C", "\xD0\x8E" => "\xD1\x9E", "\xD0\x8F" => "\xD1\x9F", "\xD0\x90" => "\xD0\xB0", -			"\xD0\x91" => "\xD0\xB1", "\xD0\x92" => "\xD0\xB2", "\xD0\x93" => "\xD0\xB3", "\xD0\x94" => "\xD0\xB4", -			"\xD0\x95" => "\xD0\xB5", "\xD0\x96" => "\xD0\xB6", "\xD0\x97" => "\xD0\xB7", "\xD0\x98" => "\xD0\xB8", -			"\xD0\x99" => "\xD0\xB9", "\xD0\x9A" => "\xD0\xBA", "\xD0\x9B" => "\xD0\xBB", "\xD0\x9C" => "\xD0\xBC", -			"\xD0\x9D" => "\xD0\xBD", "\xD0\x9E" => "\xD0\xBE", "\xD0\x9F" => "\xD0\xBF", "\xD0\xA0" => "\xD1\x80", -			"\xD0\xA1" => "\xD1\x81", "\xD0\xA2" => "\xD1\x82", "\xD0\xA3" => "\xD1\x83", "\xD0\xA4" => "\xD1\x84", -			"\xD0\xA5" => "\xD1\x85", "\xD0\xA6" => "\xD1\x86", "\xD0\xA7" => "\xD1\x87", "\xD0\xA8" => "\xD1\x88", -			"\xD0\xA9" => "\xD1\x89", "\xD0\xAA" => "\xD1\x8A", "\xD0\xAB" => "\xD1\x8B", "\xD0\xAC" => "\xD1\x8C", -			"\xD0\xAD" => "\xD1\x8D", "\xD0\xAE" => "\xD1\x8E", "\xD0\xAF" => "\xD1\x8F", "\xD2\x90" => "\xD2\x91", -			"\xE1\xB8\x82" => "\xE1\xB8\x83", "\xE1\xB8\x8A" => "\xE1\xB8\x8B", "\xE1\xB8\x9E" => "\xE1\xB8\x9F", "\xE1\xB9\x80" => "\xE1\xB9\x81", -			"\xE1\xB9\x96" => "\xE1\xB9\x97", "\xE1\xB9\xA0" => "\xE1\xB9\xA1", "\xE1\xB9\xAA" => "\xE1\xB9\xAB", "\xE1\xBA\x80" => "\xE1\xBA\x81", -			"\xE1\xBA\x82" => "\xE1\xBA\x83", "\xE1\xBA\x84" => "\xE1\xBA\x85", "\xE1\xBB\xB2" => "\xE1\xBB\xB3" -		); - -		return strtr(strtolower($string), $utf8_upper_to_lower); +		return mb_substr($str, $offset);  	} - -	/** -	* UTF-8 aware alternative to strtoupper -	* Make a string uppercase -	* Note: The concept of a characters "case" only exists is some alphabets -	* such as Latin, Greek, Cyrillic, Armenian and archaic Georgian - it does -	* not exist in the Chinese alphabet, for example. See Unicode Standard -	* Annex #21: Case Mappings -	* -	* @param string -	* @return string string in uppercase -	*/ -	function utf8_strtoupper($string) +	else  	{ -		static $utf8_lower_to_upper = array( -			"\xC3\xA0" => "\xC3\x80", "\xC3\xA1" => "\xC3\x81", -			"\xC3\xA2" => "\xC3\x82", "\xC3\xA3" => "\xC3\x83", "\xC3\xA4" => "\xC3\x84", "\xC3\xA5" => "\xC3\x85", -			"\xC3\xA6" => "\xC3\x86", "\xC3\xA7" => "\xC3\x87", "\xC3\xA8" => "\xC3\x88", "\xC3\xA9" => "\xC3\x89", -			"\xC3\xAA" => "\xC3\x8A", "\xC3\xAB" => "\xC3\x8B", "\xC3\xAC" => "\xC3\x8C", "\xC3\xAD" => "\xC3\x8D", -			"\xC3\xAE" => "\xC3\x8E", "\xC3\xAF" => "\xC3\x8F", "\xC3\xB0" => "\xC3\x90", "\xC3\xB1" => "\xC3\x91", -			"\xC3\xB2" => "\xC3\x92", "\xC3\xB3" => "\xC3\x93", "\xC3\xB4" => "\xC3\x94", "\xC3\xB5" => "\xC3\x95", -			"\xC3\xB6" => "\xC3\x96", "\xC3\xB8" => "\xC3\x98", "\xC3\xB9" => "\xC3\x99", "\xC3\xBA" => "\xC3\x9A", -			"\xC3\xBB" => "\xC3\x9B", "\xC3\xBC" => "\xC3\x9C", "\xC3\xBD" => "\xC3\x9D", "\xC3\xBE" => "\xC3\x9E", -			"\xC3\xBF" => "\xC5\xB8", "\xC4\x81" => "\xC4\x80", "\xC4\x83" => "\xC4\x82", "\xC4\x85" => "\xC4\x84", -			"\xC4\x87" => "\xC4\x86", "\xC4\x89" => "\xC4\x88", "\xC4\x8B" => "\xC4\x8A", "\xC4\x8D" => "\xC4\x8C", -			"\xC4\x8F" => "\xC4\x8E", "\xC4\x91" => "\xC4\x90", "\xC4\x93" => "\xC4\x92", "\xC4\x97" => "\xC4\x96", -			"\xC4\x99" => "\xC4\x98", "\xC4\x9B" => "\xC4\x9A", "\xC4\x9D" => "\xC4\x9C", "\xC4\x9F" => "\xC4\x9E", -			"\xC4\xA1" => "\xC4\xA0", "\xC4\xA3" => "\xC4\xA2", "\xC4\xA5" => "\xC4\xA4", "\xC4\xA7" => "\xC4\xA6", -			"\xC4\xA9" => "\xC4\xA8", "\xC4\xAB" => "\xC4\xAA", "\xC4\xAF" => "\xC4\xAE", "\xC4\xB5" => "\xC4\xB4", -			"\xC4\xB7" => "\xC4\xB6", "\xC4\xBA" => "\xC4\xB9", "\xC4\xBC" => "\xC4\xBB", "\xC4\xBE" => "\xC4\xBD", -			"\xC5\x82" => "\xC5\x81", "\xC5\x84" => "\xC5\x83", "\xC5\x86" => "\xC5\x85", "\xC5\x88" => "\xC5\x87", -			"\xC5\x8B" => "\xC5\x8A", "\xC5\x8D" => "\xC5\x8C", "\xC5\x91" => "\xC5\x90", "\xC5\x95" => "\xC5\x94", -			"\xC5\x97" => "\xC5\x96", "\xC5\x99" => "\xC5\x98", "\xC5\x9B" => "\xC5\x9A", "\xC5\x9D" => "\xC5\x9C", -			"\xC5\x9F" => "\xC5\x9E", "\xC5\xA1" => "\xC5\xA0", "\xC5\xA3" => "\xC5\xA2", "\xC5\xA5" => "\xC5\xA4", -			"\xC5\xA7" => "\xC5\xA6", "\xC5\xA9" => "\xC5\xA8", "\xC5\xAB" => "\xC5\xAA", "\xC5\xAD" => "\xC5\xAC", -			"\xC5\xAF" => "\xC5\xAE", "\xC5\xB1" => "\xC5\xB0", "\xC5\xB3" => "\xC5\xB2", "\xC5\xB5" => "\xC5\xB4", -			"\xC5\xB7" => "\xC5\xB6", "\xC5\xBA" => "\xC5\xB9", "\xC5\xBC" => "\xC5\xBB", "\xC5\xBE" => "\xC5\xBD", -			"\xC6\xA1" => "\xC6\xA0", "\xC6\xB0" => "\xC6\xAF", "\xC8\x99" => "\xC8\x98", "\xC8\x9B" => "\xC8\x9A", -			"\xCE\xAC" => "\xCE\x86", "\xCE\xAD" => "\xCE\x88", "\xCE\xAE" => "\xCE\x89", "\xCE\xAF" => "\xCE\x8A", -			"\xCE\xB1" => "\xCE\x91", "\xCE\xB2" => "\xCE\x92", "\xCE\xB3" => "\xCE\x93", "\xCE\xB4" => "\xCE\x94", -			"\xCE\xB5" => "\xCE\x95", "\xCE\xB6" => "\xCE\x96", "\xCE\xB7" => "\xCE\x97", "\xCE\xB8" => "\xCE\x98", -			"\xCE\xB9" => "\xCE\x99", "\xCE\xBA" => "\xCE\x9A", "\xCE\xBB" => "\xCE\x9B", "\xCE\xBC" => "\xCE\x9C", -			"\xCE\xBD" => "\xCE\x9D", "\xCE\xBE" => "\xCE\x9E", "\xCE\xBF" => "\xCE\x9F", "\xCF\x80" => "\xCE\xA0", -			"\xCF\x81" => "\xCE\xA1", "\xCF\x83" => "\xCE\xA3", "\xCF\x84" => "\xCE\xA4", "\xCF\x85" => "\xCE\xA5", -			"\xCF\x86" => "\xCE\xA6", "\xCF\x87" => "\xCE\xA7", "\xCF\x88" => "\xCE\xA8", "\xCF\x89" => "\xCE\xA9", -			"\xCF\x8A" => "\xCE\xAA", "\xCF\x8B" => "\xCE\xAB", "\xCF\x8C" => "\xCE\x8C", "\xCF\x8D" => "\xCE\x8E", -			"\xCF\x8E" => "\xCE\x8F", "\xD0\xB0" => "\xD0\x90", "\xD0\xB1" => "\xD0\x91", "\xD0\xB2" => "\xD0\x92", -			"\xD0\xB3" => "\xD0\x93", "\xD0\xB4" => "\xD0\x94", "\xD0\xB5" => "\xD0\x95", "\xD0\xB6" => "\xD0\x96", -			"\xD0\xB7" => "\xD0\x97", "\xD0\xB8" => "\xD0\x98", "\xD0\xB9" => "\xD0\x99", "\xD0\xBA" => "\xD0\x9A", -			"\xD0\xBB" => "\xD0\x9B", "\xD0\xBC" => "\xD0\x9C", "\xD0\xBD" => "\xD0\x9D", "\xD0\xBE" => "\xD0\x9E", -			"\xD0\xBF" => "\xD0\x9F", "\xD1\x80" => "\xD0\xA0", "\xD1\x81" => "\xD0\xA1", "\xD1\x82" => "\xD0\xA2", -			"\xD1\x83" => "\xD0\xA3", "\xD1\x84" => "\xD0\xA4", "\xD1\x85" => "\xD0\xA5", "\xD1\x86" => "\xD0\xA6", -			"\xD1\x87" => "\xD0\xA7", "\xD1\x88" => "\xD0\xA8", "\xD1\x89" => "\xD0\xA9", "\xD1\x8A" => "\xD0\xAA", -			"\xD1\x8B" => "\xD0\xAB", "\xD1\x8C" => "\xD0\xAC", "\xD1\x8D" => "\xD0\xAD", "\xD1\x8E" => "\xD0\xAE", -			"\xD1\x8F" => "\xD0\xAF", "\xD1\x91" => "\xD0\x81", "\xD1\x92" => "\xD0\x82", "\xD1\x93" => "\xD0\x83", -			"\xD1\x94" => "\xD0\x84", "\xD1\x95" => "\xD0\x85", "\xD1\x96" => "\xD0\x86", "\xD1\x97" => "\xD0\x87", -			"\xD1\x98" => "\xD0\x88", "\xD1\x99" => "\xD0\x89", "\xD1\x9A" => "\xD0\x8A", "\xD1\x9B" => "\xD0\x8B", -			"\xD1\x9C" => "\xD0\x8C", "\xD1\x9E" => "\xD0\x8E", "\xD1\x9F" => "\xD0\x8F", "\xD2\x91" => "\xD2\x90", -			"\xE1\xB8\x83" => "\xE1\xB8\x82", "\xE1\xB8\x8B" => "\xE1\xB8\x8A", "\xE1\xB8\x9F" => "\xE1\xB8\x9E", "\xE1\xB9\x81" => "\xE1\xB9\x80", -			"\xE1\xB9\x97" => "\xE1\xB9\x96", "\xE1\xB9\xA1" => "\xE1\xB9\xA0", "\xE1\xB9\xAB" => "\xE1\xB9\xAA", "\xE1\xBA\x81" => "\xE1\xBA\x80", -			"\xE1\xBA\x83" => "\xE1\xBA\x82", "\xE1\xBA\x85" => "\xE1\xBA\x84", "\xE1\xBB\xB3" => "\xE1\xBB\xB2" -		); - -		return strtr(strtoupper($string), $utf8_lower_to_upper); -	} - -	/** -	* UTF-8 aware alternative to substr -	* Return part of a string given character offset (and optionally length) -	* -	* Note arguments: comparied to substr - if offset or length are -	* not integers, this version will not complain but rather massages them -	* into an integer. -	* -	* Note on returned values: substr documentation states false can be -	* returned in some cases (e.g. offset > string length) -	* mb_substr never returns false, it will return an empty string instead. -	* This adopts the mb_substr approach -	* -	* Note on implementation: PCRE only supports repetitions of less than -	* 65536, in order to accept up to MAXINT values for offset and length, -	* we'll repeat a group of 65535 characters when needed. -	* -	* Note on implementation: calculating the number of characters in the -	* string is a relatively expensive operation, so we only carry it out when -	* necessary. It isn't necessary for +ve offsets and no specified length -	* -	* @author Chris Smith<chris@jalakai.co.uk> -	* @param string $str -	* @param integer $offset number of UTF-8 characters offset (from left) -	* @param integer $length (optional) length in UTF-8 characters from offset -	* @return mixed string or FALSE if failure -	*/ -	function utf8_substr($str, $offset, $length = NULL) -	{ -		// generates E_NOTICE -		// for PHP4 objects, but not PHP5 objects -		$str = (string) $str; -		$offset = (int) $offset; -		if (!is_null($length)) -		{ -			$length = (int) $length; -		} - -		// handle trivial cases -		if ($length === 0 || ($offset < 0 && $length < 0 && $length < $offset)) -		{ -			return ''; -		} - -		// normalise negative offsets (we could use a tail -		// anchored pattern, but they are horribly slow!) -		if ($offset < 0) -		{ -			// see notes -			$strlen = utf8_strlen($str); -			$offset = $strlen + $offset; -			if ($offset < 0) -			{ -				$offset = 0; -			} -		} - -		$op = ''; -		$lp = ''; - -		// establish a pattern for offset, a -		// non-captured group equal in length to offset -		if ($offset > 0) -		{ -			$ox = (int) ($offset / 65535); -			$oy = $offset % 65535; - -			if ($ox) -			{ -				$op = '(?:.{65535}){' . $ox . '}'; -			} - -			$op = '^(?:' . $op . '.{' . $oy . '})'; -		} -		else -		{ -			// offset == 0; just anchor the pattern -			$op = '^'; -		} - -		// establish a pattern for length -		if (is_null($length)) -		{ -			// the rest of the string -			$lp = '(.*)$'; -		} -		else -		{ -			if (!isset($strlen)) -			{ -				// see notes -				$strlen = utf8_strlen($str); -			} - -			// another trivial case -			if ($offset > $strlen) -			{ -				return ''; -			} - -			if ($length > 0) -			{ -				// reduce any length that would -				// go passed the end of the string -				$length = min($strlen - $offset, $length); - -				$lx = (int) ($length / 65535); -				$ly = $length % 65535; - -				// negative length requires a captured group -				// of length characters -				if ($lx) -				{ -					$lp = '(?:.{65535}){' . $lx . '}'; -				} -				$lp = '(' . $lp . '.{'. $ly . '})'; -			} -			else if ($length < 0) -			{ -				if ($length < ($offset - $strlen)) -				{ -					return ''; -				} - -				$lx = (int) ((-$length) / 65535); -				$ly = (-$length) % 65535; - -				// negative length requires ... capture everything -				// except a group of  -length characters -				// anchored at the tail-end of the string -				if ($lx) -				{ -					$lp = '(?:.{65535}){' . $lx . '}'; -				} -				$lp = '(.*)(?:' . $lp . '.{' . $ly . '})$'; -			} -		} - -		if (!preg_match('#' . $op . $lp . '#us', $str, $match)) -		{ -			return ''; -		} - -		return $match[1]; +		return mb_substr($str, $offset, $length);  	} +} -	/** -	* Return the length (in characters) of a UTF-8 string -	* -	* @param	string	$text		UTF-8 string -	* @return	integer				Length (in chars) of given string -	*/ -	function utf8_strlen($text) -	{ -		// Since utf8_decode is replacing multibyte characters to ? strlen works fine -		return strlen(utf8_decode($text)); -	} +/** +* Return the length (in characters) of a UTF-8 string +* @ignore +*/ +function utf8_strlen($text) +{ +	return mb_strlen($text, 'utf-8');  }  /** @@ -867,7 +415,6 @@ function utf8_recode($string, $encoding)  	// Trigger an error?! Fow now just give bad data :-(  	trigger_error('Unknown encoding: ' . $encoding, E_USER_ERROR); -	//return $string; // use utf_normalizer::cleanup() ?  }  /** @@ -1611,14 +1158,8 @@ function utf8_case_fold_nfkc($text, $option = 'full')  	// do the case fold  	$text = utf8_case_fold($text, $option); -	if (!class_exists('utf_normalizer')) -	{ -		global $phpbb_root_path, $phpEx; -		include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx); -	} -  	// convert to NFKC -	utf_normalizer::nfkc($text); +	Normalizer::normalize($text, Normalizer::NFKC);  	// FC_NFKC_Closure, http://www.unicode.org/Public/5.0.0/ucd/DerivedNormalizationProps.txt  	$text = strtr($text, $fc_nfkc_closure); @@ -1714,106 +1255,56 @@ function utf8_case_fold_nfc($text, $option = 'full')  	return $text;  } -if (extension_loaded('intl')) +/** +* wrapper around PHP's native normalizer from intl +* previously a PECL extension, included in the core since PHP 5.3.0 +* http://php.net/manual/en/normalizer.normalize.php +* +* @param	mixed	$strings	a string or an array of strings to normalize +* @return	mixed				the normalized content, preserving array keys if array given. +*/ +function utf8_normalize_nfc($strings)  { -	/** -	* wrapper around PHP's native normalizer from intl -	* previously a PECL extension, included in the core since PHP 5.3.0 -	* http://php.net/manual/en/normalizer.normalize.php -	* -	* @param	mixed	$strings	a string or an array of strings to normalize -	* @return	mixed				the normalized content, preserving array keys if array given. -	*/ -	function utf8_normalize_nfc($strings) +	if (empty($strings))  	{ -		if (empty($strings)) -		{ -			return $strings; -		} - -		if (!is_array($strings)) -		{ -			if (Normalizer::isNormalized($strings)) -			{ -				return $strings; -			} -			return (string) Normalizer::normalize($strings); -		} -		else -		{ -			foreach ($strings as $key => $string) -			{ -				if (is_array($string)) -				{ -					foreach ($string as $_key => $_string) -					{ -						if (Normalizer::isNormalized($strings[$key][$_key])) -						{ -							continue; -						} -						$strings[$key][$_key] = (string) Normalizer::normalize($strings[$key][$_key]); -					} -				} -				else -				{ -					if (Normalizer::isNormalized($strings[$key])) -					{ -						continue; -					} -					$strings[$key] = (string) Normalizer::normalize($strings[$key]); -				} -			} -		} -  		return $strings;  	} -} -else -{ -	/** -	* A wrapper function for the normalizer which takes care of including the class if -	* required and modifies the passed strings to be in NFC (Normalization Form Composition). -	* -	* @param	mixed	$strings	a string or an array of strings to normalize -	* @return	mixed				the normalized content, preserving array keys if array given. -	*/ -	function utf8_normalize_nfc($strings) + +	if (!is_array($strings))  	{ -		if (empty($strings)) +		if (Normalizer::isNormalized($strings))  		{  			return $strings;  		} - -		if (!class_exists('utf_normalizer')) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx); -		} - -		if (!is_array($strings)) -		{ -			utf_normalizer::nfc($strings); -		} -		else if (is_array($strings)) +		return (string) Normalizer::normalize($strings); +	} +	else +	{ +		foreach ($strings as $key => $string)  		{ -			foreach ($strings as $key => $string) +			if (is_array($string))  			{ -				if (is_array($string)) +				foreach ($string as $_key => $_string)  				{ -					foreach ($string as $_key => $_string) +					if (Normalizer::isNormalized($strings[$key][$_key]))  					{ -						utf_normalizer::nfc($strings[$key][$_key]); +						continue;  					} +					$strings[$key][$_key] = (string) Normalizer::normalize($strings[$key][$_key]);  				} -				else +			} +			else +			{ +				if (Normalizer::isNormalized($strings[$key]))  				{ -					utf_normalizer::nfc($strings[$key]); +					continue;  				} +				$strings[$key] = (string) Normalizer::normalize($strings[$key]);  			}  		} - -		return $strings;  	} + +	return $strings;  }  /** @@ -1959,50 +1450,3 @@ function utf8_basename($filename)  	return $filename;  } - -/** -* UTF8-safe str_replace() function -* -* @param string $search The value to search for -* @param string $replace The replacement string -* @param string $subject The target string -* @return string The resultant string -*/ -function utf8_str_replace($search, $replace, $subject) -{ -	if (!is_array($search)) -	{ -		$search = array($search); -		if (is_array($replace)) -		{ -			$replace = (string) $replace; -			trigger_error('Array to string conversion', E_USER_NOTICE); -		} -	} - -	$length = sizeof($search); - -	if (!is_array($replace)) -	{ -		$replace = array_fill(0, $length, $replace); -	} -	else -	{ -		$replace = array_pad($replace, $length, ''); -	} - -	for ($i = 0; $i < $length; $i++) -	{ -		$search_length = utf8_strlen($search[$i]); -		$replace_length = utf8_strlen($replace[$i]); - -		$offset = 0; -		while (($start = utf8_strpos($subject, $search[$i], $offset)) !== false) -		{ -			$subject = utf8_substr($subject, 0, $start) . $replace[$i] . utf8_substr($subject, $start + $search_length); -			$offset = $start + $replace_length; -		} -	} - -	return $subject; -} | 
