From e8bcf08c72a18b3bf396e6448d6658227ecb46f2 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 30 Apr 2014 16:21:29 +0200 Subject: 1. Prepare core and Larry skin for improved accessibility 2. Implement full keyboard navigation in main mail view --- program/lib/Roundcube/html.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php index f47ef299a..5e07a7806 100644 --- a/program/lib/Roundcube/html.php +++ b/program/lib/Roundcube/html.php @@ -32,7 +32,7 @@ class html public static $doctype = 'xhtml'; public static $lc_tags = true; - public static $common_attrib = array('id','class','style','title','align','unselectable'); + public static $common_attrib = array('id','class','style','title','align','unselectable','tabindex','role'); public static $containers = array('iframe','div','span','p','h1','h2','h3','ul','form','textarea','table','thead','tbody','tr','th','td','style','script'); @@ -286,7 +286,8 @@ class html // ignore not allowed attributes if (!empty($allowed)) { $is_data_attr = @substr_compare($key, 'data-', 0, 5) === 0; - if (!isset($allowed_f[$key]) && (!$is_data_attr || !isset($allowed_f['data-*']))) { + $is_aria_attr = @substr_compare($key, 'aria-', 0, 5) === 0; + if (!$is_aria_attr && !isset($allowed_f[$key]) && (!$is_data_attr || !isset($allowed_f['data-*']))) { continue; } } -- cgit v1.2.3 From 89d6ce68463b92641946551b07ec49b023d56d90 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 1 May 2014 11:48:29 +0200 Subject: Update to TinyMCE 4.x --- program/js/app.js | 5 ++ program/js/editor.js | 94 +++++++++++++--------------- program/lib/Roundcube/rcube_spellchecker.php | 13 +++- program/steps/mail/compose.inc | 2 +- program/steps/mail/sendmail.inc | 7 ++- program/steps/utils/spell_html.inc | 30 ++++----- skins/classic/common.css | 4 ++ skins/classic/functions.js | 7 +-- skins/larry/ui.js | 2 +- 9 files changed, 84 insertions(+), 80 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/js/app.js b/program/js/app.js index 1baedac33..0588eb45b 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -3358,8 +3358,11 @@ function rcube_webmail() { this.stop_spellchecking(); + var flag = $('[name="_is_html"]'); + if (props.mode == 'html') { this.plain2html($('#'+props.id).val(), props.id); + flag.val(1); tinymce.execCommand('mceAddEditor', false, props.id); if (this.env.default_font) @@ -3376,6 +3379,8 @@ function rcube_webmail() } this.html2plain(existingHtml, props.id); } + + flag.val(0); tinymce.execCommand('mceRemoveEditor', false, props.id); } diff --git a/program/js/editor.js b/program/js/editor.js index 632ff9918..8a6e88433 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -19,7 +19,6 @@ function rcmail_editor_init(config) { var ret, conf = { selector: '.mce_editor', - apply_source_formatting: true, theme: 'modern', language: config.lang, content_css: config.skin_path + '/editor_content.css', @@ -28,36 +27,37 @@ function rcmail_editor_init(config) extended_valid_elements: 'font[face|size|color|style],span[id|class|align|style]', relative_urls: false, remove_script_host: false, - gecko_spellcheck: true, convert_urls: false, // #1486944 - external_image_list: window.rcmail_editor_images, //TODO - rc_client: rcmail + image_list: window.rcmail_editor_images, + image_description: false, + paste_webkit_style: "color font-size font-family", + paste_data_images: true }; if (config.mode == 'identity') $.extend(conf, { plugins: ['charmap code hr link paste tabfocus textcolor'], toolbar: 'bold italic underline alignleft aligncenter alignright alignjustify' - + ' | outdent indent charmap hr link unlink code forecolor' - + ' | fontselect fontsizeselect' + + ' | outdent indent charmap hr link unlink code forecolor' + + ' | fontselect fontsizeselect' }); else { // mail compose $.extend(conf, { - plugins: ['charmap code directionality emoticons link image media nonbreaking paste table tabfocus textcolor searchreplace' + (config.spellcheck ? ' spellchecker' : '')], + plugins: ['charmap code directionality emoticons link image media nonbreaking' + + ' paste table tabfocus textcolor searchreplace' + (config.spellcheck ? ' spellchecker' : '')], toolbar: 'bold italic underline | alignleft aligncenter alignright alignjustify' - + ' | bullist numlist outdent indent ltr rtl blockquote | forecolor backcolor | fontselect fontsizeselect' - + ' | link unlink table | emoticons charmap image media | code searchreplace undo redo', -// spellchecker_languages: (rcmail.env.spellcheck_langs ? rcmail.env.spellcheck_langs : 'Dansk=da,Deutsch=de,+English=en,Espanol=es,Francais=fr,Italiano=it,Nederlands=nl,Polski=pl,Portugues=pt,Suomi=fi,Svenska=sv'), - spellchecker_rpc_url: '?_task=utils&_action=spell_html&_remote=1', - spellchecker_enable_learn_rpc: config.spelldict, + + ' | bullist numlist outdent indent ltr rtl blockquote | forecolor backcolor | fontselect fontsizeselect' + + ' | link unlink table | emoticons charmap image media | code searchreplace undo redo', + spellchecker_rpc_url: '../../../../../?_task=utils&_action=spell_html&_remote=1', + spellchecker_enable_learn_rpc: config.spelldict, //TODO accessibility_focus: false }); conf.setup = function(ed) { ed.on('init', rcmail_editor_callback); // add handler for spellcheck button state update - ed.on('SetProgressState', function(args) { - if (!args.active) + ed.on('ProgressState', function(args) { + if (!args.state) rcmail.spellcheck_state(); }); ed.on('keypress', function() { @@ -90,7 +90,10 @@ function rcmail_editor_callback() $(tinymce.get(rcmail.env.composebody).getBody()).css(css); if (elem && elem.type == 'select-one') { - rcmail.change_identity(elem); + // insert signature (only for the first time) + if (!rcmail.env.identities_initialized) + rcmail.change_identity(elem); + // Focus previously focused element if (fe && fe.id != rcmail.env.composebody) { // use setTimeout() for IE9 (#1488541) @@ -103,8 +106,8 @@ function rcmail_editor_callback() // set tabIndex and set focus to element that was focused before rcmail_editor_tabindex(fe && fe.id == rcmail.env.composebody); - // Trigger resize (needed for proper editor resizing in some browsers using default skin) - $(window).resize(); + // Trigger resize (needed for proper editor resizing in some browsers) + window.setTimeout(function() { $(window).resize(); }, 100); } // set tabIndex on tinymce editor @@ -113,8 +116,9 @@ function rcmail_editor_tabindex(focus) if (rcmail.env.task == 'mail') { var editor = tinymce.get(rcmail.env.composebody); if (editor) { - var textarea = editor.getElement(); - var node = editor.getContentAreaContainer().childNodes[0]; + var textarea = editor.getElement(), + node = editor.getContentAreaContainer().childNodes[0]; + if (textarea && node) node.tabIndex = textarea.tabIndex; if (focus) @@ -124,49 +128,37 @@ function rcmail_editor_tabindex(focus) } // switch html/plain mode -function rcmail_toggle_editor(select, textAreaId, flagElement) +function rcmail_toggle_editor(select, textAreaId) { - var flag, ishtml; - - if (select.tagName != 'SELECT') - ishtml = select.checked; - else - ishtml = select.value == 'html'; - - var res = rcmail.command('toggle-editor', {id:textAreaId, mode:ishtml?'html':'plain'}); - - if (ishtml) { - // #1486593 - setTimeout("rcmail_editor_tabindex(true);", 500); - if (flagElement && (flag = rcube_find_object(flagElement))) - flag.value = '1'; - } - else if (res) { - if (flagElement && (flag = rcube_find_object(flagElement))) - flag.value = '0'; + var ishtml = select.tagName != 'SELECT' ? select.checked : select.value == 'html', + res = rcmail.command('toggle-editor', {id: textAreaId, mode: ishtml ? 'html' : 'plain'}); - if (rcmail.env.composebody) - rcube_find_object(rcmail.env.composebody).focus(); - } - else { // !res + if (!res) { if (select.tagName == 'SELECT') select.value = 'html'; else if (select.tagName == 'INPUT') select.checked = true; } + else if (ishtml) { + // #1486593 + setTimeout("rcmail_editor_tabindex(true);", 500); + } + else if (rcmail.env.composebody) { + rcube_find_object(rcmail.env.composebody).focus(); + } } -// editor callbeck for images listing -function rcmail_editor_images() +// editor callback for images listing +function rcmail_editor_images(callback) { - var i, files = rcmail.env.attachments, list = []; + var i, file, list = []; - for (i in files) { - att = files[i]; - if (att.complete && att.mimetype.startsWith('image/')) { - list.push([att.name, rcmail.env.comm_path+'&_id='+rcmail.env.compose_id+'&_action=display-attachment&_file='+i]); + for (i in rcmail.env.attachments) { + file = rcmail.env.attachments[i]; + if (file.complete && file.mimetype.startsWith('image/')) { + list.push({title: file.name, value: rcmail.env.comm_path+'&_id='+rcmail.env.compose_id+'&_action=display-attachment&_file='+i}); } } - return list; -}; + callback(list); +} diff --git a/program/lib/Roundcube/rcube_spellchecker.php b/program/lib/Roundcube/rcube_spellchecker.php index 5b77bda02..3d15eb660 100644 --- a/program/lib/Roundcube/rcube_spellchecker.php +++ b/program/lib/Roundcube/rcube_spellchecker.php @@ -226,7 +226,18 @@ class rcube_spellchecker else { $word = mb_substr($this->content, $item[1], $item[2], RCUBE_CHARSET); } - $result[$word] = is_array($item[4]) ? implode("\t", $item[4]) : $item[4]; + + if (is_array($item[4])) { + $suggestions = $item[4]; + } + else if (empty($item[4])) { + $suggestions = array(); + } + else { + $suggestions = explode("\t", $item[4]); + } + + $result[$word] = $suggestions; } return $result; diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index db001d54e..db485fda8 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -1675,7 +1675,7 @@ function rcmail_editor_selector($attrib) if (empty($attrib['name'])) $attrib['name'] = 'editorSelect'; - $attrib['onchange'] = "return rcmail_toggle_editor(this, '".$attrib['editorid']."', '_is_html')"; + $attrib['onchange'] = "return rcmail_toggle_editor(this, '".$attrib['editorid']."')"; $select = new html_select($attrib); diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 005c25427..5bddc249a 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -273,9 +273,10 @@ if ($isHtml) { } // append doctype and html/body wrappers - $message_body = '' - . "\r\n\r\n" - . $message_body; + $bstyle = !empty($bstyle) ? (" style='" . implode($bstyle, '; ') . "'") : ''; + $message_body = '' + . '' + . "\r\n" . $message_body; } if (!$savedraft) { diff --git a/program/steps/utils/spell_html.inc b/program/steps/utils/spell_html.inc index 27b14acef..b31d6ed86 100644 --- a/program/steps/utils/spell_html.inc +++ b/program/steps/utils/spell_html.inc @@ -19,31 +19,23 @@ +-----------------------------------------------------------------------+ */ -// read input data -$data = file_get_contents('php://input'); -// Decode JSON input -$request = json_decode($data, true); +$lang = rcube_utils::get_input_value('lang', rcube_utils::INPUT_POST); +$data = rcube_utils::get_input_value('text', rcube_utils::INPUT_POST); +$data = html_entity_decode($data, ENT_QUOTES, RCUBE_CHARSET); $result = array(); -$lang = $request['params'][0]; -$data = $request['params'][1]; -$data = implode("\n", (array) $data); - -$result['id'] = $request['id']; - $spellchecker = new rcube_spellchecker($lang); -if ($request['method'] == 'checkWords') { - $result['result'] = $spellchecker->get_words($data); -} -else if ($request['method'] == 'getSuggestions') { - $result['result'] = $spellchecker->get_suggestions($data); -} -else if ($request['method'] == 'learnWord') { +if ($method == 'learnWord') { $spellchecker->add_word($data); $result['result'] = true; } +else if ($data) { + if (!$spellchecker->check($data)) { + $result['words'] = $spellchecker->get(); + } +} if ($error = $spellchecker->error()) { rcube::raise_error(array('code' => 500, 'type' => 'php', @@ -51,12 +43,12 @@ if ($error = $spellchecker->error()) { 'message' => sprintf("Spell check engine error: " . $error)), true, false); - echo '{"error":{"errstr":"' . addslashes($error) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'; + echo json_encode(array('error' => $error)); exit; } // send output -header("Content-Type: text/xml; charset=".RCUBE_CHARSET); +header("Content-Type: application/json; charset=".RCUBE_CHARSET); echo json_encode($result); exit; diff --git a/skins/classic/common.css b/skins/classic/common.css index 10bc91c09..390522fe8 100644 --- a/skins/classic/common.css +++ b/skins/classic/common.css @@ -597,6 +597,10 @@ img.uploading height: 16px; } +.mce-btn button { + height: 28px; +} + /***** common table settings ******/ table.records-table thead tr td diff --git a/skins/classic/functions.js b/skins/classic/functions.js index 07df6391c..aaaf393e7 100644 --- a/skins/classic/functions.js +++ b/skins/classic/functions.js @@ -543,10 +543,9 @@ resize_compose_body: function() w = div.width() - 2, h = div.height(), x = bw.ie || bw.opera ? 4 : 0; - $('#compose-body_tbl').width((w+3)+'px').height(''); - $('#compose-body_ifr').width((w+3)+'px').height((h-54)+'px'); - $('#compose-body').width((w-x)+'px').height(h+'px'); - $('#googie_edit_layer').height(h+'px'); + $('#compose-body_ifr').width(w+3).height(h-2 - $('div.mce-toolbar').height()); + $('#compose-body').width(w-x).height(h); + $('#googie_edit_layer').height(h); }, resize_compose_body_ev: function() diff --git a/skins/larry/ui.js b/skins/larry/ui.js index a173ffd1d..c85c37257 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -528,7 +528,7 @@ function rcube_mail_ui() body.width(w).height(h); $('#composebodycontainer > div').width(w+8).css('margin-top', '1px'); - $('#composebody_ifr').height(h + 4 - $('.mce-toolbar-grp').height()); + $('#composebody_ifr').height(h + 4 - $('div.mce-toolbar').height()); $('#googie_edit_layer').height(h - 8); // $('#composebodycontainer')[(btns ? 'addClass' : 'removeClass')]('buttons'); // $('#composeformbuttons')[(btns ? 'show' : 'hide')](); -- cgit v1.2.3 From eda92ed4c0d2735144df8fa2136584de69634bdb Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 11 May 2014 11:03:45 +0200 Subject: Improved display of plain text messages and text to HTML conversion (#1488937) Now instead of
 we use 
styled with monospace font. We replace whitespace characters with non-breaking spaces where needed. I.e. plain text is always unwrappable, until it uses format=flowed, in such a case only flowed paragraphs are wrappable. Also conversion of text to HTML in compose editor was modified in the same way. --- plugins/hide_blockquote/hide_blockquote.js | 2 +- program/js/app.js | 70 +++++--- program/js/editor.js | 2 +- program/lib/Roundcube/rcube_mime.php | 22 ++- program/lib/Roundcube/rcube_text2html.php | 277 +++++++++++++++++++++++++++++ program/steps/mail/compose.inc | 12 +- program/steps/mail/func.inc | 83 +-------- program/steps/mail/sendmail.inc | 27 ++- program/steps/utils/text2html.inc | 28 +++ skins/classic/editor_content.css | 13 +- skins/classic/mail.css | 11 +- skins/larry/editor_content.css | 13 +- skins/larry/mail.css | 11 +- tests/Framework/Text2Html.php | 81 +++++++++ tests/phpunit.xml | 1 + 15 files changed, 497 insertions(+), 156 deletions(-) create mode 100644 program/lib/Roundcube/rcube_text2html.php create mode 100644 program/steps/utils/text2html.inc create mode 100644 tests/Framework/Text2Html.php (limited to 'program/lib/Roundcube') diff --git a/plugins/hide_blockquote/hide_blockquote.js b/plugins/hide_blockquote/hide_blockquote.js index 2d28076a1..964cc07a3 100644 --- a/plugins/hide_blockquote/hide_blockquote.js +++ b/plugins/hide_blockquote/hide_blockquote.js @@ -25,7 +25,7 @@ function hide_blockquote() if (limit <= 0) return; - $('pre > blockquote', $('#messagebody')).each(function() { + $('div.message-part div.pre > blockquote', $('#messagebody')).each(function() { var div, link, q = $(this), text = $.trim(q.text()), res = text.split(/\n/); diff --git a/program/js/app.js b/program/js/app.js index 042ebb724..46d748062 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -3439,17 +3439,23 @@ function rcube_webmail() { this.stop_spellchecking(); - if (props.mode == 'html') { - this.plain2html($('#'+props.id).val(), props.id); - tinyMCE.execCommand('mceAddControl', false, props.id); + var input = $('#' + props.id); - if (this.env.default_font) - setTimeout(function() { - $(tinyMCE.get(props.id).getBody()).css('font-family', rcmail.env.default_font); - }, 500); - } - else if (this.html2plain(tinyMCE.get(props.id).getContent(), props.id)) - tinyMCE.execCommand('mceRemoveControl', false, props.id); + if (props.mode == 'html') + this.plain2html(input.val(), function(data) { + input.val(data); + tinyMCE.execCommand('mceAddControl', false, props.id); + + if (ref.env.default_font) + setTimeout(function() { + $(tinyMCE.get(props.id).getBody()).css('font-family', ref.env.default_font); + }, 500); + }); + else + this.html2plain(tinyMCE.get(props.id).getContent(), function(data) { + tinyMCE.execCommand('mceRemoveControl', false, props.id); + input.val(data); + }); return true; }; @@ -6809,41 +6815,51 @@ function rcube_webmail() /********* html to text conversion functions *********/ /********************************************************/ - this.html2plain = function(htmlText, id) + this.html2plain = function(html, func) + { + return this.format_converter(html, 'html', func); + }; + + this.plain2html = function(plain, func) + { + return this.format_converter(plain, 'plain', func); + }; + + this.format_converter = function(text, format, func) { // warn the user (if converted content is not empty) - if (!htmlText || !(htmlText.replace(/<[^>]+>| |\s/g, '')).length) { + if (!text + || (format == 'html' && !(text.replace(/<[^>]+>| |\xC2\xA0|\s/g, '')).length) + || (format != 'html' && !(text.replace(/\xC2\xA0|\s/g, '')).length) + ) { // without setTimeout() here, textarea is filled with initial (onload) content - setTimeout(function() { $('#'+id).val(''); }, 50); + setTimeout(function() { if (func) func(''); }, 50); return true; } - if (!confirm(this.get_label('editorwarning'))) + var confirmed = this.env.editor_warned || confirm(this.get_label('editorwarning')); + + this.env.editor_warned = true; + + if (!confirmed) return false; - var url = '?_task=utils&_action=html2text', + var url = '?_task=utils&_action=' + (format == 'html' ? 'html2text' : 'text2html'), lock = this.set_busy(true, 'converting'); this.log('HTTP POST: ' + url); - $.ajax({ type: 'POST', url: url, data: htmlText, contentType: 'application/octet-stream', + $.ajax({ type: 'POST', url: url, data: text, contentType: 'application/octet-stream', error: function(o, status, err) { ref.http_error(o, status, err, lock); }, - success: function(data) { ref.set_busy(false, null, lock); $('#'+id).val(data); ref.log(data); } + success: function(data) { + ref.set_busy(false, null, lock); + if (func) func(data); + } }); return true; }; - this.plain2html = function(plain, id) - { - var lock = this.set_busy(true, 'converting'); - - plain = plain.replace(/&/g, '&').replace(//g, '>'); - $('#'+id).val(plain ? '
'+plain+'
' : ''); - - this.set_busy(false, null, lock); - }; - /********************************************************/ /********* remote request methods *********/ diff --git a/program/js/editor.js b/program/js/editor.js index af877d7b5..d23d2b26f 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -37,7 +37,7 @@ function rcmail_editor_init(config) apply_source_formatting: true, theme: 'advanced', language: config.lang, - content_css: config.skin_path + '/editor_content.css', + content_css: config.skin_path + '/editor_content.css?v2', theme_advanced_toolbar_location: 'top', theme_advanced_toolbar_align: 'left', theme_advanced_buttons3: '', diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php index 091b2fae8..370d5a8d5 100644 --- a/program/lib/Roundcube/rcube_mime.php +++ b/program/lib/Roundcube/rcube_mime.php @@ -480,15 +480,17 @@ class rcube_mime /** * Interpret a format=flowed message body according to RFC 2646 * - * @param string $text Raw body formatted as flowed text + * @param string $text Raw body formatted as flowed text + * @param string $mark Mark each flowed line with specified character * * @return string Interpreted text with unwrapped lines and stuffed space removed */ - public static function unfold_flowed($text) + public static function unfold_flowed($text, $mark = null) { $text = preg_split('/\r?\n/', $text); $last = -1; $q_level = 0; + $marks = array(); foreach ($text as $idx => $line) { if (preg_match('/^(>+)/', $line, $m)) { @@ -508,6 +510,10 @@ class rcube_mime ) { $text[$last] .= $line; unset($text[$idx]); + + if ($mark) { + $marks[$last] = true; + } } else { $last = $idx; @@ -520,7 +526,7 @@ class rcube_mime } else { // remove space-stuffing - $line = preg_replace('/^\s/', '', $line); + $line = preg_replace('/^ /', '', $line); if (isset($text[$last]) && $line && $text[$last] != '-- ' @@ -528,6 +534,10 @@ class rcube_mime ) { $text[$last] .= $line; unset($text[$idx]); + + if ($mark) { + $marks[$last] = true; + } } else { $text[$idx] = $line; @@ -538,6 +548,12 @@ class rcube_mime $q_level = $q; } + if (!empty($marks)) { + foreach (array_keys($marks) as $mk) { + $text[$mk] = $mark . $text[$mk]; + } + } + return implode("\r\n", $text); } diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php new file mode 100644 index 000000000..5da771ac8 --- /dev/null +++ b/program/lib/Roundcube/rcube_text2html.php @@ -0,0 +1,277 @@ + | + +-----------------------------------------------------------------------+ + */ + +/** + * Converts plain text to HTML + * + * @package Framework + * @subpackage Utils + */ +class rcube_text2html +{ + /** + * Contains the HTML content after conversion. + * + * @var string $html + */ + protected $html; + + /** + * Contains the plain text. + * + * @var string $text + */ + protected $text; + + /** + * Configuration + * + * @var array $config + */ + protected $config = array( + // non-breaking space + 'space' => "\xC2\xA0", + // enables format=flowed parser + 'flowed' => false, + // enables wrapping for non-flowed text + 'wrap' => false, + // line-break tag + 'break' => "
\n", + // prefix and suffix (wrapper element) + 'begin' => '
', + 'end' => '', + // enables links replacement + 'links' => true, + ); + + + /** + * Constructor. + * + * If the plain text source string (or file) is supplied, the class + * will instantiate with that source propagated, all that has + * to be done it to call get_html(). + * + * @param string $source Plain text + * @param boolean $from_file Indicates $source is a file to pull content from + * @param array $config Class configuration + */ + function __construct($source = '', $from_file = false, $config = array()) + { + if (!empty($source)) { + $this->set_text($source, $from_file); + } + + if (!empty($config) && is_array($config)) { + $this->config = array_merge($this->config, $config); + } + } + + /** + * Loads source text into memory, either from $source string or a file. + * + * @param string $source Plain text + * @param boolean $from_file Indicates $source is a file to pull content from + */ + function set_text($source, $from_file = false) + { + if ($from_file && file_exists($source)) { + $this->text = file_get_contents($source); + } + else { + $this->text = $source; + } + + $this->_converted = false; + } + + /** + * Returns the HTML content. + * + * @return string HTML content + */ + function get_html() + { + if (!$this->_converted) { + $this->_convert(); + } + + return $this->html; + } + + /** + * Prints the HTML. + */ + function print_html() + { + print $this->get_html(); + } + + /** + * Workhorse function that does actual conversion (calls _converter() method). + */ + protected function _convert() + { + $text = stripslashes($this->text); + + // Convert TXT to HTML + $this->html = $this->_converter($text); + $this->_converted = true; + } + + /** + * Workhorse function that does actual conversion. + * + * @param string Plain text + */ + protected function _converter($text) + { + // make links and email-addresses clickable + $attribs = array('link_attribs' => array('rel' => 'noreferrer', 'target' => '_blank')); + $replacer = new rcmail_string_replacer($attribs); + + if ($this->config['flowed']) { + $flowed_char = 0x01; + $text = rcube_mime::unfold_flowed($text, chr($flowed_char)); + } + + // search for patterns like links and e-mail addresses and replace with tokens + if ($this->config['links']) { + $text = $replacer->replace($text); + } + + // split body into single lines + $text = preg_split('/\r?\n/', $text); + $quote_level = 0; + $last = -1; + + // find/mark quoted lines... + for ($n=0, $cnt=count($text); $n < $cnt; $n++) { + $flowed = false; + if ($this->config['flowed'] && ord($text[0]) == $flowed_char) { + $flowed = true; + $text[$n] = substr($text[$n], 1); + } + + if ($text[$n][0] == '>' && preg_match('/^(>+ {0,1})+/', $text[$n], $regs)) { + $q = substr_count($regs[0], '>'); + $text[$n] = substr($text[$n], strlen($regs[0])); + $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); + + if ($q > $quote_level) { + $text[$n] = $replacer->get_replacement($replacer->add( + str_repeat('
', $q - $quote_level))) . $text[$n]; + $last = $n; + } + else if ($q < $quote_level) { + $text[$n] = $replacer->get_replacement($replacer->add( + str_repeat('
', $quote_level - $q))) . $text[$n]; + $last = $n; + } + } + else { + $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); + $q = 0; + + if ($quote_level > 0) { + $text[$n] = $replacer->get_replacement($replacer->add( + str_repeat('', $quote_level))) . $text[$n]; + } + } + + $quote_level = $q; + } + + if ($quote_level > 0) { + $text[$n] = $replacer->get_replacement($replacer->add( + str_repeat('', $quote_level))) . $text[$n]; + } + + $text = join("\n", $text); + + // colorize signature (up to lines) + $len = strlen($text); + $sig_max_lines = rcube::get_instance()->config->get('sig_max_lines', 15); + + while (($sp = strrpos($text, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) { + if ($sp == 0 || $text[$sp-1] == "\n") { + // do not touch blocks with more that X lines + if (substr_count($text, "\n", $sp) < $sig_max_lines) { + $text = substr($text, 0, max(0, $sp)) + .''.substr($text, $sp).''; + } + + break; + } + } + + // insert url/mailto links and citation tags + $text = $replacer->resolve($text); + + // replace \n before + $text = str_replace("\n", "", $text); + + // replace line breaks + $text = str_replace("\n", $this->config['break'], $text); + + return $this->config['begin'] . $text . $this->config['end']; + } + + /** + * Converts spaces in line of text + */ + protected function _convert_line($text, $is_flowed) + { + static $table; + + if (empty($table)) { + $table = get_html_translation_table(HTML_SPECIALCHARS); + unset($table['?']); + } + + // skip signature separator + if ($text == '-- ') { + return $text; + } + + // replace HTML special characters + $text = strtr($text, $table); + + $nbsp = $this->config['space']; + + // replace some whitespace characters + $text = str_replace(array("\r", "\t"), array('', ' '), $text); + + // replace spaces with non-breaking spaces + if ($is_flowed) { + $text = preg_replace_callback('/(^|[^ ])( +)/', function($matches) { + if (!strlen($matches[2])) { + return str_repeat($nbsp, strlen($matches[2])); + } + else { + return $matches[1] . ' ' . str_repeat($nbsp, strlen($matches[2])-1); + } + }, $text); + } + else { + $text = str_replace(' ', $nbsp, $text); + } + + return $text; + } +} diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 2b717d673..0ceb85db2 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -624,7 +624,8 @@ function rcmail_compose_header_from($attrib) } if (!$sql_arr['html_signature']) { - $html = "
" . $html . "
"; + $t2h = new rcube_text2html($sql_arr['signature'], false); + $html = $t2h->get_html(); } $a_signatures[$identity_id]['text'] = $text; @@ -826,15 +827,8 @@ function rcmail_compose_part_body($part, $isHtml = false) } } - if ($part->ctype_parameters['format'] == 'flowed') { - $body = rcube_mime::unfold_flowed($body); - } - // add HTML formatting - $body = rcmail_plain_body($body); - if ($body) { - $body = '
' . $body . '
'; - } + $body = rcmail_plain_body($body, $part->ctype_parameters['format'] == 'flowed'); } } else { diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 7270cf95a..ac0d7fc5f 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -854,95 +854,28 @@ function rcmail_print_body($part, $p = array()) // plaintext postprocessing if ($part->ctype_secondary == 'plain') { - if ($part->ctype_secondary == 'plain' && $part->ctype_parameters['format'] == 'flowed') { - $body = rcube_mime::unfold_flowed($body); - } - - $body = rcmail_plain_body($body); + $body = rcmail_plain_body($body, $part->ctype_parameters['format'] == 'flowed'); } // allow post-processing of the message body $data = $RCMAIL->plugins->exec_hook('message_part_after', array('type' => $part->ctype_secondary, 'body' => $body, 'id' => $part->mime_id) + $data); - return $data['type'] == 'html' ? $data['body'] : html::tag('pre', array(), $data['body']); + return $data['body']; } /** * Handle links and citation marks in plain text message * * @param string Plain text string + * @param boolean Set to True if the source text is in format=flowed * * @return string Formatted HTML string */ -function rcmail_plain_body($body) +function rcmail_plain_body($body, $flowed = false) { - global $RCMAIL; - - // make links and email-addresses clickable - $attribs = array('link_attribs' => array('rel' => 'noreferrer', 'target' => '_blank')); - $replacer = new rcmail_string_replacer($attribs); - - // search for patterns like links and e-mail addresses and replace with tokens - $body = $replacer->replace($body); - - // split body into single lines - $body = preg_split('/\r?\n/', $body); - $quote_level = 0; - $last = -1; - - // find/mark quoted lines... - for ($n=0, $cnt=count($body); $n < $cnt; $n++) { - if ($body[$n][0] == '>' && preg_match('/^(>+ {0,1})+/', $body[$n], $regs)) { - $q = substr_count($regs[0], '>'); - $body[$n] = substr($body[$n], strlen($regs[0])); - - if ($q > $quote_level) { - $body[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $q - $quote_level))) . $body[$n]; - $last = $n; - } - else if ($q < $quote_level) { - $body[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $quote_level - $q))) . $body[$n]; - $last = $n; - } - } - else { - $q = 0; - if ($quote_level > 0) - $body[$n] = $replacer->get_replacement($replacer->add( - str_repeat('', $quote_level))) . $body[$n]; - } - - $quote_level = $q; - } - - $body = join("\n", $body); - - // quote plain text (don't use rcube::Q() here, to display entities "as is") - $table = get_html_translation_table(HTML_SPECIALCHARS); - unset($table['?']); - $body = strtr($body, $table); - - // colorize signature (up to lines) - $len = strlen($body); - $sig_max_lines = $RCMAIL->config->get('sig_max_lines', 15); - - while (($sp = strrpos($body, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) { - if ($sp == 0 || $body[$sp-1] == "\n") { - // do not touch blocks with more that X lines - if (substr_count($body, "\n", $sp) < $sig_max_lines) { - $body = substr($body, 0, max(0, $sp)) - . ''.substr($body, $sp).''; - } - - break; - } - } - - // insert url/mailto links and citation tags - $body = $replacer->resolve($body); + $text2html = new rcube_text2html($body, false, array('flowed' => $flowed)); + $body = $text2html->get_html(); return $body; } @@ -1272,8 +1205,8 @@ function rcmail_message_body($attrib) $plugin = $RCMAIL->plugins->exec_hook('message_body_prefix', array('part' => $MESSAGE, 'prefix' => '')); - $out .= html::div('message-part', $plugin['prefix'] . html::tag('pre', array(), - rcmail_plain_body(rcube::Q($MESSAGE->body, 'strict', false)))); + $out .= html::div('message-part', + $plugin['prefix'] . rcmail_plain_body($MESSAGE->body)); } } diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 04ba94f5e..baecbd118 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -280,13 +280,23 @@ if ($isHtml) { if (!$savedraft) { if ($isHtml) { - // remove signature's div ID - $message_body = preg_replace('/\s*id="_rc_sig"/', '', $message_body); - - // add inline css for blockquotes - $bstyle = 'padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px'; - $message_body = preg_replace('/
/', - '
', $message_body); + $b_style = 'padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0'; + $pre_style = 'margin: 0; padding: 0; font-family: monospace'; + + $message_body = preg_replace( + array( + // remove signature's div ID + '/\s*id="_rc_sig"/', + // add inline css for blockquotes and container + '/
/', + '/
/' + ), + array( + '', + '
', + '
' + ), + $message_body); } // Check spelling before send @@ -912,7 +922,8 @@ function rcmail_generic_message_footer($isHtml) if (!preg_match('/\.(php|ini|conf)$/', $file) && strpos($file, '/etc/') === false) { $footer = file_get_contents($file); if ($isHtml && !$html_footer) { - $footer = '
' . $footer . '
'; + $t2h = new rcube_text2html($footer, false); + $footer = $t2h->get_html(); } return $footer; } diff --git a/program/steps/utils/text2html.inc b/program/steps/utils/text2html.inc new file mode 100644 index 000000000..167243694 --- /dev/null +++ b/program/steps/utils/text2html.inc @@ -0,0 +1,28 @@ + | + +-----------------------------------------------------------------------+ +*/ + +$text = stream_get_contents(fopen('php://input', 'r')); + +$converter = new rcube_text2html($text, false, array('wrap' => true)); + +header('Content-Type: text/html; charset=' . RCUBE_CHARSET); +print $converter->get_html(); +exit; diff --git a/skins/classic/editor_content.css b/skins/classic/editor_content.css index aabed07b5..67480ab77 100644 --- a/skins/classic/editor_content.css +++ b/skins/classic/editor_content.css @@ -12,20 +12,15 @@ body { margin-top: 2px; } -pre -{ +div.pre { margin: 0; padding: 0; - white-space: -moz-pre-wrap !important; - white-space: pre-wrap !important; - white-space: pre; - word-wrap: break-word; /* IE (and Safari) */ + font-family: monospace; } blockquote { - padding-left: 5px; border-left: #1010ff 2px solid; - margin-left: 5px; - width: 100%; + margin: 0; + padding: 0 0.4em; } diff --git a/skins/classic/mail.css b/skins/classic/mail.css index fc066e023..47faa29af 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -1306,17 +1306,12 @@ div.message-htmlpart a color: #0000CC; } -div.message-part pre, -div.message-htmlpart pre, div.message-part div.pre { margin: 0px; padding: 0px; font-family: monospace; font-size: 12px; - white-space: -moz-pre-wrap !important; - white-space: pre-wrap !important; - white-space: pre; } div.message-part span.sig @@ -1330,8 +1325,10 @@ div.message-part blockquote border-left: 2px solid blue; border-right: 2px solid blue; background-color: #F6F6F6; - margin: 2px 0px; - padding: 1px 8px 1px 10px; + margin: 0; + padding: 0 0.4em; + overflow: hidden; + text-overflow: ellipsis; } div.message-part blockquote blockquote diff --git a/skins/larry/editor_content.css b/skins/larry/editor_content.css index aabed07b5..67480ab77 100644 --- a/skins/larry/editor_content.css +++ b/skins/larry/editor_content.css @@ -12,20 +12,15 @@ body { margin-top: 2px; } -pre -{ +div.pre { margin: 0; padding: 0; - white-space: -moz-pre-wrap !important; - white-space: pre-wrap !important; - white-space: pre; - word-wrap: break-word; /* IE (and Safari) */ + font-family: monospace; } blockquote { - padding-left: 5px; border-left: #1010ff 2px solid; - margin-left: 5px; - width: 100%; + margin: 0; + padding: 0 0.4em; } diff --git a/skins/larry/mail.css b/skins/larry/mail.css index 3ec14568f..7afb14fba 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -1103,16 +1103,11 @@ div.message-partheaders { border-top: 0; } -div.message-part pre, -div.message-htmlpart pre, div.message-part div.pre { margin: 0; padding: 0; font-family: monospace; font-size: 12px; - white-space: -moz-pre-wrap !important; - white-space: pre-wrap !important; - white-space: pre; } div.message-part span.sig { @@ -1124,8 +1119,10 @@ div.message-part blockquote { border-left: 2px solid blue; border-right: 2px solid blue; background-color: #F6F6F6; - margin: 2px 0 2px 0; - padding: 1px 8px 1px 10px; + margin: 0; + padding: 0 0.4em; + overflow: hidden; + text-overflow: ellipsis; } div.message-part blockquote blockquote { diff --git a/tests/Framework/Text2Html.php b/tests/Framework/Text2Html.php new file mode 100644 index 000000000..91dabf2b7 --- /dev/null +++ b/tests/Framework/Text2Html.php @@ -0,0 +1,81 @@ + '', + 'end' => '', + 'break' => '
', + 'links' => false, + 'flowed' => false, + 'space' => '_', // replace UTF-8 non-breaking space for simpler testing + ); + + $data[] = array(" aaaa", "_aaaa", $options); + $data[] = array("aaaa aaaa", "aaaa_aaaa", $options); + $data[] = array("aaaa aaaa", "aaaa__aaaa", $options); + $data[] = array("aaaa aaaa", "aaaa___aaaa", $options); + $data[] = array("aaaa\taaaa", "aaaa____aaaa", $options); + $data[] = array("aaaa\naaaa", "aaaa
aaaa", $options); + $data[] = array("aaaa\n aaaa", "aaaa
_aaaa", $options); + $data[] = array("aaaa\n aaaa", "aaaa
__aaaa", $options); + $data[] = array("aaaa\n aaaa", "aaaa
___aaaa", $options); + $data[] = array("\taaaa", "____aaaa", $options); + $data[] = array("\naaaa", "
aaaa", $options); + $data[] = array("\n aaaa", "
_aaaa", $options); + $data[] = array("\n aaaa", "
__aaaa", $options); + $data[] = array("\n aaaa", "
___aaaa", $options); + $data[] = array("aaaa\n\nbbbb", "aaaa

bbbb", $options); + $data[] = array(">aaaa \n>aaaa", "
aaaa_
aaaa
", $options); + $data[] = array(">aaaa\n>aaaa", "
aaaa
aaaa
", $options); + $data[] = array(">aaaa \n>bbbb\ncccc dddd", "
aaaa_
bbbb
cccc_dddd", $options); + + $options['flowed'] = true; + + $data[] = array(" aaaa", "aaaa", $options); + $data[] = array("aaaa aaaa", "aaaa_aaaa", $options); + $data[] = array("aaaa aaaa", "aaaa__aaaa", $options); + $data[] = array("aaaa aaaa", "aaaa___aaaa", $options); + $data[] = array("aaaa\taaaa", "aaaa____aaaa", $options); + $data[] = array("aaaa\naaaa", "aaaa
aaaa", $options); + $data[] = array("aaaa\n aaaa", "aaaa
aaaa", $options); + $data[] = array("aaaa\n aaaa", "aaaa
_aaaa", $options); + $data[] = array("aaaa\n aaaa", "aaaa
__aaaa", $options); + $data[] = array("\taaaa", "____aaaa", $options); + $data[] = array("\naaaa", "
aaaa", $options); + $data[] = array("\n aaaa", "
aaaa", $options); + $data[] = array("\n aaaa", "
_aaaa", $options); + $data[] = array("\n aaaa", "
__aaaa", $options); + $data[] = array("aaaa\n\nbbbb", "aaaa

bbbb", $options); + $data[] = array(">aaaa \n>aaaa", "
aaaa aaaa
", $options); + $data[] = array(">aaaa\n>aaaa", "
aaaa
aaaa
", $options); + $data[] = array(">aaaa \n>bbbb\ncccc dddd", "
aaaa bbbb
cccc_dddd", $options); + + return $data; + } + + /** + * Test text to html conversion + * + * @dataProvider data_text2html + */ + function test_text2html($input, $output, $options) + { + $t2h = new rcube_text2html($input, false, $options); + + $html = $t2h->get_html(); + + $this->assertEquals($output, $html); + } +} diff --git a/tests/phpunit.xml b/tests/phpunit.xml index cee3434c1..f3df53521 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -40,6 +40,7 @@ Framework/SpellcheckPspell.php Framework/Spellchecker.php Framework/StringReplacer.php + Framework/Text2Html.php Framework/User.php Framework/Utils.php Framework/VCard.php -- cgit v1.2.3 From d9d276ea700186a11c6525fec375160a76229b76 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 May 2014 10:20:42 +0200 Subject: Improve _convert_line() performance --- program/lib/Roundcube/rcube_text2html.php | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 5da771ac8..6032726b0 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -259,14 +259,20 @@ class rcube_text2html // replace spaces with non-breaking spaces if ($is_flowed) { - $text = preg_replace_callback('/(^|[^ ])( +)/', function($matches) { - if (!strlen($matches[2])) { - return str_repeat($nbsp, strlen($matches[2])); - } - else { - return $matches[1] . ' ' . str_repeat($nbsp, strlen($matches[2])-1); - } - }, $text); + $pos = 0; + $diff = 0; + $len = strlen($nbsp); + $copy = $text; + + while (($pos = strpos($text, ' ', $pos)) !== false) { + if ($pos == 0 || $text[$pos-1] == ' ') { + $copy = substr_replace($copy, $nbsp, $pos + $diff, 1); + $diff += $len - 1; + } + $pos++; + } + + $text = $copy; } else { $text = str_replace(' ', $nbsp, $text); -- cgit v1.2.3 From 596d43be13156b24325e45b3f3716722c61fafa2 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 May 2014 10:45:41 +0200 Subject: Add session ID (first 8 chars) to the log --- program/lib/Roundcube/rcube.php | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index f2aeda7f0..d618fb64d 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -1132,6 +1132,11 @@ class rcube return true; } + // add session ID to the log + if ($sess = session_id()) { + $line = '<' . substr($sess, 0, 8) . '> ' . $line; + } + if ($log_driver == 'syslog') { $prio = $name == 'errors' ? LOG_ERR : LOG_INFO; syslog($prio, $line); -- cgit v1.2.3 From d41367492dbbd7fdb074cd1374044917fc2e82df Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 May 2014 11:19:27 +0200 Subject: Fix flowed lines recognition --- program/lib/Roundcube/rcube_text2html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 6032726b0..9ca3f960f 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -163,7 +163,7 @@ class rcube_text2html // find/mark quoted lines... for ($n=0, $cnt=count($text); $n < $cnt; $n++) { $flowed = false; - if ($this->config['flowed'] && ord($text[0]) == $flowed_char) { + if ($this->config['flowed'] && ord($text[$n][0]) == $flowed_char) { $flowed = true; $text[$n] = substr($text[$n], 1); } -- cgit v1.2.3 From e0881f985d558a1084ccc1c50702c4867b94f4c1 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 May 2014 11:22:06 +0200 Subject: Disable wrapping non-flowed lines on dash character --- program/lib/Roundcube/rcube_text2html.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 9ca3f960f..e0502c42b 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -275,7 +275,8 @@ class rcube_text2html $text = $copy; } else { - $text = str_replace(' ', $nbsp, $text); + // make the whole line non-breakable + $text = str_replace(array(' ', '-'), array($nbsp, '-⁠'), $text); } return $text; -- cgit v1.2.3 From d5190084980835d68847a9b9c18f68c00b4cd37a Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 May 2014 12:13:24 +0200 Subject: Add configurable LDAP_OPT_DEREF option (#1489864) - patch from Stuart C. Naifeh --- CHANGELOG | 1 + config/defaults.inc.php | 2 ++ program/lib/Roundcube/rcube_ldap_generic.php | 3 +++ 3 files changed, 6 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 3601908c3..57293452d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,7 @@ CHANGELOG Roundcube Webmail - Set In-Reply-To and References for forwarded messages (#1489593) - Removed redundant default_folders config option (#1489737) - Implemented IMAP SPECIAL-USE extension support [RFC6154] (#1487830) +- Add configurable LDAP_OPT_DEREF option (#1489864) - Fix mbox files import RELEASE 1.0.1 diff --git a/config/defaults.inc.php b/config/defaults.inc.php index a76eec6dc..85190eb0a 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -784,6 +784,8 @@ $config['ldap_public']['Verisign'] = array( 'sizelimit' => '0', // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. 'timelimit' => '0', // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. 'referrals' => false, // Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups + 'dereference' => 0, // Sets the LDAP_OPT_DEREF option. One of: LDAP_DEREF_NEVER, LDAP_DEREF_SEARCHING, LDAP_DEREF_FINDING, LDAP_DEREF_ALWAYS + // Used where addressbook contains aliases to objects elsewhere in the LDAP tree. // definition for contact groups (uncomment if no groups are supported) // for the groups base_dn, the user replacements %fu, %u, $d and %dc work as for base_dn (see above) diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index f1048ef39..f6f9884d8 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -190,6 +190,9 @@ class rcube_ldap_generic if (isset($this->config['referrals'])) ldap_set_option($lc, LDAP_OPT_REFERRALS, $this->config['referrals']); + + if (isset($this->config['dereference'])) + ldap_set_option($lc, LDAP_OPT_DEREF, $this->config['dereference']); } else { $this->_debug("S: NOT OK"); -- cgit v1.2.3 From e2b4760e846e8b74f2f674e1fa25d82ba21e7a2e Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 May 2014 19:08:25 +0200 Subject: Fix invalid closing tag --- program/lib/Roundcube/rcube_text2html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 5da771ac8..cb4390e5d 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -54,7 +54,7 @@ class rcube_text2html 'break' => "
\n", // prefix and suffix (wrapper element) 'begin' => '
', - 'end' => '', + 'end' => '
', // enables links replacement 'links' => true, ); -- cgit v1.2.3 From f0992426d9c5af5046c76a2da86183d0c3a40084 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 13 May 2014 19:40:00 +0200 Subject: Bring back the old behaviour where text messages without format=flowed are auto-wrapped. Make it the default in text2html class. --- program/lib/Roundcube/rcube_text2html.php | 2 +- program/steps/mail/func.inc | 3 ++- tests/Framework/Text2Html.php | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 60016fffd..8bcda301c 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -49,7 +49,7 @@ class rcube_text2html // enables format=flowed parser 'flowed' => false, // enables wrapping for non-flowed text - 'wrap' => false, + 'wrap' => true, // line-break tag 'break' => "
\n", // prefix and suffix (wrapper element) diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index ac0d7fc5f..a1d1a4163 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -874,7 +874,8 @@ function rcmail_print_body($part, $p = array()) */ function rcmail_plain_body($body, $flowed = false) { - $text2html = new rcube_text2html($body, false, array('flowed' => $flowed)); + $options = array('flowed' => $flowed, 'wrap' => !$flowed); + $text2html = new rcube_text2html($body, false, $options); $body = $text2html->get_html(); return $body; diff --git a/tests/Framework/Text2Html.php b/tests/Framework/Text2Html.php index 91dabf2b7..af2604d8e 100644 --- a/tests/Framework/Text2Html.php +++ b/tests/Framework/Text2Html.php @@ -19,6 +19,7 @@ class Framework_Text2Html extends PHPUnit_Framework_TestCase 'break' => '
', 'links' => false, 'flowed' => false, + 'wrap' => false, 'space' => '_', // replace UTF-8 non-breaking space for simpler testing ); -- cgit v1.2.3 From c0a5aa5f5ff38ac7b8a650b07c134b7b86deb27f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 15 May 2014 10:41:35 +0200 Subject: Improved handling of new-lines in quoted paragraphs on text2html conversion --- program/lib/Roundcube/rcube_text2html.php | 65 +++++++++++++++++++++---------- skins/classic/mail.css | 2 +- skins/larry/mail.css | 2 +- tests/Framework/Text2Html.php | 11 ++++++ 4 files changed, 58 insertions(+), 22 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 8bcda301c..363f1b21f 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -158,10 +158,10 @@ class rcube_text2html // split body into single lines $text = preg_split('/\r?\n/', $text); $quote_level = 0; - $last = -1; + $last = null; - // find/mark quoted lines... - for ($n=0, $cnt=count($text); $n < $cnt; $n++) { + // wrap quoted lines with
+ for ($n = 0, $cnt = count($text); $n < $cnt; $n++) { $flowed = false; if ($this->config['flowed'] && ord($text[$n][0]) == $flowed_char) { $flowed = true; @@ -172,43 +172,71 @@ class rcube_text2html $q = substr_count($regs[0], '>'); $text[$n] = substr($text[$n], strlen($regs[0])); $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); + $_length = strlen(str_replace(' ', '', $text[$n])); if ($q > $quote_level) { - $text[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $q - $quote_level))) . $text[$n]; - $last = $n; + if ($last !== null) { + $text[$last] .= (!$length ? "\n" : '') + . $replacer->get_replacement($replacer->add( + str_repeat('
', $q - $quote_level))) + . $text[$n]; + + unset($text[$n]); + } + else { + $text[$n] = $replacer->get_replacement($replacer->add( + str_repeat('
', $q - $quote_level))) . $text[$n]; + + $last = $n; + } } else if ($q < $quote_level) { - $text[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $quote_level - $q))) . $text[$n]; + $text[$last] .= (!$length ? "\n" : '') + . $replacer->get_replacement($replacer->add( + str_repeat('
', $quote_level - $q))) + . $text[$n]; + + unset($text[$n]); + } + else { $last = $n; } } else { $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); - $q = 0; + $q = 0; + $_length = strlen(str_replace(' ', '', $text[$n])); if ($quote_level > 0) { - $text[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $quote_level))) . $text[$n]; + $text[$last] .= (!$length ? "\n" : '') + . $replacer->get_replacement($replacer->add( + str_repeat('
', $quote_level))) + . $text[$n]; + + unset($text[$n]); + } + else { + $last = $n; } } $quote_level = $q; + $length = $_length; } if ($quote_level > 0) { - $text[$n] = $replacer->get_replacement($replacer->add( - str_repeat('
', $quote_level))) . $text[$n]; + $text[$last] .= $replacer->get_replacement($replacer->add( + str_repeat('
', $quote_level))); } $text = join("\n", $text); // colorize signature (up to lines) - $len = strlen($text); + $len = strlen($text); + $sig_sep = "--" . $this->config['space'] . "\n"; $sig_max_lines = rcube::get_instance()->config->get('sig_max_lines', 15); - while (($sp = strrpos($text, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) { + while (($sp = strrpos($text, $sig_sep, $sp ? -$len+$sp-1 : 0)) !== false) { if ($sp == 0 || $text[$sp-1] == "\n") { // do not touch blocks with more that X lines if (substr_count($text, "\n", $sp) < $sig_max_lines) { @@ -223,9 +251,6 @@ class rcube_text2html // insert url/mailto links and citation tags $text = $replacer->resolve($text); - // replace \n before
- $text = str_replace("\n
", "", $text); - // replace line breaks $text = str_replace("\n", $this->config['break'], $text); @@ -246,7 +271,7 @@ class rcube_text2html // skip signature separator if ($text == '-- ') { - return $text; + return '--' . $this->config['space']; } // replace HTML special characters @@ -276,7 +301,7 @@ class rcube_text2html } else { // make the whole line non-breakable - $text = str_replace(array(' ', '-'), array($nbsp, '-⁠'), $text); + $text = str_replace(array(' ', '-', '/'), array($nbsp, '-⁠', '/⁠'), $text); } return $text; diff --git a/skins/classic/mail.css b/skins/classic/mail.css index 47faa29af..6409b6b9b 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -1325,7 +1325,7 @@ div.message-part blockquote border-left: 2px solid blue; border-right: 2px solid blue; background-color: #F6F6F6; - margin: 0; + margin: 2px 0; padding: 0 0.4em; overflow: hidden; text-overflow: ellipsis; diff --git a/skins/larry/mail.css b/skins/larry/mail.css index 7afb14fba..8306afd9f 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -1119,7 +1119,7 @@ div.message-part blockquote { border-left: 2px solid blue; border-right: 2px solid blue; background-color: #F6F6F6; - margin: 0; + margin: 2px 0; padding: 0 0.4em; overflow: hidden; text-overflow: ellipsis; diff --git a/tests/Framework/Text2Html.php b/tests/Framework/Text2Html.php index af2604d8e..8d091d5c9 100644 --- a/tests/Framework/Text2Html.php +++ b/tests/Framework/Text2Html.php @@ -41,6 +41,7 @@ class Framework_Text2Html extends PHPUnit_Framework_TestCase $data[] = array(">aaaa \n>aaaa", "
aaaa_
aaaa
", $options); $data[] = array(">aaaa\n>aaaa", "
aaaa
aaaa
", $options); $data[] = array(">aaaa \n>bbbb\ncccc dddd", "
aaaa_
bbbb
cccc_dddd", $options); + $data[] = array("aaaa-bbbb/cccc", "aaaa-⁠bbbb/⁠cccc", $options); $options['flowed'] = true; @@ -63,6 +64,16 @@ class Framework_Text2Html extends PHPUnit_Framework_TestCase $data[] = array(">aaaa\n>aaaa", "
aaaa
aaaa
", $options); $data[] = array(">aaaa \n>bbbb\ncccc dddd", "
aaaa bbbb
cccc_dddd", $options); + $options['flowed'] = false; + $options['wrap'] = true; + + $data[] = array(">>aaaa bbbb\n>>\n>>>\n>cccc\n\ndddd eeee", + "
aaaa bbbb


cccc

dddd eeee", $options); + $data[] = array("\n>>aaaa\n\ndddd", + "
aaaa

dddd", $options); + $data[] = array("aaaa\n>bbbb\n>cccc\n\ndddd\n>>test", + "aaaa
bbbb
cccc

dddd
test
", $options); + return $data; } -- cgit v1.2.3 From 963499a17e98cdab4a6e872a711ce9badb8c3b0b Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 15 May 2014 13:54:45 +0200 Subject: Plugin API: added imap_search_before hook --- program/lib/Roundcube/rcube_imap.php | 51 +++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 18 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 4204354b3..4b32c466b 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -1489,23 +1489,39 @@ class rcube_imap extends rcube_storage * Invoke search request to IMAP server * * @param string $folder Folder name to search in - * @param string $str Search criteria + * @param string $search Search criteria * @param string $charset Search charset * @param string $sort_field Header field to sort by + * * @return rcube_result_index Search result object * @todo: Search criteria should be provided in non-IMAP format, eg. array */ - public function search($folder='', $str='ALL', $charset=NULL, $sort_field=NULL) + public function search($folder = '', $search = 'ALL', $charset = null, $sort_field = null) { - if (!$str) { - $str = 'ALL'; + if (!$search) { + $search = 'ALL'; } - // multi-folder search - if (is_array($folder) && count($folder) > 1 && $str != 'ALL') { - new rcube_result_index; // trigger autoloader and make these classes available for threaded context - new rcube_result_thread; + if ((is_array($folder) && empty($folder)) || (!is_array($folder) && !strlen($folder))) { + $folder = $this->folder; + } + + $plugin = rcube::get_instance()->plugins->exec_hook('imap_search_before', array( + 'folder' => $folder, + 'search' => $search, + 'charset' => $charset, + 'sort_field' => $sort_field, + 'threading' => $this->threading, + )); + + $folder = $plugin['folder']; + $search = $plugin['search']; + $charset = $plugin['charset']; + $sort_field = $plugin['sort_field']; + $results = $plugin['result']; + // multi-folder search + if (!$results && is_array($folder) && count($folder) > 1 && $search != 'ALL') { // connect IMAP to have all the required classes and settings loaded $this->check_connection(); @@ -1518,29 +1534,28 @@ class rcube_imap extends rcube_storage $searcher->set_timelimit(60); // continue existing incomplete search - if (!empty($this->search_set) && $this->search_set->incomplete && $str == $this->search_string) { + if (!empty($this->search_set) && $this->search_set->incomplete && $search == $this->search_string) { $searcher->set_results($this->search_set); } // execute the search $results = $searcher->exec( $folder, - $str, + $search, $charset ? $charset : $this->default_charset, $sort_field && $this->get_capability('SORT') ? $sort_field : null, $this->threading ); } - else { - $folder = is_array($folder) ? $folder[0] : $folder; - if (!strlen($folder)) { - $folder = $this->folder; - } - $results = $this->search_index($folder, $str, $charset, $sort_field); + else if (!$results) { + $folder = is_array($folder) ? $folder[0] : $folder; + $search = is_array($search) ? $search[$folder] : $search; + $results = $this->search_index($folder, $search, $charset, $sort_field); } - $this->set_search_set(array($str, $results, $charset, $sort_field, - $this->threading || $this->search_sorted ? true : false)); + $sorted = $this->threading || $this->search_sorted || $plugin['search_sorted'] ? true : false; + + $this->set_search_set(array($search, $results, $charset, $sort_field, $sorted)); return $results; } -- cgit v1.2.3 From 47a7833aca96a263068eed53f9471a3699ef257b Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 15 May 2014 13:57:18 +0200 Subject: CS fixes --- program/js/app.js | 4 ++-- program/lib/Roundcube/rcube_imap_search.php | 25 +++++++++----------- program/lib/Roundcube/rcube_result_multifolder.php | 27 +++++++++++++--------- program/lib/Roundcube/rcube_storage.php | 13 +++++++++++ 4 files changed, 42 insertions(+), 27 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/js/app.js b/program/js/app.js index 9aa0942f1..21595570a 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -4225,7 +4225,7 @@ function rcube_webmail() }; // build URL params for search - this.search_params = function(search, filter, smods) + this.search_params = function(search, filter) { var n, url = {}, mods_arr = [], mods = this.env.search_mods, @@ -4244,7 +4244,7 @@ function rcube_webmail() if (search) { url._q = search; - if (!smods && mods && this.message_list) + if (mods && this.message_list) mods = mods[mbox] || mods['*']; if (mods) { diff --git a/program/lib/Roundcube/rcube_imap_search.php b/program/lib/Roundcube/rcube_imap_search.php index 0c44daf1b..365d78f76 100644 --- a/program/lib/Roundcube/rcube_imap_search.php +++ b/program/lib/Roundcube/rcube_imap_search.php @@ -29,7 +29,7 @@ class rcube_imap_search { public $options = array(); - protected $jobs = array(); + protected $jobs = array(); protected $timelimit = 0; protected $results; protected $conn; @@ -40,7 +40,7 @@ class rcube_imap_search public function __construct($options, $conn) { $this->options = $options; - $this->conn = $conn; + $this->conn = $conn; } /** @@ -54,7 +54,7 @@ class rcube_imap_search */ public function exec($folders, $str, $charset = null, $sort_field = null, $threading=null) { - $start = floor(microtime(true)); + $start = floor(microtime(true)); $results = new rcube_result_multifolder($folders); // start a search job for every folder to search in @@ -65,7 +65,8 @@ class rcube_imap_search $results->add($result); } else { - $job = new rcube_imap_search_job($folder, $str, $charset, $sort_field, $threading); + $search = is_array($str) && $str[$folder] ? $str[$folder] : $str; + $job = new rcube_imap_search_job($folder, $search, $charset, $sort_field, $threading); $job->worker = $this; $this->jobs[] = $job; } @@ -129,11 +130,11 @@ class rcube_imap_search_job /* extends Stackable */ public function __construct($folder, $str, $charset = null, $sort_field = null, $threading=false) { - $this->folder = $folder; - $this->search = $str; - $this->charset = $charset; + $this->folder = $folder; + $this->search = $str; + $this->charset = $charset; $this->sort_field = $sort_field; - $this->threading = $threading; + $this->threading = $threading; $this->result = new rcube_result_index($folder); $this->result->incomplete = true; @@ -150,9 +151,8 @@ class rcube_imap_search_job /* extends Stackable */ protected function search_index() { $criteria = $this->search; - $charset = $this->charset; - - $imap = $this->worker->get_imap(); + $charset = $this->charset; + $imap = $this->worker->get_imap(); if (!$imap->connected()) { trigger_error("No IMAP connection for $this->folder", E_USER_WARNING); @@ -228,7 +228,4 @@ class rcube_imap_search_job /* extends Stackable */ { return $this->result; } - } - - diff --git a/program/lib/Roundcube/rcube_result_multifolder.php b/program/lib/Roundcube/rcube_result_multifolder.php index 4bbd2188d..786ee85f6 100644 --- a/program/lib/Roundcube/rcube_result_multifolder.php +++ b/program/lib/Roundcube/rcube_result_multifolder.php @@ -26,16 +26,16 @@ */ class rcube_result_multifolder { - public $multi = true; - public $sets = array(); + public $multi = true; + public $sets = array(); public $incomplete = false; public $folder; - protected $meta = array(); - protected $index = array(); + protected $meta = array(); + protected $index = array(); protected $folders = array(); + protected $order = 'ASC'; protected $sorting; - protected $order = 'ASC'; /** @@ -44,7 +44,7 @@ class rcube_result_multifolder public function __construct($folders = array()) { $this->folders = $folders; - $this->meta = array('count' => 0); + $this->meta = array('count' => 0); } @@ -74,7 +74,8 @@ class rcube_result_multifolder // append UIDs to global index $folder = $result->get_parameters('MAILBOX'); - $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $result->get()); + $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $result->get()); + $this->index = array_merge($this->index, $index); } @@ -89,7 +90,7 @@ class rcube_result_multifolder } $this->sorting = $sort_field; - $this->order = $sort_order; + $this->order = $sort_order; } /** @@ -150,8 +151,10 @@ class rcube_result_multifolder if ($this->order != $set->get_parameters('ORDER')) { $set->revert(); } + $folder = $set->get_parameters('MAILBOX'); - $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $set->get()); + $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $set->get()); + $this->index = array_merge($this->index, $index); } } @@ -171,6 +174,7 @@ class rcube_result_multifolder if (!empty($this->folder)) { $msgid .= '-' . $this->folder; } + return array_search($msgid, $this->index); } @@ -188,6 +192,7 @@ class rcube_result_multifolder if ($set->get_parameters('MAILBOX') == $folder) { $set->filter($ids); } + $this->meta['count'] += $set->count(); } } @@ -267,8 +272,8 @@ class rcube_result_multifolder public function get_parameters($param=null) { $params = array( - 'SORT' => $this->sorting, - 'ORDER' => $this->order, + 'SORT' => $this->sorting, + 'ORDER' => $this->order, 'MAILBOX' => $this->folders, ); diff --git a/program/lib/Roundcube/rcube_storage.php b/program/lib/Roundcube/rcube_storage.php index 69d6d2fae..c1293961c 100644 --- a/program/lib/Roundcube/rcube_storage.php +++ b/program/lib/Roundcube/rcube_storage.php @@ -151,6 +151,19 @@ abstract class rcube_storage } + /** + * Get connection/class option + * + * @param string $name Option name + * + * @param mixed Option value + */ + public function get_option($name) + { + return $this->options[$name]; + } + + /** * Activate/deactivate debug mode. * -- cgit v1.2.3 From 001d337b3793857c5953bd814cd44b93a5f0d53d Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Fri, 16 May 2014 16:00:33 +0200 Subject: Fix handling unicode characters in links (#1489898) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_string_replacer.php | 2 +- tests/Framework/StringReplacer.php | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index d38b97e64..d4cc0991e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -22,6 +22,7 @@ CHANGELOG Roundcube Webmail - Fix mbox files import - Fix unintentional draft autosave request if autosave is disabled (#1489882) - Fix malformed References: header in send/saved mail (#1489891) +- Fix handling unicode characters in links (#1489898) RELEASE 1.0.1 ------------- diff --git a/program/lib/Roundcube/rcube_string_replacer.php b/program/lib/Roundcube/rcube_string_replacer.php index 77b91d18b..ce61e5367 100644 --- a/program/lib/Roundcube/rcube_string_replacer.php +++ b/program/lib/Roundcube/rcube_string_replacer.php @@ -42,7 +42,7 @@ class rcube_string_replacer // Support unicode/punycode in top-level domain part $utf_domain = '[^?&@"\'\\/()<>\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})'; $url1 = '.:;,'; - $url2 = 'a-zA-Z0-9%=#$@+?|!&\\/_~\\[\\]\\(\\){}\*-'; + $url2 = 'a-zA-Z0-9%=#$@+?|!&\\/_~\\[\\]\\(\\){}\*\x80-\xFE-'; $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]*[$url2]+)*)/"; $this->mailto_pattern = "/(" diff --git a/tests/Framework/StringReplacer.php b/tests/Framework/StringReplacer.php index 0fa7fae34..7d9600a78 100644 --- a/tests/Framework/StringReplacer.php +++ b/tests/Framework/StringReplacer.php @@ -42,6 +42,10 @@ class Framework_StringReplacer extends PHPUnit_Framework_TestCase array('1@1.com www.domain.tld', '1@1.com www.domain.tld'), array(' www.domain.tld ', ' www.domain.tld '), array(' www.domain.tld/#!download|856p1|2 ', ' www.domain.tld/#!download|856p1|2 '), + // #1489898: allow some unicode characters + array('https://www.google.com/maps/place/New+York,+État+de+New+York/@40.7056308,-73.9780035,11z/data=!3m1!4b1!4m2!3m1!1s0x89c24fa5d33f083b:0xc80b8f06e177fe62', + 'https://www.google.com/maps/place/New+York,+État+de+New+York/@40.7056308,-73.9780035,11z/data=!3m1!4b1!4m2!3m1!1s0x89c24fa5d33f083b:0xc80b8f06e177fe62' + ), ); } -- cgit v1.2.3 From 82ed256f6eeba8dce305f3953aa70681351c9bad Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 20 May 2014 19:25:45 +0200 Subject: Fix incorrect handling of HTML comments in messages sanitization code (#1489904) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_washtml.php | 2 +- tests/Framework/Washtml.php | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 27286e8e5..1b093a5a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -26,6 +26,7 @@ CHANGELOG Roundcube Webmail - Fix unintentional draft autosave request if autosave is disabled (#1489882) - Fix malformed References: header in send/saved mail (#1489891) - Fix handling unicode characters in links (#1489898) +- Fix incorrect handling of HTML comments in messages sanitization code (#1489904) RELEASE 1.0.1 ------------- diff --git a/program/lib/Roundcube/rcube_washtml.php b/program/lib/Roundcube/rcube_washtml.php index e23e5b21d..5f40eecf4 100644 --- a/program/lib/Roundcube/rcube_washtml.php +++ b/program/lib/Roundcube/rcube_washtml.php @@ -456,7 +456,7 @@ class rcube_washtml // Remove invalid HTML comments (#1487759) // Don't remove valid conditional comments // Don't remove MSOutlook () conditional comments (#1489004) - $html = preg_replace('/

test

', $washed, "HTML invalid comments (#1487759)"); + + $html = "

para1

para2

"; + $washed = $washer->wash($html); + + $this->assertEquals('

para1

para2

', $washed, "HTML comments - simple comment"); + + $html = "

para1

para2

"; + $washed = $washer->wash($html); + + $this->assertEquals('

para1

para2

', $washed, "HTML comments - tags inside (#1489904)"); } /** -- cgit v1.2.3 From 5793309478b60b3f30aea191ec2f46b944584afa Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 21 May 2014 19:46:40 +0200 Subject: Limit cache data size to avoid database errors --- program/lib/Roundcube/rcube_cache.php | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_cache.php b/program/lib/Roundcube/rcube_cache.php index a708cb292..0017dcacc 100644 --- a/program/lib/Roundcube/rcube_cache.php +++ b/program/lib/Roundcube/rcube_cache.php @@ -45,6 +45,7 @@ class rcube_cache private $cache = array(); private $cache_changes = array(); private $cache_sums = array(); + private $max_packet = -1; /** @@ -319,7 +320,7 @@ class rcube_cache * Writes single cache record into DB. * * @param string $key Cache key name - * @param mxied $data Serialized cache data + * @param mixed $data Serialized cache data * * @param boolean True on success, False on failure */ @@ -329,6 +330,12 @@ class rcube_cache return false; } + // don't attempt to write too big data sets + if (strlen($data) > $this->max_packet_size()) { + trigger_error("rcube_cache: max_packet_size ($this->max_packet) exceeded for key $key. Tried to write " . strlen($data) . " bytes", E_USER_WARNING); + return false; + } + if ($this->type == 'memcache' || $this->type == 'apc') { return $this->add_record($this->ckey($key), $data); } @@ -591,4 +598,30 @@ class rcube_cache return $this->packed ? @unserialize($data) : $data; } + + /** + * Determine the maximum size for cache data to be written + */ + private function max_packet_size() + { + if ($this->max_packet < 0) { + $this->max_packet = 2097152; // default/max is 2 MB + + if ($this->type == 'db') { + $value = $this->db->get_variable('max_allowed_packet', 1048500); + $this->max_packet = min($value, $this->max_packet) - 2000; + } + else if ($this->type == 'memcache') { + $stats = $this->db->getStats(); + $remaining = $stats['limit_maxbytes'] - $stats['bytes']; + $this->max_packet = min($remaining / 5, $this->max_packet); + } + else if ($this->type == 'apc' && function_exists('apc_sma_info')) { + $stats = apc_sma_info(); + $this->max_packet = min($stats['avail_mem'] / 5, $this->max_packet); + } + } + + return $this->max_packet; + } } -- cgit v1.2.3 From 939380da27f3502847fc1f18e8b67f3fb6d6742f Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 21 May 2014 19:48:16 +0200 Subject: Don't list empty (nil) metadata entries to save memory anc caching space --- program/lib/Roundcube/rcube_imap_generic.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index f45694dd0..3b5be15db 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -3143,7 +3143,8 @@ class rcube_imap_generic if (isset($mbox) && is_array($data[$i])) { $size_sub = count($data[$i]); for ($x=0; $x<$size_sub; $x++) { - $result[$mbox][$data[$i][$x]] = $data[$i][++$x]; + if ($data[$i][$x+1] !== null) + $result[$mbox][$data[$i][$x]] = $data[$i][++$x]; } unset($data[$i]); } @@ -3161,7 +3162,8 @@ class rcube_imap_generic } } else if (isset($mbox)) { - $result[$mbox][$data[$i]] = $data[++$i]; + if ($data[$i+1] !== null) + $result[$mbox][$data[$i]] = $data[++$i]; unset($data[$i]); unset($data[$i-1]); } @@ -3306,10 +3308,10 @@ class rcube_imap_generic for ($x=0, $len=count($attribs); $x<$len;) { $attr = $attribs[$x++]; $value = $attribs[$x++]; - if ($attr == 'value.priv') { + if ($attr == 'value.priv' && $value !== null) { $result[$mbox]['/private' . $entry] = $value; } - else if ($attr == 'value.shared') { + else if ($attr == 'value.shared' && $value !== null) { $result[$mbox]['/shared' . $entry] = $value; } } -- cgit v1.2.3 From 079be2c2fbdc9decbbf5bd123c3800ba001423b1 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 22 May 2014 12:34:33 +0200 Subject: If search string cannot be converted to ASCII (result is an empty string) use the original string (#1489911) --- program/lib/Roundcube/rcube_imap.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 4b32c466b..bf588cacf 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -1691,12 +1691,15 @@ class rcube_imap extends rcube_storage $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n $string = substr($str, $string_offset - 1, $m[0]); $string = rcube_charset::convert($string, $charset, $dest_charset); - if ($string === false) { + + if ($string === false || !strlen($string)) { continue; } + $res .= substr($str, $last, $m[1] - $last - 1) . rcube_imap_generic::escape($string); $last = $m[0] + $string_offset - 1; } + if ($last < strlen($str)) { $res .= substr($str, $last, strlen($str)-$last); } -- cgit v1.2.3 From 1a5d981a44e2941479b2c9d8c16e62f3580b0adc Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 22 May 2014 18:01:06 +0200 Subject: Fix debug output --- program/lib/Roundcube/rcube_ldap_generic.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index f6f9884d8..252eafabe 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -889,9 +889,10 @@ class rcube_ldap_generic } $this->vlv_config = array(); + $config_root_dn = $this->config['config_root_dn']; - $ldap_result = ldap_search($this->conn, $this->config['config_root_dn'], '(objectclass=vlvsearch)', array('*'), 0, 0, 0); - $vlv_searches = new rcube_ldap_result($this->conn, $ldap_result, $this->config['config_root_dn'], '(objectclass=vlvsearch)'); + $ldap_result = ldap_search($this->conn, $config_root_dn, '(objectclass=vlvsearch)', array('*'), 0, 0, 0); + $vlv_searches = new rcube_ldap_result($this->conn, $ldap_result, $config_root_dn, '(objectclass=vlvsearch)'); if ($vlv_searches->count() < 1) { $this->_debug("D: Empty result from search for '(objectclass=vlvsearch)' on '$config_root_dn'"); -- cgit v1.2.3 From 14291c79dbc1a6ad77a5d43b28e4f3a49f3df46c Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 22 May 2014 18:02:02 +0200 Subject: Add option to suppress session data writes to DB --- program/lib/Roundcube/rcube_session.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php index caca262c6..f04f47a21 100644 --- a/program/lib/Roundcube/rcube_session.php +++ b/program/lib/Roundcube/rcube_session.php @@ -3,7 +3,7 @@ /* +-----------------------------------------------------------------------+ | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2012, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | Copyright (C) 2011, Kolab Systems AG | | | | Licensed under the GNU General Public License version 3 or | @@ -44,6 +44,7 @@ class rcube_session private $secret = ''; private $ip_check = false; private $logging = false; + private $nowrite = false; private $storage; private $memcache; @@ -201,6 +202,9 @@ class rcube_session $table = $this->db->table_name('session'); $ts = microtime(true); + if ($this->nowrite) + return true; + // no session row in DB (db_read() returns false) if (!$this->key) { $oldvars = null; @@ -725,6 +729,16 @@ class rcube_session } + /** + * Blocks session data from being written to database. + * Can be used if write-race conditions are to be expected + */ + function nowrite($block = true) + { + $this->nowrite = $block; + } + + /** * Check session authentication cookie * -- cgit v1.2.3 From 693612d396ede5c7ed8dc36e792d0e5653ccb8de Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 22 May 2014 20:21:15 +0200 Subject: Improve performance of sort_folder_list() method. Now sorting 25k folders takes around 3 seconds. --- program/lib/Roundcube/rcube_imap.php | 82 +++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 33 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index bf588cacf..41d1c373f 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -4142,59 +4142,75 @@ class rcube_imap extends rcube_storage */ public function sort_folder_list($a_folders, $skip_default = false) { - $a_out = $a_defaults = $folders = array(); - $delimiter = $this->get_hierarchy_delimiter(); $specials = array_merge(array('INBOX'), array_values($this->get_special_folders())); + $folders = array_flip($a_folders); - // find default folders and skip folders starting with '.' + // convert names to UTF-8 and skip folders starting with '.' foreach ($a_folders as $folder) { - if ($folder[0] == '.') { - continue; - } - - if (!$skip_default && ($p = array_search($folder, $specials)) !== false && !$a_defaults[$p]) { - $a_defaults[$p] = $folder; + if ($folder[0] != '.') { + // for better performance skip encoding conversion + // if the string does not look like UTF7-IMAP + $folders[$folder] = strpos($folder, '+') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP'); } else { - $folders[$folder] = rcube_charset::convert($folder, 'UTF7-IMAP'); + unset($folders[$idx]); } } - // sort folders and place defaults on the top - asort($folders, SORT_LOCALE_STRING); - ksort($a_defaults); - $folders = array_merge($a_defaults, array_keys($folders)); + // sort folders + // asort($folders, SORT_LOCALE_STRING) is not properly sorting case sensitive names + uasort($folders, array($this, 'sort_folder_comparator')); + + $folders = array_keys($folders); - // finally we must rebuild the list to move - // subfolders of default folders to their place... - // ...also do this for the rest of folders because - // asort() is not properly sorting case sensitive names - while (list($key, $folder) = each($folders)) { - // set the type of folder name variable (#1485527) - $a_out[] = (string) $folder; - unset($folders[$key]); - $this->rsort($folder, $delimiter, $folders, $a_out); + if ($skip_default) { + return $folders; } - return $a_out; + $specials = array_unique(array_intersect($specials, $folders)); + $head = array(); + + // place default folders on the top + foreach ($specials as $special) { + $prefix = $special . $delimiter; + + foreach ($folders as $idx => $folder) { + if ($folder === $special) { + $head[] = (string) $special; + unset($folders[$idx]); + } + // put subfolders of default folders on their place... + else if (strpos($folder, $prefix) === 0) { + $head[] = (string) $folder; + unset($folders[$idx]); + } + } + } + + return array_merge($head, $folders); } /** - * Recursive method for sorting folders + * Callback for uasort() that implements correct + * locale-aware case-sensitive sorting */ - protected function rsort($folder, $delimiter, &$list, &$out) + protected function sort_folder_comparator($str1, $str2) { - while (list($key, $name) = each($list)) { - if (strpos($name, $folder.$delimiter) === 0) { - // set the type of folder name variable (#1485527) - $out[] = (string) $name; - unset($list[$key]); - $this->rsort($name, $delimiter, $list, $out); + $delimiter = $this->get_hierarchy_delimiter(); + $path1 = explode($delimiter, $str1); + $path2 = explode($delimiter, $str2); + + foreach ($path1 as $idx => $folder1) { + $folder2 = $path2[$idx]; + + if ($folder1 === $folder2) { + continue; } + + return strcoll($folder1, $folder2); } - reset($list); } -- cgit v1.2.3 From 081f3b7d52340125c6a68c5587ed496167332544 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 22 May 2014 20:38:28 +0200 Subject: Bring back forcing of string type for folders list items (removed unintentionally by last commit) --- program/lib/Roundcube/rcube_imap.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 41d1c373f..2ff48c743 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -4168,21 +4168,23 @@ class rcube_imap extends rcube_storage return $folders; } + // force the type of folder name variable (#1485527) + $folders = array_map('strval', $folders); $specials = array_unique(array_intersect($specials, $folders)); $head = array(); - // place default folders on the top + // place default folders on top foreach ($specials as $special) { $prefix = $special . $delimiter; foreach ($folders as $idx => $folder) { if ($folder === $special) { - $head[] = (string) $special; + $head[] = $special; unset($folders[$idx]); } // put subfolders of default folders on their place... else if (strpos($folder, $prefix) === 0) { - $head[] = (string) $folder; + $head[] = $folder; unset($folders[$idx]); } } -- cgit v1.2.3 From ccf5a4f18de31c2839959f7f0b079e5b029ef307 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 25 May 2014 12:55:38 +0200 Subject: Silence PHP Warning: strtolower() expects parameter 1 to be string --- program/lib/Roundcube/rcube_imap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 2ff48c743..e4b77a0a3 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -1848,7 +1848,7 @@ class rcube_imap extends rcube_storage $this->struct_charset = $this->structure_charset($structure); } - $headers->ctype = strtolower($headers->ctype); + $headers->ctype = @strtolower($headers->ctype); // Here we can recognize malformed BODYSTRUCTURE and // 1. [@TODO] parse the message in other way to create our own message structure -- cgit v1.2.3 From 49dad5f669965ca6149c2d759ede2a91fa571149 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 27 May 2014 11:39:31 +0200 Subject: Fix broken normalize_string(), add support for ISO-8859-2 --- program/lib/Roundcube/rcube_utils.php | 34 +++++++++++++++++++++++++--------- tests/Framework/Utils.php | 3 ++- 2 files changed, 27 insertions(+), 10 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index c2009cee0..00999ba50 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -928,7 +928,7 @@ class rcube_utils /** * Normalize the given string for fulltext search. - * Currently only optimized for Latin-1 characters; to be extended + * Currently only optimized for ISO-8859-1 and ISO-8859-2 characters; to be extended * * @param string Input string (UTF-8) * @param boolean True to return list of words as array @@ -949,15 +949,32 @@ class rcube_utils // split by words $arr = self::tokenize_string($str); + // detect character set + if (utf8_encode(utf8_decode($str)) == $str) { + // ISO-8859-1 (or ASCII) + preg_match_all('/./u', 'äâàåáãæçéêëèïîìíñöôòøõóüûùúýÿ', $keys); + preg_match_all('/./', 'aaaaaaaceeeeiiiinoooooouuuuyy', $values); + + $mapping = array_combine($keys[0], $values[0]); + $mapping = array_merge($mapping, array('ß' => 'ss', 'ae' => 'a', 'oe' => 'o', 'ue' => 'u')); + } + else if (rcube_charset::convert(rcube_charset::convert($str, 'UTF-8', 'ISO-8859-2'), 'ISO-8859-2', 'UTF-8') == $str) { + // ISO-8859-2 + preg_match_all('/./u', 'ąáâäćçčéęëěíîłľĺńňóôöŕřśšşťţůúűüźžżý', $keys); + preg_match_all('/./', 'aaaaccceeeeiilllnnooorrsssttuuuuzzzy', $values); + + $mapping = array_combine($keys[0], $values[0]); + $mapping = array_merge($mapping, array('ß' => 'ss', 'ae' => 'a', 'oe' => 'o', 'ue' => 'u')); + } + foreach ($arr as $i => $part) { - if (utf8_encode(utf8_decode($part)) == $part) { // is latin-1 ? - $arr[$i] = utf8_encode(strtr(strtolower(strtr(utf8_decode($part), - 'ÇçäâàåéêëèïîìÅÉöôòüûùÿøØáíóúñÑÁÂÀãÃÊËÈÍÎÏÓÔõÕÚÛÙýÝ', - 'ccaaaaeeeeiiiaeooouuuyooaiounnaaaaaeeeiiioooouuuyy')), - array('ß' => 'ss', 'ae' => 'a', 'oe' => 'o', 'ue' => 'u'))); + $part = mb_strtolower($part); + + if (!empty($mapping)) { + $part = strtr($part, $mapping); } - else - $arr[$i] = mb_strtolower($part); + + $arr[$i] = $part; } return $as_array ? $arr : join(" ", $arr); @@ -1039,7 +1056,6 @@ class rcube_utils } } - /** * Find out if the string content means true or false * diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php index 82b8ebb73..560a8bde7 100644 --- a/tests/Framework/Utils.php +++ b/tests/Framework/Utils.php @@ -327,7 +327,8 @@ class Framework_Utils extends PHPUnit_Framework_TestCase $test = array( '' => '', 'abc def' => 'abc def', - 'ÇçäâàåéêëèïîìÅÉöôòüûùÿøØáíóúñÑÁÂÀãÃÊËÈÍÎÏÓÔõÕÚÛÙýÝ' => 'ccaaaaeeeeiiiaeooouuuyooaiounnaaaaaeeeiiioooouuuyy', + 'ÇçäâàåæéêëèïîìÅÉöôòüûùÿøØáíóúñÑÁÂÀãÃÊËÈÍÎÏÓÔõÕÚÛÙýÝ' => 'ccaaaaaeeeeiiiaeooouuuyooaiounnaaaaaeeeiiioooouuuyy', + 'ąáâäćçčéęëěíîłľĺńňóôöŕřśšşťţůúűüźžżýĄŚŻŹĆ' => 'aaaaccceeeeiilllnnooorrsssttuuuuzzzyaszzc', 'ß' => 'ss', 'ae' => 'a', 'oe' => 'o', -- cgit v1.2.3 From 5bf83d551e3c748b8ba37ad6459a505730ec9877 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 27 May 2014 14:44:52 +0200 Subject: Fix unintentional line-height style modification in HTML messages (#1489917) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_washtml.php | 2 +- tests/Framework/Washtml.php | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 03d1d285a..af23c6ea5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -29,6 +29,7 @@ CHANGELOG Roundcube Webmail - Fix incorrect handling of HTML comments in messages sanitization code (#1489904) - Fix so current page is reset on list-mode change (#1489907) - Fix so responses menu hides on click in classic skin (#1489915) +- Fix unintentional line-height style modification in HTML messages (#1489917) RELEASE 1.0.1 ------------- diff --git a/program/lib/Roundcube/rcube_washtml.php b/program/lib/Roundcube/rcube_washtml.php index 5f40eecf4..984294376 100644 --- a/program/lib/Roundcube/rcube_washtml.php +++ b/program/lib/Roundcube/rcube_washtml.php @@ -206,7 +206,7 @@ class rcube_washtml $value .= ' ' . $val; // #1488535: Fix size units, so width:800 would be changed to width:800px - if (preg_match('/(left|right|top|bottom|width|height)/i', $cssid) + if (preg_match('/^(left|right|top|bottom|width|height)/i', $cssid) && preg_match('/^[0-9]+$/', $val) ) { $value .= 'px'; diff --git a/tests/Framework/Washtml.php b/tests/Framework/Washtml.php index 5c15c692c..f041504d7 100644 --- a/tests/Framework/Washtml.php +++ b/tests/Framework/Washtml.php @@ -169,4 +169,18 @@ class Framework_Washtml extends PHPUnit_Framework_TestCase $this->assertRegExp('|style="font-family: 新細明體; color: red"|', $washed, "Unicode chars in style attribute (#1489697)"); } + + /** + * Test style item fixes + */ + function test_style_wash() + { + $html = "

a

"; + + $washer = new rcube_washtml; + $washed = $washer->wash($html); + + $this->assertRegExp('|line-height: 1;|', $washed, "Untouched line-height (#1489917)"); + $this->assertRegExp('|; height: 10px|', $washed, "Fixed height units"); + } } -- cgit v1.2.3 From 17acd5ccda5b23792477891ab969b378cacbbaf2 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 27 May 2014 19:51:04 +0200 Subject: Use public property instead of setter method to improve compatibility --- program/lib/Roundcube/rcube_session.php | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php index f04f47a21..26f78433a 100644 --- a/program/lib/Roundcube/rcube_session.php +++ b/program/lib/Roundcube/rcube_session.php @@ -44,10 +44,16 @@ class rcube_session private $secret = ''; private $ip_check = false; private $logging = false; - private $nowrite = false; private $storage; private $memcache; + /** + * Blocks session data from being written to database. + * Can be used if write-race conditions are to be expected + * @var boolean + */ + public $nowrite = false; + /** * Default constructor @@ -729,16 +735,6 @@ class rcube_session } - /** - * Blocks session data from being written to database. - * Can be used if write-race conditions are to be expected - */ - function nowrite($block = true) - { - $this->nowrite = $block; - } - - /** * Check session authentication cookie * -- cgit v1.2.3 From 20ef295ba8ff0e9fce57ee24dd7f467a366a5c88 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 28 May 2014 09:05:52 +0200 Subject: Fix UTF7-IMAP encoding detection (fixes folders list sorting) --- program/lib/Roundcube/rcube_imap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index e4b77a0a3..8bdc92bee 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -4151,7 +4151,7 @@ class rcube_imap extends rcube_storage if ($folder[0] != '.') { // for better performance skip encoding conversion // if the string does not look like UTF7-IMAP - $folders[$folder] = strpos($folder, '+') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP'); + $folders[$folder] = strpos($folder, '&') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP'); } else { unset($folders[$idx]); -- cgit v1.2.3 From a62cc30cb4186e89c4d33fdf80f9aa95b9def7cc Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 28 May 2014 10:58:47 +0200 Subject: Small code improvements --- program/lib/Roundcube/rcube_imap.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 8bdc92bee..78073abd6 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -4142,9 +4142,8 @@ class rcube_imap extends rcube_storage */ public function sort_folder_list($a_folders, $skip_default = false) { - $delimiter = $this->get_hierarchy_delimiter(); $specials = array_merge(array('INBOX'), array_values($this->get_special_folders())); - $folders = array_flip($a_folders); + $folders = array(); // convert names to UTF-8 and skip folders starting with '.' foreach ($a_folders as $folder) { @@ -4153,9 +4152,6 @@ class rcube_imap extends rcube_storage // if the string does not look like UTF7-IMAP $folders[$folder] = strpos($folder, '&') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP'); } - else { - unset($folders[$idx]); - } } // sort folders @@ -4175,7 +4171,7 @@ class rcube_imap extends rcube_storage // place default folders on top foreach ($specials as $special) { - $prefix = $special . $delimiter; + $prefix = $special . $this->delimiter; foreach ($folders as $idx => $folder) { if ($folder === $special) { @@ -4200,9 +4196,8 @@ class rcube_imap extends rcube_storage */ protected function sort_folder_comparator($str1, $str2) { - $delimiter = $this->get_hierarchy_delimiter(); - $path1 = explode($delimiter, $str1); - $path2 = explode($delimiter, $str2); + $path1 = explode($this->delimiter, $str1); + $path2 = explode($this->delimiter, $str2); foreach ($path1 as $idx => $folder1) { $folder2 = $path2[$idx]; -- cgit v1.2.3 From 232bcde1c2222b24ff659882355b048b1f4295cd Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 1 Jun 2014 18:53:33 +0200 Subject: Change private vars/methods to protected --- program/lib/Roundcube/rcube_imap_generic.php | 40 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 3b5be15db..e4c9b7eb8 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -50,17 +50,17 @@ class rcube_imap_generic public static $mupdate; - private $fp; - private $host; - private $logged = false; - private $capability = array(); - private $capability_readed = false; - private $prefs; - private $cmd_tag; - private $cmd_num = 0; - private $resourceid; - private $_debug = false; - private $_debug_handler = false; + protected $fp; + protected $host; + protected $logged = false; + protected $capability = array(); + protected $capability_readed = false; + protected $prefs; + protected $cmd_tag; + protected $cmd_num = 0; + protected $resourceid; + protected $_debug = false; + protected $_debug_handler = false; const ERROR_OK = 0; const ERROR_NO = -1; @@ -352,7 +352,7 @@ class rcube_imap_generic * * @return bool True if connection is closed */ - private function eof() + protected function eof() { if (!is_resource($this->fp)) { return true; @@ -375,7 +375,7 @@ class rcube_imap_generic /** * Closes connection stream. */ - private function closeSocket() + protected function closeSocket() { @fclose($this->fp); $this->fp = null; @@ -421,7 +421,7 @@ class rcube_imap_generic return false; } - private function hasCapability($name) + protected function hasCapability($name) { if (empty($this->capability) || $name == '') { return false; @@ -1310,7 +1310,7 @@ class rcube_imap_generic * @return array List of mailboxes or hash of options if $status_ops argument * is non-empty. */ - private function _listMailboxes($ref, $mailbox, $subscribed=false, + protected function _listMailboxes($ref, $mailbox, $subscribed=false, $status_opts=array(), $select_opts=array()) { if (!strlen($mailbox)) { @@ -1985,7 +1985,7 @@ class rcube_imap_generic * * @return bool True on success, False on failure */ - private function modFlag($mailbox, $messages, $flag, $mod = '+') + protected function modFlag($mailbox, $messages, $flag, $mod = '+') { if ($mod != '+' && $mod != '-') { $mod = '+'; @@ -3681,7 +3681,7 @@ class rcube_imap_generic return $result; } - private function _xor($string, $string2) + protected function _xor($string, $string2) { $result = ''; $size = strlen($string); @@ -3700,7 +3700,7 @@ class rcube_imap_generic * * @return string Space-separated list of flags */ - private function flagsToStr($flags) + protected function flagsToStr($flags) { foreach ((array)$flags as $idx => $flag) { if ($flag = $this->flags[strtoupper($flag)]) { @@ -3752,7 +3752,7 @@ class rcube_imap_generic /** * CAPABILITY response parser */ - private function parseCapability($str, $trusted=false) + protected function parseCapability($str, $trusted=false) { $str = preg_replace('/^\* CAPABILITY /i', '', $str); @@ -3829,7 +3829,7 @@ class rcube_imap_generic * * @since 0.5-stable */ - private function debug($message) + protected function debug($message) { if (($len = strlen($message)) > self::DEBUG_LINE_LENGTH) { $diff = $len - self::DEBUG_LINE_LENGTH; -- cgit v1.2.3 From 35c135bce14d6c2260ff396b7087cd5ceed074b7 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 1 Jun 2014 18:54:30 +0200 Subject: Change private method to protected --- program/lib/Roundcube/rcube_imap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 78073abd6..6dcf528e0 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -2990,7 +2990,7 @@ class rcube_imap extends rcube_storage * @param array $result Reference to folders list * @param string $type Listing type (ext-subscribed, subscribed or all) */ - private function list_folders_update(&$result, $type = null) + protected function list_folders_update(&$result, $type = null) { $namespace = $this->get_namespace(); $search = array(); -- cgit v1.2.3 From 354c7d3c6c457f93baae64c6df64ad99f4050b81 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 4 Jun 2014 10:44:26 +0200 Subject: Fix folders sorting in case when special folders are subfolders of INBOX --- program/lib/Roundcube/rcube_imap.php | 38 ++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 6dcf528e0..e29bfc46b 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -4166,30 +4166,38 @@ class rcube_imap extends rcube_storage // force the type of folder name variable (#1485527) $folders = array_map('strval', $folders); + $out = array(); + + // finally we must put special folders on top and rebuild the list + // to move their subfolders where they belong... $specials = array_unique(array_intersect($specials, $folders)); - $head = array(); + $folders = array_merge($specials, array_diff($folders, $specials)); - // place default folders on top - foreach ($specials as $special) { - $prefix = $special . $this->delimiter; + $this->sort_folder_specials(null, $folders, $specials, $out); - foreach ($folders as $idx => $folder) { - if ($folder === $special) { - $head[] = $special; - unset($folders[$idx]); - } - // put subfolders of default folders on their place... - else if (strpos($folder, $prefix) === 0) { - $head[] = $folder; - unset($folders[$idx]); + return $out; + } + + /** + * Recursive function to put subfolders of special folders in place + */ + protected function sort_folder_specials($folder, &$list, &$specials, &$out) + { + while (list($key, $name) = each($list)) { + if ($folder === null || strpos($name, $folder.$this->delimiter) === 0) { + $out[] = $name; + unset($list[$key]); + + if (!empty($specials) && ($found = array_search($name, $specials)) !== false) { + unset($specials[$found]); + $this->sort_folder_specials($name, $list, $specials, $out); } } } - return array_merge($head, $folders); + reset($list); } - /** * Callback for uasort() that implements correct * locale-aware case-sensitive sorting -- cgit v1.2.3 From 72afe3153cfaf0f8aaa0a4db115fea62959ff6d1 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 4 Jun 2014 15:29:37 +0200 Subject: Use tags for table headers as suggested by the WCAG 2.0 Guidelines --- program/js/app.js | 2 +- program/js/list.js | 6 +- program/lib/Roundcube/html.php | 15 +++- program/steps/mail/func.inc | 4 +- skins/classic/common.css | 2 + skins/classic/mail.css | 152 +++++++++++++++++++++-------------------- skins/larry/mail.css | 137 +++++++++++++++++++------------------ skins/larry/styles.css | 22 +++--- 8 files changed, 179 insertions(+), 161 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/js/app.js b/program/js/app.js index 1f6582bf6..9d08a3f75 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -6712,7 +6712,7 @@ function rcube_webmail() tr = document.createElement('tr'); for (c=0, len=repl.length; c < len; c++) { - cell = document.createElement('td'); + cell = document.createElement('th'); cell.innerHTML = repl[c].html || ''; if (repl[c].id) cell.id = repl[c].id; if (repl[c].className) cell.className = repl[c].className; diff --git a/program/js/list.js b/program/js/list.js index 837a8459d..cf6c3f011 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -199,7 +199,7 @@ init_header: function() if (this.fixed_header) { // copy (modified) fixed header back to the actual table $(this.list.tHead).replaceWith($(this.fixed_header).find('thead').clone()); - $(this.list.tHead).find('tr td').attr('style', '').find('a').attr('tabindex', '-1'); // remove fixed widths + $(this.list.tHead).find('th,td').attr('style', '').find('a').attr('tabindex', '-1'); // remove fixed widths } else if (!bw.touch && this.list.className.indexOf('fixedheader') >= 0) { this.init_fixed_header(); @@ -855,9 +855,9 @@ get_prev_row: function() get_first_row: function() { if (this.rowcount) { - var i, len, uid, rows = this.tbody.childNodes; + var i, uid, rows = this.tbody.childNodes; - for (i=0, len=rows.length-1; iheader)) { $rowcontent = ''; foreach ($this->header as $c => $col) { - $rowcontent .= self::tag($this->_col_tagname(), $col->attrib, $col->content); + $rowcontent .= self::tag($this->_head_tagname(), $col->attrib, $col->content); } $thead = $this->tagname == 'table' ? self::tag('thead', null, self::tag('tr', null, $rowcontent, parent::$common_attrib)) : self::tag($this->_row_tagname(), array('class' => 'thead'), $rowcontent, parent::$common_attrib); @@ -890,7 +890,16 @@ class html_table extends html private function _row_tagname() { static $row_tagnames = array('table' => 'tr', 'ul' => 'li', '*' => 'div'); - return $row_tagnames[$this->tagname] ? $row_tagnames[$this->tagname] : $row_tagnames['*']; + return $row_tagnames[$this->tagname] ?: $row_tagnames['*']; + } + + /** + * Getter for the corresponding tag name for table row elements + */ + private function _head_tagname() + { + static $head_tagnames = array('table' => 'th', '*' => 'span'); + return $head_tagnames[$this->tagname] ?: $head_tagnames['*']; } /** @@ -899,7 +908,7 @@ class html_table extends html private function _col_tagname() { static $col_tagnames = array('table' => 'td', '*' => 'span'); - return $col_tagnames[$this->tagname] ? $col_tagnames[$this->tagname] : $col_tagnames['*']; + return $col_tagnames[$this->tagname] ?: $col_tagnames['*']; } } diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index cbfb1200b..436475f64 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -509,8 +509,8 @@ function rcmail_message_list_head($attrib, $a_show_cols) $a_sort_cols = array('subject', 'date', 'from', 'to', 'fromto', 'size', 'cc'); if (!empty($attrib['optionsmenuicon'])) { - $onclick = 'return ' . rcmail_output::JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu', null, event)"; - $inner = 'v'; + $onclick = 'return ' . rcmail_output::JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu', this, event)"; + $inner = $RCMAIL->gettext('listoptions'); if (is_string($attrib['optionsmenuicon']) && $attrib['optionsmenuicon'] != 'true') { $inner = html::img(array('src' => $skin_path . $attrib['optionsmenuicon'], 'alt' => $RCMAIL->gettext('listoptions'))); } diff --git a/skins/classic/common.css b/skins/classic/common.css index 126408444..c0d0a2610 100644 --- a/skins/classic/common.css +++ b/skins/classic/common.css @@ -607,6 +607,7 @@ img.uploading /***** common table settings ******/ +table.records-table thead tr th, table.records-table thead tr td { height: 20px; @@ -617,6 +618,7 @@ table.records-table thead tr td background: url(images/listheader.gif) top left repeat-x #CCC; font-size: 11px; font-weight: bold; + text-align: left; } table.records-table tbody tr td diff --git a/skins/classic/mail.css b/skins/classic/mail.css index 3310ac54f..45661f7f8 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -719,6 +719,7 @@ table.messagelist.fixedcopy z-index: 2; } +.messagelist thead tr th, .messagelist thead tr td { height: 20px; @@ -729,25 +730,26 @@ table.messagelist.fixedcopy background: url(images/listheader.gif) top left repeat-x #CCC; font-size: 11px; font-weight: bold; + text-align: left; } -.messagelist thead tr td.sortedASC, -.messagelist thead tr td.sortedDESC +.messagelist thead tr > .sortedASC, +.messagelist thead tr > .sortedDESC { background-position: 0 -26px; } -.messagelist thead tr td.sortedASC a +.messagelist thead tr > .sortedASC a { background: url(images/icons/sort.gif) right 0 no-repeat; } -.messagelist thead tr td.sortedDESC a +.messagelist thead tr > .sortedDESC a { background: url(images/icons/sort.gif) right -14px no-repeat; } -.messagelist thead tr td a +.messagelist thead tr a { display: block; width: auto !important; @@ -756,18 +758,19 @@ table.messagelist.fixedcopy text-decoration: none; } -.messagelist thead tr td.size.sortedASC a, -.messagelist thead tr td.size.sortedDESC a +.messagelist thead tr > .size.sortedASC a, +.messagelist thead tr > .size.sortedDESC a { padding-right: 18px; } -.messagelist thead tr td.subject +.messagelist thead tr > .subject { padding-left: 18px; width: 99%; } +.messagelist tbody tr th, .messagelist tbody tr td { height: 20px; @@ -804,10 +807,10 @@ table.messagelist.fixedcopy cursor: pointer; } -.messagelist tr td.flag span, -.messagelist tr td.status span, -.messagelist tr td.attachment span, -.messagelist tr td.priority span +.messagelist tr > .flag span, +.messagelist tr > .status span, +.messagelist tr > .attachment span, +.messagelist tr > .priority span { display: block; width: 15px; @@ -815,29 +818,29 @@ table.messagelist.fixedcopy .messagelist tr td div.collapsed, .messagelist tr td div.expanded, -.messagelist tr td.threads .listmenu, -.messagelist tr td.attachment span.attachment, -.messagelist tr td.attachment span.report, -.messagelist tr td.priority span.priority, -.messagelist tr td.priority span.prio1, -.messagelist tr td.priority span.prio2, -.messagelist tr td.priority span.prio3, -.messagelist tr td.priority span.prio4, -.messagelist tr td.priority span.prio5, -.messagelist tr td.flag span.flagged, -.messagelist tr td.flag span.unflagged, -.messagelist tr td.flag span.unflagged:hover, -.messagelist tr td.status span.status, -.messagelist tr td.status span.msgicon, -.messagelist tr td.status span.deleted, -.messagelist tr td.status span.unread, -.messagelist tr td.status span.unreadchildren, -.messagelist tr td.subject span.msgicon, -.messagelist tr td.subject span.deleted, -.messagelist tr td.subject span.unread, -.messagelist tr td.subject span.replied, -.messagelist tr td.subject span.forwarded, -.messagelist tr td.subject span.unreadchildren +.messagelist tr > .threads .listmenu, +.messagelist tr > .attachment span.attachment, +.messagelist tr > .attachment span.report, +.messagelist tr > .priority span.priority, +.messagelist tr > .priority span.prio1, +.messagelist tr > .priority span.prio2, +.messagelist tr > .priority span.prio3, +.messagelist tr > .priority span.prio4, +.messagelist tr > .priority span.prio5, +.messagelist tr > .flag span.flagged, +.messagelist tr > .flag span.unflagged, +.messagelist tr > .flag span.unflagged:hover, +.messagelist tr > .status span.status, +.messagelist tr > .status span.msgicon, +.messagelist tr > .status span.deleted, +.messagelist tr > .status span.unread, +.messagelist tr > .status span.unreadchildren, +.messagelist tr > .subject span.msgicon, +.messagelist tr > .subject span.deleted, +.messagelist tr > .subject span.unread, +.messagelist tr > .subject span.replied, +.messagelist tr > .subject span.forwarded, +.messagelist tr > .subject span.unreadchildren { display: inline-block; vertical-align: middle; @@ -846,99 +849,99 @@ table.messagelist.fixedcopy background: url(images/messageicons.png) center no-repeat; } -.messagelist tr td.attachment span.attachment +.messagelist tr > .attachment span.attachment { background-position: 0 -170px; } -.messagelist tr td.attachment span.report +.messagelist tr > .attachment span.report { background-position: 0 -255px; } -.messagelist tr td.priority span.priority +.messagelist tr > .priority span.priority { background-position: 0 -309px; } -.messagelist tr td.priority span.prio5 +.messagelist tr > .priority span.prio5 { background-position: 0 -358px; } -.messagelist tr td.priority span.prio4 +.messagelist tr > .priority span.prio4 { background-position: 0 -340px; } -.messagelist tr td.priority span.prio3 +.messagelist tr > .priority span.prio3 { background-position: 0 -324px; } -.messagelist tr td.priority span.prio2 +.messagelist tr > .priority span.prio2 { background-position: 0 -309px; } -.messagelist tr td.priority span.prio1 +.messagelist tr > .priority span.prio1 { background-position: 0 -290px; } -.messagelist tr td.flag span.flagged +.messagelist tr > .flag span.flagged { background-position: 0 -153px; } -.messagelist tr td.flag span.unflagged:hover +.messagelist tr > .flag span.unflagged:hover { background-position: 0 -136px; } -.messagelist tr td.subject span.msgicon, -.messagelist tr td.subject span.unreadchildren +.messagelist tr > .subject span.msgicon, +.messagelist tr > .subject span.unreadchildren { background-position: 0 -51px; margin: 0 2px; } -.messagelist tr td.subject span.replied +.messagelist tr > .subject span.replied { background-position: 0 -85px; } -.messagelist tr td.subject span.forwarded +.messagelist tr > .subject span.forwarded { background-position: 0 -68px; } -.messagelist tr td.subject span.replied.forwarded +.messagelist tr > .subject span.replied.forwarded { background-position: 0 -102px; } -.messagelist tr td.status span.msgicon, -.messagelist tr td.flag span.unflagged, -.messagelist tr td.status span.unreadchildren +.messagelist tr > .status span.msgicon, +.messagelist tr > .flag span.unflagged, +.messagelist tr > .status span.unreadchildren { background-position: 0 17px; /* no icon */ } -.messagelist tr td.status span.msgicon:hover +.messagelist tr > .status span.msgicon:hover { background-position: 0 -272px; } -.messagelist tr td.status span.deleted, -.messagelist tr td.subject span.deleted +.messagelist tr > .status span.deleted, +.messagelist tr > .subject span.deleted { background-position: 0 -187px; } -.messagelist tr td.status span.status, -.messagelist tr td.status span.unread, -.messagelist tr td.subject span.unread +.messagelist tr > .status span.status, +.messagelist tr > .status span.unread, +.messagelist tr > .subject span.unread { background-position: 0 -119px; } @@ -955,7 +958,7 @@ table.messagelist.fixedcopy cursor: pointer; } -.messagelist tr td.threads .listmenu +.messagelist tr > .threads .listmenu { background-position: 0 -238px; cursor: pointer; @@ -980,45 +983,45 @@ table.messagelist.fixedcopy text-decoration: underline; } -.messagelist tr td.attachment, -.messagelist tr td.threads, -.messagelist tr td.status, -.messagelist tr td.flag, -.messagelist tr td.priority +.messagelist tr > .attachment, +.messagelist tr > .threads, +.messagelist tr > .status, +.messagelist tr > .flag, +.messagelist tr > .priority { width: 17px; padding: 0 0 0 2px; } -.messagelist tr td.size +.messagelist tr > .size { width: 60px; text-align: right; padding: 0 2px; } -.messagelist tr td.fromto, -.messagelist tr td.from, -.messagelist tr td.to, -.messagelist tr td.cc, -.messagelist tr td.replyto +.messagelist tr > .fromto, +.messagelist tr > .from, +.messagelist tr > .to, +.messagelist tr > .cc, +.messagelist tr > .replyto { width: 180px; padding: 0 2px; } -.messagelist tr td.date +.messagelist tr > .date { width: 135px; padding: 0 2px; } -.messagelist tr td.folder +.messagelist tr > .folder { width: 135px; } -.messagelist tr td.hidden +.messagelist tr > .hidden { display: none; } @@ -1041,6 +1044,7 @@ table.messagelist.fixedcopy } /* This padding-left minus the focused padding left should be half of the focused border-left */ +.messagelist thead tr th:first-child, .messagelist thead tr td:first-child, .messagelist tbody tr td:first-child { border-left: 0; diff --git a/skins/larry/mail.css b/skins/larry/mail.css index c5919ffe3..a0b66d9be 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -477,66 +477,66 @@ table.messagelist.fixedcopy { z-index: 2; } -.messagelist thead td:first-child { +.messagelist thead th:first-child { border-radius: 4px 0 0 0; /* for Chrome */ } -.messagelist tr td.attachment, -.messagelist tr td.threads, -.messagelist tr td.status, -.messagelist tr td.flag, -.messagelist tr td.priority { +.messagelist tr > .attachment, +.messagelist tr > .threads, +.messagelist tr > .status, +.messagelist tr > .flag, +.messagelist tr > .priority { width: 20px; padding: 2px 3px; } -.webkit .messagelist tr td.attachment, -.webkit .messagelist tr td.threads, -.webkit .messagelist tr td.status, -.webkit .messagelist tr td.flag, -.webkit .messagelist tr td.priority { +.webkit .messagelist tr > .attachment, +.webkit .messagelist tr > .threads, +.webkit .messagelist tr > .status, +.webkit .messagelist tr > .flag, +.webkit .messagelist tr > .priority { width: 26px; } -.messagelist tr td.threads { +.messagelist tr > .threads { width: 26px; } -.webkit .messagelist tr td.threads { +.webkit .messagelist tr > .threads { width: 30px; } -.messagelist tr td.threads, -.messagelist tr td.threads + td { +.messagelist tr > .threads, +.messagelist tr > .threads + td { border-left: 0; } -.messagelist tr td.size { +.messagelist tr > .size { width: 60px; text-align: right; } -.messagelist thead tr td.size { +.messagelist thead tr th.size { text-align: left; } -.messagelist tr td.fromto, -.messagelist tr td.from, -.messagelist tr td.to, -.messagelist tr td.cc, -.messagelist tr td.replyto { +.messagelist tr > .fromto, +.messagelist tr > .from, +.messagelist tr > .to, +.messagelist tr > .cc, +.messagelist tr > .replyto { width: 200px; } -.messagelist tr td.date { +.messagelist tr > .date { width: 155px; } -.messagelist tr td.folder { +.messagelist tr > .folder { width: 135px; } -.messagelist tr td.hidden { +.messagelist tr > .hidden { display: none; } @@ -553,13 +553,14 @@ table.messagelist.fixedcopy { /* background-color: #fff; */ } +.messagelist tr.flagged th, .messagelist tr.flagged td, .messagelist tr.flagged td a { color: #f30; } -.messagelist thead tr td.sortedASC a, -.messagelist thead tr td.sortedDESC a { +.messagelist thead tr th.sortedASC a, +.messagelist thead tr th.sortedDESC a { color: #004458; text-decoration: underline; background-image: url(images/listicons.png); @@ -567,7 +568,7 @@ table.messagelist.fixedcopy { background-position: right -912px; } -.messagelist thead tr td.sortedASC a { +.messagelist thead tr th.sortedASC a { background-position: right -944px; } @@ -589,39 +590,39 @@ table.messagelist.fixedcopy { cursor: pointer; } -.messagelist tr td.flag span, -.messagelist tr td.status span, -.messagelist tr td.attachment span, -.messagelist tr td.priority span { +.messagelist tr > .flag span, +.messagelist tr > .status span, +.messagelist tr > .attachment span, +.messagelist tr > .priority span { display: block; width: 20px; } .messagelist tr td div.collapsed, .messagelist tr td div.expanded, -.messagelist tr td.threads .listmenu, -.messagelist tr td.attachment span.attachment, -.messagelist tr td.attachment span.report, -.messagelist tr td.priority span.priority, -.messagelist tr td.priority span.prio1, -.messagelist tr td.priority span.prio2, -.messagelist tr td.priority span.prio3, -.messagelist tr td.priority span.prio4, -.messagelist tr td.priority span.prio5, -.messagelist tr td.flag span.flagged, -.messagelist tr td.flag span.unflagged, -.messagelist tr td.flag span.unflagged:hover, -.messagelist tr td.status span.status, -.messagelist tr td.status span.msgicon, -.messagelist tr td.status span.deleted, -.messagelist tr td.status span.unread, -.messagelist tr td.status span.unreadchildren, -.messagelist tr td.subject span.msgicon, -.messagelist tr td.subject span.deleted, -.messagelist tr td.subject span.unread, -.messagelist tr td.subject span.replied, -.messagelist tr td.subject span.forwarded, -.messagelist tr td.subject span.unreadchildren { +.messagelist tr > .threads .listmenu, +.messagelist tr > .attachment span.attachment, +.messagelist tr > .attachment span.report, +.messagelist tr > .priority span.priority, +.messagelist tr > .priority span.prio1, +.messagelist tr > .priority span.prio2, +.messagelist tr > .priority span.prio3, +.messagelist tr > .priority span.prio4, +.messagelist tr > .priority span.prio5, +.messagelist tr > .flag span.flagged, +.messagelist tr > .flag span.unflagged, +.messagelist tr > .flag span.unflagged:hover, +.messagelist tr > .status span.status, +.messagelist tr > .status span.msgicon, +.messagelist tr > .status span.deleted, +.messagelist tr > .status span.unread, +.messagelist tr > .status span.unreadchildren, +.messagelist tr > .subject span.msgicon, +.messagelist tr > .subject span.deleted, +.messagelist tr > .subject span.unread, +.messagelist tr > .subject span.replied, +.messagelist tr > .subject span.forwarded, +.messagelist tr > .subject span.unreadchildren { display: inline-block; vertical-align: middle; height: 18px; @@ -634,7 +635,7 @@ table.messagelist.fixedcopy { background-position: 0 -996px; } -.messagelist thead tr td.attachment span.attachment { +.messagelist thead tr th.attachment span.attachment { background-position: -24px -997px; } @@ -642,7 +643,7 @@ table.messagelist.fixedcopy { background-position: -24px -1116px; } -.messagelist thead tr td.priority span.priority { +.messagelist thead tr th.priority span.priority { background-position: -24px -1845px; } @@ -666,15 +667,15 @@ table.messagelist.fixedcopy { background-position: 0 -1036px; } -.messagelist thead tr td.flag span.flagged { +.messagelist thead tr th.flag span.flagged { background-position: -22px -1036px; } -.messagelist tr td.status span.msgicon:hover { - background-position: -23px -1056px; +.messagelist tr:hover td.status span.msgicon { + background-position: -23px -1057px; } -.messagelist tr td.flag span.unflagged:hover { +.messagelist tr:hover td.flag span.unflagged { background-position: -23px -1076px; } @@ -717,10 +718,10 @@ table.messagelist.fixedcopy { .messagelist tr td.status span.unread, .messagelist tr td.subject span.unread, .messagelist tr td.status span.unread:hover { - background-position: 0 -1016px; + background-position: 0 -1017px; } -.messagelist thead tr td.status span.status { +.messagelist thead tr th.status span.status { background-position: -23px -1017px; } @@ -734,10 +735,10 @@ table.messagelist.fixedcopy { cursor: pointer; } -.messagelist tr td.threads .listmenu { - background-position: 6px -972px; +.messagelist tr th.threads .listmenu { + background-position: 4px -972px; cursor: pointer; - width: 26px; + width: 24px; height: 21px; overflow: hidden; text-indent: -5000px; @@ -745,12 +746,12 @@ table.messagelist.fixedcopy { padding: 3px 5px 2px 6px; } -.messagelist tr td.threads .listmenu:focus { +.messagelist tr th.threads .listmenu:focus { background-color: rgba(73,180,210,0.7); outline: none; } -.messagelist thead tr td.subject, +.messagelist thead tr th.subject, .messagelist tbody tr td.subject { width: 99%; white-space: nowrap; diff --git a/skins/larry/styles.css b/skins/larry/styles.css index 27a0cb99c..a2cad34f1 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -1131,6 +1131,7 @@ a.iconlink.upload { } .boxtitle, +.uibox .listing thead th, .uibox .listing thead td { font-size: 12px; font-weight: bold; @@ -1142,12 +1143,14 @@ a.iconlink.upload { white-space: nowrap; } +.uibox .listing thead th, .uibox .listing thead td { padding-bottom: 8px; height: auto; } .uibox .boxtitle, +.uibox .listing thead th, .uibox .listing thead td { background: #b0ccd7; color: #004458; @@ -1212,11 +1215,7 @@ a.iconlink.upload { /* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */ .listing.focus tbody tr.focused > td:first-child { - border-left: 2px solid #b0ccd7; -} - -.listing.focus tbody tr.selected.focused > td:first-child { - border-left-color: #9ec2d0; + border-left: 2px solid #739da8; } .listbox .listitem.selected, @@ -1511,6 +1510,7 @@ table.records-table { border: 0; } +.records-table thead th, .records-table thead td { color: #69939e; font-size: 11px; @@ -1525,13 +1525,17 @@ table.records-table { padding: 8px 7px; overflow: hidden; text-overflow: ellipsis; + text-align: left; } +.records-table.sortheader thead th, .records-table.sortheader thead td { padding: 0; } +.records-table thead th a, .records-table thead td a, +.records-table thead th span, .records-table thead td span { display: block; padding: 7px 7px; @@ -1541,6 +1545,7 @@ table.records-table { text-overflow: ellipsis; } +.records-table thead th a:focus, .records-table thead td a:focus { color: #fff; background-color: rgba(73,180,210,0.7); @@ -1561,6 +1566,7 @@ table.records-table { } /* This padding-left minus the focused padding left should be half of the focused border-left */ +.records-table thead tr th:first-child, .records-table thead tr td:first-child, .records-table tbody tr td:first-child { border-left: 2px solid transparent; @@ -1569,11 +1575,7 @@ table.records-table { /* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */ .records-table.focus tbody tr.focused > td:first-child { - border-left: 2px solid #b0ccd7; -} - -.records-table.focus tbody tr.selected.focused > td:first-child { - border-left-color: #49b3d2; + border-left: 2px solid #49b3d2; } .records-table tr.selected td { -- cgit v1.2.3 From c5bfe69e2199d6dc92136d5e1ebcc9cdeb180bf5 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 4 Jun 2014 18:42:57 +0200 Subject: Improved video support, all tinymce related resources moved to program/js/tinymce/roundcube dir --- program/include/rcmail.php | 3 +- program/js/editor.js | 24 ++++++-- program/js/tinymce/roundcube/browser.css | 91 ++++++++++++++++++++++++++++++ program/js/tinymce/roundcube/content.css | 26 +++++++++ program/js/tinymce/roundcube/video.png | Bin 0 -> 999 bytes program/lib/Roundcube/rcube_washtml.php | 6 +- program/localization/en_US/labels.inc | 2 + program/steps/mail/sendmail.inc | 4 +- skins/classic/common.css | 86 ----------------------------- skins/classic/editor_content.css | 26 --------- skins/larry/editor_content.css | 26 --------- skins/larry/styles.css | 92 ------------------------------- 12 files changed, 148 insertions(+), 238 deletions(-) create mode 100644 program/js/tinymce/roundcube/browser.css create mode 100644 program/js/tinymce/roundcube/content.css create mode 100644 program/js/tinymce/roundcube/video.png delete mode 100644 skins/classic/editor_content.css delete mode 100644 skins/larry/editor_content.css (limited to 'program/lib/Roundcube') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index a6ba18312..a9e717b86 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -1795,8 +1795,9 @@ class rcmail extends rcube 'spelldict' => intval($this->config->get('spellcheck_dictionary')) ); - $this->output->add_label('selectimage', 'addimage'); + $this->output->add_label('selectimage', 'addimage', 'selectmedia', 'addmedia'); $this->output->set_env('editor_config', $config); + $this->output->include_css('program/js/tinymce/roundcube/browser.css'); $this->output->include_script('tinymce/tinymce.min.js'); $this->output->include_script('editor.js'); } diff --git a/program/js/editor.js b/program/js/editor.js index 6540bd56a..c5ceddd0f 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -40,7 +40,7 @@ function rcube_text_editor(config, id) selector: '#' + ($('#' + id).is('.mce_editor') ? id : 'fake-editor-id'), theme: 'modern', language: config.lang, - content_css: config.skin_path + '/editor_content.css?v2', + content_css: 'program/js/tinymce/roundcube/content.css?v1', menubar: false, statusbar: false, toolbar_items_size: 'small', @@ -84,7 +84,7 @@ function rcube_text_editor(config, id) accessibility_focus: false, file_browser_callback: function(name, url, type, win) { ref.file_browser_callback(name, url, type); }, // @todo: support more than image (types: file, image, media) - file_browser_callback_types: 'image' + file_browser_callback_types: 'image media' }); } @@ -582,9 +582,25 @@ function rcube_text_editor(config, id) return; } - if (file.mimetype.startsWith('image/')) { + var rx, img_src; + + switch (rcmail.env.file_browser_type) { + case 'image': + rx = /^image\//i; + break; + + case 'media': + rx = /^video\//i; + img_src = 'program/js/tinymce/roundcube/video.png'; + break; + + default: + return; + } + + if (rx.test(file.mimetype)) { var href = rcmail.env.comm_path+'&_id='+rcmail.env.compose_id+'&_action=display-attachment&_file='+file_id, - img = $('').attr({title: file.name, src: href + '&_thumbnail=1'}); + img = $('').attr({title: file.name, src: img_src ? img_src : href + '&_thumbnail=1'}); return $('
  • ').data('url', href) .append($('').append(img)) diff --git a/program/js/tinymce/roundcube/browser.css b/program/js/tinymce/roundcube/browser.css new file mode 100644 index 000000000..1787226f3 --- /dev/null +++ b/program/js/tinymce/roundcube/browser.css @@ -0,0 +1,91 @@ +/* This file contains the CSS data for media file selector of TinyMCE */ +#image-selector-list { + position: absolute; + top: 0; + left: 0; + right: 152px; + height: 100%; + overflow-x: hidden; + overflow-y: auto; +} + +#image-selector-form { + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 150px; + border: 0; + border: 1px solid #FFF; + border-left: 1px solid #DDD; + text-align: center; + padding-top: 10px; +} + +#image-upload-button { + width: 80%; + height: 30px; +} + +#image-upload-button span { + position: absolute; + width: 100%; + text-align: center; + line-height: 30px; +} + +#image-selector-list li { + line-height: 80px; + padding: 2px 0 2px 3px; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; +} + +#image-selector-list li:hover { + background-color: #F0F0F0; +} + +#image-selector-list ul li img { + vertical-align: middle; + max-height: 80px; +} + +#image-selector-list ul li span.name { + vertical-align: middle; + font-weight: bold; + padding-left: 10px; +} + +#image-selector-list ul li span.img { + height: 80px; + width: 80px; + text-align: center; + display: inline-block; + overflow: hidden; + line-height: 80px; +} + +#image-selector-form.droptarget.hover, +#image-selector-form.droptarget.active { + border: 1px solid #019bc6; + box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); + -moz-box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); + -webkit-box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); + -o-box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); +} + +#image-selector-form.droptarget.hover { + background-color: #d9ecf4; + box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); + -moz-box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); + -webkit-box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); + -o-box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); +} + +div.mce-abs-end div.hint { + line-height: 50px; + padding-left: 10px; + color: #999; + text-shadow: 0 1px 1px #FFF; +} diff --git a/program/js/tinymce/roundcube/content.css b/program/js/tinymce/roundcube/content.css new file mode 100644 index 000000000..67480ab77 --- /dev/null +++ b/program/js/tinymce/roundcube/content.css @@ -0,0 +1,26 @@ +/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ + +body, td, pre { + font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +body { + background-color: #FFFFFF; + margin-left: 4px; + margin-right: 4px; + margin-top: 2px; +} + +div.pre { + margin: 0; + padding: 0; + font-family: monospace; +} + +blockquote +{ + border-left: #1010ff 2px solid; + margin: 0; + padding: 0 0.4em; +} diff --git a/program/js/tinymce/roundcube/video.png b/program/js/tinymce/roundcube/video.png new file mode 100644 index 000000000..faf657000 Binary files /dev/null and b/program/js/tinymce/roundcube/video.png differ diff --git a/program/lib/Roundcube/rcube_washtml.php b/program/lib/Roundcube/rcube_washtml.php index 984294376..b93d3b117 100644 --- a/program/lib/Roundcube/rcube_washtml.php +++ b/program/lib/Roundcube/rcube_washtml.php @@ -95,6 +95,7 @@ class rcube_washtml 'ins', 'label', 'legend', 'li', 'map', 'menu', 'nobr', 'ol', 'p', 'pre', 'q', 's', 'samp', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'wbr', 'img', + 'video', 'source', // form elements 'button', 'input', 'textarea', 'select', 'option', 'optgroup' ); @@ -246,7 +247,10 @@ class rcube_washtml $quot = strpos($style, '"') !== false ? "'" : '"'; $t .= ' style=' . $quot . $style . $quot; } - else if ($key == 'background' || ($key == 'src' && strtolower($node->tagName) == 'img')) { //check tagName anyway + else if ($key == 'background' + || ($key == 'src' && preg_match('/^(img|source)$/i', $node->tagName)) + || ($key == 'poster' && strtolower($node->tagName) == 'video') + ) { if (($src = $this->config['cid_map'][$value]) || ($src = $this->config['cid_map'][$this->config['base_url'].$value]) ) { diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 20992e50e..2da99105f 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -232,6 +232,8 @@ $labels['mailreplyintro'] = 'On $date, $sender wrote:'; $labels['originalmessage'] = 'Original Message'; $labels['selectimage'] = 'Select image'; $labels['addimage'] = 'Add image'; +$labels['selectmedia'] = 'Select movie'; +$labels['addmedia'] = 'Add movie'; $labels['editidents'] = 'Edit identities'; $labels['spellcheck'] = 'Spell'; diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 4737ce368..b70b18b6b 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -428,7 +428,7 @@ if (is_array($COMPOSE['attachments'])) { $attachment = $RCMAIL->plugins->exec_hook('attachment_get', $attachment); if ($isHtml) { - $dispurl = '/\ssrc\s*=\s*[\'"]*\S+display-attachment\S+file=rcmfile' + $dispurl = '/\s(poster|src)\s*=\s*[\'"]*\S+display-attachment\S+file=rcmfile' . preg_quote($attachment['id']) . '[\s\'"]*/'; $message_body = $MAIL_MIME->getHTMLBody(); $is_inline = preg_match($dispurl, $message_body); @@ -449,7 +449,7 @@ if (is_array($COMPOSE['attachments'])) { $cid .= '@localhost'; } - $message_body = preg_replace($dispurl, ' src="cid:' . $cid . '" ', $message_body); + $message_body = preg_replace($dispurl, ' \\1="cid:' . $cid . '" ', $message_body); $MAIL_MIME->setHTMLBody($message_body); diff --git a/skins/classic/common.css b/skins/classic/common.css index bdc7501f3..813df9ed3 100644 --- a/skins/classic/common.css +++ b/skins/classic/common.css @@ -1246,84 +1246,6 @@ fieldset.tabbed border: 0 !important; } -#image-selector-list -{ - position: absolute; - top: 0; - left: 0; - right: 152px; - height: 100%; - overflow-x: hidden; - overflow-y: auto; -} - -#image-selector-form -{ - position: absolute; - top: 0; - bottom: 0; - right: 0; - width: 150px; - border: 0; - border: 1px solid #FFF; - border-left: 1px solid #DDD; - text-align: center; - padding-top: 10px; -} - -#image-upload-button -{ - width: 80%; - height: 30px; -} - -#image-upload-button span -{ - position: absolute; - width: 100%; - text-align: center; - line-height: 30px; -} - -#image-selector-list li -{ - line-height: 80px; - padding: 2px 0 2px 3px; - cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; -} - -#image-selector-list li:hover -{ - background-color: #F0F0F0; -} - -#image-selector-list ul li img -{ - vertical-align: middle; - max-height: 80px; -} - -#image-selector-list ul li span.name -{ - vertical-align: middle; - font-weight: bold; - padding-left: 10px; - line-height: 80px; - vertical-align: middle; -} - -#image-selector-list ul li span.img -{ - width: 80px; - text-align: center; - display: inline-block; - overflow: hidden; - line-height: 80px; - vertical-align: middle; -} - #image-selector-form.droptarget { background: url(images/filedrop.png) center bottom no-repeat; } @@ -1335,11 +1257,3 @@ fieldset.tabbed -moz-box-shadow: 0 0 5px 0 #999; -o-box-shadow: 0 0 5px 0 #999; } - -div.mce-abs-end div.hint -{ - line-height: 50px; - padding-left: 10px; - color: #999; - text-shadow: 0 1px 1px #FFF; -} diff --git a/skins/classic/editor_content.css b/skins/classic/editor_content.css deleted file mode 100644 index 67480ab77..000000000 --- a/skins/classic/editor_content.css +++ /dev/null @@ -1,26 +0,0 @@ -/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ - -body, td, pre { - font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; - font-size: 12px; -} - -body { - background-color: #FFFFFF; - margin-left: 4px; - margin-right: 4px; - margin-top: 2px; -} - -div.pre { - margin: 0; - padding: 0; - font-family: monospace; -} - -blockquote -{ - border-left: #1010ff 2px solid; - margin: 0; - padding: 0 0.4em; -} diff --git a/skins/larry/editor_content.css b/skins/larry/editor_content.css deleted file mode 100644 index 67480ab77..000000000 --- a/skins/larry/editor_content.css +++ /dev/null @@ -1,26 +0,0 @@ -/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ - -body, td, pre { - font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; - font-size: 12px; -} - -body { - background-color: #FFFFFF; - margin-left: 4px; - margin-right: 4px; - margin-top: 2px; -} - -div.pre { - margin: 0; - padding: 0; - font-family: monospace; -} - -blockquote -{ - border-left: #1010ff 2px solid; - margin: 0; - padding: 0 0.4em; -} diff --git a/skins/larry/styles.css b/skins/larry/styles.css index 6eceb772e..d1e45012b 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -2721,98 +2721,6 @@ fieldset.tab { margin-left: 0; } -/*** image selector in HTML editor ***/ -#image-selector-list { - position: absolute; - top: 0; - left: 0; - right: 152px; - height: 100%; - overflow-x: hidden; - overflow-y: auto; -} - -#image-selector-form { - position: absolute; - top: 0; - bottom: 0; - right: 0; - width: 150px; - border: 0; - border: 1px solid #FFF; - border-left: 1px solid #DDD; - text-align: center; - padding-top: 10px; -} - -#image-upload-button { - width: 80%; - height: 30px; -} - -#image-upload-button span { - position: absolute; - width: 100%; - text-align: center; - line-height: 30px; -} - -#image-selector-list li { - line-height: 80px; - padding: 2px 0 2px 3px; - cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; -} - -#image-selector-list li:hover { - background-color: #F0F0F0; -} - -#image-selector-list ul li img { - vertical-align: middle; - max-height: 80px; -} - -#image-selector-list ul li span.name { - vertical-align: middle; - font-weight: bold; - padding-left: 10px; -} - -#image-selector-list ul li span.img { - height: 80px; - width: 80px; - text-align: center; - display: inline-block; - overflow: hidden; - line-height: 80px; -} - #image-selector-form.droptarget { background: url(images/filedrop.png) center bottom no-repeat; } - -#image-selector-form.droptarget.hover, -#image-selector-form.droptarget.active { - border: 1px solid #019bc6; - box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); - -moz-box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); - -webkit-box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); - -o-box-shadow: 0 0 3px 2px rgba(71,135,177, 0.5); -} - -#image-selector-form.droptarget.hover { - background-color: #d9ecf4; - box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); - -moz-box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); - -webkit-box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); - -o-box-shadow: 0 0 5px 2px rgba(71,135,177, 0.9); -} - -div.mce-abs-end div.hint { - line-height: 50px; - padding-left: 10px; - color: #999; - text-shadow: 0 1px 1px #FFF; -} -- cgit v1.2.3 From ebfdc0925f7169aac45c2437d7a1196687a200c8 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 5 Jun 2014 12:03:46 +0200 Subject: Fix check for data-* attributes after merge with dev-accessibility --- program/lib/Roundcube/html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php index 0209d1bf2..3aae7cfe7 100644 --- a/program/lib/Roundcube/html.php +++ b/program/lib/Roundcube/html.php @@ -283,11 +283,11 @@ class html continue; } - // ignore not allowed attributes, except data-* + // ignore not allowed attributes, except aria-* and data-* if (!empty($allowed)) { $is_data_attr = @substr_compare($key, 'data-', 0, 5) === 0; $is_aria_attr = @substr_compare($key, 'aria-', 0, 5) === 0; - if (!$is_aria_attr && !isset($allowed_f[$key]) && (!$is_data_attr || !isset($allowed_f['data-*']))) { + if (!$is_aria_attr && !$is_data_attr && !isset($allowed_f[$key])) { continue; } } -- cgit v1.2.3 From ba5c53e5c3894bcbbc33dfd3271583e44c35de25 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 9 Jun 2014 14:16:35 +0200 Subject: Send X-UA-Compatible as HTTP header instead of meta tag --- index.php | 1 + program/lib/Roundcube/rcube_output.php | 36 ++++++++++++++++++---------------- skins/classic/includes/links.html | 1 - skins/larry/includes/links.html | 1 - 4 files changed, 20 insertions(+), 19 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/index.php b/index.php index 3674db1d7..ae5df4000 100644 --- a/index.php +++ b/index.php @@ -44,6 +44,7 @@ $RCMAIL = rcmail::get_instance($GLOBALS['env']); // Make the whole PHP output non-cacheable (#1487797) $RCMAIL->output->nocacheing_headers(); +$RCMAIL->output->common_headers(); // turn on output buffering ob_start(); diff --git a/program/lib/Roundcube/rcube_output.php b/program/lib/Roundcube/rcube_output.php index 1907645b0..55a38b240 100644 --- a/program/lib/Roundcube/rcube_output.php +++ b/program/lib/Roundcube/rcube_output.php @@ -44,7 +44,6 @@ abstract class rcube_output $this->browser = new rcube_browser(); } - /** * Magic getter */ @@ -60,7 +59,6 @@ abstract class rcube_output return null; } - /** * Setter for output charset. * To be specified in a meta tag and sent as http-header @@ -72,7 +70,6 @@ abstract class rcube_output $this->charset = $charset; } - /** * Getter for output charset * @@ -83,7 +80,6 @@ abstract class rcube_output return $this->charset; } - /** * Set environment variable * @@ -95,7 +91,6 @@ abstract class rcube_output $this->env[$name] = $value; } - /** * Environment variable getter. * @@ -108,7 +103,6 @@ abstract class rcube_output return $this->env[$name]; } - /** * Delete all stored env variables and commands */ @@ -117,7 +111,6 @@ abstract class rcube_output $this->env = array(); } - /** * Invoke display_message command * @@ -129,7 +122,6 @@ abstract class rcube_output */ abstract function show_message($message, $type = 'notice', $vars = null, $override = true, $timeout = 0); - /** * Redirect to a certain url. * @@ -138,13 +130,11 @@ abstract class rcube_output */ abstract function redirect($p = array(), $delay = 1); - /** * Send output to the client. */ abstract function send(); - /** * Send HTTP headers to prevent caching a page */ @@ -157,9 +147,6 @@ abstract class rcube_output header("Expires: ".gmdate("D, d M Y H:i:s")." GMT"); header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); - // Request browser to disable DNS prefetching (CVE-2010-0464) - header("X-DNS-Prefetch-Control: off"); - // We need to set the following headers to make downloads work using IE in HTTPS mode. if ($this->browser->ie && rcube_utils::https_check()) { header('Pragma: private'); @@ -178,14 +165,32 @@ abstract class rcube_output */ public function future_expire_header($offset = 2600000) { - if (headers_sent()) + if (headers_sent()) { return; + } header("Expires: " . gmdate("D, d M Y H:i:s", time()+$offset) . " GMT"); header("Cache-Control: max-age=$offset"); header("Pragma: "); } + /** + * Send browser compatibility/security/etc. headers + */ + public function common_headers() + { + if (headers_sent()) { + return; + } + + // Unlock IE compatibility mode + if ($this->browser->ie) { + header('X-UA-Compatible: IE=edge'); + } + + // Request browser to disable DNS prefetching (CVE-2010-0464) + header("X-DNS-Prefetch-Control: off"); + } /** * Show error page and terminate script execution @@ -200,7 +205,6 @@ abstract class rcube_output exit(-1); } - /** * Create an edit field for inclusion on a form * @@ -253,7 +257,6 @@ abstract class rcube_output return $out; } - /** * Convert a variable into a javascript object notation * @@ -269,5 +272,4 @@ abstract class rcube_output // that's why we have @ here return @json_encode($input); } - } diff --git a/skins/classic/includes/links.html b/skins/classic/includes/links.html index 2f6ef0119..8ff57c229 100644 --- a/skins/classic/includes/links.html +++ b/skins/classic/includes/links.html @@ -1,4 +1,3 @@ - diff --git a/skins/larry/includes/links.html b/skins/larry/includes/links.html index ce9863a6c..a49e58826 100644 --- a/skins/larry/includes/links.html +++ b/skins/larry/includes/links.html @@ -1,4 +1,3 @@ - -- cgit v1.2.3 From f67d372449a358f72c9f8d654dadda014fccf293 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 10 Jun 2014 11:57:05 +0200 Subject: Fix "PHP Fatal error: Cannot break/continue 1 level" when ldap_start_tls() fails --- program/lib/Roundcube/rcube_ldap_generic.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index 252eafabe..25fe2e5d2 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -175,9 +175,11 @@ class rcube_ldap_generic $this->_debug("C: Connect to $hostname [{$this->config['name']}]"); if ($lc = @ldap_connect($host, $this->config['port'])) { - if ($this->config['use_tls'] === true) - if (!ldap_start_tls($lc)) - continue; + if ($this->config['use_tls'] === true) { + if (!ldap_start_tls($lc)) { + return false; + } + } $this->_debug("S: OK"); @@ -186,7 +188,7 @@ class rcube_ldap_generic $this->conn = $lc; if (!empty($this->config['network_timeout'])) - ldap_set_option($lc, LDAP_OPT_NETWORK_TIMEOUT, $this->config['network_timeout']); + ldap_set_option($lc, LDAP_OPT_NETWORK_TIMEOUT, $this->config['network_timeout']); if (isset($this->config['referrals'])) ldap_set_option($lc, LDAP_OPT_REFERRALS, $this->config['referrals']); -- cgit v1.2.3 From 109bcce470b789dac498d0fba8fb9673b988f867 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 16 Jun 2014 14:13:58 +0200 Subject: Add config option to specify IMAP connection socket parameters - imap_conn_options (#1489948) --- CHANGELOG | 1 + config/defaults.inc.php | 37 ++++-- program/lib/Roundcube/rcube.php | 19 +-- program/lib/Roundcube/rcube_imap.php | 12 +- program/lib/Roundcube/rcube_imap_generic.php | 181 +++++++++++++++------------ 5 files changed, 145 insertions(+), 105 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 9e26b9501..d2fc4faaf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Add config option to specify IMAP connection socket parameters - imap_conn_options (#1489948) - Password: Add option to force new users to change their password (#1486884) - Improve support for screen readers and assistive technology using WCAG 2.0 and WAI ARIA standards - Enable basic keyboard navigation throughout the UI (#1487845) diff --git a/config/defaults.inc.php b/config/defaults.inc.php index 859378624..c20a06bf7 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -123,6 +123,27 @@ $config['default_port'] = 143; // best server supported one) $config['imap_auth_type'] = null; +// IMAP socket context options +// See http://php.net/manual/en/context.ssl.php +// The example below enables server certificate validation +//$config['imap_conn_options'] = array( +// 'ssl' => array( +// 'verify_peer' => true, +// 'verify_depth' => 3, +// 'cafile' => '/etc/openssl/certs/ca.crt', +// ), +// ); +$config['imap_conn_options'] = null; + +// IMAP connection timeout, in seconds. Default: 0 (use default_socket_timeout) +$config['imap_timeout'] = 0; + +// Optional IMAP authentication identifier to be used as authorization proxy +$config['imap_auth_cid'] = null; + +// Optional IMAP authentication password to be used for imap_auth_cid +$config['imap_auth_pw'] = null; + // If you know your imap's folder delimiter, you can specify it here. // Otherwise it will be determined automatically $config['imap_delimiter'] = null; @@ -160,15 +181,6 @@ $config['imap_force_ns'] = false; // Note: Because the list is cached, re-login is required after change. $config['imap_disabled_caps'] = array(); -// IMAP connection timeout, in seconds. Default: 0 (use default_socket_timeout) -$config['imap_timeout'] = 0; - -// Optional IMAP authentication identifier to be used as authorization proxy -$config['imap_auth_cid'] = null; - -// Optional IMAP authentication password to be used for imap_auth_cid -$config['imap_auth_pw'] = null; - // Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache'. $config['imap_cache'] = null; @@ -244,13 +256,14 @@ $config['smtp_timeout'] = 0; // requires 'smtp_timeout' to be non zero. // $config['smtp_conn_options'] = array( // 'ssl' => array( -// 'verify_peer' => true, -// 'verify_depth => 3, -// 'cafile' => '/etc/openssl/certs/ca.crt', +// 'verify_peer' => true, +// 'verify_depth' => 3, +// 'cafile' => '/etc/openssl/certs/ca.crt', // ), // ); $config['smtp_conn_options'] = null; + // ---------------------------------- // LDAP // ---------------------------------- diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index d618fb64d..cf54c3c12 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -357,15 +357,16 @@ class rcube // set class options $options = array( - 'auth_type' => $this->config->get("{$driver}_auth_type", 'check'), - 'auth_cid' => $this->config->get("{$driver}_auth_cid"), - 'auth_pw' => $this->config->get("{$driver}_auth_pw"), - 'debug' => (bool) $this->config->get("{$driver}_debug"), - 'force_caps' => (bool) $this->config->get("{$driver}_force_caps"), - 'disabled_caps' => $this->config->get("{$driver}_disabled_caps"), - 'timeout' => (int) $this->config->get("{$driver}_timeout"), - 'skip_deleted' => (bool) $this->config->get('skip_deleted'), - 'driver' => $driver, + 'auth_type' => $this->config->get("{$driver}_auth_type", 'check'), + 'auth_cid' => $this->config->get("{$driver}_auth_cid"), + 'auth_pw' => $this->config->get("{$driver}_auth_pw"), + 'debug' => (bool) $this->config->get("{$driver}_debug"), + 'force_caps' => (bool) $this->config->get("{$driver}_force_caps"), + 'disabled_caps' => $this->config->get("{$driver}_disabled_caps"), + 'socket_options' => $this->config->get("{$driver}_conn_options"), + 'timeout' => (int) $this->config->get("{$driver}_timeout"), + 'skip_deleted' => (bool) $this->config->get('skip_deleted'), + 'driver' => $driver, ); if (!empty($_SESSION['storage_host'])) { diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index e29bfc46b..109886f8d 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -110,13 +110,13 @@ class rcube_imap extends rcube_storage /** * Connect to an IMAP server * - * @param string $host Host to connect - * @param string $user Username for IMAP account - * @param string $pass Password for IMAP account - * @param integer $port Port to connect to - * @param string $use_ssl SSL schema (either ssl or tls) or null if plain connection + * @param string $host Host to connect + * @param string $user Username for IMAP account + * @param string $pass Password for IMAP account + * @param integer $port Port to connect to + * @param string $use_ssl SSL schema (either ssl or tls) or null if plain connection * - * @return boolean TRUE on success, FALSE on failure + * @return boolean True on success, False on failure */ public function connect($host, $user, $pass, $port=143, $use_ssl=null) { diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index e4c9b7eb8..5aaad0a00 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -723,110 +723,38 @@ class rcube_imap_generic // configure $this->set_prefs($options); - $auth_method = $this->prefs['auth_type']; - $result = false; - - // initialize connection - $this->error = ''; - $this->errornum = self::ERROR_OK; - $this->selected = null; - $this->user = $user; $this->host = $host; + $this->user = $user; $this->logged = false; + $this->selected = null; // check input if (empty($host)) { $this->setError(self::ERROR_BAD, "Empty host"); return false; } + if (empty($user)) { $this->setError(self::ERROR_NO, "Empty user"); return false; } + if (empty($password)) { $this->setError(self::ERROR_NO, "Empty password"); return false; } - if (!$this->prefs['port']) { - $this->prefs['port'] = 143; - } - // check for SSL - if ($this->prefs['ssl_mode'] && $this->prefs['ssl_mode'] != 'tls') { - $host = $this->prefs['ssl_mode'] . '://' . $host; - } - - if ($this->prefs['timeout'] <= 0) { - $this->prefs['timeout'] = max(0, intval(ini_get('default_socket_timeout'))); - } - // Connect - $this->fp = @fsockopen($host, $this->prefs['port'], $errno, $errstr, $this->prefs['timeout']); - - if (!$this->fp) { - if (!$errstr) { - $errstr = "Unknown reason (fsockopen() function disabled?)"; - } - $this->setError(self::ERROR_BAD, sprintf("Could not connect to %s:%d: %s", $host, $this->prefs['port'], $errstr)); - return false; - } - - if ($this->prefs['timeout'] > 0) { - stream_set_timeout($this->fp, $this->prefs['timeout']); - } - - $line = trim(fgets($this->fp, 8192)); - - if ($this->_debug) { - // set connection identifier for debug output - preg_match('/#([0-9]+)/', (string)$this->fp, $m); - $this->resourceid = strtoupper(substr(md5($m[1].$this->user.microtime()), 0, 4)); - - if ($line) - $this->debug('S: '. $line); - } - - // Connected to wrong port or connection error? - if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) { - if ($line) - $error = sprintf("Wrong startup greeting (%s:%d): %s", $host, $this->prefs['port'], $line); - else - $error = sprintf("Empty startup greeting (%s:%d)", $host, $this->prefs['port']); - - $this->setError(self::ERROR_BAD, $error); - $this->closeConnection(); + if (!$this->_connect($host)) { return false; } - // RFC3501 [7.1] optional CAPABILITY response - if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) { - $this->parseCapability($matches[1], true); - } - - // TLS connection - if ($this->prefs['ssl_mode'] == 'tls' && $this->getCapability('STARTTLS')) { - $res = $this->execute('STARTTLS'); - - if ($res[0] != self::ERROR_OK) { - $this->closeConnection(); - return false; - } - - if (!stream_socket_enable_crypto($this->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { - $this->setError(self::ERROR_BAD, "Unable to negotiate TLS"); - $this->closeConnection(); - return false; - } - - // Now we're secure, capabilities need to be reread - $this->clearCapability(); - } - // Send ID info if (!empty($this->prefs['ident']) && $this->getCapability('ID')) { $this->id($this->prefs['ident']); } + $auth_method = $this->prefs['auth_type']; $auth_methods = array(); $result = null; @@ -900,6 +828,103 @@ class rcube_imap_generic return false; } + /** + * Connects to IMAP server. + * + * @param string $host Server hostname or IP + * + * @return bool True on success, False on failure + */ + protected function _connect($host) + { + // initialize connection + $this->error = ''; + $this->errornum = self::ERROR_OK; + + if (!$this->prefs['port']) { + $this->prefs['port'] = 143; + } + + // check for SSL + if ($this->prefs['ssl_mode'] && $this->prefs['ssl_mode'] != 'tls') { + $host = $this->prefs['ssl_mode'] . '://' . $host; + } + + if ($this->prefs['timeout'] <= 0) { + $this->prefs['timeout'] = max(0, intval(ini_get('default_socket_timeout'))); + } + + if (!empty($this->prefs['socket_options'])) { + $context = stream_context_create($this->prefs['socket_options']); + $this->fp = stream_socket_client($host . ':' . $this->prefs['port'], $errno, $errstr, + $this->prefs['timeout'], STREAM_CLIENT_CONNECT, $context); + } + else { + $this->fp = @fsockopen($host, $this->prefs['port'], $errno, $errstr, $this->prefs['timeout']); + } + + if (!$this->fp) { + $this->setError(self::ERROR_BAD, sprintf("Could not connect to %s:%d: %s", + $host, $this->prefs['port'], $errstr ?: "Unknown reason")); + + return false; + } + + if ($this->prefs['timeout'] > 0) { + stream_set_timeout($this->fp, $this->prefs['timeout']); + } + + $line = trim(fgets($this->fp, 8192)); + + if ($this->_debug) { + // set connection identifier for debug output + preg_match('/#([0-9]+)/', (string) $this->fp, $m); + $this->resourceid = strtoupper(substr(md5($m[1].$this->user.microtime()), 0, 4)); + + if ($line) { + $this->debug('S: '. $line); + } + } + + // Connected to wrong port or connection error? + if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) { + if ($line) + $error = sprintf("Wrong startup greeting (%s:%d): %s", $host, $this->prefs['port'], $line); + else + $error = sprintf("Empty startup greeting (%s:%d)", $host, $this->prefs['port']); + + $this->setError(self::ERROR_BAD, $error); + $this->closeConnection(); + return false; + } + + // RFC3501 [7.1] optional CAPABILITY response + if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) { + $this->parseCapability($matches[1], true); + } + + // TLS connection + if ($this->prefs['ssl_mode'] == 'tls' && $this->getCapability('STARTTLS')) { + $res = $this->execute('STARTTLS'); + + if ($res[0] != self::ERROR_OK) { + $this->closeConnection(); + return false; + } + + if (!stream_socket_enable_crypto($this->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { + $this->setError(self::ERROR_BAD, "Unable to negotiate TLS"); + $this->closeConnection(); + return false; + } + + // Now we're secure, capabilities need to be reread + $this->clearCapability(); + } + + return true; + } + /** * Initializes environment */ -- cgit v1.2.3 From 07893b3cdd5ed8c4291d6f2928bded1bc5713dc7 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 22 Jun 2014 11:32:16 +0200 Subject: Support LIST-MYRIGHTS extension in rcube_imap_generic (#1489665) --- program/lib/Roundcube/rcube_imap_generic.php | 64 +++++++++++++++++----------- 1 file changed, 39 insertions(+), 25 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 5aaad0a00..7b9ba2ec8 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -1293,15 +1293,15 @@ class rcube_imap_generic * * @param string $ref Reference name * @param string $mailbox Mailbox name - * @param array $status_opts (see self::_listMailboxes) + * @param array $return_opts (see self::_listMailboxes) * @param array $select_opts (see self::_listMailboxes) * - * @return array List of mailboxes or hash of options if $status_opts argument + * @return array List of mailboxes or hash of options if $return_opts argument * is non-empty. */ - function listMailboxes($ref, $mailbox, $status_opts=array(), $select_opts=array()) + function listMailboxes($ref, $mailbox, $return_opts=array(), $select_opts=array()) { - return $this->_listMailboxes($ref, $mailbox, false, $status_opts, $select_opts); + return $this->_listMailboxes($ref, $mailbox, false, $return_opts, $select_opts); } /** @@ -1309,14 +1309,14 @@ class rcube_imap_generic * * @param string $ref Reference name * @param string $mailbox Mailbox name - * @param array $status_opts (see self::_listMailboxes) + * @param array $return_opts (see self::_listMailboxes) * - * @return array List of mailboxes or hash of options if $status_opts argument + * @return array List of mailboxes or hash of options if $return_opts argument * is non-empty. */ - function listSubscribed($ref, $mailbox, $status_opts=array()) + function listSubscribed($ref, $mailbox, $return_opts=array()) { - return $this->_listMailboxes($ref, $mailbox, true, $status_opts, NULL); + return $this->_listMailboxes($ref, $mailbox, true, $return_opts, NULL); } /** @@ -1325,9 +1325,9 @@ class rcube_imap_generic * @param string $ref Reference name * @param string $mailbox Mailbox name * @param bool $subscribed Enables returning subscribed mailboxes only - * @param array $status_opts List of STATUS options - * (RFC5819: LIST-STATUS: MESSAGES, RECENT, UIDNEXT, UIDVALIDITY, UNSEEN) - * or RETURN options (RFC5258: LIST_EXTENDED: SUBSCRIBED, CHILDREN) + * @param array $return_opts List of RETURN options (RFC5819: LIST-STATUS, RFC5258: LIST-EXTENDED) + * Possible: MESSAGES, RECENT, UIDNEXT, UIDVALIDITY, UNSEEN, + * MYRIGHTS, SUBSCRIBED, CHILDREN * @param array $select_opts List of selection options (RFC5258: LIST-EXTENDED) * Possible: SUBSCRIBED, RECURSIVEMATCH, REMOTE, * SPECIAL-USE (RFC6154) @@ -1336,7 +1336,7 @@ class rcube_imap_generic * is non-empty. */ protected function _listMailboxes($ref, $mailbox, $subscribed=false, - $status_opts=array(), $select_opts=array()) + $return_opts=array(), $select_opts=array()) { if (!strlen($mailbox)) { $mailbox = '*'; @@ -1354,17 +1354,23 @@ class rcube_imap_generic $args[] = $this->escape($ref); $args[] = $this->escape($mailbox); - if (!empty($status_opts) && $this->getCapability('LIST-EXTENDED')) { - $rets = array_intersect($status_opts, array('SUBSCRIBED', 'CHILDREN')); + if (!empty($return_opts) && $this->getCapability('LIST-EXTENDED')) { + $rets = array_intersect($return_opts, array('SUBSCRIBED', 'CHILDREN')); } - if (!empty($status_opts) && $this->getCapability('LIST-STATUS')) { - $status_opts = array_intersect($status_opts, array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN')); + if (!empty($return_opts) && $this->getCapability('LIST-STATUS')) { + $lstatus = true; + $status_opts = array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN'); + $opts = array_diff($return_opts, $status_opts); + $status_opts = array_diff($return_opts, $opts); if (!empty($status_opts)) { - $lstatus = true; $rets[] = 'STATUS (' . implode(' ', $status_opts) . ')'; } + + if (!empty($opts)) { + $rets = array_merge($rets, $opts); + } } if (!empty($rets)) { @@ -1388,9 +1394,10 @@ class rcube_imap_generic $line = substr($response, $last, $pos - $last); $last = $pos + 2; - if (!preg_match('/^\* (LIST|LSUB|STATUS) /i', $line, $m)) { + if (!preg_match('/^\* (LIST|LSUB|STATUS|MYRIGHTS) /i', $line, $m)) { continue; } + $cmd = strtoupper($m[1]); $line = substr($line, strlen($m[0])); @@ -1421,13 +1428,20 @@ class rcube_imap_generic $this->data['LIST'][$mailbox], $opts)); } } - // * STATUS () - else if ($cmd == 'STATUS') { - list($mailbox, $status) = $this->tokenizeResponse($line, 2); - - for ($i=0, $len=count($status); $i<$len; $i += 2) { - list($name, $value) = $this->tokenizeResponse($status, 2); - $folders[$mailbox][$name] = $value; + else if ($lstatus) { + // * STATUS () + if ($cmd == 'STATUS') { + list($mailbox, $status) = $this->tokenizeResponse($line, 2); + + for ($i=0, $len=count($status); $i<$len; $i += 2) { + list($name, $value) = $this->tokenizeResponse($status, 2); + $folders[$mailbox][$name] = $value; + } + } + // * MYRIGHTS + else if ($cmd == 'MYRIGHTS') { + list($mailbox, $acl) = $this->tokenizeResponse($line, 2); + $folders[$mailbox]['MYRIGHTS'] = $acl; } } } -- cgit v1.2.3 From 6fa1a0da1f0902f10be8fc4eb24180f8e3453c17 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 24 Jun 2014 19:16:18 +0200 Subject: Extend get_quota() so it's possible to specify GETQUOTAROOT folder and return full quota info (including all roots and types, e.g. MESSAGE) - for future use --- program/include/rcmail.php | 1 + program/lib/Roundcube/rcube_imap.php | 7 ++- program/lib/Roundcube/rcube_imap_generic.php | 91 +++++++++++++++------------- program/lib/Roundcube/rcube_storage.php | 4 +- 4 files changed, 57 insertions(+), 46 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index f4689215c..29ed66a43 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -1678,6 +1678,7 @@ class rcmail extends rcube $quota = $this->storage->get_quota(); $quota = $this->plugins->exec_hook('quota', $quota); + unset($quota['abort']); $quota_result = (array) $quota; $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : ''; diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 109886f8d..858db7b5b 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -3067,14 +3067,15 @@ class rcube_imap extends rcube_storage /** * Get mailbox quota information - * added by Nuny + * + * @param string $folder Folder name * * @return mixed Quota info or False if not supported */ - public function get_quota() + public function get_quota($folder = null) { if ($this->get_capability('QUOTA') && $this->check_connection()) { - return $this->conn->getQuota(); + return $this->conn->getQuota($folder); } return false; diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 7b9ba2ec8..032506412 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2873,59 +2873,66 @@ class rcube_imap_generic /** * Returns QUOTA information * + * @param string $mailbox Mailbox name + * * @return array Quota information */ - function getQuota() - { - /* - * GETQUOTAROOT "INBOX" - * QUOTAROOT INBOX user/rchijiiwa1 - * QUOTA user/rchijiiwa1 (STORAGE 654 9765) - * OK Completed - */ - $result = false; - $quota_lines = array(); - $key = $this->nextTag(); - $command = $key . ' GETQUOTAROOT INBOX'; - - // get line(s) containing quota info - if ($this->putLine($command)) { - do { - $line = rtrim($this->readLine(5000)); - if (preg_match('/^\* QUOTA /', $line)) { - $quota_lines[] = $line; - } - } while (!$this->startsWith($line, $key, true, true)); - } - else { - $this->setError(self::ERROR_COMMAND, "Unable to send command: $command"); + function getQuota($mailbox = null) + { + if ($mailbox === null || $mailbox === '') { + $mailbox = 'INBOX'; } - // return false if not found, parse if found + // a0001 GETQUOTAROOT INBOX + // * QUOTAROOT INBOX user/sample + // * QUOTA user/sample (STORAGE 654 9765) + // a0001 OK Completed + + list($code, $response) = $this->execute('GETQUOTAROOT', array($this->escape($mailbox))); + + $result = false; $min_free = PHP_INT_MAX; - foreach ($quota_lines as $key => $quota_line) { - $quota_line = str_replace(array('(', ')'), '', $quota_line); - $parts = explode(' ', $quota_line); - $storage_part = array_search('STORAGE', $parts); + $all = array(); - if (!$storage_part) { - continue; - } + if ($code == self::ERROR_OK) { + foreach (explode("\n", $response) as $line) { + if (preg_match('/^\* QUOTA /', $line)) { + list(, , $quota_root) = $this->tokenizeResponse($line, 3); + + while ($line) { + list($type, $used, $total) = $this->tokenizeResponse($line, 1); + $type = strtolower($type); + + if ($type && $total) { + $all[$quota_root][$type]['used'] = intval($used); + $all[$quota_root][$type]['total'] = intval($total); + } + } + + if (empty($all[$quota_root]['storage'])) { + continue; + } - $used = intval($parts[$storage_part+1]); - $total = intval($parts[$storage_part+2]); - $free = $total - $used; + $used = $all[$quota_root]['storage']['used']; + $total = $all[$quota_root]['storage']['total']; + $free = $total - $used; - // return lowest available space from all quotas - if ($free < $min_free) { - $min_free = $free; - $result['used'] = $used; - $result['total'] = $total; - $result['percent'] = min(100, round(($used/max(1,$total))*100)); - $result['free'] = 100 - $result['percent']; + // calculate lowest available space from all storage quotas + if ($free < $min_free) { + $min_free = $free; + $result['used'] = $used; + $result['total'] = $total; + $result['percent'] = min(100, round(($used/max(1,$total))*100)); + $result['free'] = 100 - $result['percent']; + } + } } } + if (!empty($result)) { + $result['all'] = $all; + } + return $result; } diff --git a/program/lib/Roundcube/rcube_storage.php b/program/lib/Roundcube/rcube_storage.php index c1293961c..ccb28c680 100644 --- a/program/lib/Roundcube/rcube_storage.php +++ b/program/lib/Roundcube/rcube_storage.php @@ -918,9 +918,11 @@ abstract class rcube_storage /** * Get mailbox quota information. * + * @param string $folder Folder name + * * @return mixed Quota info or False if not supported */ - abstract function get_quota(); + abstract function get_quota($folder = null); /* ----------------------------------------- -- cgit v1.2.3 From 6d5a1b9e8f426d5ddc7c5bf2840a25859ab9d9e1 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 28 Jun 2014 10:07:44 +0200 Subject: Get rid of some rcube_config::all() calls --- program/include/rcmail.php | 35 ++++++++++++++++++++--------------- program/lib/Roundcube/rcube.php | 10 +++++++--- 2 files changed, 27 insertions(+), 18 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index cfdd1816e..0151020c7 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -730,14 +730,16 @@ class rcmail extends rcube */ public function logout_actions() { - $config = $this->config->all(); - $storage = $this->get_storage(); + $storage = $this->get_storage(); + $logout_expunge = $this->config->get('logout_expunge'); + $logout_purge = $this->config->get('logout_purge'); + $trash_mbox = $this->config->get('trash_mbox'); - if ($config['logout_purge'] && !empty($config['trash_mbox'])) { - $storage->clear_folder($config['trash_mbox']); + if ($logout_purge && !empty($trash_mbox)) { + $storage->clear_folder($trash_mbox); } - if ($config['logout_expunge']) { + if ($logout_expunge) { $storage->expunge_folder('INBOX'); } @@ -887,12 +889,15 @@ class rcmail extends rcube $prefix = $this->storage->get_namespace('prefix'); $prefix_len = strlen($prefix); - if (!$prefix_len) + if (!$prefix_len) { return; + } - $prefs = $this->config->all(); - if (!empty($prefs['namespace_fixed'])) + if ($this->config->get('namespace_fixed')) { return; + } + + $prefs = array(); // Build namespace prefix regexp $ns = $this->storage->get_namespace(); @@ -912,16 +917,16 @@ class rcmail extends rcube // Fix preferences $opts = array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox', 'archive_mbox'); foreach ($opts as $opt) { - if ($value = $prefs[$opt]) { + if ($value = $this->config->get($opt)) { if ($value != 'INBOX' && !preg_match($regexp, $value)) { $prefs[$opt] = $prefix.$value; } } } - if (!empty($prefs['search_mods'])) { + if (($search_mods = $this->config->get('search_mods')) && !empty($search_mods)) { $folders = array(); - foreach ($prefs['search_mods'] as $idx => $value) { + foreach ($search_mods as $idx => $value) { if ($idx != 'INBOX' && $idx != '*' && !preg_match($regexp, $idx)) { $idx = $prefix.$idx; } @@ -931,9 +936,9 @@ class rcmail extends rcube $prefs['search_mods'] = $folders; } - if (!empty($prefs['message_threading'])) { + if (($threading = $this->config->get('message_threading')) && !empty($threading)) { $folders = array(); - foreach ($prefs['message_threading'] as $idx => $value) { + foreach ($threading as $idx => $value) { if ($idx != 'INBOX' && !preg_match($regexp, $idx)) { $idx = $prefix.$idx; } @@ -943,8 +948,8 @@ class rcmail extends rcube $prefs['message_threading'] = $folders; } - if (!empty($prefs['collapsed_folders'])) { - $folders = explode('&&', $prefs['collapsed_folders']); + if ($collapsed = $this->config->get('collapsed_folders')) { + $folders = explode('&&', $collapsed); $count = count($folders); $folders_str = ''; diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index cf54c3c12..5f55414e6 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -172,9 +172,13 @@ class rcube public function get_dbh() { if (!$this->db) { - $config_all = $this->config->all(); - $this->db = rcube_db::factory($config_all['db_dsnw'], $config_all['db_dsnr'], $config_all['db_persistent']); - $this->db->set_debug((bool)$config_all['sql_debug']); + $this->db = rcube_db::factory( + $this->config->get('db_dsnw'), + $this->config->get('db_dsnr'), + $this->config->get('db_persistent') + ); + + $this->db->set_debug((bool)$this->config->get('sql_debug')); } return $this->db; -- cgit v1.2.3 From 36d004e3d0ad9ff97b66b2e505f6b17fd6d23102 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 3 Jul 2014 14:25:19 +0200 Subject: Added 'contact_search_name' option to define autocompletion entry format --- CHANGELOG | 1 + config/defaults.inc.php | 5 +++ program/js/app.js | 2 +- program/lib/Roundcube/rcube_addressbook.php | 53 +++++++++++++++++++++++++++++ program/steps/mail/autocomplete.inc | 10 ++++-- 5 files changed, 68 insertions(+), 3 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 4730642ef..6b3927a08 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Added 'contact_search_name' option to define autocompletion entry format - Display quota information for current folder not INBOX only (#1487993) - Support images in HTML signatures (#1488676) - Display full quota information in popup (#1485769, #1486604) diff --git a/config/defaults.inc.php b/config/defaults.inc.php index e7cb1e3aa..18171b75f 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -877,6 +877,11 @@ $config['address_template'] = '{street}
    {locality} {zipcode}
    {country} { // Note: For LDAP sources fuzzy_search must be enabled to use 'partial' or 'prefix' mode $config['addressbook_search_mode'] = 0; +// Template of contact entry on the autocompletion list. +// You can use contact fields as: name, email, organization, department, etc. +// See program/steps/addressbook/func.inc for a list +$config['contact_search_name'] = '{name} <{email}>'; + // ---------------------------------- // USER PREFERENCES // ---------------------------------- diff --git a/program/js/app.js b/program/js/app.js index a3060a8c3..34871f798 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -4568,7 +4568,7 @@ function rcube_webmail() // add each result line to list if (results && (len = results.length)) { for (i=0; i < len && maxlen > 0; i++) { - text = typeof results[i] === 'object' ? results[i].name : results[i]; + text = typeof results[i] === 'object' ? (results[i].display || results[i].name) : results[i]; type = typeof results[i] === 'object' ? results[i].type : ''; id = i + this.env.contacts.length; $('
  • ').attr('id', 'rcmkSearchItem' + id) diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php index 4d9fa3db1..7566d6546 100644 --- a/program/lib/Roundcube/rcube_addressbook.php +++ b/program/lib/Roundcube/rcube_addressbook.php @@ -556,6 +556,59 @@ abstract class rcube_addressbook return $fn; } + /** + * Build contact display name for autocomplete listing + * + * @param array Hash array with contact data as key-value pairs + * @param string Optional email address + * @param string Optional name (self::compose_list_name() result) + * + * @return string Display name + */ + public static function compose_search_name($contact, $email = null, $name = null) + { + static $template; + + if (!isset($template)) { // cache this + $template = rcube::get_instance()->config->get('contact_search_name'); + if (empty($template)) { + $template = '{name} <{email}>'; + } + } + + $result = $template; + + if (preg_match_all('/\{[a-z]+\}/', $result, $matches)) { + foreach ($matches[0] as $key) { + $key = trim($key, '{}'); + + switch ($key) { + case 'name': + $value = $name ?: self::compose_list_name($contact); + break; + + case 'email': + $value = $email; + break; + } + + if (empty($value)) { + $value = strpos($key, ':') ? $contact[$key] : self::get_col_values($key, $contact, true); + if (is_array($value)) { + $value = $value[0]; + } + } + + $result = str_replace('{' . $key . '}', $value, $result); + } + } + + $result = preg_replace('/\s+/', ' ', $result); + $result = trim($result); + + return $result; + } + /** * Create a unique key for sorting contacts */ diff --git a/program/steps/mail/autocomplete.inc b/program/steps/mail/autocomplete.inc index 71b337a53..c805cd009 100644 --- a/program/steps/mail/autocomplete.inc +++ b/program/steps/mail/autocomplete.inc @@ -90,8 +90,14 @@ if (!empty($book_types) && strlen($search)) { // skip duplicates if (!in_array($contact, $contacts)) { - $contacts[] = array('name' => $contact, 'type' => $sql_arr['_type']); - $sort_keys[] = sprintf('%s %03d', $sql_arr['name'] , $idx++); + $contact = array('name' => $contact, 'type' => $sql_arr['_type']); + + if (($display = rcube_addressbook::compose_search_name($sql_arr, $email, $name)) && $display != $contact['name']) { + $contact['display'] = $display; + } + + $contacts[] = $contact; + $sort_keys[] = sprintf('%s %03d', $contact['display'] ?: $name, $idx++); if (count($contacts) >= $MAXNUM) { break 2; -- cgit v1.2.3 From 740b8ea74a122e7988504ea17222bc969fe55813 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 5 Jul 2014 13:41:21 +0200 Subject: Fix bug where contacts with no email address were listed on compose addressbook (#1489970) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_contacts.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 82c80fc45..4a58d9ede 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -55,6 +55,7 @@ CHANGELOG Roundcube Webmail - Fix incorrect label translation in return receipt (#1489963) - Fix security issue in delete-response action - allow only ajax request - Fix Delete button state after deleting identity/response (#1489972) +- Fix bug where contacts with no email address were listed on compose addressbook (#1489970) RELEASE 1.0.1 ------------- diff --git a/program/lib/Roundcube/rcube_contacts.php b/program/lib/Roundcube/rcube_contacts.php index d215760cf..5e1a40e5b 100644 --- a/program/lib/Roundcube/rcube_contacts.php +++ b/program/lib/Roundcube/rcube_contacts.php @@ -264,7 +264,7 @@ class rcube_contacts extends rcube_addressbook if ($read_vcard) $sql_arr = $this->convert_db_data($sql_arr); else { - $sql_arr['email'] = explode(self::SEPARATOR, $sql_arr['email']); + $sql_arr['email'] = $sql_arr['email'] ? explode(self::SEPARATOR, $sql_arr['email']) : array(); $sql_arr['email'] = array_map('trim', $sql_arr['email']); } -- cgit v1.2.3 From b231c8f6accb7c04461ab8364016d0abbe81f82e Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 7 Jul 2014 19:06:10 +0200 Subject: Fix images import from various vCard formats (#1489977) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_vcard.php | 51 ++++++++++++++++++++++------------- tests/Framework/VCard.php | 16 +++++++++++ 3 files changed, 50 insertions(+), 18 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 4a58d9ede..aa22fb0e3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -56,6 +56,7 @@ CHANGELOG Roundcube Webmail - Fix security issue in delete-response action - allow only ajax request - Fix Delete button state after deleting identity/response (#1489972) - Fix bug where contacts with no email address were listed on compose addressbook (#1489970) +- Fix images import from various vCard formats (#1489977) RELEASE 1.0.1 ------------- diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php index fb8fdd525..4a2684f10 100644 --- a/program/lib/Roundcube/rcube_vcard.php +++ b/program/lib/Roundcube/rcube_vcard.php @@ -594,29 +594,34 @@ class rcube_vcard private static function vcard_decode($vcard) { // Perform RFC2425 line unfolding and split lines - $vcard = preg_replace(array("/\r/", "/\n\s+/"), '', $vcard); - $lines = explode("\n", $vcard); - $data = array(); + $vcard = preg_replace(array("/\r/", "/\n\s+/"), '', $vcard); + $lines = explode("\n", $vcard); + $result = array(); for ($i=0; $i < count($lines); $i++) { - if (!preg_match('/^([^:]+):(.+)$/', $lines[$i], $line)) + if (!($pos = strpos($lines[$i], ':'))) { continue; + } + + $prefix = substr($lines[$i], 0, $pos); + $data = substr($lines[$i], $pos+1); - if (preg_match('/^(BEGIN|END)$/i', $line[1])) + if (preg_match('/^(BEGIN|END)$/i', $prefix)) { continue; + } // convert 2.1-style "EMAIL;internet;home:" to 3.0-style "EMAIL;TYPE=internet;TYPE=home:" - if ($data['VERSION'][0] == "2.1" - && preg_match('/^([^;]+);([^:]+)/', $line[1], $regs2) + if ($result['VERSION'][0] == "2.1" + && preg_match('/^([^;]+);([^:]+)/', $prefix, $regs2) && !preg_match('/^TYPE=/i', $regs2[2]) ) { - $line[1] = $regs2[1]; + $prefix = $regs2[1]; foreach (explode(';', $regs2[2]) as $prop) { - $line[1] .= ';' . (strpos($prop, '=') ? $prop : 'TYPE='.$prop); + $prefix .= ';' . (strpos($prop, '=') ? $prop : 'TYPE='.$prop); } } - if (preg_match_all('/([^\\;]+);?/', $line[1], $regs2)) { + if (preg_match_all('/([^\\;]+);?/', $prefix, $regs2)) { $entry = array(); $field = strtoupper($regs2[1][0]); $enc = null; @@ -629,10 +634,10 @@ class rcube_vcard // add next line(s) to value string if QP line end detected if ($value == 'QUOTED-PRINTABLE') { while (preg_match('/=$/', $lines[$i])) { - $line[2] .= "\n" . $lines[++$i]; + $data .= "\n" . $lines[++$i]; } } - $enc = $value; + $enc = $value == 'BASE64' ? 'B' : $value; } else { $lc_key = strtolower($key); @@ -652,20 +657,30 @@ class rcube_vcard // should we use vCard 3.0 instead? // $entry['base64'] = true; } - $line[2] = self::decode_value($line[2], $enc ? $enc : 'base64'); + + $data = self::decode_value($data, $enc ? $enc : 'base64'); + } + else if ($field == 'PHOTO') { + // vCard 4.0 data URI, "PHOTO:data:image/jpeg;base64,..." + if (preg_match('/^data:[a-z\/_-]+;base64,/i', $data, $m)) { + $entry['encoding'] = $enc = 'B'; + $data = substr($data, strlen($m[0])); + $data = self::decode_value($data, 'base64'); + } } if ($enc != 'B' && empty($entry['base64'])) { - $line[2] = self::vcard_unquote($line[2]); + $data = self::vcard_unquote($data); } - $entry = array_merge($entry, (array) $line[2]); - $data[$field][] = $entry; + $entry = array_merge($entry, (array) $data); + $result[$field][] = $entry; } } - unset($data['VERSION']); - return $data; + unset($result['VERSION']); + + return $result; } /** diff --git a/tests/Framework/VCard.php b/tests/Framework/VCard.php index 3353b5b13..0a34fc51f 100644 --- a/tests/Framework/VCard.php +++ b/tests/Framework/VCard.php @@ -107,6 +107,22 @@ class Framework_VCard extends PHPUnit_Framework_TestCase // ENCODING=b case (#1488683) $this->assertEquals("/9j/4AAQSkZJRgABAQA", substr(base64_encode($vcard['photo']), 0, 19), "Photo decoding"); $this->assertEquals("Müller", $vcard['surname'], "Unicode characters"); + + $input = str_replace('ENCODING=b:', 'ENCODING=base64;jpeg:', $input); + + $vcards = rcube_vcard::import($input); + $vcard = $vcards[0]->get_assoc(); + + // ENCODING=base64 case (#1489977) + $this->assertEquals("/9j/4AAQSkZJRgABAQA", substr(base64_encode($vcard['photo']), 0, 19), "Photo decoding"); + + $input = str_replace('PHOTO;ENCODING=base64;jpeg:', 'PHOTO:data:image/jpeg;base64,', $input); + + $vcards = rcube_vcard::import($input); + $vcard = $vcards[0]->get_assoc(); + + // vcard4.0 "PHOTO:data:image/jpeg;base64," case (#1489977) + $this->assertEquals("/9j/4AAQSkZJRgABAQA", substr(base64_encode($vcard['photo']), 0, 19), "Photo decoding"); } function test_encodings() -- cgit v1.2.3 From 4922e55d582fb1907211bba8cc539551475f280f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Fri, 11 Jul 2014 09:28:36 +0200 Subject: Fix sorting messages by size on servers without SORT capability (#1489981) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_imap_generic.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index aa22fb0e3..79148e033 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -57,6 +57,7 @@ CHANGELOG Roundcube Webmail - Fix Delete button state after deleting identity/response (#1489972) - Fix bug where contacts with no email address were listed on compose addressbook (#1489970) - Fix images import from various vCard formats (#1489977) +- Fix sorting messages by size on servers without SORT capability (#1489981) RELEASE 1.0.1 ------------- diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 032506412..99fb6d861 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -1916,8 +1916,8 @@ class rcube_imap_generic $result[$id] = ''; } } else if ($mode == 2) { - if (preg_match('/(UID|RFC822\.SIZE) ([0-9]+)/', $line, $matches)) { - $result[$id] = trim($matches[2]); + if (preg_match('/' . $index_field . ' ([0-9]+)/', $line, $matches)) { + $result[$id] = trim($matches[1]); } else { $result[$id] = 0; } -- cgit v1.2.3 From e0492d213b4c087b7092fa6bdc3dfecbc14f9bcf Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 14 Jul 2014 08:56:59 +0200 Subject: Fix "Illegal offset type" error (#1489985) --- program/lib/Roundcube/rcube_imap.php | 14 ++++++++------ program/lib/Roundcube/rcube_imap_generic.php | 16 +++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 858db7b5b..9a07711c2 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -3298,12 +3298,14 @@ class rcube_imap extends rcube_storage // request \Subscribed flag in LIST response as performance improvement for folder_exists() $folders = $this->conn->listMailboxes('', '*', array('SUBSCRIBED'), array('SPECIAL-USE')); - foreach ($folders as $folder) { - if ($flags = $this->conn->data['LIST'][$folder]) { - foreach ($types as $type) { - if (in_array($type, $flags)) { - $type = strtolower(substr($type, 1)); - $special[$type] = $folder; + if (!empty($folders)) { + foreach ($folders as $folder) { + if ($flags = $this->conn->data['LIST'][$folder]) { + foreach ($types as $type) { + if (in_array($type, $flags)) { + $type = strtolower(substr($type, 1)); + $special[$type] = $folder; + } } } } diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 99fb6d861..d76014f89 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -1296,8 +1296,8 @@ class rcube_imap_generic * @param array $return_opts (see self::_listMailboxes) * @param array $select_opts (see self::_listMailboxes) * - * @return array List of mailboxes or hash of options if $return_opts argument - * is non-empty. + * @return array|bool List of mailboxes or hash of options if STATUS/MYROGHTS response + * is requested, False on error. */ function listMailboxes($ref, $mailbox, $return_opts=array(), $select_opts=array()) { @@ -1311,8 +1311,8 @@ class rcube_imap_generic * @param string $mailbox Mailbox name * @param array $return_opts (see self::_listMailboxes) * - * @return array List of mailboxes or hash of options if $return_opts argument - * is non-empty. + * @return array|bool List of mailboxes or hash of options if STATUS/MYROGHTS response + * is requested, False on error. */ function listSubscribed($ref, $mailbox, $return_opts=array()) { @@ -1332,8 +1332,8 @@ class rcube_imap_generic * Possible: SUBSCRIBED, RECURSIVEMATCH, REMOTE, * SPECIAL-USE (RFC6154) * - * @return array List of mailboxes or hash of options if $status_ops argument - * is non-empty. + * @return array|bool List of mailboxes or hash of options if STATUS/MYROGHTS response + * is requested, False on error. */ protected function _listMailboxes($ref, $mailbox, $subscribed=false, $return_opts=array(), $select_opts=array()) @@ -1355,7 +1355,9 @@ class rcube_imap_generic $args[] = $this->escape($mailbox); if (!empty($return_opts) && $this->getCapability('LIST-EXTENDED')) { - $rets = array_intersect($return_opts, array('SUBSCRIBED', 'CHILDREN')); + $ext_opts = array('SUBSCRIBED', 'CHILDREN'); + $rets = array_intersect($return_opts, $ext_opts); + $return_opts = array_diff($return_opts, $rets); } if (!empty($return_opts) && $this->getCapability('LIST-STATUS')) { -- cgit v1.2.3 From 83316e175dfb0aa4dde06a975600292be60dd132 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 23 Jul 2014 12:15:50 +0200 Subject: Reset $value in a loop --- program/lib/Roundcube/rcube_addressbook.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php index 7566d6546..71d556234 100644 --- a/program/lib/Roundcube/rcube_addressbook.php +++ b/program/lib/Roundcube/rcube_addressbook.php @@ -580,7 +580,8 @@ abstract class rcube_addressbook if (preg_match_all('/\{[a-z]+\}/', $result, $matches)) { foreach ($matches[0] as $key) { - $key = trim($key, '{}'); + $key = trim($key, '{}'); + $value = ''; switch ($key) { case 'name': -- cgit v1.2.3 From 0ee2db7a68b011af85c6b3ba924ff459e438a16a Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 24 Jul 2014 09:02:09 +0200 Subject: Support allowfullscreen attribute on iframe elements --- program/lib/Roundcube/html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php index 3aae7cfe7..bcf89d7df 100644 --- a/program/lib/Roundcube/html.php +++ b/program/lib/Roundcube/html.php @@ -218,7 +218,7 @@ class html $attr = array('src' => $attr); } return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib, - array('src','name','width','height','border','frameborder','onload'))); + array('src','name','width','height','border','frameborder','onload','allowfullscreen'))); } /** -- cgit v1.2.3 From e1567419411fbd56a3f3ac5f0a805b1e345fa0cc Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 28 Jul 2014 19:03:16 +0200 Subject: Fix bug where $Forwarded flag was being set even if server didn't support it (#1490000) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_imap_generic.php | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 6ca28478d..a6ade5bfc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -40,6 +40,7 @@ CHANGELOG Roundcube Webmail - Fix mbox files import - Fix some mime-type to extension mapping checks in Installer (#1489983) - Fix errors when using localStorage in Safari's private browsing mode (#1489996) +- Fix bug where $Forwarded flag was being set even if server didn't support it (#1490000) RELEASE 1.0.2 ------------- diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index d76014f89..a43dfeeed 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2028,10 +2028,6 @@ class rcube_imap_generic */ protected function modFlag($mailbox, $messages, $flag, $mod = '+') { - if ($mod != '+' && $mod != '-') { - $mod = '+'; - } - if (!$this->select($mailbox)) { return false; } @@ -2041,12 +2037,25 @@ class rcube_imap_generic return false; } + if ($this->flags[strtoupper($flag)]) { + $flag = $this->flags[strtoupper($flag)]; + } + + if (!$flag || !in_array($flag, (array) $this->data['PERMANENTFLAGS']) + || !in_array('\\*', (array) $this->data['PERMANENTFLAGS']) + ) { + return false; + } + // Clear internal status cache if ($flag == 'SEEN') { unset($this->data['STATUS:'.$mailbox]['UNSEEN']); } - $flag = $this->flags[strtoupper($flag)]; + if ($mod != '+' && $mod != '-') { + $mod = '+'; + } + $result = $this->execute('UID STORE', array( $this->compressMessageSet($messages), $mod . 'FLAGS.SILENT', "($flag)"), self::COMMAND_NORESPONSE); -- cgit v1.2.3 From 5b592d17ef078ebb101b47402dc6c3381249ba78 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 30 Jul 2014 10:49:18 -0400 Subject: Remove redundant folder check when using search set --- program/lib/Roundcube/rcube_imap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 9a07711c2..79a8973db 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -761,7 +761,7 @@ class rcube_imap extends rcube_storage $page = $page ? $page : $this->list_page; // use saved message set - if ($this->search_string && $folder == $this->folder) { + if ($this->search_string) { return $this->list_search_messages($folder, $page, $slice); } -- cgit v1.2.3 From cc850263d40ac080890f2b9f7bb797f83e7a30ff Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 31 Jul 2014 14:29:08 +0200 Subject: Add optional timezone argument for date conversion --- program/lib/Roundcube/rcube_utils.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index 00999ba50..39e27fc7f 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -795,7 +795,7 @@ class rcube_utils * * @return object DateTime instance or false on failure */ - public static function anytodatetime($date) + public static function anytodatetime($date, $timezone = null) { if (is_object($date) && is_a($date, 'DateTime')) { return $date; @@ -807,7 +807,7 @@ class rcube_utils // try to parse string with DateTime first if (!empty($date)) { try { - $dt = new DateTime($date); + $dt = new DateTime($date, $timezone); } catch (Exception $e) { // ignore -- cgit v1.2.3 From fcb7d4fc034335d960917abd37254bd3997cf2f3 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Fri, 1 Aug 2014 12:49:37 +0200 Subject: Fix various iCloud vCard issues, added fallback for external photos (#1489993) --- CHANGELOG | 1 + program/lib/Roundcube/html.php | 2 +- program/lib/Roundcube/rcube_vcard.php | 10 +++++----- program/steps/addressbook/func.inc | 10 +++++++--- program/steps/addressbook/photo.inc | 8 ++++++-- program/steps/mail/show.inc | 4 +++- tests/Framework/VCard.php | 19 +++++++++++++++++++ 7 files changed, 42 insertions(+), 12 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index a6ade5bfc..a2de91fa6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -41,6 +41,7 @@ CHANGELOG Roundcube Webmail - Fix some mime-type to extension mapping checks in Installer (#1489983) - Fix errors when using localStorage in Safari's private browsing mode (#1489996) - Fix bug where $Forwarded flag was being set even if server didn't support it (#1490000) +- Fix various iCloud vCard issues, added fallback for external photos (#1489993) RELEASE 1.0.2 ------------- diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php index bcf89d7df..f18cad0bf 100644 --- a/program/lib/Roundcube/html.php +++ b/program/lib/Roundcube/html.php @@ -153,7 +153,7 @@ class html $attr = array('src' => $attr); } return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib, - array('src','alt','width','height','border','usemap','onclick'))); + array('src','alt','width','height','border','usemap','onclick','onerror'))); } /** diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php index 4a2684f10..96add110f 100644 --- a/program/lib/Roundcube/rcube_vcard.php +++ b/program/lib/Roundcube/rcube_vcard.php @@ -110,7 +110,7 @@ class rcube_vcard public function load($vcard, $charset = RCUBE_CHARSET, $detect = false) { self::$values_decoded = false; - $this->raw = self::vcard_decode($vcard); + $this->raw = self::vcard_decode(self::cleanup($vcard)); // resolve charset parameters if ($charset == null) { @@ -496,7 +496,7 @@ class rcube_vcard if (preg_match('/^END:VCARD$/i', $line)) { // parse vcard - $obj = new rcube_vcard(self::cleanup($vcard_block), $charset, true, self::$fieldmap); + $obj = new rcube_vcard($vcard_block, $charset, true, self::$fieldmap); // FN and N is required by vCard format (RFC 2426) // on import we can be less restrictive, let's addressbook decide if (!empty($obj->displayname) || !empty($obj->surname) || !empty($obj->firstname) || !empty($obj->email)) { @@ -532,9 +532,9 @@ class rcube_vcard // Cleanup $vcard = preg_replace(array( // convert special types (like Skype) to normal type='skype' classes with this simple regex ;) - '/item(\d+)\.(TEL|EMAIL|URL)([^:]*?):(.*?)item\1.X-ABLabel:(?:_\$!<)?([\w-() ]*)(?:>!\$_)?./s', - '/^item\d*\.X-AB.*$/m', // remove cruft like item1.X-AB* - '/^item\d*\./m', // remove item1.ADR instead of ADR + '/item(\d+)\.(TEL|EMAIL|URL)([^:]*?):(.*?)item\1.X-ABLabel:(?:_\$!<)?([\w-() ]*)(?:>!\$_)?./si', + '/^item\d*\.X-AB.*$/mi', // remove cruft like item1.X-AB* + '/^item\d*\./mi', // remove item1.ADR instead of ADR '/\n+/', // remove empty lines '/^(N:[^;\R]*)$/m', // if N doesn't have any semicolons, add some ), diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index d4c57cc9d..38de93d05 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -816,11 +816,15 @@ function rcmail_contact_photo($attrib) } $photo_img = $RCMAIL->url($url); } - else + else { $ff_value = '-del-'; // will disable delete-photo action + } - $img = html::img(array('src' => $photo_img, 'border' => 1, 'alt' => $RCMAIL->gettext('contactphoto'))); - $content = html::div($attrib, $img); + $content = html::div($attrib, html::img(array( + 'src' => $photo_img, + 'alt' => $RCMAIL->gettext('contactphoto'), + 'onerror' => 'this.src = rcmail.env.photo_placeholder', + ))); if ($CONTACT_COLTYPES['photo'] && ($RCMAIL->action == 'edit' || $RCMAIL->action == 'add')) { $RCMAIL->output->add_gui_object('contactphoto', $attrib['id']); diff --git a/program/steps/addressbook/photo.inc b/program/steps/addressbook/photo.inc index 482185735..30d09ffcc 100644 --- a/program/steps/addressbook/photo.inc +++ b/program/steps/addressbook/photo.inc @@ -72,8 +72,12 @@ $plugin = $RCMAIL->plugins->exec_hook('contact_photo', if ($plugin['url']) { $RCMAIL->output->redirect($plugin['url']); } -else { - $data = $plugin['data']; + +$data = $plugin['data']; + +// detect if photo data is an URL +if (strlen($data) < 1024 && filter_var($data, FILTER_VALIDATE_URL)) { + $RCMAIL->output->redirect($data); } // deliver alt image diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index 4b2d78d31..d4121fdd8 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -349,8 +349,10 @@ function rcmail_message_contactphoto($attrib) '_task' => 'addressbook', '_action' => 'photo', '_email' => $MESSAGE->sender['mailto'], - '_alt' => $placeholder + '_alt' => $placeholder, )); + + $attrib['onerror'] = "this.src = '" . ($placeholder ? $placeholder : 'program/resources/blank.gif') . "'"; } else { $photo_img = $placeholder ? $placeholder : 'program/resources/blank.gif'; diff --git a/tests/Framework/VCard.php b/tests/Framework/VCard.php index 0a34fc51f..c23dba844 100644 --- a/tests/Framework/VCard.php +++ b/tests/Framework/VCard.php @@ -79,6 +79,25 @@ class Framework_VCard extends PHPUnit_Framework_TestCase $this->assertEquals("http://domain.tld", $vcard['website:other'][0], "Decode dummy backslash character"); } + /** + * Some Apple vCard quirks (#1489993) + */ + function test_parse_six() + { + $vcard = new rcube_vcard("BEGIN:VCARD\n" + . "VERSION:3.0\n" + . "N:;;;;\n" + . "FN:Apple Computer AG\n" + . "ITEM1.ADR;type=WORK;type=pref:;;Birgistrasse 4a;Wallisellen-Zürich;;8304;Switzerland\n" + . "PHOTO;ENCODING=B:aHR0cDovL3Rlc3QuY29t\n" + . "END:VCARD" + ); + + $result = $vcard->get_assoc(); + + $this->assertCount(1, $result['address:work'], "ITEM1.-prefixed entry"); + } + function test_import() { $input = file_get_contents($this->_srcpath('apple.vcf')); -- cgit v1.2.3 From 6c1c60f3b908aa922a46cbae94a03eb162147b70 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 2 Aug 2014 09:03:29 +0200 Subject: Support password encryption using openssl extension (#1489989) --- CHANGELOG | 1 + INSTALL | 4 ++-- program/lib/Roundcube/rcube.php | 26 +++++++++++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index a2de91fa6..f2bbe353d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Support password encryption using openssl extension (#1489989) - Create/rename groups in UI dialogs (#1489951) - Added 'contact_search_name' option to define autocompletion entry format - Display quota information for current folder not INBOX only (#1487993) diff --git a/INSTALL b/INSTALL index abb6bbd7d..9ab791112 100644 --- a/INSTALL +++ b/INSTALL @@ -15,7 +15,7 @@ REQUIREMENTS - PCRE, DOM, JSON, XML, Session, Sockets (required) - PHP Data Objects (PDO) with driver for either MySQL, PostgreSQL or SQLite (required) - Libiconv, Zip (recommended) - - Fileinfo, Mcrypt, mbstring (optional) + - OpenSSL, Fileinfo, Mcrypt, mbstring (optional) * PEAR packages distributed with Roundcube or external: - Mail_Mime 1.8.1 or newer - Mail_mimeDecode 1.5.5 or newer @@ -35,7 +35,7 @@ REQUIREMENTS - magic_quotes_runtime disabled - magic_quotes_sybase disabled - register_globals disabled (PHP < 5.4) -* PHP compiled with OpenSSL to connect to IMAPS and to use the spell checker +* PHP compiled with OpenSSL to use secure (tls/ssl) connections and to use the spell checker * A MySQL (4.0.8 or newer), PostgreSQL, MS SQL Server (2005 or newer) database engine or SQLite support in PHP * One of the above databases with permission to create tables diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index 5f55414e6..e3e26d8b9 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -829,7 +829,13 @@ class rcube */ $clear = pack("a*H2", $clear, "80"); - if (function_exists('mcrypt_module_open') && + if (function_exists('openssl_encrypt')) { + $method = 'DES-EDE3-CBC'; + $opts = defined('OPENSSL_RAW_DATA') ? OPENSSL_RAW_DATA : true; + $iv = $this->create_iv(openssl_cipher_iv_length($method)); + $cipher = $iv . openssl_encrypt($clear, $method, $ckey, $opts, $iv); + } + else if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")) ) { $iv = $this->create_iv(mcrypt_enc_get_iv_size($td)); @@ -850,7 +856,7 @@ class rcube self::raise_error(array( 'code' => 500, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available" + 'message' => "Could not perform encryption; make sure OpenSSL or Mcrypt or lib/des.inc is available" ), true, true); } } @@ -876,7 +882,21 @@ class rcube $cipher = $base64 ? base64_decode($cipher) : $cipher; - if (function_exists('mcrypt_module_open') && + if (function_exists('openssl_decrypt')) { + $method = 'DES-EDE3-CBC'; + $opts = defined('OPENSSL_RAW_DATA') ? OPENSSL_RAW_DATA : true; + $iv_size = openssl_cipher_iv_length($method); + $iv = substr($cipher, 0, $iv_size); + + // session corruption? (#1485970) + if (strlen($iv) < $iv_size) { + return ''; + } + + $cipher = substr($cipher, $iv_size); + $clear = openssl_decrypt($cipher, $method, $ckey, $opts, $iv); + } + else if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")) ) { $iv_size = mcrypt_enc_get_iv_size($td); -- cgit v1.2.3 From 6ac9395fbd8fed837d4f40501e4e6cd089243b96 Mon Sep 17 00:00:00 2001 From: "Jeroen van Meeuwen (Kolab Systems)" Date: Fri, 1 Aug 2014 21:11:08 +0200 Subject: Use Net_LDAP3 --- program/lib/Net/LDAP3.php | 2615 ++++++++++++++++++++++++++ program/lib/Net/LDAP3/Result.php | 139 ++ program/lib/Roundcube/rcube_ldap.php | 30 +- program/lib/Roundcube/rcube_ldap_generic.php | 898 +-------- program/lib/Roundcube/rcube_ldap_result.php | 130 -- 5 files changed, 2823 insertions(+), 989 deletions(-) create mode 100644 program/lib/Net/LDAP3.php create mode 100644 program/lib/Net/LDAP3/Result.php delete mode 100644 program/lib/Roundcube/rcube_ldap_result.php (limited to 'program/lib/Roundcube') diff --git a/program/lib/Net/LDAP3.php b/program/lib/Net/LDAP3.php new file mode 100644 index 000000000..b101b4afc --- /dev/null +++ b/program/lib/Net/LDAP3.php @@ -0,0 +1,2615 @@ + | + | Aleksander Machniak | + | Jeroen van Meeuwen | + +-----------------------------------------------------------------------+ +*/ + +require_once __DIR__ . '/LDAP3/Result.php'; + +/** + * Model class to access a LDAP directories + * + * @package Net_LDAP3 + */ +class Net_LDAP3 +{ + public $conn; + public $vlv_active = false; + + private $attribute_level_rights_map = array( + "r" => "read", + "s" => "search", + "w" => "write", + "o" => "delete", + "c" => "compare", + "W" => "write", + "O" => "delete" + ); + + private $entry_level_rights_map = array( + "a" => "add", + "d" => "delete", + "n" => "modrdn", + "v" => "read" + ); + + /* + * Manipulate configuration through the config_set and config_get methods. + * Available options: + * 'debug' => false, + * 'hosts' => array(), + * 'port' => 389, + * 'use_tls' => false, + * 'ldap_version' => 3, // using LDAPv3 + * 'auth_method' => '', // SASL authentication method (for proxy auth), e.g. DIGEST-MD5 + * 'numsub_filter' => '(objectClass=organizationalUnit)', // with VLV, we also use numSubOrdinates to query the total number of records. Set this filter to get all numSubOrdinates attributes for counting + * 'referrals' => false, // Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups + * 'network_timeout' => 10, // The timeout (in seconds) for connect + bind arrempts. This is only supported in PHP >= 5.3.0 with OpenLDAP 2.x + * 'sizelimit' => 0, // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. + * 'timelimit' => 0, // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. + * 'vlv' => false, // force VLV off + * 'config_root_dn' => 'cn=config', // Root DN to read config (e.g. vlv indexes) from + * 'service_bind_dn' => 'uid=kolab-service,ou=Special Users,dc=example,dc=org', + * 'service_bind_pw' => 'Welcome2KolabSystems', + * 'root_dn' => 'dc=example,dc=org', + */ + protected $config = array( + 'sizelimit' => 0, + 'timelimit' => 0, + ); + + protected $debug_level = false; + protected $list_page = 1; + protected $page_size = 10; + protected $cache; + + // Use public method config_set('log_hook', $callback) to have $callback be + // call_user_func'ed instead of the local log functions. + protected $_log_hook; + + // Use public method config_set('config_get_hook', $callback) to have + // $callback be call_user_func'ed instead of the local config_get function. + protected $_config_get_hook; + + // Use public method config_set('config_set_hook', $callback) to have + // $callback be call_user_func'ed instead of the local config_set function. + protected $_config_set_hook; + + // Not Yet Implemented + // Intended to allow hooking in for the purpose of caching. + protected $_result_hook; + + // Runtime. These are not the variables you're looking for. + protected $_current_bind_dn; + protected $_current_bind_pw; + protected $_current_host; + protected $_supported_control = array(); + protected $_vlv_indexes_and_searches; + + /** + * Constructor + * + * @param array $config Configuration parameters that have not already + * been initialized. For configuration parameters + * that have in fact been set, use the config_set() + * method after initialization. + */ + public function __construct($config = array()) + { + if (!empty($config) && is_array($config)) { + foreach ($config as $key => $value) { + if (empty($this->config[$key])) { + $setter = 'config_set_' . $key; + if (method_exists($this, $setter)) { + $this->$setter($value); + } + else if (isset($this->$key)) { + $this->$key = $value; + } + else { + $this->config[$key] = $value; + } + } + } + } + } + + /** + * Add multiple entries to the directory information tree in one go. + */ + public function add_entries($entries, $attributes = array()) + { + // If $entries is an associative array, it's keys are DNs and its + // values are the attributes for that DN. + // + // If $entries is a non-associative array, the attributes are expected + // to be positional in $attributes. + + $result_set = array(); + + if (array_keys($entries) == range(0, count($entries) - 1)) { + // $entries is sequential + if (count($entries) !== count($attributes)) { + $this->_error("Wrong entry/attribute count in " . __FUNCTION__); + return false; + } + + for ($i = 0; $i < count($entries); $i++) { + $result_set[$i] = $this->add_entry($entries[$i], $attributes[$i]); + } + } + else { + // $entries is associative + foreach ($entries as $entry_dn => $entry_attributes) { + if (array_keys($attributes) !== range(0, count($attributes)-1)) { + // $attributes is associative as well, let's merge these + // + // $entry_attributes takes precedence, so is in the second + // position in array_merge() + $entry_attributes = array_merge($attributes, $entry_attributes); + } + + $result_set[$entry_dn] = $this->add_entry($entry_dn, $entry_attributes); + } + } + + return $result_set; + } + + /** + * Add an entry to the directory information tree. + */ + public function add_entry($entry_dn, $attributes) + { + // TODO: + // - Get entry rdn attribute value from entry_dn and see if it exists in + // attributes -> issue warning if so (but not block the operation). + $this->_debug("Entry DN", $entry_dn); + $this->_debug("Attributes", $attributes); + + foreach ($attributes as $attr_name => $attr_value) { + if (empty($attr_value)) { + unset($attributes[$attr_name]); + } + } + + $this->_debug("C: Add $entry_dn: " . json_encode($attributes)); + + if (($add_result = ldap_add($this->conn, $entry_dn, $attributes)) == false) { + $this->_debug("S: " . ldap_error($this->conn)); + $this->_debug("S: Adding entry $entry_dn failed. " . ldap_error($this->conn)); + + return false; + } + + $this->_debug("LDAP: S: OK"); + + return true; + } + + /** + * Add replication agreements and initialize the consumer(s) for + * $domain_root_dn. + * + * Searches the configured replicas for any of the current domain/config + * databases, and uses this information to configure the additional + * replication for the (new) domain database (at $domain_root_dn). + * + * Very specific to Netscape-based directory servers, and currently also + * very specific to multi-master replication. + */ + public function add_replication_agreements($domain_root_dn) + { + $replica_hosts = $this->list_replicas(); + + if (empty($replica_hosts)) { + return; + } + + $result = $this->search($this->config_get('config_root_dn'), "(&(objectclass=nsDS5Replica)(nsDS5ReplicaType=3))", "sub"); + + if (!$result) { + $this->_debug("No replication configuration found."); + return; + } + + // Preserve the number of replicated databases we have, because the replication ID + // can be calculated from the number of databases replicated, and the number of + // servers. + $num_replica_dbs = $result->count(); + $replicas = $result->entries(true); + $max_replica_agreements = 0; + + foreach ($replicas as $replica_dn => $replica_attrs) { + $result = $this->search($replica_dn, "(objectclass=nsDS5ReplicationAgreement)", "sub"); + if ($result) { + if ($max_replica_agreements < $result->count()) { + $max_replica_agreements = $result->count(); + $max_replica_agreements_dn = $replica_dn; + } + } + } + + $max_repl_id = $num_replica_dbs * count($replica_hosts); + + $this->_debug("The current maximum replication ID is $max_repl_id"); + $this->_debug("The current maximum number of replication agreements for any database is $max_replica_agreements (for $max_replica_agreements_dn)"); + $this->_debug("With " . count($replica_hosts) . " replicas, the next is " . ($max_repl_id + 1) . " and the last one is " . ($max_repl_id + count($replica_hosts))); + + // Then add the replication agreements + foreach ($replica_hosts as $num => $replica_host) { + $ldap = new Net_LDAP3($this->config); + $ldap->config_set('hosts', array($replica_host)); + $ldap->connect(); + $ldap->bind($this->_current_bind_dn, $this->_current_bind_pw); + + $replica_attrs = array( + 'cn' => 'replica', + 'objectclass' => array( + 'top', + 'nsds5replica', + 'extensibleobject', + ), + 'nsDS5ReplicaBindDN' => $ldap->get_entry_attribute($replica_dn, "nsDS5ReplicaBindDN"), + 'nsDS5ReplicaId' => ($max_repl_id + $num + 1), + 'nsDS5ReplicaRoot' => $domain_root_dn, + 'nsDS5ReplicaType' => $ldap->get_entry_attribute($replica_dn, "nsDS5ReplicaType"), + 'nsds5ReplicaPurgeDelay' => $ldap->get_entry_attribute($replica_dn, "nsds5ReplicaPurgeDelay"), + 'nsDS5Flags' => $ldap->get_entry_attribute($replica_dn, "nsDS5Flags") + ); + + $new_replica_dn = 'cn=replica,cn="' . $domain_root_dn . '",cn=mapping tree,cn=config'; + + $this->_debug("Adding $new_replica_dn to $replica_host with attributes: " . var_export($replica_attrs, true)); + + $result = $ldap->add_entry($new_replica_dn, $replica_attrs); + + if (!$result) { + $this->_error("Could not add replication configuration to database for $domain_root_dn on $replica_host"); + continue; + } + + $result = $ldap->search($replica_dn, "(objectclass=nsDS5ReplicationAgreement)", "sub"); + + if (!$result) { + $this->_error("Host $replica_host does not have any replication agreements"); + continue; + } + + $entries = $result->entries(true); + $replica_agreement_tpl_dn = key($entries); + + $this->_debug("Using " . var_export($replica_agreement_tpl_dn, true) . " as the template for new replication agreements"); + + foreach ($replica_hosts as $replicate_to_host) { + // Skip the current server + if ($replicate_to_host == $replica_host) { + continue; + } + + $this->_debug("Adding a replication agreement for $domain_root_dn to $replicate_to_host on " . $replica_host); + + $attrs = array( + 'objectclass', + 'nsDS5ReplicaBindDN', + 'nsDS5ReplicaCredentials', + 'nsDS5ReplicaTransportInfo', + 'nsDS5ReplicaBindMethod', + 'nsDS5ReplicaHost', + 'nsDS5ReplicaPort' + ); + + $replica_agreement_attrs = $ldap->get_entry_attributes($replica_agreement_tpl_dn, $attrs); + $replica_agreement_attrs['cn'] = array_shift(explode('.', $replicate_to_host)) . str_replace(array('dc=',','), array('_',''), $domain_root_dn); + $replica_agreement_attrs['nsDS5ReplicaRoot'] = $domain_root_dn; + $replica_agreement_dn = "cn=" . $replica_agreement_attrs['cn'] . "," . $new_replica_dn; + + $this->_debug("Adding $replica_agreement_dn to $replica_host with attributes: " . var_export($replica_agreement_attrs, true)); + + $result = $ldap->add_entry($replica_agreement_dn, $replica_agreement_attrs); + + if (!$result) { + $this->_error("Failed adding $replica_agreement_dn"); + } + } + } + + $server_id = implode('', array_diff($replica_hosts, $this->_server_id_not)); + + $this->_debug("About to trigger consumer initialization for replicas on current 'parent': $server_id"); + + $result = $this->search($this->config_get('config_root_dn'), "(&(objectclass=nsDS5ReplicationAgreement)(nsds5replicaroot=$domain_root_dn))", "sub"); + + if ($result) { + foreach ($result->entries(true) as $agreement_dn => $agreement_attrs) { + $this->modify_entry_attributes( + $agreement_dn, + array( + 'replace' => array( + 'nsds5BeginReplicaRefresh' => 'start', + ), + ) + ); + } + } + } + + public function attribute_details($attributes = array()) + { + $schema = $this->init_schema(); + + if (!$schema) { + return array(); + } + + $attribs = $schema->getAll('attributes'); + + $attributes_details = array(); + + foreach ($attributes as $attribute) { + if (array_key_exists($attribute, $attribs)) { + $attrib_details = $attribs[$attribute]; + + if (!empty($attrib_details['sup'])) { + foreach ($attrib_details['sup'] as $super_attrib) { + $_attrib_details = $attribs[$super_attrib]; + if (is_array($_attrib_details)) { + $attrib_details = array_merge($_attrib_details, $attrib_details); + } + } + } + } + else if (array_key_exists(strtolower($attribute), $attribs)) { + $attrib_details = $attribs[strtolower($attribute)]; + + if (!empty($attrib_details['sup'])) { + foreach ($attrib_details['sup'] as $super_attrib) { + $_attrib_details = $attribs[$super_attrib]; + if (is_array($_attrib_details)) { + $attrib_details = array_merge($_attrib_details, $attrib_details); + } + } + } + } + else { + $this->_warning("LDAP: No schema details exist for attribute $attribute (which is strange)"); + } + + // The relevant parts only, please + $attributes_details[$attribute] = array( + 'type' => !empty($attrib_details['single-value']) ? 'text' : 'list', + 'description' => $attrib_details['desc'], + 'syntax' => $attrib_details['syntax'], + 'max-length' => $attrib_details['max-length'] ?: false, + ); + } + + return $attributes_details; + } + + public function attributes_allowed($objectclasses = array()) + { + $this->_debug("Listing allowed_attributes for objectclasses", $objectclasses); + + if (!is_array($objectclasses) || empty($objectclasses)) { + return false; + } + + $schema = $this->init_schema(); + if (!$schema) { + return false; + } + + $may = array(); + $must = array(); + $superclasses = array(); + + foreach ($objectclasses as $objectclass) { + $superclass = $schema->superclass($objectclass); + if (!empty($superclass)) { + $superclasses = array_merge($superclass, $superclasses); + } + + $_may = $schema->may($objectclass); + $_must = $schema->must($objectclass); + + if (is_array($_may)) { + $may = array_merge($may, $_may); + } + if (is_array($_must)) { + $must = array_merge($must, $_must); + } + } + + $may = array_unique($may); + $must = array_unique($must); + $superclasses = array_unique($superclasses); + + return array('may' => $may, 'must' => $must, 'super' => $superclasses); + } + + public function classes_allowed() + { + $schema = $this->init_schema(); + if (!$schema) { + return false; + } + + $list = $schema->getAll('objectclasses'); + $classes = array(); + + foreach ($list as $class) { + $classes[] = $class['name']; + } + + return $classes; + } + + /** + * Bind connection with DN and password + * + * @param string $dn Bind DN + * @param string $pass Bind password + * + * @return boolean True on success, False on error + */ + public function bind($bind_dn, $bind_pw) + { + if (!$this->conn) { + return false; + } + + if ($bind_dn == $this->_current_bind_dn) { + return true; + } + + $this->_debug("C: Bind [dn: $bind_dn] [pass: $bind_pw]"); + + if (@ldap_bind($this->conn, $bind_dn, $bind_pw)) { + $this->_debug("S: OK"); + $this->_current_bind_dn = $bind_dn; + $this->_current_bind_pw = $bind_pw; + + return true; + } + + $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("Bind failed for dn=$bind_dn: ".ldap_error($this->conn)); + + return false; + } + + /** + * Close connection to LDAP server + */ + public function close() + { + if ($this->conn) { + $this->_debug("C: Close"); + ldap_unbind($this->conn); + + $this->_current_bind_dn = null; + $this->_current_bind_pw = null; + $this->conn = null; + } + } + + /** + * Get the value of a configuration item. + * + * @param string $key Configuration key + * @param mixed $default Default value to return + */ + public function config_get($key, $default = null) + { + if (!empty($this->_config_get_hook)) { + return call_user_func_array($this->_config_get_hook, array($key, $value)); + } + else if (method_exists($this, "config_get_{$key}")) { + return call_user_func(array($this, "config_get_$key"), $value); + } + else if (!isset($this->config[$key])) { + return $default; + } + else { + return $this->config[$key]; + } + } + + /** + * Set a configuration item to value. + * + * @param string $key Configuration key + * @param mixed $value Configuration value + */ + public function config_set($key, $value = null) + { + if (is_array($key)) { + foreach ($key as $k => $v) { + $this->config_set($k, $v); + } + return; + } + + if (!empty($this->_config_set_hook)) { + call_user_func($this->_config_set_hook, array($key, $value)); + } + else if (method_exists($this, "config_set_{$key}")) { + call_user_func_array(array($this, "config_set_$key"), array($value)); + } + else if (isset($this->$key)) { + $this->$key = $value; + } + else { + // 'host' option is deprecated + if ($key == 'host') { + $this->config['hosts'] = (array) $value; + } + else { + $this->config[$key] = $value; + } + } + } + + /** + * Establish a connection to the LDAP server + */ + public function connect($host = null) + { + if (!function_exists('ldap_connect')) { + $this->_error("No ldap support in this PHP installation"); + return false; + } + + if (is_resource($this->conn)) { + $this->_debug("Connection already exists"); + return true; + } + + $hosts = !empty($host) ? $host : $this->config_get('hosts', array()); + $port = $this->config_get('port', 389); + + foreach ((array) $hosts as $host) { + $this->_debug("C: Connect [$host:$port]"); + + if ($lc = @ldap_connect($host, $port)) { + if ($this->config_get('use_tls', false) === true) { + if (!ldap_start_tls($lc)) { + $this->_debug("S: Could not start TLS. " . ldap_error($lc)); + continue; + } + } + + $this->_debug("S: OK"); + + $ldap_version = $this->config_get('ldap_version', 3); + $timeout = $this->config_get('network_timeout'); + $referrals = $this->config_get('referrals'); + + ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $ldap_version); + + if ($timeout) { + ldap_set_option($lc, LDAP_OPT_NETWORK_TIMEOUT, $timeout); + } + + if ($referrals !== null) { + ldap_set_option($lc, LDAP_OPT_REFERRALS, (bool) $referrals); + } + + $this->_current_host = $host; + $this->conn = $lc; + + break; + } + + $this->_debug("S: NOT OK"); + } + + if (!is_resource($this->conn)) { + $this->_error("Could not connect to LDAP"); + return false; + } + + return true; + } + + /** + * Shortcut to ldap_delete() + */ + public function delete_entry($entry_dn) + { + $this->_debug("LDAP: C: Delete $entry_dn"); + + if (ldap_delete($this->conn, $entry_dn) === false) { + $this->_debug("LDAP: S: " . ldap_error($this->conn)); + return false; + } + + $this->_debug("LDAP: S: OK"); + + return true; + } + + /** + * Deletes specified entry and all entries in the tree + */ + public function delete_entry_recursive($entry_dn) + { + // searching for sub entries, but not scope sub, just one level + $result = $this->search($entry_dn, '(objectclass=*)', 'one'); + + if ($result) { + $entries = $result->entries(true); + + foreach (array_keys($entries) as $sub_dn) { + if (!$this->delete_entry_recursive($sub_dn)) { + return false; + } + } + } + + if (!$this->delete_entry($entry_dn)) { + return false; + } + + return true; + } + + public function effective_rights($subject) + { + $effective_rights_control_oid = "1.3.6.1.4.1.42.2.27.9.5.2"; + + $supported_controls = $this->supported_controls(); + + if (!in_array($effective_rights_control_oid, $supported_controls)) { + $this->_debug("LDAP: No getEffectiveRights control in supportedControls"); + return false; + } + + $attributes = array( + 'attributeLevelRights' => array(), + 'entryLevelRights' => array(), + ); + + $output = array(); + $entry_dn = $this->entry_dn($subject); + + if (!$entry_dn) { + $entry_dn = $this->config_get($subject . "_base_dn"); + } + if (!$entry_dn) { + $entry_dn = $this->config_get("base_dn"); + } + if (!$entry_dn) { + $entry_dn = $this->config_get("root_dn"); + } + + $this->_debug("effective_rights for subject $subject resolves to entry dn $entry_dn"); + + $moz_ldapsearch = "/usr/lib64/mozldap/ldapsearch"; + if (!is_file($moz_ldapsearch)) { + $moz_ldapsearch = "/usr/lib/mozldap/ldapsearch"; + } + if (!is_file($moz_ldapsearch)) { + $moz_ldapsearch = null; + } + + if (empty($moz_ldapsearch)) { + $this->_error("Mozilla LDAP C SDK binary ldapsearch not found, cannot get effective rights on subject $subject"); + return null; + } + + $command = array( + $moz_ldapsearch, + '-x', + '-h', + $this->_ldap_server, + '-p', + $this->_ldap_port, + '-b', + escapeshellarg($entry_dn), + '-D', + escapeshellarg($this->_current_bind_dn), + '-w', + escapeshellarg($this->_current_bind_pw), + '-J', + escapeshellarg(implode(':', array( + $effective_rights_control_oid, // OID + 'true', // Criticality + 'dn:' . $this->_current_bind_dn // User DN + ))), + '-s', + 'base', + '"(objectclass=*)"', + '"*"', + ); + + $command = implode(' ', $command); + + $this->_debug("LDAP: Executing command: $command"); + + exec($command, $output, $return_code); + + $this->_debug("LDAP: Command output:" . var_export($output, true)); + $this->_debug("Return code: " . $return_code); + + if ($return_code) { + $this->_error("Command $moz_ldapsearch returned error code: $return_code"); + return null; + } + + $lines = array(); + foreach ($output as $line_num => $line) { + if (substr($line, 0, 1) == " ") { + $lines[count($lines)-1] .= trim($line); + } + else { + $lines[] = trim($line); + } + } + + foreach ($lines as $line) { + $line_components = explode(':', $line); + $attribute_name = array_shift($line_components); + $attribute_value = trim(implode(':', $line_components)); + + switch ($attribute_name) { + case "attributeLevelRights": + $attributes[$attribute_name] = $this->parse_attribute_level_rights($attribute_value); + break; + case "dn": + $attributes[$attribute_name] = $attribute_value; + break; + case "entryLevelRights": + $attributes[$attribute_name] = $this->parse_entry_level_rights($attribute_value); + break; + + default: + break; + } + } + + return $attributes; + } + + /** + * Resolve entry data to entry DN + * + * @param string $subject Entry string (e.g. entry DN or unique attribute value) + * @param array $attributes Additional attributes + * @param string $base_dn Optional base DN + * + * @return string Entry DN string + */ + public function entry_dn($subject, $attributes = array(), $base_dn = null) + { + $this->_debug("entry_dn on subject $subject"); + $is_dn = ldap_explode_dn($subject, 1); + + if (is_array($is_dn) && array_key_exists("count", $is_dn) && $is_dn["count"] > 0) { + $this->_debug("$subject is a dn"); + return $subject; + } + + $this->_debug("$subject is not a dn"); + + if (strlen($subject) < 32 || preg_match('/[^a-fA-F0-9-]/', $subject)) { + $this->_debug("$subject is not a unique identifier"); + return; + } + + $unique_attr = $this->config_get('unique_attribute', 'nsuniqueid'); + + $this->_debug("Using unique_attribute " . var_export($unique_attr, true) . " at " . __FILE__ . ":" . __LINE__); + + $attributes = array_merge(array($unique_attr => $subject), (array)$attributes); + $subject = $this->entry_find_by_attribute($attributes, $base_dn); + + if (!empty($subject)) { + return key($subject); + } + } + + public function entry_find_by_attribute($attributes, $base_dn = null) + { + $this->_debug("Net_LDAP3::entry_find_by_attribute(\$attributes, \$base_dn) called with base_dn", $base_dn, "and attributes", $attributes); + + if (empty($attributes) || !is_array($attributes)) { + return false; + } + + if (empty($attributes[key($attributes)])) { + return false; + } + + $filter = count($attributes) ? "(&" : ""; + + foreach ($attributes as $key => $value) { + $filter .= "(" . $key . "=" . $value . ")"; + } + + $filter .= count($attributes) ? ")" : ""; + + if (empty($base_dn)) { + $base_dn = $this->config_get('root_dn'); + $this->_debug("Using base_dn from domain " . $this->domain . ": " . $base_dn); + } + + $result = $this->search($base_dn, $filter, 'sub', array_keys($attributes)); + + if ($result && $result->count() > 0) { + $this->_debug("Results found: " . implode(', ', array_keys($result->entries(true)))); + return $result->entries(true); + } + else { + $this->_debug("No result"); + return false; + } + } + + public function find_user_groups($member_dn) + { + $groups = array(); + $root_dn = $this->config_get('root_dn'); + + // TODO: Do not query for both, it's either one or the other + $entries = $this->search($root_dn, "(|" . + "(&(objectclass=groupofnames)(member=$member_dn))" . + "(&(objectclass=groupofuniquenames)(uniquemember=$member_dn))" . + ")" + ); + + if ($entries) { + $groups = array_keys($entries->entries(true)); + } + + return $groups; + } + + public function get_entry_attribute($subject_dn, $attribute) + { + $entry = $this->get_entry_attributes($subject_dn, (array)$attribute); + + return $entry[strtolower($attribute)]; + } + + public function get_entry_attributes($subject_dn, $attributes) + { + // @TODO: use get_entry? + $result = $this->search($subject_dn, '(objectclass=*)', 'base', $attributes); + + if (!$result) { + return array(); + } + + $entries = $result->entries(true); + $entry_dn = key($entries); + $entry = $entries[$entry_dn]; + + return $entry; + } + + /** + * Get a specific LDAP entry, identified by its DN + * + * @param string $dn Record identifier + * @param array $attributes Attributes to return + * + * @return array Hash array + */ + public function get_entry($dn, $attributes = array()) + { + $rec = null; + + if ($this->conn && $dn) { + $this->_debug("C: Read [dn: $dn] [(objectclass=*)]"); + + if ($ldap_result = @ldap_read($this->conn, $dn, '(objectclass=*)', $attributes)) { + $this->_debug("S: OK"); + + if ($entry = ldap_first_entry($this->conn, $ldap_result)) { + $rec = ldap_get_attributes($this->conn, $entry); + } + } + else { + $this->_debug("S: ".ldap_error($this->conn)); + } + + if (!empty($rec)) { + $rec['dn'] = $dn; // Add in the dn for the entry. + } + } + + return $rec; + } + + public function list_replicas() + { + $this->_debug("Finding replicas for this server."); + + // Search any host that is a replica for the current host + $replica_hosts = $this->config_get('replica_hosts', array()); + $root_dn = $this->config_get('config_root_dn'); + + if (!empty($replica_hosts)) { + return $replica_hosts; + } + + $ldap = new Net_LDAP3($this->config); + $ldap->connect(); + $ldap->bind($this->_current_bind_dn, $this->_current_bind_pw); + + $result = $ldap->search($root_dn, '(objectclass=nsds5replicationagreement)', 'sub', array('nsds5replicahost')); + + if (!$result) { + $this->_debug("No replicas configured"); + return $replica_hosts; + } + + $this->_debug("Replication agreements found: " . var_export($result->entries(true), true)); + + foreach ($result->entries(true) as $dn => $attrs) { + if (!in_array($attrs['nsds5replicahost'], $replica_hosts)) { + $replica_hosts[] = $attrs['nsds5replicahost']; + } + } + + // $replica_hosts now holds the IDs of servers we are currently NOT + // connected to. We might need this later in order to set + $this->_server_id_not = $replica_hosts; + + $this->_debug("So far, we have the following replicas: " . var_export($replica_hosts, true)); + + $ldap->close(); + + foreach ($replica_hosts as $replica_host) { + $ldap->config_set('hosts', array($replica_host)); + $ldap->connect(); + $ldap->bind($this->_current_bind_dn, $this->_current_bind_pw); + + $result = $ldap->search($root_dn, '(objectclass=nsds5replicationagreement)', 'sub', array('nsds5replicahost')); + if (!$result) { + $this->_debug("No replicas configured"); + } + + foreach ($result->entries(true) as $dn => $attrs) { + if (!in_array($attrs['nsds5replicahost'], $replica_hosts)) { + $replica_hosts[] = $attrs['nsds5replicahost']; + } + } + + $ldap->close(); + } + + $this->config_set('replica_hosts', $replica_hosts); + + return $replica_hosts; + } + + public function login($username, $password, $domain = null) + { + $this->_debug("Net_LDAP3::login(\$username = '" . $username . "', \$password = '****', \$domain = '" . $domain . "')"); + + $_bind_dn = $this->config_get('service_bind_dn'); + $_bind_pw = $this->config_get('service_bind_pw'); + + if (empty($_bind_dn)) { + $this->_debug("No valid service bind dn found."); + return null; + } + + if (empty($_bind_pw)) { + $this->_debug("No valid service bind password found."); + return null; + } + + $bound = $this->bind($_bind_dn, $_bind_pw); + + if (!$bound) { + $this->_debug("Could not bind with service bind credentials."); + return null; + } + + $entry_dn = $this->entry_dn($username); + + if (!empty($entry_dn)) { + $bound = $this->bind($entry_dn, $password); + + if (!$bound) { + $this->_error("Could not bind with " . $entry_dn); + return null; + } + + return $entry_dn; + } + + $base_dn = $this->config_get('root_dn'); + + if (empty($base_dn)) { + $this->_debug("Could not get a valid base dn to search."); + return null; + } + + $localpart = $username; + + if (empty($domain) ) { + if (count(explode('@', $username)) > 1) { + $_parts = explode('@', $username); + $localpart = $_parts[0]; + $domain = $_parts[1]; + } + else { + $localpart = $username; + $domain = ''; + } + } + + $realm = $domain; + $filter = $this->config_get("login_filter", null); + + if (empty($filter)) { + $filter = $this->config_get("filter", null); + } + if (empty($filter)) { + $filter = "(&(|(mail=%s)(mail=%U@%d)(alias=%s)(alias=%U@%d)(uid=%s))(objectclass=inetorgperson))"; + } + + $this->_debug("Net::LDAP3::login() original filter: " . $filter); + + $replace_patterns = array( + '/%s/' => $username, + '/%d/' => $domain, + '/%U/' => $localpart, + '/%r/' => $realm + ); + + $filter = preg_replace(array_keys($replace_patterns), array_values($replace_patterns), $filter); + + $this->_debug("Net::LDAP3::login() actual filter: " . $filter); + + $result = $this->search($base_dn, $filter, 'sub'); + + if (!$result) { + $this->_debug("Could not search $base_dn with $filter"); + return null; + } + + if ($result->count() > 1) { + $this->_debug("Multiple entries found."); + return null; + } + else if ($result->count() < 1) { + $this->_debug("No entries found."); + return null; + } + + $entries = $result->entries(); + $entry = self::normalize_result($entries); + $entry_dn = key($entry); + + $bound = $this->bind($entry_dn, $password); + + if (!$bound) { + $this->_debug("Could not bind with " . $entry_dn); + return null; + } + + return $entry_dn; + } + + public function list_group_members($dn, $entry = null, $recurse = true) + { + $this->_debug("Called list_group_members(" . $dn . ")"); + + if (is_array($entry) && in_array('objectclass', $entry)) { + if (!in_array(array('groupofnames', 'groupofuniquenames', 'groupofurls'), $entry['objectclass'])) { + $this->_debug("Called list_group_members on a non-group!"); + return array(); + } + } + else { + $entry = $this->get_entry($dn, array('member', 'uniquemember', 'memberurl', 'objectclass')); + + if (!$entry) { + return array(); + } + } + + $group_members = array(); + + foreach ((array)$entry['objectclass'] as $objectclass) { + switch (strtolower($objectclass)) { + case "groupofnames": + case "kolabgroupofnames": + $group_members = array_merge($group_members, $this->list_group_member($dn, $entry['member'], $recurse)); + break; + case "groupofuniquenames": + case "kolabgroupofuniquenames": + $group_members = array_merge($group_members, $this->list_group_uniquemember($dn, $entry['uniquemember'], $recurse)); + break; + case "groupofurls": + $group_members = array_merge($group_members, $this->list_group_memberurl($dn, $entry['memberurl'], $recurse)); + break; + } + } + + return array_values(array_filter($group_members)); + } + + public function modify_entry($subject_dn, $old_attrs, $new_attrs) + { + $this->_debug("OLD ATTRIBUTES", $old_attrs); + $this->_debug("NEW ATTRIBUTES", $new_attrs); + + // TODO: Get $rdn_attr - we have type_id in $new_attrs + $dn_components = ldap_explode_dn($subject_dn, 0); + $rdn_components = explode('=', $dn_components[0]); + $rdn_attr = $rdn_components[0]; + + $this->_debug("Net_LDAP3::modify_entry() using rdn attribute: " . $rdn_attr); + + $mod_array = array( + 'add' => array(), // For use with ldap_mod_add() + 'del' => array(), // For use with ldap_mod_del() + 'replace' => array(), // For use with ldap_mod_replace() + 'rename' => array(), // For use with ldap_rename() + ); + + // This is me cheating. Remove this special attribute. + if (array_key_exists('ou', $old_attrs) || array_key_exists('ou', $new_attrs)) { + $old_ou = $old_attrs['ou']; + $new_ou = $new_attrs['ou']; + unset($old_attrs['ou']); + unset($new_attrs['ou']); + } + else { + $old_ou = null; + $new_ou = null; + } + + // Compare each attribute value of the old attrs with the corresponding value + // in the new attrs, if any. + foreach ($old_attrs as $attr => $old_attr_value) { + if (is_array($old_attr_value)) { + if (count($old_attr_value) == 1) { + $old_attrs[$attr] = $old_attr_value[0]; + $old_attr_value = $old_attrs[$attr]; + } + } + + if (array_key_exists($attr, $new_attrs)) { + if (is_array($new_attrs[$attr])) { + if (count($new_attrs[$attr]) == 1) { + $new_attrs[$attr] = $new_attrs[$attr][0]; + } + } + + if (is_array($old_attrs[$attr]) && is_array($new_attrs[$attr])) { + $_sort1 = $new_attrs[$attr]; + sort($_sort1); + $_sort2 = $old_attr_value; + sort($_sort2); + } + else { + $_sort1 = true; + $_sort2 = false; + } + + if ($new_attrs[$attr] !== $old_attr_value && $_sort1 !== $_sort2) { + $this->_debug("Attribute $attr changed from " . var_export($old_attr_value, true) . " to " . var_export($new_attrs[$attr], true)); + if ($attr === $rdn_attr) { + $this->_debug("This attribute is the RDN attribute. Let's see if it is multi-valued, and if the original still exists in the new value."); + if (is_array($old_attrs[$attr])) { + if (!is_array($new_attrs[$attr])) { + if (in_array($new_attrs[$attr], $old_attrs[$attr])) { + // TODO: Need to remove all $old_attrs[$attr] values not equal to $new_attrs[$attr], and not equal to the current $rdn_attr value [0] + + $this->_debug("old attrs. is array, new attrs. is not array. new attr. exists in old attrs."); + + $rdn_attr_value = array_shift($old_attrs[$attr]); + $_attr_to_remove = array(); + + foreach ($old_attrs[$attr] as $value) { + if (strtolower($value) != strtolower($new_attrs[$attr])) { + $_attr_to_remove[] = $value; + } + } + + $this->_debug("Adding to delete attribute $attr values:" . implode(', ', $_attr_to_remove)); + + $mod_array['del'][$attr] = $_attr_to_remove; + + if (strtolower($new_attrs[$attr]) !== strtolower($rdn_attr_value)) { + $this->_debug("new attrs is not the same as the old rdn value, issuing a rename"); + $mod_array['rename']['dn'] = $subject_dn; + $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr][0]; + } + } + else { + $this->_debug("new attrs is not the same as any of the old rdn value, issuing a full rename"); + $mod_array['rename']['dn'] = $subject_dn; + $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr]; + } + } + else { + // TODO: See if the rdn attr. value is still in $new_attrs[$attr] + if (in_array($old_attrs[$attr][0], $new_attrs[$attr])) { + $this->_debug("Simply replacing attr $attr as rdn attr value is preserved."); + $mod_array['replace'][$attr] = $new_attrs[$attr]; + } + else { + // TODO: This fails. + $mod_array['rename']['dn'] = $subject_dn; + $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr][0]; + $mod_array['del'][$attr] = $old_attrs[$attr][0]; + } + } + } + else { + if (!is_array($new_attrs[$attr])) { + $this->_debug("Renaming " . $old_attrs[$attr] . " to " . $new_attrs[$attr]); + $mod_array['rename']['dn'] = $subject_dn; + $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr]; + } + else { + $this->_debug("Adding to replace"); + // An additional attribute value is being supplied. Just replace and continue. + $mod_array['replace'][$attr] = $new_attrs[$attr]; + continue; + } + } + + } + else { + if (!isset($new_attrs[$attr]) || $new_attrs[$attr] === '' || (is_array($new_attrs[$attr]) && empty($new_attrs[$attr]))) { + switch ($attr) { + case "userpassword": + break; + default: + $this->_debug("Adding to del: $attr"); + $mod_array['del'][$attr] = (array)($old_attr_value); + break; + } + } + else { + $this->_debug("Adding to replace: $attr"); + $mod_array['replace'][$attr] = (array)($new_attrs[$attr]); + } + } + } + else { + $this->_debug("Attribute $attr unchanged"); + } + } + else { + // TODO: Since we're not shipping the entire object back and forth, and only post + // part of the data... we don't know what is actually removed (think modifiedtimestamp, etc.) + $this->_debug("Group attribute $attr not mentioned in \$new_attrs..., but not explicitly removed... by assumption"); + } + } + + foreach ($new_attrs as $attr => $value) { + // OU's parent base dn + if ($attr == 'base_dn') { + continue; + } + + if (is_array($value)) { + if (count($value) == 1) { + $new_attrs[$attr] = $value[0]; + $value = $new_attrs[$attr]; + } + } + + if (array_key_exists($attr, $old_attrs)) { + if (is_array($old_attrs[$attr])) { + if (count($old_attrs[$attr]) == 1) { + $old_attrs[$attr] = $old_attrs[$attr][0]; + } + } + + if (is_array($new_attrs[$attr]) && is_array($old_attrs[$attr])) { + $_sort1 = $old_attrs[$attr]; + sort($_sort1); + $_sort2 = $value; + sort($_sort2); + } + else { + $_sort1 = true; + $_sort2 = false; + } + + if ($value === null || $value === '' || (is_array($value) && empty($value))) { + if (!array_key_exists($attr, $mod_array['del'])) { + switch ($attr) { + case 'userpassword': + break; + default: + $this->_debug("Adding to del(2): $attr"); + $mod_array['del'][$attr] = (array)($old_attrs[$attr]); + break; + } + } + } + else { + if (!($old_attrs[$attr] === $value) && !($attr === $rdn_attr) && !($_sort1 === $_sort2)) { + if (!array_key_exists($attr, $mod_array['replace'])) { + $this->_debug("Adding to replace(2): $attr"); + $mod_array['replace'][$attr] = $value; + } + } + } + } + else { + if (!empty($value)) { + $mod_array['add'][$attr] = $value; + } + } + } + + if (empty($old_ou)) { + $subject_dn_components = ldap_explode_dn($subject_dn, 0); + unset($subject_dn_components["count"]); + $subject_rdn = array_shift($subject_dn_components); + $old_ou = implode(',', $subject_dn_components); + } + + // object is an organizational unit + if (strpos($subject_dn, 'ou=' . $old_ou) === 0) { + $root = substr($subject_dn, strlen($old_ou) + 4); // remove ou=*, + + if ((!empty($new_attrs['base_dn']) && strtolower($new_attrs['base_dn']) !== strtolower($root)) + || (strtolower($old_ou) !== strtolower($new_ou)) + ) { + if (!empty($new_attrs['base_dn'])) { + $root = $new_attrs['base_dn']; + } + + $mod_array['rename']['new_parent'] = $root; + $mod_array['rename']['dn'] = $subject_dn; + $mod_array['rename']['new_rdn'] = 'ou=' . $new_ou; + } + } + // not OU object, but changed ou attribute + else if ((!empty($old_ou) && !empty($new_ou)) && strtolower($old_ou) !== strtolower($new_ou)) { + $mod_array['rename']['new_parent'] = $new_ou; + if (empty($mod_array['rename']['dn']) || empty($mod_array['rename']['new_rdn'])) { + $mod_array['rename']['dn'] = $subject_dn; + $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$rdn_attr]; + } + } + + $this->_debug($mod_array); + + $result = $this->modify_entry_attributes($subject_dn, $mod_array); + + if ($result) { + return $mod_array; + } + } + + /** + * Bind connection with (SASL-) user and password + * + * @param string $authc Authentication user + * @param string $pass Bind password + * @param string $authz Autorization user + * + * @return boolean True on success, False on error + */ + public function sasl_bind($authc, $pass, $authz=null) + { + if (!$this->conn) { + return false; + } + + if (!function_exists('ldap_sasl_bind')) { + $this->_error("Unable to bind: ldap_sasl_bind() not exists"); + return false; + } + + if (!empty($authz)) { + $authz = 'u:' . $authz; + } + + $method = $this->config_get('auth_method'); + if (empty($method)) { + $method = 'DIGEST-MD5'; + } + + $this->_debug("C: Bind [mech: $method, authc: $authc, authz: $authz] [pass: $pass]"); + + if (ldap_sasl_bind($this->conn, null, $pass, $method, null, $authc, $authz)) { + $this->_debug("S: OK"); + return true; + } + + $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("Bind failed for authcid=$authc ".ldap_error($this->conn)); + + return false; + } + + /** + * Execute LDAP search + * + * @param string $base_dn Base DN to use for searching + * @param string $filter Filter string to query + * @param string $scope The LDAP scope (list|sub|base) + * @param array $attrs List of entry attributes to read + * @param array $prop Hash array with query configuration properties: + * - sort: array of sort attributes (has to be in sync with the VLV index) + * - search: search string used for VLV controls + * @param bool $count_only Set to true if only entry count is requested + * + * @return mixed Net_LDAP3_Result object or number of entries (if $count_only=true) or False on failure + */ + public function search($base_dn, $filter = '(objectclass=*)', $scope = 'sub', $attrs = array('dn'), $props = array(), $count_only = false) + { + if (!$this->conn) { + $this->_debug("No active connection for " . __CLASS__ . "::" . __FUNCTION__); + return false; + } + + $this->_debug("C: Search base dn: [$base_dn] scope [$scope] with filter [$filter]"); + + // make sure attributes list is not empty + if (empty($attrs)) { + $attrs = array('dn'); + } + + if (!$count_only && ($sort = $this->find_vlv($base_dn, $filter, $scope, $props['sort']))) { + // when using VLV, we get the total count by... + // ...either reading numSubOrdinates attribute + if (($sub_filter = $this->config_get('numsub_filter')) && + ($result_count = @$ns_function($this->conn, $base_dn, $sub_filter, array('numSubOrdinates'), 0, 0, 0)) + ) { + $counts = ldap_get_entries($this->conn, $result_count); + for ($vlv_count = $j = 0; $j < $counts['count']; $j++) { + $vlv_count += $counts[$j]['numsubordinates'][0]; + } + $this->_debug("D: total numsubordinates = " . $vlv_count); + } + // ...or by fetching all records dn and count them + else if (!function_exists('ldap_parse_virtuallist_control')) { + $vlv_count = $this->search($base_dn, $filter, $scope, array('dn'), $props, true); + } + + $this->vlv_active = $this->_vlv_set_controls($sort, $this->list_page, $this->page_size, + $this->_vlv_search($sort, $props['search'])); + } + else { + $this->vlv_active = false; + } + + $function = self::scope_to_function($scope, $ns_function); + $sizelimit = (int) $this->config['sizelimit']; + $timelimit = (int) $this->config['timelimit']; + + $this->_debug("Using function $function on scope $scope (\$ns_function is $ns_function)"); + + if ($this->vlv_active) { + if (!empty($this->additional_filter)) { + $filter = "(&" . $filter . $this->additional_filter . ")"; + $this->_debug("C: (With VLV) Setting a filter (with additional filter) of " . $filter); + } + else { + $this->_debug("C: (With VLV) Setting a filter (without additional filter) of " . $filter); + } + } + else { + if (!empty($this->additional_filter)) { + $filter = "(&" . $filter . $this->additional_filter . ")"; + } + $this->_debug("C: (Without VLV) Setting a filter of " . $filter); + } + + $this->_debug("Executing search with return attributes: " . var_export($attrs, true)); + + $ldap_result = @$function($this->conn, $base_dn, $filter, $attrs, 0, $sizelimit, $timelimit); + + if (!$ldap_result) { + $this->_debug("$function failed for dn=$base_dn: ".ldap_error($this->conn)); + return false; + } + + // when running on a patched PHP we can use the extended functions + // to retrieve the total count from the LDAP search result + if ($this->vlv_active && function_exists('ldap_parse_virtuallist_control')) { + if (ldap_parse_result($this->conn, $ldap_result, $errcode, $matcheddn, $errmsg, $referrals, $serverctrls)) { + ldap_parse_virtuallist_control($this->conn, $serverctrls, $last_offset, $vlv_count, $vresult); + $this->_debug("S: VLV result: last_offset=$last_offset; content_count=$vlv_count"); + } + else { + $this->_debug("S: ".($errmsg ? $errmsg : ldap_error($this->conn))); + } + } + else if ($this->debug) { + $this->_debug("S: ".ldap_count_entries($this->conn, $ldap_result)." record(s) found"); + } + + $result = new Net_LDAP3_Result($this->conn, $base_dn, $filter, $scope, $ldap_result); + $result->set('offset', $last_offset); + $result->set('count', $vlv_count); + $result->set('vlv', true); + + return $count_only ? $result->count() : $result; + } + + /** + * Similar to Net_LDAP3::search() but using a search array with multiple + * keys and values that to continue to use the VLV but with an original + * filter adding the search stuff to an additional filter. + * + * @see Net_LDAP3::search() + */ + public function search_entries($base_dn, $filter = '(objectclass=*)', $scope = 'sub', $attrs = array('dn'), $props = array()) + { + $this->_debug("Net_LDAP3::search_entries with search " . var_export($props, true)); + + if (is_array($props['search']) && array_key_exists('params', $props['search'])) { + $_search = $this->search_filter($props['search']); + $this->_debug("C: Search filter: $_search"); + + if (!empty($_search)) { + $this->additional_filter = $_search; + } + else { + $this->additional_filter = "(|"; + + foreach ($props['search'] as $attr => $value) { + $this->additional_filter .= "(" . $attr . "=" . $this->_fuzzy_search_prefix() . $value . $this->_fuzzy_search_suffix() . ")"; + } + + $this->additional_filter .= ")"; + } + + $this->_debug("C: Setting an additional filter " . $this->additional_filter); + } + + $search = $this->search($base_dn, $filter, $scope, $attrs, $props); + + $this->additional_filter = null; + + if (!$search) { + $this->_debug("Net_LDAP3: Search did not succeed!"); + return false; + } + + return $search; + } + + /** + * Create LDAP search filter string according to defined parameters. + */ + public function search_filter($search) + { + if (empty($search) || !is_array($search) || empty($search['params'])) { + return null; + } + + $operators = array('=', '~=', '>=', '<='); + $filter = ''; + + foreach ((array) $search['params'] as $field => $param) { + switch ((string)$param['type']) { + case 'prefix': + $prefix = ''; + $suffix = '*'; + break; + + case 'suffix': + $prefix = '*'; + $suffix = ''; + break; + + case 'exact': + case '=': + case '~=': + case '>=': + case '<=': + $prefix = ''; + $suffix = ''; + break; + + case 'exists': + $prefix = '*'; + $suffix = ''; + $param['value'] = ''; + break; + + case 'both': + default: + $prefix = '*'; + $suffix = '*'; + break; + } + + $operator = $param['type'] && in_array($param['type'], $operators) ? $param['type'] : '='; + + if (is_array($param['value'])) { + $val_filter = array(); + foreach ($param['value'] as $val) { + $value = self::quote_string($val); + $val_filter[] = "(" . $field . $operator . $prefix . $value . $suffix . ")"; + } + $filter .= "(|" . implode($val_filter, '') . ")"; + } + else { + $value = self::quote_string($param['value']); + $filter .= "(" . $field . $operator . $prefix . $value . $suffix . ")"; + } + } + + // join search parameters with specified operator ('OR' or 'AND') + if (count($search['params']) > 1) { + $filter = '(' . ($search['operator'] == 'AND' ? '&' : '|') . $filter . ')'; + } + + return $filter; + } + + /** + * Set properties for VLV-based paging + * + * @param number $page Page number to list (starting at 1) + * @param number $size Number of entries to display on one page + */ + public function set_vlv_page($page, $size = 10) + { + $this->list_page = $page; + $this->page_size = $size; + } + + /** + * Turn an LDAP entry into a regular PHP array with attributes as keys. + * + * @param array $entry Attributes array as retrieved from ldap_get_attributes() or ldap_get_entries() + * + * @return array Hash array with attributes as keys + */ + public static function normalize_entry($entry) + { + $rec = array(); + for ($i=0; $i < $entry['count']; $i++) { + $attr = $entry[$i]; + for ($j=0; $j < $entry[$attr]['count']; $j++) { + $rec[$attr][$j] = $entry[$attr][$j]; + } + } + + return $rec; + } + + /** + * Normalize a ldap result by converting entry attribute arrays into single values + */ + public static function normalize_result($_result) + { + if (!is_array($_result)) { + return array(); + } + + $result = array(); + + for ($x = 0; $x < $_result['count']; $x++) { + $dn = $_result[$x]['dn']; + $result[$dn] = array(); + for ($y = 0; $y < $_result[$x]['count']; $y++) { + $attr = $_result[$x][$y]; + if ($_result[$x][$attr]['count'] == 1) { + switch ($attr) { + case 'objectclass': + $result[$dn][$attr] = array(strtolower($_result[$x][$attr][0])); + break; + default: + $result[$dn][$attr] = $_result[$x][$attr][0]; + break; + } + } + else { + $result[$dn][$attr] = array(); + for ($z = 0; $z < $_result[$x][$attr]['count']; $z++) { + switch ($attr) { + case 'objectclass': + $result[$dn][$attr][] = strtolower($_result[$x][$attr][$z]); + break; + default: + $result[$dn][$attr][] = $_result[$x][$attr][$z]; + break; + } + } + } + } + } + + return $result; + } + + public static function scopeint2str($scope) + { + switch ($scope) { + case 2: + return 'sub'; + break; + case 1: + return 'one'; + break; + case 0: + return 'base'; + break; + default: + $this->_debug("Scope $scope is not a valid scope integer"); + break; + } + } + + /** + * Choose the right PHP function according to scope property + * + * @param string $scope The LDAP scope (sub|base|list) + * @param string $ns_function Function to be used for numSubOrdinates queries + * @return string PHP function to be used to query directory + */ + public static function scope_to_function($scope, &$ns_function = null) + { + switch ($scope) { + case 'sub': + $function = $ns_function = 'ldap_search'; + break; + case 'base': + $function = $ns_function = 'ldap_read'; + break; + case 'one': + case 'list': + default: + $function = 'ldap_list'; + $ns_function = 'ldap_read'; + break; + } + + return $function; + } + + private function config_set_config_get_hook($callback) + { + $this->_config_get_hook = $callback; + } + + private function config_set_config_set_hook($callback) + { + $this->_config_set_hook = $callback; + } + + /** + * Sets the debug level both for this class and the ldap connection. + */ + private function config_set_debug($value) + { + $this->config['debug'] = (bool) $value; + if ((int)($value) > 0) { + ldap_set_option(null, LDAP_OPT_DEBUG_LEVEL, (int)($value)); + } + } + + /** + * Sets a log hook that is called with every log message in this module. + */ + private function config_set_log_hook($callback) + { + $this->_log_hook = $callback; + } + + /** + * Find a matching VLV + */ + protected function find_vlv($base_dn, $filter, $scope, $sort_attrs = null) + { + if ($scope == 'base') { + return false; + } + + $vlv_indexes = $this->find_vlv_indexes_and_searches(); + + if (empty($vlv_indexes)) { + return false; + } + + $this->_debug("Existing vlv index and search information", $vlv_indexes); + + $filter = strtolower($filter); + + foreach ($vlv_indexes as $vlv_index) { + if (!empty($vlv_index[$base_dn])) { + $this->_debug("Found a VLV for base_dn: " . $base_dn); + if ($vlv_index[$base_dn]['filter'] == $filter) { + if ($vlv_index[$base_dn]['scope'] == $scope) { + $this->_debug("Scope and filter matches"); + + // Not passing any sort attributes means you don't care + if (!empty($sort_attrs)) { + $sort_attrs = (array) $sort_attrs; + if (count(array_intersect($sort_attrs, $vlv_index[$base_dn]['sort'])) == count($sort_attrs)) { + return $sort_attrs; + } + else { + return false; + } + } + else { + return $vlv_index[$base_dn]['sort'][0]; + } + } + else { + $this->_debug("Scope does not match. VLV: " . var_export($vlv_index[$base_dn]['scope'], true) + . " while looking for " . var_export($scope, true)); + return false; + } + } + else { + $this->_debug("Filter does not match"); + } + } + } + + return false; + } + + /** + * Return VLV indexes and searches including necessary configuration + * details. + */ + protected function find_vlv_indexes_and_searches() + { + if ($this->config['vlv'] === false) { + return false; + } + + if (is_array($this->config['vlv'])) { + return $this->config['vlv']; + } + + if ($this->_vlv_indexes_and_searches !== null) { + return $this->_vlv_indexes_and_searches; + } + + $this->_vlv_indexes_and_searches = array(); + + $config_root_dn = $this->config_get('config_root_dn'); + + if (empty($config_root_dn)) { + return array(); + } + + if ($this->cache && ($cached_config = $this->cache->get('vlvconfig'))) { + $this->_vlv_indexes_and_searches = $cached_config; + return $this->_vlv_indexes_and_searches; + } + + $this->_debug("No VLV information available yet, refreshing"); + + $search_filter = '(objectclass=vlvsearch)'; + $search_result = ldap_search($this->conn, $config_root_dn, $search_filter, array('*'), 0, 0, 0); + + if ($search_result === false) { + $this->_debug("Search for '$search_filter' on '$config_root_dn' failed:".ldap_error($this->conn)); + return; + } + + $vlv_searches = new Net_LDAP3_Result($this->conn, $config_root_dn, $search_filter, 'sub', $search_result); + + if ($vlv_searches->count() < 1) { + $this->_debug("Empty result from search for '(objectclass=vlvsearch)' on '$config_root_dn'"); + return; + } + + $index_filter = '(objectclass=vlvindex)'; + + foreach ($vlv_searches->entries(true) as $vlv_search_dn => $vlv_search_attrs) { + // The attributes we are interested in are as follows: + $_vlv_base_dn = $vlv_search_attrs['vlvbase']; + $_vlv_scope = $vlv_search_attrs['vlvscope']; + $_vlv_filter = $vlv_search_attrs['vlvfilter']; + + // Multiple indexes may exist + $index_result = ldap_search($this->conn, $vlv_search_dn, $index_filter, array('*'), 0, 0, 0); + + if ($index_result === false) { + $this->_debug("Search for '$index_filter' on '$vlv_search_dn' failed:".ldap_error($this->conn)); + continue; + } + + $vlv_indexes = new Net_LDAP3_Result($this->conn, $vlv_search_dn, $index_filter, 'sub', $index_result); + $vlv_indexes = $vlv_indexes->entries(true); + + // Reset this one for each VLV search. + $_vlv_sort = array(); + + foreach ($vlv_indexes as $vlv_index_dn => $vlv_index_attrs) { + $_vlv_sort[] = explode(' ', $vlv_index_attrs['vlvsort']); + } + + $this->_vlv_indexes_and_searches[] = array( + $_vlv_base_dn => array( + 'scope' => self::scopeint2str($_vlv_scope), + 'filter' => strtolower($_vlv_filter), + 'sort' => $_vlv_sort, + ), + ); + } + + // cache this + if ($this->cache) { + $this->cache->set('vlvconfig', $this->_vlv_indexes_and_searches); + } + + return $this->_vlv_indexes_and_searches; + } + + private function init_schema() + { + // use PEAR include if autoloading failed + if (!class_exists('Net_LDAP2')) { + require_once('Net/LDAP2.php'); + } + + $port = $this->config_get('port', 389); + $tls = $this->config_get('use_tls', false); + + foreach ((array) $this->config_get('hosts') as $host) { + $this->_debug("C: Connect [$host:$port]"); + + $_ldap_cfg = array( + 'host' => $host, + 'port' => $port, + 'tls' => $tls, + 'version' => 3, + 'binddn' => $this->config_get('service_bind_dn'), + 'bindpw' => $this->config_get('service_bind_pw') + ); + + $_ldap_schema_cache_cfg = array( + 'path' => "/tmp/" . $host . ":" . ($port ? $port : '389') . "-Net_LDAP2_Schema.cache", + 'max_age' => 86400, + ); + + $_ldap = Net_LDAP2::connect($_ldap_cfg); + + if (!is_a($_ldap, 'Net_LDAP2_Error')) { + $this->_debug("S: OK"); + break; + } + + $this->_debug("S: NOT OK"); + $this->_debug($_ldap->getMessage()); + } + + if (is_a($_ldap, 'Net_LDAP2_Error')) { + return null; + } + + $_ldap_schema_cache = new Net_LDAP2_SimpleFileSchemaCache($_ldap_schema_cache_cfg); + + $_ldap->registerSchemaCache($_ldap_schema_cache); + + // TODO: We should learn what LDAP tech. we're running against. + // Perhaps with a scope base objectclass recognize rootdse entry + $schema_root_dn = $this->config_get('schema_root_dn'); + + if (!$schema_root_dn) { + $_schema = $_ldap->schema(); + } + + return $_schema; + } + + private function list_group_member($dn, $members, $recurse = true) + { + $this->_debug("Called list_group_member(" . $dn . ")"); + + $members = (array) $members; + $group_members = array(); + + // remove possible 'count' item + unset($members['count']); + + // Use the member attributes to return an array of member ldap objects + // NOTE that the member attribute is supposed to contain a DN + foreach ($members as $member) { + $member_entry = $this->get_entry($member, array('member', 'uniquemember', 'memberurl', 'objectclass')); + + if (empty($member_entry)) { + continue; + } + + $group_members[$member] = $member; + + if ($recurse) { + // Nested groups + $group_group_members = $this->list_group_members($member, $member_entry); + if ($group_group_members) { + $group_members = array_merge($group_group_members, $group_members); + } + } + } + + return array_filter($group_members); + } + + private function list_group_uniquemember($dn, $uniquemembers, $recurse = true) + { + $this->_debug("Called list_group_uniquemember(" . $dn . ")", $entry); + + $uniquemembers = (array)($uniquemembers); + $group_members = array(); + + // remove possible 'count' item + unset($uniquemembers['count']); + + foreach ($uniquemembers as $member) { + $member_entry = $this->get_entry($member, array('member', 'uniquemember', 'memberurl', 'objectclass')); + + if (empty($member_entry)) { + continue; + } + + $group_members[$member] = $member; + + if ($recurse) { + // Nested groups + $group_group_members = $this->list_group_members($member, $member_entry); + if ($group_group_members) { + $group_members = array_merge($group_group_members, $group_members); + } + } + } + + return array_filter($group_members); + } + + private function list_group_memberurl($dn, $memberurls, $recurse = true) + { + $this->_debug("Called list_group_memberurl(" . $dn . ")"); + + $group_members = array(); + $memberurls = (array) $memberurls; + $attributes = array('member', 'uniquemember', 'memberurl', 'objectclass'); + + // remove possible 'count' item + unset($memberurls['count']); + + foreach ($memberurls as $url) { + $ldap_uri = $this->parse_memberurl($url); + $result = $this->search($ldap_uri[3], $ldap_uri[6], 'sub', $attributes); + + if (!$result) { + continue; + } + + foreach ($result->entries(true) as $entry_dn => $_entry) { + $group_members[$entry_dn] = $entry_dn; + $this->_debug("Found " . $entry_dn); + + if ($recurse) { + // Nested group + $group_group_members = $this->list_group_members($entry_dn, $_entry); + if ($group_group_members) { + $group_members = array_merge($group_members, $group_group_members); + } + } + } + } + + return array_filter($group_members); + } + + /** + * memberUrl attribute parser + * + * @param string $url URL string + * + * @return array URL elements + */ + private function parse_memberurl($url) + { + preg_match('/(.*):\/\/(.*)\/(.*)\?(.*)\?(.*)\?(.*)/', $url, $matches); + return $matches; + } + + private function modify_entry_attributes($subject_dn, $attributes) + { + // Opportunities to set false include failed ldap commands. + $result = true; + + if (is_array($attributes['rename']) && !empty($attributes['rename'])) { + $olddn = $attributes['rename']['dn']; + $newrdn = $attributes['rename']['new_rdn']; + + if (!empty($attributes['rename']['new_parent'])) { + $new_parent = $attributes['rename']['new_parent']; + } + else { + $new_parent = null; + } + + $this->_debug("LDAP: C: Rename $olddn to $newrdn,$new_parent"); + + $result = ldap_rename($this->conn, $olddn, $newrdn, $new_parent, true); + + if ($result) { + $this->_debug("LDAP: S: OK"); + + if ($new_parent) { + $subject_dn = $newrdn . ',' . $new_parent; + } + else { + $old_parent_dn_components = ldap_explode_dn($olddn, 0); + unset($old_parent_dn_components["count"]); + $old_rdn = array_shift($old_parent_dn_components); + $old_parent_dn = implode(",", $old_parent_dn_components); + $subject_dn = $newrdn . ',' . $old_parent_dn; + } + } + else { + $this->_debug("LDAP: S: " . ldap_error($this->conn)); + $this->_warning("LDAP: Failed to rename $olddn to $newrdn,$new_parent"); + return false; + } + } + + if (is_array($attributes['replace']) && !empty($attributes['replace'])) { + $this->_debug("LDAP: C: Mod-Replace $subject_dn: " . json_encode($attributes['replace'])); + + $result = ldap_mod_replace($this->conn, $subject_dn, $attributes['replace']); + + if ($result) { + $this->_debug("LDAP: S: OK"); + } + else { + $this->_debug("LDAP: S: " . ldap_error($this->conn)); + $this->_warning("LDAP: Failed to replace attributes on $subject_dn: " . json_encode($attributes['replace'])); + return false; + } + } + + if (is_array($attributes['del']) && !empty($attributes['del'])) { + $this->_debug("LDAP: C: Mod-Delete $subject_dn: " . json_encode($attributes['del'])); + + $result = ldap_mod_del($this->conn, $subject_dn, $attributes['del']); + + if ($result) { + $this->_debug("LDAP: S: OK"); + } + else { + $this->_debug("LDAP: S: " . ldap_error($this->conn)); + $this->_warning("LDAP: Failed to delete attributes on $subject_dn: " . json_encode($attributes['del'])); + return false; + } + } + + if (is_array($attributes['add']) && !empty($attributes['add'])) { + $this->_debug("LDAP: C: Mod-Add $subject_dn: " . json_encode($attributes['add'])); + + $result = ldap_mod_add($this->conn, $subject_dn, $attributes['add']); + + if ($result) { + $this->_debug("LDAP: S: OK"); + } + else { + $this->_debug("LDAP: S: " . ldap_error($this->conn)); + $this->_warning("LDAP: Failed to add attributes on $subject_dn: " . json_encode($attributes['add'])); + return false; + } + } + + return true; + } + + private function parse_attribute_level_rights($attribute_value) + { + $attribute_value = str_replace(", ", ",", $attribute_value); + $attribute_values = explode(",", $attribute_value); + $attribute_value = array(); + + foreach ($attribute_values as $access_right) { + $access_right_components = explode(":", $access_right); + $access_attribute = strtolower(array_shift($access_right_components)); + $access_value = array_shift($access_right_components); + + $attribute_value[$access_attribute] = array(); + + for ($i = 0; $i < strlen($access_value); $i++) { + $method = $this->attribute_level_rights_map[substr($access_value, $i, 1)]; + + if (!in_array($method, $attribute_value[$access_attribute])) { + $attribute_value[$access_attribute][] = $method; + } + } + } + + return $attribute_value; + } + + private function parse_entry_level_rights($attribute_value) + { + $_attribute_value = array(); + + for ($i = 0; $i < strlen($attribute_value); $i++) { + $method = $this->entry_level_rights_map[substr($attribute_value, $i, 1)]; + + if (!in_array($method, $_attribute_value)) { + $_attribute_value[] = $method; + } + } + + return $_attribute_value; + } + + private function supported_controls() + { + if (!empty($this->supported_controls)) { + return $this->supported_controls; + } + + $this->_info("Obtaining supported controls"); + + if ($result = $this->search('', '(objectclass=*)', 'base', array('supportedcontrol'))) { + $result = $result->entries(true); + $control = $result['']['supportedcontrol']; + } + else { + $control = array(); + } + + $this->_info("Obtained " . count($control) . " supported controls"); + $this->supported_controls = $control; + + return $control; + } + + protected function _alert() + { + $this->__log(LOG_ALERT, func_get_args()); + } + + protected function _critical() + { + $this->__log(LOG_CRIT, func_get_args()); + } + + protected function _debug() + { + $this->__log(LOG_DEBUG, func_get_args()); + } + + protected function _emergency() + { + $this->__log(LOG_EMERG, func_get_args()); + } + + protected function _error() + { + $this->__log(LOG_ERR, func_get_args()); + } + + protected function _info() + { + $this->__log(LOG_INFO, func_get_args()); + } + + protected function _notice() + { + $this->__log(LOG_NOTICE, func_get_args()); + } + + protected function _warning() + { + $this->__log(LOG_WARNING, func_get_args()); + } + + /** + * Log a message. + */ + private function __log($level, $args) + { + $msg = array(); + + foreach ($args as $arg) { + $msg[] = !is_string($arg) ? var_export($arg, true) : $arg; + } + + if (!empty($this->_log_hook)) { + call_user_func_array($this->_log_hook, array($level, $msg)); + return; + } + + if ($this->debug_level > 0) { + syslog($level, implode("\n", $msg)); + } + } + + /** + * Add BER sequence with correct length and the given identifier + */ + private static function _ber_addseq($str, $identifier) + { + $len = dechex(strlen($str)/2); + if (strlen($len) % 2 != 0) { + $len = '0'.$len; + } + + return $identifier . $len . $str; + } + + /** + * Returns BER encoded integer value in hex format + */ + private static function _ber_encode_int($offset) + { + $val = dechex($offset); + $prefix = ''; + + // check if bit 8 of high byte is 1 + if (preg_match('/^[89abcdef]/', $val)) { + $prefix = '00'; + } + + if (strlen($val)%2 != 0) { + $prefix .= '0'; + } + + return $prefix . $val; + } + + /** + * Quotes attribute value string + * + * @param string $str Attribute value + * @param bool $dn True if the attribute is a DN + * + * @return string Quoted string + */ + public static function quote_string($str, $is_dn = false) + { + // take firt entry if array given + if (is_array($str)) { + $str = reset($str); + } + + if ($is_dn) { + $replace = array( + ',' => '\2c', + '=' => '\3d', + '+' => '\2b', + '<' => '\3c', + '>' => '\3e', + ';' => '\3b', + "\\"=> '\5c', + '"' => '\22', + '#' => '\23' + ); + } + else { + $replace = array( + '*' => '\2a', + '(' => '\28', + ')' => '\29', + "\\" => '\5c', + '/' => '\2f' + ); + } + + return strtr($str, $replace); + } + + /** + * create ber encoding for sort control + * + * @param array List of cols to sort by + * @return string BER encoded option value + */ + private static function _sort_ber_encode($sortcols) + { + $str = ''; + foreach (array_reverse((array)$sortcols) as $col) { + $ber_val = self::_string2hex($col); + + // 30 = ber sequence with a length of octet value + // 04 = octet string with a length of the ascii value + $oct = self::_ber_addseq($ber_val, '04'); + $str = self::_ber_addseq($oct, '30') . $str; + } + + // now tack on sequence identifier and length + $str = self::_ber_addseq($str, '30'); + + return pack('H'.strlen($str), $str); + } + + /** + * Returns ascii string encoded in hex + */ + private static function _string2hex($str) + { + $hex = ''; + for ($i=0; $i < strlen($str); $i++) + $hex .= dechex(ord($str[$i])); + + return $hex; + } + + /** + * Generate BER encoded string for Virtual List View option + * + * @param integer List offset (first record) + * @param integer Records per page + * @return string BER encoded option value + */ + private static function _vlv_ber_encode($offset, $rpp, $search = '') + { + // This string is ber-encoded, php will prefix this value with: + // 04 (octet string) and 10 (length of 16 bytes) + // the code behind this string is broken down as follows: + // 30 = ber sequence with a length of 0e (14) bytes following + // 02 = type integer (in two's complement form) with 2 bytes following (beforeCount): 01 00 (ie 0) + // 02 = type integer (in two's complement form) with 2 bytes following (afterCount): 01 18 (ie 25-1=24) + // a0 = type context-specific/constructed with a length of 06 (6) bytes following + // 02 = type integer with 2 bytes following (offset): 01 01 (ie 1) + // 02 = type integer with 2 bytes following (contentCount): 01 00 + + // whith a search string present: + // 81 = type context-specific/constructed with a length of 04 (4) bytes following (the length will change here) + // 81 indicates a user string is present where as a a0 indicates just a offset search + // 81 = type context-specific/constructed with a length of 06 (6) bytes following + + // the following info was taken from the ISO/IEC 8825-1:2003 x.690 standard re: the + // encoding of integer values (note: these values are in + // two-complement form so since offset will never be negative bit 8 of the + // leftmost octet should never by set to 1): + // 8.3.2: If the contents octets of an integer value encoding consist + // of more than one octet, then the bits of the first octet (rightmost) and bit 8 + // of the second (to the left of first octet) octet: + // a) shall not all be ones; and + // b) shall not all be zero + + if ($search) { + $search = preg_replace('/[^-[:alpha:] ,.()0-9]+/', '', $search); + $ber_val = self::_string2hex($search); + $str = self::_ber_addseq($ber_val, '81'); + } + else { + // construct the string from right to left + $str = "020100"; # contentCount + + // returns encoded integer value in hex format + $ber_val = self::_ber_encode_int($offset); + + // calculate octet length of $ber_val + $str = self::_ber_addseq($ber_val, '02') . $str; + + // now compute length over $str + $str = self::_ber_addseq($str, 'a0'); + } + + // now tack on records per page + $str = "020100" . self::_ber_addseq(self::_ber_encode_int($rpp-1), '02') . $str; + + // now tack on sequence identifier and length + $str = self::_ber_addseq($str, '30'); + + return pack('H'.strlen($str), $str); + } + + private function _fuzzy_search_prefix() + { + switch ($this->config_get("fuzzy_search", 2)) { + case 2: + return "*"; + break; + case 1: + case 0: + default: + return ""; + break; + } + } + + private function _fuzzy_search_suffix() + { + switch ($this->config_get("fuzzy_search", 2)) { + case 2: + return "*"; + break; + case 1: + return "*"; + case 0: + default: + return ""; + break; + } + } + + /** + * Return the search string value to be used in VLV controls + */ + private function _vlv_search($sort, $search) + { + if (!empty($this->additional_filter)) { + $this->_debug("Not setting a VLV search filter because we already have a filter"); + return; + } + + if (empty($search)) { + return; + } + + $search_suffix = $this->_fuzzy_search_suffix(); + + foreach ($search as $attr => $value) { + if (!in_array(strtolower($attr), $sort)) { + $this->_debug("Cannot use VLV search using attribute not indexed: $attr (not in " . var_export($sort, true) . ")"); + return; + } + else { + return $value . $search_suffix; + } + } + } + + /** + * Set server controls for Virtual List View (paginated listing) + */ + private function _vlv_set_controls($sort, $list_page, $page_size, $search = null) + { + $sort_ctrl = array( + 'oid' => "1.2.840.113556.1.4.473", + 'value' => self::_sort_ber_encode($sort) + ); + + if (!empty($search)) { + $this->_debug("_vlv_set_controls to include search: " . var_export($search, true)); + } + + $vlv_ctrl = array( + 'oid' => "2.16.840.1.113730.3.4.9", + 'value' => self::_vlv_ber_encode( + $offset = ($list_page-1) * $page_size + 1, + $page_size, + $search + ), + 'iscritical' => true + ); + + $this->_debug("C: set controls sort=" . join(' ', unpack('H'.(strlen($sort_ctrl['value'])*2), $sort_ctrl['value'])) + . " (" . implode(',', (array) $sort) . ");" + . " vlv=" . join(' ', (unpack('H'.(strlen($vlv_ctrl['value'])*2), $vlv_ctrl['value']))) . " ($offset/$page_size)"); + + if (!ldap_set_option($this->conn, LDAP_OPT_SERVER_CONTROLS, array($sort_ctrl, $vlv_ctrl))) { + $this->_debug("S: ".ldap_error($this->conn)); + $this->set_error(self::ERROR_SEARCH, 'vlvnotsupported'); + + return false; + } + + return true; + } + +} diff --git a/program/lib/Net/LDAP3/Result.php b/program/lib/Net/LDAP3/Result.php new file mode 100644 index 000000000..728b30442 --- /dev/null +++ b/program/lib/Net/LDAP3/Result.php @@ -0,0 +1,139 @@ + | + | Jeroen van Meeuwen | + +-----------------------------------------------------------------------+ +*/ + +/** + * Model class representing an LDAP search result + * + * @package LDAP + */ +class Net_LDAP3_Result implements Iterator +{ + protected $conn; + protected $base_dn; + protected $filter; + protected $scope; + + private $count; + private $current; + private $iteratorkey = 0; + + /** + * Default constructor + * + * @param resource $conn LDAP link identifier + * @param string $base_dn Base DN used to get this result + * @param string $filter Filter query used to get this result + * @param string $scope Scope of the result + * @param resource $result LDAP result entry identifier + */ + function __construct($conn, $base_dn, $filter, $scope, $result) + { + $this->conn = $conn; + $this->base_dn = $base_dn; + $this->filter = $filter; + $this->scope = $scope; + $this->result = $result; + } + + public function get($property, $default = null) + { + if (isset($this->$property)) { + return $this->$property; + } else { + return $default; + } + } + + public function set($property, $value) + { + $this->$property = $value; + } + + /** + * + */ + public function sort($attr) + { + return ldap_sort($this->conn, $this->result, $attr); + } + + /** + * + */ + public function count() + { + if (!isset($this->count)) + $this->count = ldap_count_entries($this->conn, $this->result); + + return $this->count; + } + + /** + * + */ + public function entries($normalize = false) + { + $entries = ldap_get_entries($this->conn, $this->result); + + if ($normalize) { + return Net_LDAP3::normalize_result($entries); + } + + return $entries; + } + + + /*** Implement PHP 5 Iterator interface to make foreach work ***/ + + function current() + { + $attrib = ldap_get_attributes($this->conn, $this->current); + $attrib['dn'] = ldap_get_dn($this->conn, $this->current); + + return $attrib; + } + + function key() + { + return $this->iteratorkey; + } + + function rewind() + { + $this->iteratorkey = 0; + $this->current = ldap_first_entry($this->conn, $this->result); + } + + function next() + { + $this->iteratorkey++; + $this->current = ldap_next_entry($this->conn, $this->current); + } + + function valid() + { + return (bool)$this->current; + } + +} diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index 5a4b9dd61..7fdcbc806 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -232,8 +232,7 @@ class rcube_ldap extends rcube_addressbook // initialize ldap wrapper object $this->ldap = new rcube_ldap_generic($this->prop); - $this->ldap->set_cache($this->cache); - $this->ldap->set_debug($this->debug); + $this->ldap->config_set(array('cache' => $this->cache, 'debug' => $this->debug)); $this->_connect(); } @@ -320,8 +319,7 @@ class rcube_ldap extends rcube_addressbook // we need to use a separate LDAP connection if (!empty($this->prop['vlv'])) { $ldap = new rcube_ldap_generic($this->prop); - $ldap->set_debug($this->debug); - $ldap->set_cache($this->cache); + $ldap->config_set(array('cache' => $this->cache, 'debug' => $this->debug)); if (!$ldap->connect($host)) { continue; } @@ -1066,7 +1064,7 @@ class rcube_ldap extends rcube_addressbook } } - if (!$this->ldap->add($dn, $newentry)) { + if (!$this->ldap->add_entry($dn, $newentry)) { $this->set_error(self::ERROR_SAVING, 'errorsaving'); return false; } @@ -1078,7 +1076,7 @@ class rcube_ldap extends rcube_addressbook 'objectClass' => (array) $this->prop['sub_fields'][$xidx], ); - $this->ldap->add($xdn, $xf); + $this->ldap->add_entry($xdn, $xf); } $dn = self::dn_encode($dn); @@ -1221,7 +1219,7 @@ class rcube_ldap extends rcube_addressbook if (!empty($subdeldata)) { foreach ($subdeldata as $fld => $val) { $subdn = $fld.'='.rcube_ldap_generic::quote_string($val).','.$dn; - if (!$this->ldap->delete($subdn)) { + if (!$this->ldap->delete_entry($subdn)) { return false; } } @@ -1265,7 +1263,7 @@ class rcube_ldap extends rcube_addressbook $fld => $val, 'objectClass' => (array) $this->prop['sub_fields'][$fld], ); - $this->ldap->add($subdn, $xf); + $this->ldap->add_entry($subdn, $xf); } } @@ -1295,7 +1293,7 @@ class rcube_ldap extends rcube_addressbook if ($this->sub_filter) { if ($entries = $this->ldap->list_entries($dn, $this->sub_filter)) { foreach ($entries as $entry) { - if (!$this->ldap->delete($entry['dn'])) { + if (!$this->ldap->delete_entry($entry['dn'])) { $this->set_error(self::ERROR_SAVING, 'errorsaving'); return false; } @@ -1304,12 +1302,12 @@ class rcube_ldap extends rcube_addressbook } // Delete the record. - if (!$this->ldap->delete($dn)) { + if (!$this->ldap->delete_entry($dn)) { $this->set_error(self::ERROR_SAVING, 'errorsaving'); return false; } - // remove contact from all groups where he was member + // remove contact from all groups where he was a member if ($this->groups) { $dn = self::dn_encode($dn); $group_ids = $this->get_record_groups($dn); @@ -1342,7 +1340,7 @@ class rcube_ldap extends rcube_addressbook if ($with_groups && $this->groups && ($groups = $this->_fetch_groups()) && count($groups)) { foreach ($groups as $group) { - $this->ldap->delete($group['dn']); + $this->ldap->delete_entry($group['dn']); } if ($this->cache) { @@ -1567,7 +1565,7 @@ class rcube_ldap extends rcube_addressbook $this->debug = $dbg; if ($this->ldap) { - $this->ldap->set_debug($dbg); + $this->ldap->config_set('debug', $dbg); } } @@ -1666,7 +1664,7 @@ class rcube_ldap extends rcube_addressbook } $ldap = clone $this->ldap; - $ldap->set_config($this->prop['groups']); + $ldap->config_set($this->prop['groups']); $ldap->set_vlv_page($vlv_page+1, $page_size); } @@ -1790,7 +1788,7 @@ class rcube_ldap extends rcube_addressbook $member_attr => '', ); - if (!$this->ldap->add($new_dn, $new_entry)) { + if (!$this->ldap->add_entry($new_dn, $new_entry)) { $this->set_error(self::ERROR_SAVING, 'errorsaving'); return false; } @@ -1813,7 +1811,7 @@ class rcube_ldap extends rcube_addressbook $group_cache = $this->_fetch_groups(); $del_dn = $group_cache[$group_id]['dn']; - if (!$this->ldap->delete($del_dn)) { + if (!$this->ldap->delete_entry($del_dn)) { $this->set_error(self::ERROR_SAVING, 'errorsaving'); return false; } diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index 25fe2e5d2..a88e53c0e 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -5,8 +5,8 @@ | Roundcube/rcube_ldap_generic.php | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2006-2013, The Roundcube Dev Team | - | Copyright (C) 2012-2013, Kolab Systems AG | + | Copyright (C) 2006-2014, The Roundcube Dev Team | + | Copyright (C) 2012-2014, Kolab Systems AG | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,464 +21,124 @@ +-----------------------------------------------------------------------+ */ - -/* - LDAP connection properties - -------------------------- - - $prop = array( - 'host' => '', - // or - 'hosts' => array('directory.verisign.com'), - 'port' => 389, - 'use_tls' => true|false, - 'ldap_version' => 3, // using LDAPv3 - 'auth_method' => '', // SASL authentication method (for proxy auth), e.g. DIGEST-MD5 - 'attributes' => array('dn'), // List of attributes to read from the server - 'vlv' => false, // Enable Virtual List View to more efficiently fetch paginated data (if server supports it) - 'config_root_dn' => 'cn=config', // Root DN to read config (e.g. vlv indexes) from - 'numsub_filter' => '(objectClass=organizationalUnit)', // with VLV, we also use numSubOrdinates to query the total number of records. Set this filter to get all numSubOrdinates attributes for counting - 'sizelimit' => '0', // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. - 'timelimit' => '0', // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. - 'network_timeout' => 10, // The timeout (in seconds) for connect + bind arrempts. This is only supported in PHP >= 5.3.0 with OpenLDAP 2.x - 'referrals' => true|false, // Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups - ); -*/ - /** * Model class to access an LDAP directories * * @package Framework * @subpackage LDAP */ -class rcube_ldap_generic +class rcube_ldap_generic extends Net_LDAP3 { - const UPDATE_MOD_ADD = 1; - const UPDATE_MOD_DELETE = 2; - const UPDATE_MOD_REPLACE = 4; - const UPDATE_MOD_FULL = 7; - - public $conn; - public $vlv_active = false; - /** private properties */ protected $cache = null; - protected $config = array(); protected $attributes = array('dn'); - protected $entries = null; - protected $result = null; - protected $debug = false; - protected $list_page = 1; - protected $page_size = 10; - protected $vlv_config = null; - - /** - * Object constructor - * - * @param array $p LDAP connection properties - */ - function __construct($p) + function __construct($config = null) { - $this->config = $p; + parent::__construct($config); - if (is_array($p['attributes'])) - $this->attributes = $p['attributes']; - - if (!is_array($p['hosts']) && !empty($p['host'])) - $this->config['hosts'] = array($p['host']); + $this->config_set('log_hook', array($this, 'log')); } /** - * Activate/deactivate debug mode - * - * @param boolean $dbg True if LDAP commands should be logged + * Establish a connection to the LDAP server */ - public function set_debug($dbg = true) - { - $this->debug = $dbg; - } - - /** - * Set connection options - * - * @param mixed $opt Option name as string or hash array with multiple options - * @param mixed $val Option value - */ - public function set_config($opt, $val = null) - { - if (is_array($opt)) - $this->config = array_merge($this->config, $opt); - else - $this->config[$opt] = $value; - } - - /** - * Enable caching by passing an instance of rcube_cache to be used by this object - * - * @param object rcube_cache Instance or False to disable caching - */ - public function set_cache($cache_engine) - { - $this->cache = $cache_engine; - } - - /** - * Set properties for VLV-based paging - * - * @param number $page Page number to list (starting at 1) - * @param number $size Number of entries to display on one page - */ - public function set_vlv_page($page, $size = 10) - { - $this->list_page = $page; - $this->page_size = $size; - } - - /** - * Establish a connection to the LDAP server - */ public function connect($host = null) { - if (!function_exists('ldap_connect')) { - rcube::raise_error(array('code' => 100, 'type' => 'ldap', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "No ldap support in this installation of PHP"), - true); - return false; - } - - if (is_resource($this->conn) && $this->config['host'] == $host) - return true; - - if (empty($this->config['ldap_version'])) - $this->config['ldap_version'] = 3; - - // iterate over hosts if none specified - if (!$host) { - if (!is_array($this->config['hosts'])) - $this->config['hosts'] = array($this->config['hosts']); - - foreach ($this->config['hosts'] as $host) { - if (!empty($host) && $this->connect($host)) { - return true; - } - } - - return false; - } - - // open connection to the given $host - $host = rcube_utils::idn_to_ascii(rcube_utils::parse_host($host)); - $hostname = $host . ($this->config['port'] ? ':'.$this->config['port'] : ''); - - $this->_debug("C: Connect to $hostname [{$this->config['name']}]"); - - if ($lc = @ldap_connect($host, $this->config['port'])) { - if ($this->config['use_tls'] === true) { - if (!ldap_start_tls($lc)) { - return false; - } - } - - $this->_debug("S: OK"); - - ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $this->config['ldap_version']); - $this->config['host'] = $host; - $this->conn = $lc; - - if (!empty($this->config['network_timeout'])) - ldap_set_option($lc, LDAP_OPT_NETWORK_TIMEOUT, $this->config['network_timeout']); + // Net_LDAP3 does not support IDNA yet + // also parse_host() here is very Roundcube specific + $host = rcube_utils::idn_to_ascii(rcube_utils::parse_host($host)); - if (isset($this->config['referrals'])) - ldap_set_option($lc, LDAP_OPT_REFERRALS, $this->config['referrals']); - - if (isset($this->config['dereference'])) - ldap_set_option($lc, LDAP_OPT_DEREF, $this->config['dereference']); - } - else { - $this->_debug("S: NOT OK"); - } - - if (!is_resource($this->conn)) { - rcube::raise_error(array('code' => 100, 'type' => 'ldap', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Could not connect to any LDAP server, last tried $hostname"), - true); - return false; - } - - return true; + return parent::connect($host); } /** - * Bind connection with (SASL-) user and password + * Get a specific LDAP entry, identified by its DN * - * @param string $authc Authentication user - * @param string $pass Bind password - * @param string $authz Autorization user + * @param string $dn Record identifier * - * @return boolean True on success, False on error + * @return array Hash array */ - public function sasl_bind($authc, $pass, $authz=null) + function get_entry($dn) { - if (!$this->conn) { - return false; - } - - if (!function_exists('ldap_sasl_bind')) { - rcube::raise_error(array('code' => 100, 'type' => 'ldap', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Unable to bind: ldap_sasl_bind() not exists"), - true); - return false; - } - - if (!empty($authz)) { - $authz = 'u:' . $authz; - } - - if (!empty($this->config['auth_method'])) { - $method = $this->config['auth_method']; - } - else { - $method = 'DIGEST-MD5'; - } - - $this->_debug("C: SASL Bind [mech: $method, authc: $authc, authz: $authz, pass: **** [" . strlen($pass) . "]"); - - if (ldap_sasl_bind($this->conn, NULL, $pass, $method, NULL, $authc, $authz)) { - $this->_debug("S: OK"); - return true; - } - - $this->_debug("S: ".ldap_error($this->conn)); - - rcube::raise_error(array( - 'code' => ldap_errno($this->conn), 'type' => 'ldap', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "SASL Bind failed for authcid=$authc ".ldap_error($this->conn)), - true); - return false; + return parent::get_entry($dn, $this->attributes); } /** - * Bind connection with DN and password - * - * @param string $dn Bind DN - * @param string $pass Bind password - * - * @return boolean True on success, False on error + * Prints debug/error info to the log */ - public function bind($dn, $pass) + public function log($level, $msg) { - if (!$this->conn) { - return false; - } - - $this->_debug("C: Bind $dn, pass: **** [" . strlen($pass) . "]"); - - if (@ldap_bind($this->conn, $dn, $pass)) { - $this->_debug("S: OK"); - return true; - } - - $this->_debug("S: ".ldap_error($this->conn)); + $msg = implode("\n", $msg); - rcube::raise_error(array( - 'code' => ldap_errno($this->conn), 'type' => 'ldap', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)), - true); + switch ($level) { + case LOG_DEBUG: + case LOG_INFO: + case LOG_NOTICE: + if ($this->config['debug']) { + rcube::write_log('ldap', $msg); + } + break; - return false; - } + case LOG_EMERGE: + case LOG_ALERT: + case LOG_CRIT: + rcube::raise_error($msg, true, true); + break; - /** - * Close connection to LDAP server - */ - public function close() - { - if ($this->conn) { - $this->_debug("C: Close"); - ldap_unbind($this->conn); - $this->conn = null; + case LOG_ERR: + case LOG_WARNING: + rcube::raise_error($msg, true, false); + break; } } /** - * Return the last result set - * - * @return object rcube_ldap_result Result object + * @deprecated */ - function get_result() + public function set_debug($dbg = true) { - return $this->result; + $this->config['debug'] = (bool) $dbg; } /** - * Get a specific LDAP entry, identified by its DN - * - * @param string $dn Record identifier - * @return array Hash array + * @deprecated */ - function get_entry($dn) + public function set_cache($cache_engine) { - $rec = null; - - if ($this->conn && $dn) { - $this->_debug("C: Read $dn [(objectclass=*)]"); - - if ($ldap_result = @ldap_read($this->conn, $dn, '(objectclass=*)', $this->attributes)) { - $this->_debug("S: OK"); - - if ($entry = ldap_first_entry($this->conn, $ldap_result)) { - $rec = ldap_get_attributes($this->conn, $entry); - } - } - else { - $this->_debug("S: ".ldap_error($this->conn)); - } - - if (!empty($rec)) { - $rec['dn'] = $dn; // Add in the dn for the entry. - } - } - - return $rec; + $this->config['cache'] = $cache_engine; } /** - * Execute the LDAP search based on the stored credentials - * - * @param string $base_dn The base DN to query - * @param string $filter The LDAP filter for search - * @param string $scope The LDAP scope (list|sub|base) - * @param array $attrs List of entry attributes to read - * @param array $prop Hash array with query configuration properties: - * - sort: array of sort attributes (has to be in sync with the VLV index) - * - search: search string used for VLV controls - * @param boolean $count_only Set to true if only entry count is requested - * - * @return mixed rcube_ldap_result object or number of entries (if count_only=true) or false on error + * @deprecated */ - public function search($base_dn, $filter = '', $scope = 'sub', $attrs = array('dn'), $prop = array(), $count_only = false) + public static function scope2func($scope, &$ns_function = null) { - if (!$this->conn) { - return false; - } - - if (empty($filter)) { - $filter = '(objectclass=*)'; - } - - $this->_debug("C: Search $base_dn for $filter"); - - $function = self::scope2func($scope, $ns_function); - - // find available VLV index for this query - if (!$count_only && ($vlv_sort = $this->_find_vlv($base_dn, $filter, $scope, $prop['sort']))) { - // when using VLV, we get the total count by... - // ...either reading numSubOrdinates attribute - if (($sub_filter = $this->config['numsub_filter']) && - ($result_count = @$ns_function($this->conn, $base_dn, $sub_filter, array('numSubOrdinates'), 0, 0, 0)) - ) { - $counts = ldap_get_entries($this->conn, $result_count); - for ($vlv_count = $j = 0; $j < $counts['count']; $j++) - $vlv_count += $counts[$j]['numsubordinates'][0]; - $this->_debug("D: total numsubordinates = " . $vlv_count); - } - // ...or by fetching all records dn and count them - else if (!function_exists('ldap_parse_virtuallist_control')) { - $vlv_count = $this->search($base_dn, $filter, $scope, array('dn'), $prop, true); - } - - $this->vlv_active = $this->_vlv_set_controls($vlv_sort, $this->list_page, $this->page_size, $prop['search']); - } - else { - $this->vlv_active = false; - } - - // only fetch dn for count (should keep the payload low) - if ($ldap_result = @$function($this->conn, $base_dn, $filter, - $attrs, 0, (int)$this->config['sizelimit'], (int)$this->config['timelimit']) - ) { - // when running on a patched PHP we can use the extended functions - // to retrieve the total count from the LDAP search result - if ($this->vlv_active && function_exists('ldap_parse_virtuallist_control')) { - if (ldap_parse_result($this->conn, $ldap_result, $errcode, $matcheddn, $errmsg, $referrals, $serverctrls)) { - ldap_parse_virtuallist_control($this->conn, $serverctrls, $last_offset, $vlv_count, $vresult); - $this->_debug("S: VLV result: last_offset=$last_offset; content_count=$vlv_count"); - } - else { - $this->_debug("S: ".($errmsg ? $errmsg : ldap_error($this->conn))); - } - } - else if ($this->debug) { - $this->_debug("S: ".ldap_count_entries($this->conn, $ldap_result)." record(s) found"); - } - - $this->result = new rcube_ldap_result($this->conn, $ldap_result, $base_dn, $filter, $vlv_count); - - return $count_only ? $this->result->count() : $this->result; - } - else { - $this->_debug("S: ".ldap_error($this->conn)); - } - - return false; + return self::scope_to_function($scope, $ns_function); } /** - * Modify an LDAP entry on the server - * - * @param string $dn Entry DN - * @param array $params Hash array of entry attributes - * @param int $mode Update mode (UPDATE_MOD_ADD | UPDATE_MOD_DELETE | UPDATE_MOD_REPLACE) + * @deprecated */ - public function modify($dn, $parms, $mode = 255) + public function set_config($opt, $val = null) { - // TODO: implement this - - return false; + $this->config_set($opt, $val); } /** - * Wrapper for ldap_add() - * - * @see ldap_add() + * @deprecated */ public function add($dn, $entry) { - $this->_debug("C: Add $dn: ".print_r($entry, true)); - - $res = ldap_add($this->conn, $dn, $entry); - if ($res === false) { - $this->_debug("S: ".ldap_error($this->conn)); - return false; - } - - $this->_debug("S: OK"); - return true; + return $this->add_entry($dn, $entry); } /** - * Wrapper for ldap_delete() - * - * @see ldap_delete() + * @deprecated */ public function delete($dn) { - $this->_debug("C: Delete $dn"); - - $res = ldap_delete($this->conn, $dn); - if ($res === false) { - $this->_debug("S: ".ldap_error($this->conn)); - return false; - } - - $this->_debug("S: OK"); - return true; + return $this->delete_entry($dn); } /** @@ -595,9 +255,6 @@ class rcube_ldap_generic $this->_debug("C: Read $dn [{$filter}]"); if ($this->conn && $dn) { - if (!$attributes) - $attributes = $this->attributes; - $result = @ldap_read($this->conn, $dn, $filter, $attributes, 0, (int)$this->config['sizelimit'], (int)$this->config['timelimit']); if ($result === false) { $this->_debug("S: ".ldap_error($this->conn)); @@ -610,452 +267,7 @@ class rcube_ldap_generic return false; } - - /** - * Choose the right PHP function according to scope property - * - * @param string $scope The LDAP scope (sub|base|list) - * @param string $ns_function Function to be used for numSubOrdinates queries - * @return string PHP function to be used to query directory - */ - public static function scope2func($scope, &$ns_function = null) - { - switch ($scope) { - case 'sub': - $function = $ns_function = 'ldap_search'; - break; - case 'base': - $function = $ns_function = 'ldap_read'; - break; - default: - $function = 'ldap_list'; - $ns_function = 'ldap_read'; - break; - } - - return $function; - } - - /** - * Convert the given scope integer value to a string representation - */ - public static function scopeint2str($scope) - { - switch ($scope) { - case 2: return 'sub'; - case 1: return 'one'; - case 0: return 'base'; - default: $this->_debug("Scope $scope is not a valid scope integer"); - } - - return ''; - } - - /** - * Escapes the given value according to RFC 2254 so that it can be safely used in LDAP filters. - * - * @param string $val Value to quote - * @return string The escaped value - */ - public static function escape_value($val) - { - return strtr($str, array('*'=>'\2a', '('=>'\28', ')'=>'\29', - '\\'=>'\5c', '/'=>'\2f')); - } - - /** - * Escapes a DN value according to RFC 2253 - * - * @param string $dn DN value o quote - * @return string The escaped value - */ - public static function escape_dn($dn) - { - return strtr($str, array(','=>'\2c', '='=>'\3d', '+'=>'\2b', - '<'=>'\3c', '>'=>'\3e', ';'=>'\3b', '\\'=>'\5c', - '"'=>'\22', '#'=>'\23')); - } - - /** - * Normalize a LDAP result by converting entry attributes arrays into single values - * - * @param array $result LDAP result set fetched with ldap_get_entries() - * @return array Hash array with normalized entries, indexed by their DNs - */ - public static function normalize_result($result) - { - if (!is_array($result)) { - return array(); - } - - $entries = array(); - for ($i = 0; $i < $result['count']; $i++) { - $key = $result[$i]['dn'] ? $result[$i]['dn'] : $i; - $entries[$key] = self::normalize_entry($result[$i]); - } - - return $entries; - } - - /** - * Turn an LDAP entry into a regular PHP array with attributes as keys. - * - * @param array $entry Attributes array as retrieved from ldap_get_attributes() or ldap_get_entries() - * - * @return array Hash array with attributes as keys - */ - public static function normalize_entry($entry) - { - if (!isset($entry['count'])) { - return $entry; - } - - $rec = array(); - - for ($i=0; $i < $entry['count']; $i++) { - $attr = $entry[$i]; - if ($entry[$attr]['count'] == 1) { - switch ($attr) { - case 'objectclass': - $rec[$attr] = array(strtolower($entry[$attr][0])); - break; - default: - $rec[$attr] = $entry[$attr][0]; - break; - } - } - else { - for ($j=0; $j < $entry[$attr]['count']; $j++) { - $rec[$attr][$j] = $entry[$attr][$j]; - } - } - } - - return $rec; - } - - /** - * Set server controls for Virtual List View (paginated listing) - */ - private function _vlv_set_controls($sort, $list_page, $page_size, $search = null) - { - $sort_ctrl = array('oid' => "1.2.840.113556.1.4.473", 'value' => self::_sort_ber_encode((array)$sort)); - $vlv_ctrl = array('oid' => "2.16.840.1.113730.3.4.9", 'value' => self::_vlv_ber_encode(($offset = ($list_page-1) * $page_size + 1), $page_size, $search), 'iscritical' => true); - - $this->_debug("C: Set controls sort=" . join(' ', unpack('H'.(strlen($sort_ctrl['value'])*2), $sort_ctrl['value'])) . " ($sort[0]);" - . " vlv=" . join(' ', (unpack('H'.(strlen($vlv_ctrl['value'])*2), $vlv_ctrl['value']))) . " ($offset/$page_size; $search)"); - - if (!ldap_set_option($this->conn, LDAP_OPT_SERVER_CONTROLS, array($sort_ctrl, $vlv_ctrl))) { - $this->_debug("S: ".ldap_error($this->conn)); - $this->set_error(self::ERROR_SEARCH, 'vlvnotsupported'); - return false; - } - - return true; - } - - /** - * Returns unified attribute name (resolving aliases) - */ - private static function _attr_name($namev) - { - // list of known attribute aliases - static $aliases = array( - 'gn' => 'givenname', - 'rfc822mailbox' => 'email', - 'userid' => 'uid', - 'emailaddress' => 'email', - 'pkcs9email' => 'email', - ); - - list($name, $limit) = explode(':', $namev, 2); - $suffix = $limit ? ':'.$limit : ''; - - return (isset($aliases[$name]) ? $aliases[$name] : $name) . $suffix; - } - - /** - * Quotes attribute value string - * - * @param string $str Attribute value - * @param bool $dn True if the attribute is a DN - * - * @return string Quoted string - */ - public static function quote_string($str, $dn=false) - { - // take firt entry if array given - if (is_array($str)) - $str = reset($str); - - if ($dn) - $replace = array(','=>'\2c', '='=>'\3d', '+'=>'\2b', '<'=>'\3c', - '>'=>'\3e', ';'=>'\3b', '\\'=>'\5c', '"'=>'\22', '#'=>'\23'); - else - $replace = array('*'=>'\2a', '('=>'\28', ')'=>'\29', '\\'=>'\5c', - '/'=>'\2f'); - - return strtr($str, $replace); - } - - /** - * Prints debug info to the log - */ - private function _debug($str) - { - if ($this->debug && class_exists('rcube')) { - rcube::write_log('ldap', $str); - } - } - - - /***************** Virtual List View (VLV) related utility functions **************** */ - - /** - * Return the search string value to be used in VLV controls - */ - private function _vlv_search($sort, $search) - { - foreach ($search as $attr => $value) { - if (!in_array(strtolower($attr), $sort)) { - $this->_debug("d: Cannot use VLV search using attribute not indexed: $attr (not in " . var_export($sort, true) . ")"); - return null; - } else { - return $value; - } - } - } - - /** - * Find a VLV index matching the given query attributes - * - * @return string Sort attribute or False if no match - */ - private function _find_vlv($base_dn, $filter, $scope, $sort_attrs = null) - { - if (!$this->config['vlv'] || $scope == 'base') { - return false; - } - - // get vlv config - $vlv_config = $this->_read_vlv_config(); - - if ($vlv = $vlv_config[$base_dn]) { - $this->_debug("D: Found a VLV for $base_dn"); - - if ($vlv['filter'] == strtolower($filter) || stripos($filter, '(&'.$vlv['filter'].'(') === 0) { - $this->_debug("D: Filter matches"); - if ($vlv['scope'] == $scope) { - // Not passing any sort attributes means you don't care - if (empty($sort_attrs) || in_array($sort_attrs, $vlv['sort'])) { - return $vlv['sort'][0]; - } - } - else { - $this->_debug("D: Scope does not match"); - } - } - else { - $this->_debug("D: Filter does not match"); - } - } - else { - $this->_debug("D: No VLV for $base_dn"); - } - - return false; - } - - /** - * Return VLV indexes and searches including necessary configuration - * details. - */ - private function _read_vlv_config() - { - if (empty($this->config['vlv']) || empty($this->config['config_root_dn'])) { - return array(); - } - // return hard-coded VLV config - else if (is_array($this->config['vlv'])) { - return $this->config['vlv']; - } - - // return cached result - if (is_array($this->vlv_config)) { - return $this->vlv_config; - } - - if ($this->cache && ($cached_config = $this->cache->get('vlvconfig'))) { - $this->vlv_config = $cached_config; - return $this->vlv_config; - } - - $this->vlv_config = array(); - $config_root_dn = $this->config['config_root_dn']; - - $ldap_result = ldap_search($this->conn, $config_root_dn, '(objectclass=vlvsearch)', array('*'), 0, 0, 0); - $vlv_searches = new rcube_ldap_result($this->conn, $ldap_result, $config_root_dn, '(objectclass=vlvsearch)'); - - if ($vlv_searches->count() < 1) { - $this->_debug("D: Empty result from search for '(objectclass=vlvsearch)' on '$config_root_dn'"); - return array(); - } - - foreach ($vlv_searches->entries(true) as $vlv_search_dn => $vlv_search_attrs) { - // Multiple indexes may exist - $ldap_result = ldap_search($this->conn, $vlv_search_dn, '(objectclass=vlvindex)', array('*'), 0, 0, 0); - $vlv_indexes = new rcube_ldap_result($this->conn, $ldap_result, $vlv_search_dn, '(objectclass=vlvindex)'); - - // Reset this one for each VLV search. - $_vlv_sort = array(); - foreach ($vlv_indexes->entries(true) as $vlv_index_dn => $vlv_index_attrs) { - $_vlv_sort[] = explode(' ', $vlv_index_attrs['vlvsort']); - } - - $this->vlv_config[$vlv_search_attrs['vlvbase']] = array( - 'scope' => self::scopeint2str($vlv_search_attrs['vlvscope']), - 'filter' => strtolower($vlv_search_attrs['vlvfilter']), - 'sort' => $_vlv_sort, - ); - } - - // cache this - if ($this->cache) - $this->cache->set('vlvconfig', $this->vlv_config); - - $this->_debug("D: Refreshed VLV config: " . var_export($this->vlv_config, true)); - - return $this->vlv_config; - } - - /** - * Generate BER encoded string for Virtual List View option - * - * @param integer List offset (first record) - * @param integer Records per page - * - * @return string BER encoded option value - */ - private static function _vlv_ber_encode($offset, $rpp, $search = '') - { - /* - this string is ber-encoded, php will prefix this value with: - 04 (octet string) and 10 (length of 16 bytes) - the code behind this string is broken down as follows: - 30 = ber sequence with a length of 0e (14) bytes following - 02 = type integer (in two's complement form) with 2 bytes following (beforeCount): 01 00 (ie 0) - 02 = type integer (in two's complement form) with 2 bytes following (afterCount): 01 18 (ie 25-1=24) - a0 = type context-specific/constructed with a length of 06 (6) bytes following - 02 = type integer with 2 bytes following (offset): 01 01 (ie 1) - 02 = type integer with 2 bytes following (contentCount): 01 00 - - with a search string present: - 81 = type context-specific/constructed with a length of 04 (4) bytes following (the length will change here) - 81 indicates a user string is present where as a a0 indicates just a offset search - 81 = type context-specific/constructed with a length of 06 (6) bytes following - - The following info was taken from the ISO/IEC 8825-1:2003 x.690 standard re: the - encoding of integer values (note: these values are in - two-complement form so since offset will never be negative bit 8 of the - leftmost octet should never by set to 1): - 8.3.2: If the contents octets of an integer value encoding consist - of more than one octet, then the bits of the first octet (rightmost) - and bit 8 of the second (to the left of first octet) octet: - a) shall not all be ones; and - b) shall not all be zero - */ - - if ($search) { - $search = preg_replace('/[^-[:alpha:] ,.()0-9]+/', '', $search); - $ber_val = self::_string2hex($search); - $str = self::_ber_addseq($ber_val, '81'); - } - else { - // construct the string from right to left - $str = "020100"; # contentCount - - $ber_val = self::_ber_encode_int($offset); // returns encoded integer value in hex format - - // calculate octet length of $ber_val - $str = self::_ber_addseq($ber_val, '02') . $str; - - // now compute length over $str - $str = self::_ber_addseq($str, 'a0'); - } - - // now tack on records per page - $str = "020100" . self::_ber_addseq(self::_ber_encode_int($rpp-1), '02') . $str; - - // now tack on sequence identifier and length - $str = self::_ber_addseq($str, '30'); - - return pack('H'.strlen($str), $str); - } - - /** - * create ber encoding for sort control - * - * @param array List of cols to sort by - * @return string BER encoded option value - */ - private static function _sort_ber_encode($sortcols) - { - $str = ''; - foreach (array_reverse((array)$sortcols) as $col) { - $ber_val = self::_string2hex($col); - - // 30 = ber sequence with a length of octet value - // 04 = octet string with a length of the ascii value - $oct = self::_ber_addseq($ber_val, '04'); - $str = self::_ber_addseq($oct, '30') . $str; - } - - // now tack on sequence identifier and length - $str = self::_ber_addseq($str, '30'); - - return pack('H'.strlen($str), $str); - } - - /** - * Add BER sequence with correct length and the given identifier - */ - private static function _ber_addseq($str, $identifier) - { - $len = dechex(strlen($str)/2); - if (strlen($len) % 2 != 0) - $len = '0'.$len; - - return $identifier . $len . $str; - } - - /** - * Returns BER encoded integer value in hex format - */ - private static function _ber_encode_int($offset) - { - $val = dechex($offset); - $prefix = ''; - - // check if bit 8 of high byte is 1 - if (preg_match('/^[89abcdef]/', $val)) - $prefix = '00'; - - if (strlen($val)%2 != 0) - $prefix .= '0'; - - return $prefix . $val; - } - - /** - * Returns ascii string encoded in hex - */ - private static function _string2hex($str) - { - $hex = ''; - for ($i=0; $i < strlen($str); $i++) { - $hex .= dechex(ord($str[$i])); - } - return $hex; - } - } + +// for backward compat. +class rcube_ldap_result extends Net_LDAP3_Result {} diff --git a/program/lib/Roundcube/rcube_ldap_result.php b/program/lib/Roundcube/rcube_ldap_result.php deleted file mode 100644 index efc3331bc..000000000 --- a/program/lib/Roundcube/rcube_ldap_result.php +++ /dev/null @@ -1,130 +0,0 @@ - | - +-----------------------------------------------------------------------+ -*/ - - -/** - * Model class representing an LDAP search result - * - * @package Framework - * @subpackage LDAP - */ -class rcube_ldap_result implements Iterator -{ - public $conn; - public $ldap; - public $base_dn; - public $filter; - - private $count = null; - private $current = null; - private $iteratorkey = 0; - - /** - * Default constructor - * - * @param resource $conn LDAP link identifier - * @param resource $ldap LDAP result entry identifier - * @param string $base_dn Base DN used to get this result - * @param string $filter Filter query used to get this result - * @param integer $count Record count value (pre-calculated) - */ - function __construct($conn, $ldap, $base_dn, $filter, $count = null) - { - $this->conn = $conn; - $this->ldap = $ldap; - $this->base_dn = $base_dn; - $this->filter = $filter; - $this->count = $count; - } - - /** - * Wrapper for ldap_sort() - */ - public function sort($attr) - { - return ldap_sort($this->conn, $this->ldap, $attr); - } - - /** - * Get entries count - */ - public function count() - { - if (!isset($this->count)) - $this->count = ldap_count_entries($this->conn, $this->ldap); - - return $this->count; - } - - /** - * Wrapper for ldap_get_entries() - * - * @param boolean $normalize Optionally normalize the entries to a list of hash arrays - * @return array List of LDAP entries - */ - public function entries($normalize = false) - { - $entries = ldap_get_entries($this->conn, $this->ldap); - return $normalize ? rcube_ldap_generic::normalize_result($entries) : $entries; - } - - /** - * Wrapper for ldap_get_dn() using the current entry pointer - */ - public function get_dn() - { - return $this->current ? ldap_get_dn($this->conn, $this->current) : null; - } - - - /*** Implements the PHP 5 Iterator interface to make foreach work ***/ - - function current() - { - $attrib = ldap_get_attributes($this->conn, $this->current); - $attrib['dn'] = ldap_get_dn($this->conn, $this->current); - return $attrib; - } - - function key() - { - return $this->iteratorkey; - } - - function rewind() - { - $this->iteratorkey = 0; - $this->current = ldap_first_entry($this->conn, $this->ldap); - } - - function next() - { - $this->iteratorkey++; - $this->current = ldap_next_entry($this->conn, $this->current); - } - - function valid() - { - return (bool)$this->current; - } - -} -- cgit v1.2.3 From 8ee8be9b86032bd23965dd37589691db6abfceb8 Mon Sep 17 00:00:00 2001 From: "Jeroen van Meeuwen (Kolab Systems)" Date: Sat, 2 Aug 2014 16:51:51 +0200 Subject: Correct reference to old function get_dn() --- program/lib/Roundcube/rcube_ldap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index 7fdcbc806..a26f87b0a 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -333,7 +333,7 @@ class rcube_ldap extends rcube_addressbook $res = $ldap->search($search_base_dn, $search_filter, 'sub', $search_attribs); if ($res) { $res->rewind(); - $replaces['%dn'] = $res->get_dn(); + $replaces['%dn'] = key($res->entries(TRUE)); // add more replacements from 'search_bind_attrib' config if ($search_bind_attrib) { -- cgit v1.2.3 From 65baa033e067483d5bcd57294aafab413b4cda2c Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Sun, 3 Aug 2014 19:17:13 +0200 Subject: List all plugins which have been attempted to load (#1488871) --- program/lib/Roundcube/rcube_plugin.php | 10 +++++++- program/lib/Roundcube/rcube_plugin_api.php | 39 ++++++++++++++++++++++++------ program/steps/settings/about.inc | 6 ++--- 3 files changed, 43 insertions(+), 12 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_plugin.php b/program/lib/Roundcube/rcube_plugin.php index 01c340deb..cc7c7977f 100644 --- a/program/lib/Roundcube/rcube_plugin.php +++ b/program/lib/Roundcube/rcube_plugin.php @@ -94,7 +94,15 @@ abstract class rcube_plugin /** * Provide information about this * - * @return array Meta information about a plugin or false if not implemented + * @return array Meta information about a plugin or false if not implemented: + * As hash array with the following keys: + * name: The plugin name + * vendor: Name of the plugin developer + * version: Plugin version name + * license: License name (short form according to http://spdx.org/licenses/) + * uri: The URL to the plugin homepage or source repository + * src_uri: Direct download URL to the source code of this plugin + * require: List of plugins required for this one (as array of plugin names) */ public static function info() { diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index feeeb192e..335348cef 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -38,6 +38,7 @@ class rcube_plugin_api public $handlers = array(); public $allowed_prefs = array(); public $allowed_session_prefs = array(); + public $active_plugins = array(); protected $plugins = array(); protected $tasks = array(); @@ -189,7 +190,7 @@ class rcube_plugin_api $fn = $plugins_dir . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php'; - if (file_exists($fn)) { + if (is_readable($fn)) { if (!class_exists($plugin_name, false)) { include $fn; } @@ -197,6 +198,8 @@ class rcube_plugin_api // instantiate class if exists if (class_exists($plugin_name, false)) { $plugin = new $plugin_name($this); + $this->active_plugins[] = $plugin_name; + // check inheritance... if (is_subclass_of($plugin, 'rcube_plugin')) { // ... task, request type and framed mode @@ -252,6 +255,9 @@ class rcube_plugin_api 'GPL-3.0' => 'http://www.gnu.org/licenses/gpl-3.0.html', 'GPL-3.0+' => 'http://www.gnu.org/licenses/gpl.html', 'GPL-2.0+' => 'http://www.gnu.org/licenses/gpl.html', + 'AGPLv3' => 'http://www.gnu.org/licenses/agpl.html', + 'AGPLv3+' => 'http://www.gnu.org/licenses/agpl.html', + 'AGPL-3.0' => 'http://www.gnu.org/licenses/agpl.html', 'LGPL' => 'http://www.gnu.org/licenses/lgpl.html', 'LGPLv2' => 'http://www.gnu.org/licenses/lgpl-2.0.html', 'LGPLv2.1' => 'http://www.gnu.org/licenses/lgpl-2.1.html', @@ -275,8 +281,12 @@ class rcube_plugin_api $fn = unslashify($dir->path) . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php'; $info = false; - if (!class_exists($plugin_name)) - include($fn); + if (!class_exists($plugin_name, false)) { + if (is_readable($fn)) + include($fn); + else + return false; + } if (class_exists($plugin_name)) $info = $plugin_name::info(); @@ -284,12 +294,17 @@ class rcube_plugin_api // fall back to composer.json file if (!$info) { $composer = INSTALL_PATH . "/plugins/$plugin_name/composer.json"; - if (file_exists($composer) && ($json = @json_decode(file_get_contents($composer), true))) { + if (is_readable($composer) && ($json = @json_decode(file_get_contents($composer), true))) { list($info['vendor'], $info['name']) = explode('/', $json['name']); $info['version'] = $json['version']; $info['license'] = $json['license']; - if ($license_uri = $license_uris[$info['license']]) - $info['license_uri'] = $license_uri; + $info['uri'] = $json['homepage']; + $info['require'] = array_filter(array_keys((array)$json['require']), function($pname) { + if (strpos($pname, '/') == false) + return false; + list($vendor, $name) = explode('/', $pname); + return !($name == 'plugin-installer' || $vendor == 'pear-pear'); + }); } // read local composer.lock file (once) @@ -313,7 +328,7 @@ class rcube_plugin_api // fall back to package.xml file if (!$info) { $package = INSTALL_PATH . "/plugins/$plugin_name/package.xml"; - if (file_exists($package) && ($file = file_get_contents($package))) { + if (is_readable($package) && ($file = file_get_contents($package))) { $doc = new DOMDocument(); $doc->loadXML($file); $xpath = new DOMXPath($doc); @@ -337,11 +352,19 @@ class rcube_plugin_api $deps = $xpath->evaluate('//rc:package/rc:dependencies/rc:required/rc:package/rc:name'); for ($i = 0; $i < $deps->length; $i++) { $dn = $deps->item($i)->nodeValue; - $info['requires'][] = $dn; + $info['require'][] = $dn; } } } + // At least provide the name + if (!$info && class_exists($plugin_name)) { + $info = array('name' => $plugin_name, 'version' => '--'); + } + else if ($info['license'] && empty($info['license_uri']) && ($license_uri = $license_uris[$info['license']])) { + $info['license_uri'] = $license_uri; + } + return $info; } diff --git a/program/steps/settings/about.inc b/program/steps/settings/about.inc index 026bfc1a2..73d0b0f0d 100644 --- a/program/steps/settings/about.inc +++ b/program/steps/settings/about.inc @@ -50,7 +50,7 @@ function rcmail_plugins_list($attrib) $attrib['id'] = 'rcmpluginlist'; } - $plugins = array_filter((array) $RCMAIL->config->get('plugins')); + $plugins = array_filter($RCMAIL->plugins->active_plugins); $plugin_info = array(); foreach ($plugins as $name) { @@ -61,8 +61,8 @@ function rcmail_plugins_list($attrib) // load info from required plugins, too foreach ($plugin_info as $name => $info) { - if (is_array($info['required']) && !empty($info['required'])) { - foreach ($info['required'] as $req_name) { + if (is_array($info['require']) && !empty($info['require'])) { + foreach ($info['require'] as $req_name) { if (!isset($plugin_info[$req_name]) && ($req_info = $RCMAIL->plugins->get_info($req_name))) { $plugin_info[$req_name] = $req_info; } -- cgit v1.2.3 From 539fe0b84ddfd13a6c7d7d86567d05b774980d1b Mon Sep 17 00:00:00 2001 From: brendan braybrook Date: Wed, 6 Aug 2014 00:25:14 +0000 Subject: fix stringify problem when multiple headers values exist to be returned --- program/lib/Roundcube/rcube_message_header.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_message_header.php b/program/lib/Roundcube/rcube_message_header.php index 2bda930eb..b4d20e09a 100644 --- a/program/lib/Roundcube/rcube_message_header.php +++ b/program/lib/Roundcube/rcube_message_header.php @@ -225,8 +225,15 @@ class rcube_message_header } if ($decode) { - $value = rcube_mime::decode_header($value, $this->charset); - $value = rcube_charset::clean($value); + if (is_array($value)) { + foreach ($value as $key=>$val) { + $value[$key] = rcube_mime::decode_header($val, $this->charset); + $value[$key] = rcube_charset::clean($val); + } + } else { + $value = rcube_mime::decode_header($value, $this->charset); + $value = rcube_charset::clean($value); + } } return $value; -- cgit v1.2.3 From 19926d4c3cc2806b331579d1eaf93cae9aa1b26f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 6 Aug 2014 08:03:56 +0200 Subject: CS fix after PR merge --- program/lib/Roundcube/rcube_message_header.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_message_header.php b/program/lib/Roundcube/rcube_message_header.php index b4d20e09a..2b795e591 100644 --- a/program/lib/Roundcube/rcube_message_header.php +++ b/program/lib/Roundcube/rcube_message_header.php @@ -226,11 +226,12 @@ class rcube_message_header if ($decode) { if (is_array($value)) { - foreach ($value as $key=>$val) { + foreach ($value as $key => $val) { $value[$key] = rcube_mime::decode_header($val, $this->charset); $value[$key] = rcube_charset::clean($val); } - } else { + } + else { $value = rcube_mime::decode_header($value, $this->charset); $value = rcube_charset::clean($value); } -- cgit v1.2.3 From d8b26e40f93c59482a5d65e1456c5ccbd57551be Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 6 Aug 2014 11:46:22 +0200 Subject: Overwrite Net_LDAP3's normalize_entry() method to behave as the old one --- program/lib/Roundcube/rcube_ldap_generic.php | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index a88e53c0e..9823dbb66 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -267,6 +267,43 @@ class rcube_ldap_generic extends Net_LDAP3 return false; } + + /** + * Turn an LDAP entry into a regular PHP array with attributes as keys. + * + * @param array $entry Attributes array as retrieved from ldap_get_attributes() or ldap_get_entries() + * + * @return array Hash array with attributes as keys + */ + public static function normalize_entry($entry) + { + if (!isset($entry['count'])) { + return $entry; + } + + $rec = array(); + + for ($i=0; $i < $entry['count']; $i++) { + $attr = $entry[$i]; + if ($entry[$attr]['count'] == 1) { + switch ($attr) { + case 'objectclass': + $rec[$attr] = array(strtolower($entry[$attr][0])); + break; + default: + $rec[$attr] = $entry[$attr][0]; + break; + } + } + else { + for ($j=0; $j < $entry[$attr]['count']; $j++) { + $rec[$attr][$j] = $entry[$attr][$j]; + } + } + } + + return $rec; + } } // for backward compat. -- cgit v1.2.3 From d7533442f3f5238e6aaebbaead9214beab040848 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 7 Aug 2014 08:56:29 +0200 Subject: Add default location for mime.types with nginx --- program/lib/Roundcube/rcube_mime.php | 1 + 1 file changed, 1 insertion(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php index 370d5a8d5..14bc48336 100644 --- a/program/lib/Roundcube/rcube_mime.php +++ b/program/lib/Roundcube/rcube_mime.php @@ -822,6 +822,7 @@ class rcube_mime $file_paths[] = '/etc/httpd2/mime.types'; $file_paths[] = '/etc/apache/mime.types'; $file_paths[] = '/etc/apache2/mime.types'; + $file_paths[] = '/etc/nginx/mime.types'; $file_paths[] = '/usr/local/etc/httpd/conf/mime.types'; $file_paths[] = '/usr/local/etc/apache/conf/mime.types'; } -- cgit v1.2.3 From f954922c03e30bfe06b60f35336f9274fa45ee4e Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 7 Aug 2014 17:04:05 +0200 Subject: - Implemented 'storage_connected' API hook after successful IMAP login (#1490025) - Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging - Added config option 'log_session_id' to control the lengh of the session identifer in logs --- program/lib/Roundcube/rcube.php | 28 +++++++++++++++++++++++----- program/lib/Roundcube/rcube_imap.php | 24 +++++++++++++++++++----- 2 files changed, 42 insertions(+), 10 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index e3e26d8b9..eedc46c7a 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -389,8 +389,12 @@ class rcube $this->storage->set_options($options); $this->set_storage_prop(); - } + // subscribe to 'storage_connected' hook for session logging + if ($this->config->get('imap_log_session', false)) { + $this->plugins->register_hook('storage_connected', array($this, 'storage_log_session')); + } + } /** * Set storage parameters. @@ -457,6 +461,16 @@ class rcube } + /** + * Callback for IMAP connection events to log session identifiers + */ + public function storage_log_session($args) + { + if (!empty($args['session']) && session_id()) { + $this->write_log('imap_session', $args['session']); + } + } + /** * Create session object and start the session. */ @@ -1138,8 +1152,12 @@ class rcube $line = var_export($line, true); } - $date_format = self::$instance ? self::$instance->config->get('log_date_format') : null; - $log_driver = self::$instance ? self::$instance->config->get('log_driver') : null; + $date_format = $log_driver = $session_key = null; + if (self::$instance) { + $date_format = self::$instance->config->get('log_date_format'); + $log_driver = self::$instance->config->get('log_driver'); + $session_key = intval(self::$instance->config->get('log_session_id', 8)); + } if (empty($date_format)) { $date_format = 'd-M-Y H:i:s O'; @@ -1158,8 +1176,8 @@ class rcube } // add session ID to the log - if ($sess = session_id()) { - $line = '<' . substr($sess, 0, 8) . '> ' . $line; + if ($session_key > 0 && ($sess = session_id())) { + $line = '<' . substr($sess, 0, $session_key) . '> ' . $line; } if ($log_driver == 'syslog') { diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 79a8973db..ec961c8d1 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -56,6 +56,7 @@ class rcube_imap extends rcube_storage */ protected $icache = array(); + protected $plugins; protected $list_page = 1; protected $delimiter; protected $namespace; @@ -82,6 +83,7 @@ class rcube_imap extends rcube_storage public function __construct() { $this->conn = new rcube_imap_generic(); + $this->plugins = rcube::get_instance()->plugins; // Set namespace and delimiter from session, // so some methods would work before connection @@ -147,7 +149,7 @@ class rcube_imap extends rcube_storage $attempt = 0; do { - $data = rcube::get_instance()->plugins->exec_hook('storage_connect', + $data = $this->plugins->exec_hook('storage_connect', array_merge($this->options, array('host' => $host, 'user' => $user, 'attempt' => ++$attempt))); @@ -170,8 +172,20 @@ class rcube_imap extends rcube_storage $this->connect_done = true; if ($this->conn->connected()) { + // check for session identifier + $session = null; + if (preg_match('/\s+SESSIONID=([^=\s]+)/', $this->conn->result, $m)) { + $session = $m[1]; + } + // get namespace and delimiter $this->set_env(); + + // trigger post-connect hook + $this->plugins->exec_hook('storage_connected', array( + 'host' => $host, 'user' => $user, 'session' => $session + )); + return true; } // write error log @@ -1506,7 +1520,7 @@ class rcube_imap extends rcube_storage $folder = $this->folder; } - $plugin = rcube::get_instance()->plugins->exec_hook('imap_search_before', array( + $plugin = $this->plugins->exec_hook('imap_search_before', array( 'folder' => $folder, 'search' => $search, 'charset' => $charset, @@ -2501,7 +2515,7 @@ class rcube_imap extends rcube_storage // increase messagecount of the target folder $this->set_messagecount($folder, 'ALL', 1); - rcube::get_instance()->plugins->exec_hook('message_saved', array( + $this->plugins->exec_hook('message_saved', array( 'folder' => $folder, 'message' => $message, 'headers' => $headers, @@ -2777,7 +2791,7 @@ class rcube_imap extends rcube_storage } // Give plugins a chance to provide a list of folders - $data = rcube::get_instance()->plugins->exec_hook('storage_folders', + $data = $this->plugins->exec_hook('storage_folders', array('root' => $root, 'name' => $name, 'filter' => $filter, 'mode' => 'LSUB')); if (isset($data['folders'])) { @@ -2909,7 +2923,7 @@ class rcube_imap extends rcube_storage } // Give plugins a chance to provide a list of folders - $data = rcube::get_instance()->plugins->exec_hook('storage_folders', + $data = $this->plugins->exec_hook('storage_folders', array('root' => $root, 'name' => $name, 'filter' => $filter, 'mode' => 'LIST')); if (isset($data['folders'])) { -- cgit v1.2.3 From c6183b649a1f9f7a6fc4849096f5845f03c86bc0 Mon Sep 17 00:00:00 2001 From: brendan braybrook Date: Mon, 11 Aug 2014 23:21:02 +0000 Subject: wrong type returned for gif --- program/lib/Roundcube/rcube_image.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index a15368a7e..a432d9218 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -189,7 +189,7 @@ class rcube_image } else if($props['gd_type'] == IMAGETYPE_GIF && function_exists('imagecreatefromgif')) { $image = imagecreatefromgif($this->image_file); - $type = 'gid'; + $type = 'gif'; } else if($props['gd_type'] == IMAGETYPE_PNG && function_exists('imagecreatefrompng')) { $image = imagecreatefrompng($this->image_file); -- cgit v1.2.3 From e2dd31f9878bb619ca53aa4708f8966808d7842a Mon Sep 17 00:00:00 2001 From: brendan braybrook Date: Mon, 11 Aug 2014 23:23:36 +0000 Subject: rotate image with GD if exit rotation data present --- program/lib/Roundcube/rcube_image.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index a432d9218..c7a60e672 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -228,6 +228,24 @@ class rcube_image imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, $props['width'], $props['height']); $image = $new_image; + // fix rotation of image if EXIF data exists and specifies rotation (GD strips the EXIF data) + if (file_exists($this->image_file) ) { + $exif = exif_read_data($this->image_file); + if ($exif && $exif['Orientation']) { + switch($exif['Orientation']) { + case 3: + $image = imagerotate($image, 180, 0); + break; + case 6: + $image = imagerotate($image, -90, 0); + break; + case 8: + $image = imagerotate($image, 90, 0); + break; + } + } + } + if ($props['gd_type'] == IMAGETYPE_JPEG) { $result = imagejpeg($image, $filename, 75); } -- cgit v1.2.3 From 090bacddb6e563ae3f89c9e490c6db28d96b3f95 Mon Sep 17 00:00:00 2001 From: brendan braybrook Date: Tue, 12 Aug 2014 18:39:55 +0000 Subject: changes suggested by aleks --- program/lib/Roundcube/rcube_image.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index c7a60e672..62dc5fa96 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -229,7 +229,7 @@ class rcube_image $image = $new_image; // fix rotation of image if EXIF data exists and specifies rotation (GD strips the EXIF data) - if (file_exists($this->image_file) ) { + if ($this->image_file && function_exists(exif_read_data) ) { $exif = exif_read_data($this->image_file); if ($exif && $exif['Orientation']) { switch($exif['Orientation']) { -- cgit v1.2.3 From 834fb6858e5b5e30f23d147d86de0604d2cbfcbd Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 13 Aug 2014 13:04:15 +0200 Subject: Allow to search for LDAP groups with 'group_filter' enabled --- program/lib/Roundcube/rcube_ldap.php | 50 ++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 11 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index a26f87b0a..274616a1f 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -65,6 +65,8 @@ class rcube_ldap extends rcube_addressbook private $base_dn = ''; private $groups_base_dn = ''; private $group_url; + private $group_data; + private $group_search_cache; private $cache; @@ -101,8 +103,8 @@ class rcube_ldap extends rcube_addressbook // add group name attrib to the list of attributes to be fetched $fetch_attributes[] = $this->prop['groups']['name_attr']; } - if (is_array($p['group_filters']) && count($p['group_filters'])) { - $this->groups = true; + if (is_array($p['group_filters'])) { + $this->groups = $this->groups || count($p['group_filters']); foreach ($p['group_filters'] as $k => $group_filter) { // set default name attribute to cn @@ -381,7 +383,7 @@ class rcube_ldap extends rcube_addressbook $this->prop['groups'][$k] = strtr($this->prop['groups'][$k], $replaces); } - if (!empty($this->prop['group_filters'])) { + if (is_array($this->prop['group_filters'])) { foreach ($this->prop['group_filters'] as $i => $gf) { if (!empty($gf['base_dn'])) $this->prop['group_filters'][$i]['base_dn'] = strtr($gf['base_dn'], $replaces); @@ -1602,7 +1604,7 @@ class rcube_ldap extends rcube_addressbook return array(); } - $group_cache = $this->_fetch_groups(); + $group_cache = $this->_fetch_groups($search, $mode); $groups = array(); if ($search) { @@ -1622,10 +1624,19 @@ class rcube_ldap extends rcube_addressbook /** * Fetch groups from server */ - private function _fetch_groups($vlv_page = null) + private function _fetch_groups($search = null, $mode = 0, $vlv_page = null) { + // reset group search cache + if ($search !== null && $vlv_page === null) { + $this->group_search_cache = null; + } + // return in-memory cache from previous search results + else if (is_array($this->group_search_cache) && $vlv_page === null) { + return $this->group_search_cache; + } + // special case: list groups from 'group_filters' config - if ($vlv_page === null && !empty($this->prop['group_filters'])) { + if ($vlv_page === null && $search === null && is_array($this->prop['group_filters'])) { $groups = array(); $rcube = rcube::get_instance(); @@ -1642,7 +1653,7 @@ class rcube_ldap extends rcube_addressbook return $groups; } - if ($this->cache && $vlv_page === null && ($groups = $this->cache->get('groups')) !== null) { + if ($this->cache && $search === null && $vlv_page === null && ($groups = $this->cache->get('groups')) !== null) { return $groups; } @@ -1668,8 +1679,22 @@ class rcube_ldap extends rcube_addressbook $ldap->set_vlv_page($vlv_page+1, $page_size); } - $attrs = array_unique(array('dn', 'objectClass', $name_attr, $email_attr, $sort_attr)); - $ldap_data = $ldap->search($base_dn, $filter, $scope, $attrs, $this->prop['groups']); + $props = array('sort' => $this->prop['groups']['sort']); + $attrs = array_unique(array('dn', 'objectClass', $name_attr, $email_attr, $sort_attr)); + + // add search filter + if ($search !== null) { + // set wildcards + $wp = $ws = ''; + if (!empty($this->prop['fuzzy_search']) && $mode != 1) { + $ws = '*'; + $wp = !$mode ? '*' : ''; + } + $filter = "(&$filter($name_attr=$wp" . rcube_ldap_generic::quote_string($search) . "$ws))"; + $props['search'] = $wp . $search . $ws; + } + + $ldap_data = $ldap->search($base_dn, $filter, $scope, $attrs, $props); if ($ldap_data === false) { return array(); @@ -1706,7 +1731,7 @@ class rcube_ldap extends rcube_addressbook // call recursively until we have fetched all groups while ($this->prop['groups']['vlv'] && $group_count == $page_size) { - $next_page = $this->_fetch_groups(++$vlv_page); + $next_page = $this->_fetch_groups($search, $mode, ++$vlv_page); $groups = array_merge($groups, $next_page); $group_count = count($next_page); } @@ -1717,9 +1742,12 @@ class rcube_ldap extends rcube_addressbook } // cache this - if ($this->cache) { + if ($this->cache && $search === null) { $this->cache->set('groups', $groups); } + else if ($search !== null) { + $this->group_search_cache = $groups; + } return $groups; } -- cgit v1.2.3 From 4045cd9266766488500bf038f2360e3b146d6bdc Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 13 Aug 2014 14:34:12 +0200 Subject: Cleanup after PR merge, updated changelog --- CHANGELOG | 1 + program/lib/Roundcube/rcube_image.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 0fe3cec3f..aecd0f422 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -52,6 +52,7 @@ CHANGELOG Roundcube Webmail - Fix various iCloud vCard issues, added fallback for external photos (#1489993) - Fix invalid Content-Type header when send_format_flowed=false (#1489992) - Fix errors when adding/updating contacts in active search (#1490015) +- Fix incorrect thumbnail rotation with GD and exif orientation data (#1490029) RELEASE 1.0.2 ------------- diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index 62dc5fa96..d0d0c7437 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -229,10 +229,10 @@ class rcube_image $image = $new_image; // fix rotation of image if EXIF data exists and specifies rotation (GD strips the EXIF data) - if ($this->image_file && function_exists(exif_read_data) ) { + if ($this->image_file && function_exists('exif_read_data')) { $exif = exif_read_data($this->image_file); if ($exif && $exif['Orientation']) { - switch($exif['Orientation']) { + switch ($exif['Orientation']) { case 3: $image = imagerotate($image, 180, 0); break; -- cgit v1.2.3 From 5f17657e82abfae6bce0027e243e22a4183174a6 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 14 Aug 2014 18:19:55 +0200 Subject: Support contacts import in GMail CSV format --- CHANGELOG | 1 + program/lib/Roundcube/rcube_csv2vcard.php | 175 ++++++++++++++++++++++++++++-- tests/Framework/Csv2vcard.php | 18 +++ tests/src/Csv2vcard/gmail.csv | Bin 0 -> 3760 bytes tests/src/Csv2vcard/gmail.vcf | 25 +++++ 5 files changed, 210 insertions(+), 9 deletions(-) create mode 100644 tests/src/Csv2vcard/gmail.csv create mode 100644 tests/src/Csv2vcard/gmail.vcf (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index aecd0f422..b4269c68d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Support contacts import in GMail CSV format - Added namespace filter in Folder Manager - Added folder searching in Folder Manager - Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging diff --git a/program/lib/Roundcube/rcube_csv2vcard.php b/program/lib/Roundcube/rcube_csv2vcard.php index 06bc387d5..b7d159178 100644 --- a/program/lib/Roundcube/rcube_csv2vcard.php +++ b/program/lib/Roundcube/rcube_csv2vcard.php @@ -149,6 +149,13 @@ class rcube_csv2vcard // GMail 'groups' => 'groups', + 'group_membership' => 'groups', + 'given_name' => 'firstname', + 'additional_name' => 'middlename', + 'family_name' => 'surname', + 'name' => 'displayname', + 'name_prefix' => 'prefix', + 'name_suffix' => 'suffix', ); /** @@ -272,12 +279,95 @@ class rcube_csv2vcard 'work_mobile' => "Work Mobile", 'work_title' => "Work Title", 'work_zip' => "Work Zip", - 'groups' => "Group", + 'group' => "Group", + + // GMail + 'groups' => "Groups", + 'group_membership' => "Group Membership", + 'given_name' => "Given Name", + 'additional_name' => "Additional Name", + 'family_name' => "Family Name", + 'name' => "Name", + 'name_prefix' => "Name Prefix", + 'name_suffix' => "Name Suffix", + ); + + /** + * Special fields map for GMail format + * + * @var array + */ + protected $gmail_label_map = array( + 'E-mail' => array( + 'Value' => array( + 'home' => 'email:home', + 'work' => 'email:work', + ), + ), + 'Phone' => array( + 'Value' => array( + 'home' => 'phone:home', + 'homefax' => 'phone:homefax', + 'main' => 'phone:pref', + 'pager' => 'phone:pager', + 'mobile' => 'phone:cell', + 'work' => 'phone:work', + 'workfax' => 'phone:workfax', + ), + ), + 'Relation' => array( + 'Value' => array( + 'spouse' => 'spouse', + ), + ), + 'Website' => array( + 'Value' => array( + 'profile' => 'website:profile', + 'blog' => 'website:blog', + 'homepage' => 'website:homepage', + 'work' => 'website:work', + ), + ), + 'Address' => array( + 'Street' => array( + 'home' => 'street:home', + 'work' => 'street:work', + ), + 'City' => array( + 'home' => 'locality:home', + 'work' => 'locality:work', + ), + 'Region' => array( + 'home' => 'region:home', + 'work' => 'region:work', + ), + 'Postal Code' => array( + 'home' => 'zipcode:home', + 'work' => 'zipcode:work', + ), + 'Country' => array( + 'home' => 'country:home', + 'work' => 'country:work', + ), + ), + 'Organization' => array( + 'Name' => array( + '' => 'organization', + ), + 'Title' => array( + '' => 'jobtitle', + ), + 'Department' => array( + '' => 'department', + ), + ), ); + protected $local_label_map = array(); - protected $vcards = array(); - protected $map = array(); + protected $vcards = array(); + protected $map = array(); + protected $gmail_map = array(); /** @@ -308,16 +398,24 @@ class rcube_csv2vcard public function import($csv) { // convert to UTF-8 - $head = substr($csv, 0, 4096); - $charset = rcube_charset::detect($head, RCUBE_CHARSET); - $csv = rcube_charset::convert($csv, $charset); - $head = ''; + $head = substr($csv, 0, 4096); + $charset = rcube_charset::detect($head, RCUBE_CHARSET); + $csv = rcube_charset::convert($csv, $charset); + $csv = preg_replace(array('/^[\xFE\xFF]{2}/', '/^\xEF\xBB\xBF/', '/^\x00+/'), '', $csv); // also remove BOM + $head = ''; + $prev_line = false; - $this->map = array(); + $this->map = array(); + $this->gmail_map = array(); // Parse file foreach (preg_split("/[\r\n]+/", $csv) as $line) { + if (!empty($prev_line)) { + $line = '"' . $line; + } + $elements = $this->parse_line($line); + if (empty($elements)) { continue; } @@ -331,7 +429,28 @@ class rcube_csv2vcard } // Parse data row else { + // handle multiline elements (e.g. Gmail) + if (!empty($prev_line)) { + $first = array_shift($elements); + + if ($first[0] == '"') { + $prev_line[count($prev_line)-1] = '"' . $prev_line[count($prev_line)-1] . "\n" . substr($first, 1); + } + else { + $prev_line[count($prev_line)-1] .= "\n" . $first; + } + + $elements = array_merge($prev_line, $elements); + } + + $last_element = $elements[count($elements)-1]; + if ($last_element[0] == '"') { + $elements[count($elements)-1] = substr($last_element, 1); + $prev_line = $elements; + continue; + } $this->csv_to_vcard($elements); + $prev_line = false; } } } @@ -389,6 +508,7 @@ class rcube_csv2vcard $map1[$i] = $this->csv2vcard_map[$label]; } } + // check localized labels if (!empty($this->local_label_map)) { for ($i = 0; $i < $size; $i++) { @@ -406,6 +526,22 @@ class rcube_csv2vcard } $this->map = count($map1) >= count($map2) ? $map1 : $map2; + + // support special Gmail format + foreach ($this->gmail_label_map as $key => $items) { + $num = 1; + while (($_key = "$key $num - Type") && ($found = array_search($_key, $elements)) !== false) { + $this->gmail_map["$key:$num"] = array('_key' => $key, '_idx' => $found); + foreach (array_keys($items) as $item_key) { + $_key = "$key $num - $item_key"; + if (($found = array_search($_key, $elements)) !== false) { + $this->gmail_map["$key:$num"][$item_key] = $found; + } + } + + $num++; + } + } } /** @@ -421,6 +557,22 @@ class rcube_csv2vcard } } + // Gmail format support + foreach ($this->gmail_map as $idx => $item) { + $type = preg_replace('/[^a-z]/', '', strtolower($data[$item['_idx']])); + $key = $item['_key']; + + unset($item['_idx']); + unset($item['_key']); + + foreach ($item as $item_key => $item_idx) { + $value = $data[$item_idx]; + if ($value !== null && $value !== '' && ($data_idx = $this->gmail_label_map[$key][$item_key][$type])) { + $contact[$data_idx] = $value; + } + } + } + if (empty($contact)) { return; } @@ -430,9 +582,14 @@ class rcube_csv2vcard $contact['birthday'] = $contact['birthday-y'] .'-' .$contact['birthday-m'] . '-' . $contact['birthday-d']; } - // categories/groups separator in vCard is ',' not ';' if (!empty($contact['groups'])) { + // categories/groups separator in vCard is ',' not ';' $contact['groups'] = str_replace(';', ',', $contact['groups']); + + // remove "* " added by GMail + if (!empty($this->gmail_map)) { + $contact['groups'] = str_replace('* ', '', $contact['groups']); + } } // Empty dates, e.g. "0/0/00", "0000-00-00 00:00:00" diff --git a/tests/Framework/Csv2vcard.php b/tests/Framework/Csv2vcard.php index 5d52efc58..4f48dfaa2 100644 --- a/tests/Framework/Csv2vcard.php +++ b/tests/Framework/Csv2vcard.php @@ -55,4 +55,22 @@ class Framework_Csv2vcard extends PHPUnit_Framework_TestCase $vcard = trim(str_replace("\r\n", "\n", $vcard)); $this->assertEquals($vcf_text, $vcard); } + + function test_import_gmail() + { + $csv_text = file_get_contents(TESTS_DIR . '/src/Csv2vcard/gmail.csv'); + $vcf_text = file_get_contents(TESTS_DIR . '/src/Csv2vcard/gmail.vcf'); + + $csv = new rcube_csv2vcard; + $csv->import($csv_text); + $result = $csv->export(); + $vcard = $result[0]->export(false); + + $this->assertCount(1, $result); + + $vcf_text = trim(str_replace("\r\n", "\n", $vcf_text)); + $vcard = trim(str_replace("\r\n", "\n", $vcard)); + + $this->assertEquals($vcf_text, $vcard); + } } diff --git a/tests/src/Csv2vcard/gmail.csv b/tests/src/Csv2vcard/gmail.csv new file mode 100644 index 000000000..9f67fe9f5 Binary files /dev/null and b/tests/src/Csv2vcard/gmail.csv differ diff --git a/tests/src/Csv2vcard/gmail.vcf b/tests/src/Csv2vcard/gmail.vcf new file mode 100644 index 000000000..5337d7e63 --- /dev/null +++ b/tests/src/Csv2vcard/gmail.vcf @@ -0,0 +1,25 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Prefix Firstname Middle Lastname Suffix +N:Lastname;Firstname;Middle;Prefix;Suffix +NICKNAME:nick +BDAY;VALUE=date:1975-12-12 +NOTE:note"note +CATEGORIES:My Contacts +EMAIL;TYPE=INTERNET;TYPE=HOME:home@aaa.pl +EMAIL;TYPE=INTERNET;TYPE=WORK:work@email.pl +TEL;TYPE=pager:pager +TEL;TYPE=pref:mainphone +TEL;TYPE=home:homephone +TEL;TYPE=homefax:homefax +TEL;TYPE=cell:mobile +TEL;TYPE=work:workphone +TEL;TYPE=workfax:workfax +X-SPOUSE:spouse +URL;TYPE=profile:test.com +URL;TYPE=homepage:home.page.com +ORG:company +TITLE:jobtitle +ADR;TYPE=home:;;home_street;home_city;home_state;home_zip;home_country +ADR;TYPE=work:;;work_street;work_city;;work_zip;work_country +END:VCARD -- cgit v1.2.3 From 0b799bee90d897d052d0310300a377e067e1fa34 Mon Sep 17 00:00:00 2001 From: JohnDoh Date: Sat, 16 Aug 2014 07:02:50 +0100 Subject: add support for optional plugins --- program/lib/Roundcube/rcube_plugin_api.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index 335348cef..dae3a936d 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -170,10 +170,11 @@ class rcube_plugin_api * * @param string Plugin name * @param boolean Force loading of the plugin even if it doesn't match the filter + * @param boolean Require loading of the plugin, error if it doesn't exist * * @return boolean True on success, false if not loaded or failure */ - public function load_plugin($plugin_name, $force = false) + public function load_plugin($plugin_name, $force = false, $require = true) { static $plugins_dir; @@ -225,7 +226,7 @@ class rcube_plugin_api true, false); } } - else { + elseif ($require) { rcube::raise_error(array('code' => 520, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Failed to load plugin file $fn"), true, false); -- cgit v1.2.3 From 4eee212883b34e1ca7cfb9466580ff20dca5c979 Mon Sep 17 00:00:00 2001 From: JohnDoh Date: Sat, 16 Aug 2014 07:05:30 +0100 Subject: add include_plugin function for optoinal plugins --- program/lib/Roundcube/rcube_plugin.php | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_plugin.php b/program/lib/Roundcube/rcube_plugin.php index cc7c7977f..9c7a9c2dc 100644 --- a/program/lib/Roundcube/rcube_plugin.php +++ b/program/lib/Roundcube/rcube_plugin.php @@ -120,6 +120,17 @@ abstract class rcube_plugin return $this->api->load_plugin($plugin_name, true); } + /** + * Attempt to load the given plugin which is optional for the current plugin + * + * @param string Plugin name + * @return boolean True on success, false on failure + */ + public function include_plugin($plugin_name) + { + return $this->api->load_plugin($plugin_name, true, false); + } + /** * Load local config file from plugins directory. * The loaded values are patched over the global configuration. -- cgit v1.2.3 From 6a0a4a3a5230e823b812b98272c5e011d07aac35 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 18 Aug 2014 10:00:45 +0200 Subject: Remove empty brackets, slashes and spaces from contact search name --- program/lib/Roundcube/rcube_addressbook.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php index 71d556234..5bc3edf2d 100644 --- a/program/lib/Roundcube/rcube_addressbook.php +++ b/program/lib/Roundcube/rcube_addressbook.php @@ -605,7 +605,8 @@ abstract class rcube_addressbook } $result = preg_replace('/\s+/', ' ', $result); - $result = trim($result); + $result = preg_replace('/\s*(<>|\(\)|\[\])/', '', $result); + $result = trim($result, '/ '); return $result; } -- cgit v1.2.3 From 25a9ec7bb7a1bea7238f400248599e74c4a93950 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 18 Aug 2014 14:16:20 +0200 Subject: Allow caller to supply the template for contact name composition --- program/lib/Roundcube/rcube_addressbook.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php index 5bc3edf2d..69027b0e8 100644 --- a/program/lib/Roundcube/rcube_addressbook.php +++ b/program/lib/Roundcube/rcube_addressbook.php @@ -562,21 +562,22 @@ abstract class rcube_addressbook * @param array Hash array with contact data as key-value pairs * @param string Optional email address * @param string Optional name (self::compose_list_name() result) + * @param string Optional template to use (defaults to the 'contact_search_name' config option) * * @return string Display name */ - public static function compose_search_name($contact, $email = null, $name = null) + public static function compose_search_name($contact, $email = null, $name = null, $templ = null) { static $template; - if (!isset($template)) { // cache this + if (empty($templ) && !isset($template)) { // cache this $template = rcube::get_instance()->config->get('contact_search_name'); if (empty($template)) { $template = '{name} <{email}>'; } } - $result = $template; + $result = $templ ?: $template; if (preg_match_all('/\{[a-z]+\}/', $result, $matches)) { foreach ($matches[0] as $key) { -- cgit v1.2.3 From 028734b25cfa2ee30a129710db0440617f9f3095 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 18 Aug 2014 17:21:03 +0200 Subject: Make LDAP errors available to the application --- program/lib/Roundcube/rcube_ldap.php | 20 ++++++++++++++++++-- program/lib/Roundcube/rcube_ldap_generic.php | 26 +++++++++++++++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index 274616a1f..6805c4902 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -906,7 +906,6 @@ class rcube_ldap extends rcube_addressbook return $this->result; } - /** * Get a specific contact record * @@ -948,6 +947,23 @@ class rcube_ldap extends rcube_addressbook return $assoc ? $res : $this->result; } + /** + * Returns the last error occurred (e.g. when updating/inserting failed) + * + * @return array Hash array with the following fields: type, message + */ + function get_error() + { + $err = $this->error; + + // check ldap connection for errors + if (!$err && $this->ldap->get_error()) { + $err = array(self::ERROR_SEARCH, $this->ldap->get_error()); + } + + return $err; + } + /** * Check the given data before saving. @@ -1609,7 +1625,7 @@ class rcube_ldap extends rcube_addressbook if ($search) { foreach ($group_cache as $group) { - if ($this->compare_search_value('name', $group['name'], $search, $mode)) { + if ($this->compare_search_value('name', $group['name'], mb_strtolower($search), $mode)) { $groups[] = $group; } } diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index 9823dbb66..a76ad6d06 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -32,6 +32,7 @@ class rcube_ldap_generic extends Net_LDAP3 /** private properties */ protected $cache = null; protected $attributes = array('dn'); + protected $error; function __construct($config = null) { @@ -88,11 +89,22 @@ class rcube_ldap_generic extends Net_LDAP3 case LOG_ERR: case LOG_WARNING: + $this->error = $msg; rcube::raise_error($msg, true, false); break; } } + /** + * Returns the last LDAP error occurred + * + * @return mixed Error message string or null if no error occured + */ + function get_error() + { + return $this->error; + } + /** * @deprecated */ @@ -151,7 +163,7 @@ class rcube_ldap_generic extends Net_LDAP3 $this->_debug("C: Replace $dn: ".print_r($entry, true)); if (!ldap_mod_replace($this->conn, $dn, $entry)) { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_mod_replace() failed with " . ldap_error($this->conn)); return false; } @@ -169,7 +181,7 @@ class rcube_ldap_generic extends Net_LDAP3 $this->_debug("C: Add $dn: ".print_r($entry, true)); if (!ldap_mod_add($this->conn, $dn, $entry)) { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_mod_add() failed with " . ldap_error($this->conn)); return false; } @@ -187,7 +199,7 @@ class rcube_ldap_generic extends Net_LDAP3 $this->_debug("C: Delete $dn: ".print_r($entry, true)); if (!ldap_mod_del($this->conn, $dn, $entry)) { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_mod_del() failed with " . ldap_error($this->conn)); return false; } @@ -205,7 +217,7 @@ class rcube_ldap_generic extends Net_LDAP3 $this->_debug("C: Rename $dn to $newrdn"); if (!ldap_rename($this->conn, $dn, $newrdn, $newparent, $deleteoldrdn)) { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_rename() failed with " . ldap_error($this->conn)); return false; } @@ -228,7 +240,7 @@ class rcube_ldap_generic extends Net_LDAP3 $list = ldap_get_entries($this->conn, $result); if ($list === false) { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_get_entries() failed with " . ldap_error($this->conn)); return array(); } @@ -238,7 +250,7 @@ class rcube_ldap_generic extends Net_LDAP3 $this->_debug("S: $count record(s)"); } else { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_list() failed with " . ldap_error($this->conn)); } return $list; @@ -257,7 +269,7 @@ class rcube_ldap_generic extends Net_LDAP3 if ($this->conn && $dn) { $result = @ldap_read($this->conn, $dn, $filter, $attributes, 0, (int)$this->config['sizelimit'], (int)$this->config['timelimit']); if ($result === false) { - $this->_debug("S: ".ldap_error($this->conn)); + $this->_error("ldap_read() failed with " . ldap_error($this->conn)); return false; } -- cgit v1.2.3 From fb5e2fb96f4cda26936f599f1a15a49afb53178e Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 18 Aug 2014 10:46:18 -0400 Subject: Don't fail when trying to create and subscribe a folder that already exists --- program/lib/Roundcube/rcube_imap.php | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index ec961c8d1..a66d2064d 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -3165,6 +3165,16 @@ class rcube_imap extends rcube_storage $result = $this->conn->createFolder($folder, $type ? array("\\" . ucfirst($type)) : null); + // it's quite often situation that we're trying to create and subscribe + // a folder that already exist, but is unsubscribed + if (!$result) { + if ($this->get_response_code() == rcube_storage::ALREADYEXISTS + || preg_match('/already exists/i', $this->get_error_str()) + ) { + $result = true; + } + } + // try to subscribe it if ($result) { // clear cache -- cgit v1.2.3 From f01666a6229cfacee45d4131e7dbcb52e40abfea Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 21 Aug 2014 18:08:26 +0200 Subject: Fix handling of email addresses with quoted domain part (#1490040) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_mime.php | 16 ++++++++++++++++ tests/Framework/Mime.php | 3 +++ 3 files changed, 20 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/CHANGELOG b/CHANGELOG index 8486a9024..d6606eb16 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -56,6 +56,7 @@ CHANGELOG Roundcube Webmail - Fix errors when adding/updating contacts in active search (#1490015) - Fix incorrect thumbnail rotation with GD and exif orientation data (#1490029) - Fix contacts list update after adding/deleting/moving a contact (#1490028, #1490033) +- Fix handling of email addresses with quoted domain part (#1490040) RELEASE 1.0.2 ------------- diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php index 14bc48336..f66cf1437 100644 --- a/program/lib/Roundcube/rcube_mime.php +++ b/program/lib/Roundcube/rcube_mime.php @@ -394,6 +394,7 @@ class rcube_mime } if ($address) { + $address = self::fix_email($address); $result[$key] = array('name' => $name, 'address' => $address); } } @@ -906,4 +907,19 @@ class rcube_mime return 'image/' . $type; } + /** + * Try to fix invalid email addresses + */ + public static function fix_email($email) + { + $parts = rcube_utils::explode_quoted_string('@', $email); + foreach ($parts as $idx => $part) { + // remove redundant quoting (#1490040) + if ($part[0] == '"' && preg_match('/^"([a-zA-Z0-9._+=-]+)"$/', $part, $m)) { + $parts[$idx] = $m[1]; + } + } + + return implode('@', $parts); + } } diff --git a/tests/Framework/Mime.php b/tests/Framework/Mime.php index d47eba896..43773f1a5 100644 --- a/tests/Framework/Mime.php +++ b/tests/Framework/Mime.php @@ -44,6 +44,8 @@ class Framework_Mime extends PHPUnit_Framework_TestCase 23 => '=?UTF-8?B?IlRlc3QsVGVzdCI=?= ', // invalid, but we do our best to parse correctly 24 => '"email@test.com" <>', + // valid with redundant quoting (#1490040) + 25 => '"user"@"domain.tld"', ); $results = array( @@ -73,6 +75,7 @@ class Framework_Mime extends PHPUnit_Framework_TestCase 22 => array(1, 'John Doe @ SomeBusinessName', 'MAILER-DAEMON'), 23 => array(1, 'Test,Test', 'test@domain.tld'), 24 => array(1, '', 'email@test.com'), + 25 => array(1, '', 'user@domain.tld'), ); foreach ($headers as $idx => $header) { -- cgit v1.2.3 From 75bbada03b0e616248ec3458d1a6ee98bfc03659 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 24 Aug 2014 11:23:33 +0200 Subject: Remove code for PHP<5.3, use PHP_VERSION_ID instead of version_compare() for version checks --- program/include/rcmail.php | 2 +- program/lib/Roundcube/rcube_utils.php | 11 ----------- program/lib/Roundcube/rcube_washtml.php | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 0c41c1598..52b53e9d9 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -173,7 +173,7 @@ class rcmail extends rcube setlocale(LC_ALL, $lang . '.utf8', $lang . '.UTF-8', 'en_US.utf8', 'en_US.UTF-8'); // workaround for http://bugs.php.net/bug.php?id=18556 - if (version_compare(PHP_VERSION, '5.5.0', '<') && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) { + if (PHP_VERSION_ID < 50500 && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) { setlocale(LC_CTYPE, 'en_US.utf8', 'en_US.UTF-8'); } } diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index 39e27fc7f..86d9eb2cc 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -119,17 +119,6 @@ class rcube_utils return true; } - if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<')) { - $lookup = array(); - @exec("nslookup -type=MX " . escapeshellarg($domain_part) . " 2>&1", $lookup); - foreach ($lookup as $line) { - if (strpos($line, 'MX preference')) { - return true; - } - } - return false; - } - // find MX record(s) if (!function_exists('getmxrr') || getmxrr($domain_part, $mx_records)) { return true; diff --git a/program/lib/Roundcube/rcube_washtml.php b/program/lib/Roundcube/rcube_washtml.php index b93d3b117..97ab56cdf 100644 --- a/program/lib/Roundcube/rcube_washtml.php +++ b/program/lib/Roundcube/rcube_washtml.php @@ -378,7 +378,7 @@ class rcube_washtml $this->max_nesting_level = (int) @ini_get('xdebug.max_nesting_level'); // Use optimizations if supported - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + if (PHP_VERSION_ID >= 50400) { @$node->loadHTML($html, LIBXML_PARSEHUGE | LIBXML_COMPACT); } else { -- cgit v1.2.3 From 5f58127eae9ed8c54c190506e11af13e8ba57170 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 24 Aug 2014 11:43:12 +0200 Subject: Added rcube_utils::resolve_url() --- program/include/rcmail.php | 21 ++++++--------------- program/lib/Roundcube/rcube_utils.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 15 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 52b53e9d9..ece0606ae 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -827,26 +827,17 @@ class rcmail extends rcube } if ($absolute || $full) { - $prefix = ''; + // add base path to this Roundcube installation + $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME'])); + if ($base_path == '') $base_path = '/'; + $prefix = $base_path; // prepend protocol://hostname:port if ($full) { - $schema = 'http'; - $default_port = 80; - if (rcube_utils::https_check()) { - $schema = 'https'; - $default_port = 443; - } - $prefix = $schema . '://' . preg_replace('/:\d+$/', '', $_SERVER['HTTP_HOST']); - if ($_SERVER['SERVER_PORT'] != $default_port) { - $prefix .= ':' . $_SERVER['SERVER_PORT']; - } + $prefix = rcube_utils::resolve_url($prefix); } - // add base path to this Roundcube installation - $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME'])); - if ($base_path == '') $base_path = '/'; - $prefix .= $base_path; + $prefix = rtrim($prefix, '/') . '/'; } else { $prefix = './'; diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index 86d9eb2cc..ef303f8c1 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -1071,4 +1071,34 @@ class rcube_utils return $path[0] == DIRECTORY_SEPARATOR; } } + + /** + * Resolve relative URL + * + * @param string $url Relative URL + * + * @return string Absolute URL + */ + public static function resolve_url($url) + { + // prepend protocol://hostname:port + if (!preg_match('|^https?://|', $url)) { + $schema = 'http'; + $default_port = 80; + + if (self::https_check()) { + $schema = 'https'; + $default_port = 443; + } + + $prefix = $schema . '://' . preg_replace('/:\d+$/', '', $_SERVER['HTTP_HOST']); + if ($_SERVER['SERVER_PORT'] != $default_port) { + $prefix .= ':' . $_SERVER['SERVER_PORT']; + } + + $url = $prefix . ($url[0] == '/' ? '' : '/') . $url; + } + + return $url; + } } -- cgit v1.2.3 From 35b39c8d7d2a994e6aa0d8e700d2c912d3483a85 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 26 Aug 2014 19:22:53 +0200 Subject: Fix PERMANENTFLAGS checking in modFlag() --- program/lib/Roundcube/rcube_imap_generic.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index a43dfeeed..68d9c6a2c 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2041,8 +2041,8 @@ class rcube_imap_generic $flag = $this->flags[strtoupper($flag)]; } - if (!$flag || !in_array($flag, (array) $this->data['PERMANENTFLAGS']) - || !in_array('\\*', (array) $this->data['PERMANENTFLAGS']) + if (!$flag || (!in_array($flag, (array) $this->data['PERMANENTFLAGS']) + && !in_array('\\*', (array) $this->data['PERMANENTFLAGS'])) ) { return false; } -- cgit v1.2.3 From 64d49edd789047a4791230a24b512d170d946327 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 27 Aug 2014 14:37:39 +0200 Subject: Maintain a stack of currently running plugin hooks --- program/lib/Roundcube/rcube_plugin_api.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index dae3a936d..defccc94f 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -46,7 +46,7 @@ class rcube_plugin_api protected $actionmap = array(); protected $objectsmap = array(); protected $template_contents = array(); - protected $active_hook = false; + protected $exec_stack = array(); // Deprecated names of hooks, will be removed after 0.5-stable release protected $deprecated_hooks = array( @@ -423,8 +423,10 @@ class rcube_plugin_api $args = array('arg' => $args); } + // TODO: avoid recusion by checking in_array($hook, $this->exec_stack) ? + $args += array('abort' => false); - $this->active_hook = $hook; + array_push($this->exec_stack, $hook); foreach ((array)$this->handlers[$hook] as $callback) { $ret = call_user_func($callback, $args); @@ -437,7 +439,7 @@ class rcube_plugin_api } } - $this->active_hook = false; + array_pop($this->exec_stack); return $args; } @@ -573,7 +575,7 @@ class rcube_plugin_api */ public function is_processing($hook = null) { - return $this->active_hook && (!$hook || $this->active_hook == $hook); + return count($this->exec_stack) > 0 && (!$hook || in_array($hook, $this->exec_stack)); } /** -- cgit v1.2.3 From a98a4f8bb56eacffff1765ff09dd29af26e5fc12 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 27 Aug 2014 17:45:21 +0200 Subject: Remove 3rd party libs from our repository and define the dependencies in composer.json-dist. Also remove the ancient utf8 lib and replace it with 'Patchwork UTF-8 for PHP'. For direct git checkouts, copy composer.json-dist into composer.json and run `php composer.phar install` to install the dependencies. --- composer.json-dist | 39 +- installer/check.php | 15 +- installer/index.php | 9 +- program/include/iniset.php | 15 +- program/lib/Auth/SASL.php | 125 - program/lib/Auth/SASL/Anonymous.php | 71 - program/lib/Auth/SASL/Common.php | 105 - program/lib/Auth/SASL/CramMD5.php | 68 - program/lib/Auth/SASL/DigestMD5.php | 197 - program/lib/Auth/SASL/External.php | 63 - program/lib/Auth/SASL/Login.php | 65 - program/lib/Auth/SASL/Plain.php | 63 - program/lib/Auth/SASL/SCRAM.php | 306 - program/lib/Crypt/GPG.php | 2386 --- program/lib/Crypt/GPG/ByteUtils.php | 105 - program/lib/Crypt/GPG/DecryptStatusHandler.php | 344 - program/lib/Crypt/GPG/Engine.php | 2006 --- program/lib/Crypt/GPG/Exceptions.php | 598 - program/lib/Crypt/GPG/Key.php | 223 - program/lib/Crypt/GPG/KeyGenerator.php | 790 - program/lib/Crypt/GPG/KeyGeneratorErrorHandler.php | 121 - .../lib/Crypt/GPG/KeyGeneratorStatusHandler.php | 173 - program/lib/Crypt/GPG/PinEntry.php | 875 - program/lib/Crypt/GPG/ProcessControl.php | 150 - program/lib/Crypt/GPG/Signature.php | 427 - program/lib/Crypt/GPG/SubKey.php | 672 - program/lib/Crypt/GPG/UserId.php | 373 - program/lib/Crypt/GPG/VerifyStatusHandler.php | 216 - program/lib/Crypt/GPGAbstract.php | 508 - program/lib/Mail/mime.php | 1499 -- program/lib/Mail/mimeDecode.php | 1003 -- program/lib/Mail/mimePart.php | 1260 -- program/lib/Net/IDNA2.php | 3402 ---- program/lib/Net/IDNA2/Exception.php | 4 - program/lib/Net/IDNA2/Exception/Nameprep.php | 6 - program/lib/Net/LDAP3.php | 2618 --- program/lib/Net/LDAP3/Result.php | 152 - program/lib/Net/SMTP.php | 1338 -- program/lib/Net/Sieve.php | 1274 -- program/lib/Net/Socket.php | 686 - program/lib/PEAR.php | 1137 -- program/lib/PEAR5.php | 33 - program/lib/Roundcube/bootstrap.php | 6 +- program/lib/Roundcube/rcube_charset.php | 26 +- program/lib/encoding/CP1250.map | 274 - program/lib/encoding/CP1251.map | 274 - program/lib/encoding/CP1252.map | 274 - program/lib/encoding/CP1253.map | 274 - program/lib/encoding/CP1254.map | 274 - program/lib/encoding/CP1255.map | 274 - program/lib/encoding/CP1256.map | 274 - program/lib/encoding/CP1257.map | 274 - program/lib/encoding/CP1258.map | 274 - program/lib/encoding/ISO-8859-1.map | 303 - program/lib/encoding/ISO-8859-10.map | 303 - program/lib/encoding/ISO-8859-11.map | 297 - program/lib/encoding/ISO-8859-13.map | 299 - program/lib/encoding/ISO-8859-14.map | 301 - program/lib/encoding/ISO-8859-15.map | 303 - program/lib/encoding/ISO-8859-16.map | 299 - program/lib/encoding/ISO-8859-2.map | 303 - program/lib/encoding/ISO-8859-3.map | 296 - program/lib/encoding/ISO-8859-4.map | 303 - program/lib/encoding/ISO-8859-5.map | 303 - program/lib/encoding/ISO-8859-6.map | 260 - program/lib/encoding/ISO-8859-7.map | 308 - program/lib/encoding/ISO-8859-8.map | 270 - program/lib/encoding/ISO-8859-9.map | 307 - program/lib/encoding/KOI8R.map | 302 - program/lib/encoding/KSC5601.map | 17078 ------------------- program/lib/utf8.class.php | 171 - 71 files changed, 70 insertions(+), 49954 deletions(-) delete mode 100644 program/lib/Auth/SASL.php delete mode 100644 program/lib/Auth/SASL/Anonymous.php delete mode 100644 program/lib/Auth/SASL/Common.php delete mode 100644 program/lib/Auth/SASL/CramMD5.php delete mode 100644 program/lib/Auth/SASL/DigestMD5.php delete mode 100644 program/lib/Auth/SASL/External.php delete mode 100644 program/lib/Auth/SASL/Login.php delete mode 100644 program/lib/Auth/SASL/Plain.php delete mode 100644 program/lib/Auth/SASL/SCRAM.php delete mode 100644 program/lib/Crypt/GPG.php delete mode 100644 program/lib/Crypt/GPG/ByteUtils.php delete mode 100644 program/lib/Crypt/GPG/DecryptStatusHandler.php delete mode 100644 program/lib/Crypt/GPG/Engine.php delete mode 100644 program/lib/Crypt/GPG/Exceptions.php delete mode 100644 program/lib/Crypt/GPG/Key.php delete mode 100644 program/lib/Crypt/GPG/KeyGenerator.php delete mode 100644 program/lib/Crypt/GPG/KeyGeneratorErrorHandler.php delete mode 100644 program/lib/Crypt/GPG/KeyGeneratorStatusHandler.php delete mode 100644 program/lib/Crypt/GPG/PinEntry.php delete mode 100644 program/lib/Crypt/GPG/ProcessControl.php delete mode 100644 program/lib/Crypt/GPG/Signature.php delete mode 100644 program/lib/Crypt/GPG/SubKey.php delete mode 100644 program/lib/Crypt/GPG/UserId.php delete mode 100644 program/lib/Crypt/GPG/VerifyStatusHandler.php delete mode 100644 program/lib/Crypt/GPGAbstract.php delete mode 100644 program/lib/Mail/mime.php delete mode 100644 program/lib/Mail/mimeDecode.php delete mode 100644 program/lib/Mail/mimePart.php delete mode 100644 program/lib/Net/IDNA2.php delete mode 100644 program/lib/Net/IDNA2/Exception.php delete mode 100644 program/lib/Net/IDNA2/Exception/Nameprep.php delete mode 100644 program/lib/Net/LDAP3.php delete mode 100644 program/lib/Net/LDAP3/Result.php delete mode 100644 program/lib/Net/SMTP.php delete mode 100644 program/lib/Net/Sieve.php delete mode 100644 program/lib/Net/Socket.php delete mode 100644 program/lib/PEAR.php delete mode 100644 program/lib/PEAR5.php delete mode 100644 program/lib/encoding/CP1250.map delete mode 100644 program/lib/encoding/CP1251.map delete mode 100644 program/lib/encoding/CP1252.map delete mode 100644 program/lib/encoding/CP1253.map delete mode 100644 program/lib/encoding/CP1254.map delete mode 100644 program/lib/encoding/CP1255.map delete mode 100644 program/lib/encoding/CP1256.map delete mode 100644 program/lib/encoding/CP1257.map delete mode 100644 program/lib/encoding/CP1258.map delete mode 100644 program/lib/encoding/ISO-8859-1.map delete mode 100644 program/lib/encoding/ISO-8859-10.map delete mode 100644 program/lib/encoding/ISO-8859-11.map delete mode 100644 program/lib/encoding/ISO-8859-13.map delete mode 100644 program/lib/encoding/ISO-8859-14.map delete mode 100644 program/lib/encoding/ISO-8859-15.map delete mode 100644 program/lib/encoding/ISO-8859-16.map delete mode 100644 program/lib/encoding/ISO-8859-2.map delete mode 100644 program/lib/encoding/ISO-8859-3.map delete mode 100644 program/lib/encoding/ISO-8859-4.map delete mode 100644 program/lib/encoding/ISO-8859-5.map delete mode 100644 program/lib/encoding/ISO-8859-6.map delete mode 100644 program/lib/encoding/ISO-8859-7.map delete mode 100644 program/lib/encoding/ISO-8859-8.map delete mode 100644 program/lib/encoding/ISO-8859-9.map delete mode 100644 program/lib/encoding/KOI8R.map delete mode 100644 program/lib/encoding/KSC5601.map delete mode 100644 program/lib/utf8.class.php (limited to 'program/lib/Roundcube') diff --git a/composer.json-dist b/composer.json-dist index e7462038d..7791ca907 100644 --- a/composer.json-dist +++ b/composer.json-dist @@ -3,14 +3,51 @@ "description": "The Roundcube Webmail suite", "license": "GPL-3.0+", "repositories": [ + { + "type": "pear", + "url": "http://pear.php.net/" + }, { "type": "composer", "url": "http://plugins.roundcube.net/" + }, + { + "type": "vcs", + "url": "git@github.com:roundcube/sample-plugin.git" + }, + { + "type": "vcs", + "url": "git://git.kolab.org/git/pear/Net_LDAP3" + }, + { + "type": "package", + "package": { + "name": "Net_SMTP", + "version": "dev-master", + "source": { + "url": "http://github.com/pear/Net_SMTP", + "type": "git", + "reference": "master" + } + } } ], "require": { "php": ">=5.3.0", - "roundcube/plugin-installer": ">=0.1.3" + "roundcube/plugin-installer": ">=0.1.3", + "pear/mail_mime": ">=1.8.9", + "pear/mail_mime-decode": ">=1.5.5", + "pear/net_smtp": "dev-master", + "pear-pear.php.net/auth_sasl": ">=1.0.6", + "pear-pear.php.net/net_idna2": ">=0.1.1", + "pear-pear.php.net/net_sieve": ">=1.3.2", + "pear-pear.php.net/net_ldap2": ">=2.0.12", + "kolab/Net_LDAP3": "dev-master", + "patchwork/utf8": "1.2.x" + }, + "require-dev": { + "pear-pear.php.net/crypt_gpg": "*", + "phpunit/phpunit": "*" }, "minimum-stability": "dev" } diff --git a/installer/check.php b/installer/check.php index 31b4c2955..6974d3720 100644 --- a/installer/check.php +++ b/installer/check.php @@ -28,10 +28,13 @@ $optional_php_exts = array( ); $required_libs = array( - 'PEAR' => 'PEAR.php', - 'Net_SMTP' => 'Net/SMTP.php', - 'Net_IDNA2' => 'Net/IDNA2.php', - 'Mail_mime' => 'Mail/mime.php', + 'PEAR' => 'pear.php.net', + 'Auth_SASL' => 'pear.php.net', + 'Net_SMTP' => 'pear.php.net', + 'Net_IDNA2' => 'pear.php.net', + 'Net_LDAP3' => 'git.kolab.org', + 'Mail_mime' => 'pear.php.net', + 'Mail_mimeDecode' => 'pear.php.net', ); $ini_checks = array( @@ -160,13 +163,13 @@ if (empty($found_db_driver)) { $file) { +foreach ($required_libs as $classname => $vendor) { @include_once $file; if (class_exists($classname)) { $RCI->pass($classname); } else { - $RCI->fail($classname, "Failed to load $file", $source_urls[$classname]); + $RCI->fail($classname, "Failed to load class $classname from $vendor", $source_urls[$classname]); } echo "
    "; } diff --git a/installer/index.php b/installer/index.php index 044eb3f57..b93ad2f94 100644 --- a/installer/index.php +++ b/installer/index.php @@ -3,9 +3,9 @@ /* +-------------------------------------------------------------------------+ | Roundcube Webmail setup tool | - | Version 0.9-git | + | Version 1.1-git | | | - | Copyright (C) 2009-2013, The Roundcube Dev Team | + | Copyright (C) 2009-2014, The Roundcube Dev Team | | | | This program is free software: you can redistribute it and/or modify | | it under the terms of the GNU General Public License (with exceptions | @@ -49,6 +49,11 @@ $include_path .= ini_get('include_path'); set_include_path($include_path); +// include composer autoloader (if available) +if (@file_exists(INSTALL_PATH . 'vendor/autoload.php')) { + require INSTALL_PATH . 'vendor/autoload.php'; +} + require_once 'Roundcube/bootstrap.php'; // deprecated aliases (to be removed) require_once 'bc.php'; diff --git a/program/include/iniset.php b/program/include/iniset.php index 5c3065489..b2cad4292 100644 --- a/program/include/iniset.php +++ b/program/include/iniset.php @@ -54,20 +54,25 @@ if (set_include_path($include_path) === false) { // (does not work in safe mode) @set_time_limit(120); +// include composer autoloader (if available) +if (@file_exists('vendor/autoload.php')) { + require 'vendor/autoload.php'; +} + // include Roundcube Framework require_once 'Roundcube/bootstrap.php'; // register autoloader for rcmail app classes spl_autoload_register('rcmail_autoload'); -// include composer autoloader (if available) -if (@file_exists('vendor/autoload.php')) { - require 'vendor/autoload.php'; -} - // backward compatybility (to be removed) require_once INSTALL_PATH . 'program/include/bc.php'; +// load the UTF-8 portablity layer from Patchwor +if (!function_exists('iconv') || !function_exists('utf8_encode') || !extension_loaded('mbstring')) { + \Patchwork\Utf8\Bootup::initAll(); +} + /** * PHP5 autoloader routine for dynamic class loading diff --git a/program/lib/Auth/SASL.php b/program/lib/Auth/SASL.php deleted file mode 100644 index 5bd6eb096..000000000 --- a/program/lib/Auth/SASL.php +++ /dev/null @@ -1,125 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Client implementation of various SASL mechanisms -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('PEAR.php'); - -class Auth_SASL -{ - /** - * Factory class. Returns an object of the request - * type. - * - * @param string $type One of: Anonymous - * Plain - * CramMD5 - * DigestMD5 - * SCRAM-* (any mechanism of the SCRAM family) - * Types are not case sensitive - */ - function &factory($type) - { - switch (strtolower($type)) { - case 'anonymous': - $filename = 'Auth/SASL/Anonymous.php'; - $classname = 'Auth_SASL_Anonymous'; - break; - - case 'login': - $filename = 'Auth/SASL/Login.php'; - $classname = 'Auth_SASL_Login'; - break; - - case 'plain': - $filename = 'Auth/SASL/Plain.php'; - $classname = 'Auth_SASL_Plain'; - break; - - case 'external': - $filename = 'Auth/SASL/External.php'; - $classname = 'Auth_SASL_External'; - break; - - case 'crammd5': - // $msg = 'Deprecated mechanism name. Use IANA-registered name: CRAM-MD5.'; - // trigger_error($msg, E_USER_DEPRECATED); - case 'cram-md5': - $filename = 'Auth/SASL/CramMD5.php'; - $classname = 'Auth_SASL_CramMD5'; - break; - - case 'digestmd5': - // $msg = 'Deprecated mechanism name. Use IANA-registered name: DIGEST-MD5.'; - // trigger_error($msg, E_USER_DEPRECATED); - case 'digest-md5': - // $msg = 'DIGEST-MD5 is a deprecated SASL mechanism as per RFC-6331. Using it could be a security risk.'; - // trigger_error($msg, E_USER_NOTICE); - $filename = 'Auth/SASL/DigestMD5.php'; - $classname = 'Auth_SASL_DigestMD5'; - break; - - default: - $scram = '/^SCRAM-(.{1,9})$/i'; - if (preg_match($scram, $type, $matches)) - { - $hash = $matches[1]; - $filename = dirname(__FILE__) .'/SASL/SCRAM.php'; - $classname = 'Auth_SASL_SCRAM'; - $parameter = $hash; - break; - } - return PEAR::raiseError('Invalid SASL mechanism type'); - break; - } - - require_once($filename); - if (isset($parameter)) - $obj = new $classname($parameter); - else - $obj = new $classname(); - return $obj; - } -} - -?> diff --git a/program/lib/Auth/SASL/Anonymous.php b/program/lib/Auth/SASL/Anonymous.php deleted file mode 100644 index 081190936..000000000 --- a/program/lib/Auth/SASL/Anonymous.php +++ /dev/null @@ -1,71 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Implmentation of ANONYMOUS SASL mechanism -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_Anonymous extends Auth_SASL_Common -{ - /** - * Not much to do here except return the token supplied. - * No encoding, hashing or encryption takes place for this - * mechanism, simply one of: - * o An email address - * o An opaque string not containing "@" that can be interpreted - * by the sysadmin - * o Nothing - * - * We could have some logic here for the second option, but this - * would by no means create something interpretable. - * - * @param string $token Optional email address or string to provide - * as trace information. - * @return string The unaltered input token - */ - function getResponse($token = '') - { - return $token; - } -} -?> \ No newline at end of file diff --git a/program/lib/Auth/SASL/Common.php b/program/lib/Auth/SASL/Common.php deleted file mode 100644 index d8c5610d1..000000000 --- a/program/lib/Auth/SASL/Common.php +++ /dev/null @@ -1,105 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Common functionality to SASL mechanisms -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -class Auth_SASL_Common -{ - /** - * Function which implements HMAC MD5 digest - * - * @param string $key The secret key - * @param string $data The data to hash - * @param bool $raw_output Whether the digest is returned in binary or hexadecimal format. - * - * @return string The HMAC-MD5 digest - */ - function _HMAC_MD5($key, $data, $raw_output = FALSE) - { - if (strlen($key) > 64) { - $key = pack('H32', md5($key)); - } - - if (strlen($key) < 64) { - $key = str_pad($key, 64, chr(0)); - } - - $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64); - $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64); - - $inner = pack('H32', md5($k_ipad . $data)); - $digest = md5($k_opad . $inner, $raw_output); - - return $digest; - } - - /** - * Function which implements HMAC-SHA-1 digest - * - * @param string $key The secret key - * @param string $data The data to hash - * @param bool $raw_output Whether the digest is returned in binary or hexadecimal format. - * @return string The HMAC-SHA-1 digest - * @author Jehan - * @access protected - */ - protected function _HMAC_SHA1($key, $data, $raw_output = FALSE) - { - if (strlen($key) > 64) { - $key = sha1($key, TRUE); - } - - if (strlen($key) < 64) { - $key = str_pad($key, 64, chr(0)); - } - - $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64); - $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64); - - $inner = pack('H40', sha1($k_ipad . $data)); - $digest = sha1($k_opad . $inner, $raw_output); - - return $digest; - } -} -?> diff --git a/program/lib/Auth/SASL/CramMD5.php b/program/lib/Auth/SASL/CramMD5.php deleted file mode 100644 index d3fbf179b..000000000 --- a/program/lib/Auth/SASL/CramMD5.php +++ /dev/null @@ -1,68 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Implmentation of CRAM-MD5 SASL mechanism -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_CramMD5 extends Auth_SASL_Common -{ - /** - * Implements the CRAM-MD5 SASL mechanism - * This DOES NOT base64 encode the return value, - * you will need to do that yourself. - * - * @param string $user Username - * @param string $pass Password - * @param string $challenge The challenge supplied by the server. - * this should be already base64_decoded. - * - * @return string The string to pass back to the server, of the form - * " ". This is NOT base64_encoded. - */ - function getResponse($user, $pass, $challenge) - { - return $user . ' ' . $this->_HMAC_MD5($pass, $challenge); - } -} -?> \ No newline at end of file diff --git a/program/lib/Auth/SASL/DigestMD5.php b/program/lib/Auth/SASL/DigestMD5.php deleted file mode 100644 index 07007b7c9..000000000 --- a/program/lib/Auth/SASL/DigestMD5.php +++ /dev/null @@ -1,197 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Implmentation of DIGEST-MD5 SASL mechanism -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_DigestMD5 extends Auth_SASL_Common -{ - /** - * Provides the (main) client response for DIGEST-MD5 - * requires a few extra parameters than the other - * mechanisms, which are unavoidable. - * - * @param string $authcid Authentication id (username) - * @param string $pass Password - * @param string $challenge The digest challenge sent by the server - * @param string $hostname The hostname of the machine you're connecting to - * @param string $service The servicename (eg. imap, pop, acap etc) - * @param string $authzid Authorization id (username to proxy as) - * @return string The digest response (NOT base64 encoded) - * @access public - */ - function getResponse($authcid, $pass, $challenge, $hostname, $service, $authzid = '') - { - $challenge = $this->_parseChallenge($challenge); - $authzid_string = ''; - if ($authzid != '') { - $authzid_string = ',authzid="' . $authzid . '"'; - } - - if (!empty($challenge)) { - $cnonce = $this->_getCnonce(); - $digest_uri = sprintf('%s/%s', $service, $hostname); - $response_value = $this->_getResponseValue($authcid, $pass, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $authzid); - - if ($challenge['realm']) { - return sprintf('username="%s",realm="%s"' . $authzid_string . -',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']); - } else { - return sprintf('username="%s"' . $authzid_string . ',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']); - } - } else { - return PEAR::raiseError('Invalid digest challenge'); - } - } - - /** - * Parses and verifies the digest challenge* - * - * @param string $challenge The digest challenge - * @return array The parsed challenge as an assoc - * array in the form "directive => value". - * @access private - */ - function _parseChallenge($challenge) - { - $tokens = array(); - while (preg_match('/^([a-z-]+)=("[^"]+(? diff --git a/program/lib/Auth/SASL/External.php b/program/lib/Auth/SASL/External.php deleted file mode 100644 index c5ae25e75..000000000 --- a/program/lib/Auth/SASL/External.php +++ /dev/null @@ -1,63 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Implmentation of EXTERNAL SASL mechanism -* -* @author Christoph Schulz -* @access public -* @version 1.0.3 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_External extends Auth_SASL_Common -{ - /** - * Returns EXTERNAL response - * - * @param string $authcid Authentication id (username) - * @param string $pass Password - * @param string $authzid Autorization id - * @return string EXTERNAL Response - */ - function getResponse($authcid, $pass, $authzid = '') - { - return $authzid; - } -} -?> diff --git a/program/lib/Auth/SASL/Login.php b/program/lib/Auth/SASL/Login.php deleted file mode 100644 index 918daeedd..000000000 --- a/program/lib/Auth/SASL/Login.php +++ /dev/null @@ -1,65 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* This is technically not a SASL mechanism, however -* it's used by Net_Sieve, Net_Cyrus and potentially -* other protocols , so here is a good place to abstract -* it. -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_Login extends Auth_SASL_Common -{ - /** - * Pseudo SASL LOGIN mechanism - * - * @param string $user Username - * @param string $pass Password - * @return string LOGIN string - */ - function getResponse($user, $pass) - { - return sprintf('LOGIN %s %s', $user, $pass); - } -} -?> \ No newline at end of file diff --git a/program/lib/Auth/SASL/Plain.php b/program/lib/Auth/SASL/Plain.php deleted file mode 100644 index 57894d042..000000000 --- a/program/lib/Auth/SASL/Plain.php +++ /dev/null @@ -1,63 +0,0 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id$ - -/** -* Implmentation of PLAIN SASL mechanism -* -* @author Richard Heyes -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_Plain extends Auth_SASL_Common -{ - /** - * Returns PLAIN response - * - * @param string $authcid Authentication id (username) - * @param string $pass Password - * @param string $authzid Autorization id - * @return string PLAIN Response - */ - function getResponse($authcid, $pass, $authzid = '') - { - return $authzid . chr(0) . $authcid . chr(0) . $pass; - } -} -?> diff --git a/program/lib/Auth/SASL/SCRAM.php b/program/lib/Auth/SASL/SCRAM.php deleted file mode 100644 index cbca500e4..000000000 --- a/program/lib/Auth/SASL/SCRAM.php +++ /dev/null @@ -1,306 +0,0 @@ - -* @access public -* @version 1.0 -* @package Auth_SASL -*/ - -require_once('Auth/SASL/Common.php'); - -class Auth_SASL_SCRAM extends Auth_SASL_Common -{ - /** - * Construct a SCRAM-H client where 'H' is a cryptographic hash function. - * - * @param string $hash The name cryptographic hash function 'H' as registered by IANA in the "Hash Function Textual - * Names" registry. - * @link http://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xml "Hash Function Textual - * Names" - * format of core PHP hash function. - * @access public - */ - function __construct($hash) - { - // Though I could be strict, I will actually also accept the naming used in the PHP core hash framework. - // For instance "sha1" is accepted, while the registered hash name should be "SHA-1". - $hash = strtolower($hash); - $hashes = array('md2' => 'md2', - 'md5' => 'md5', - 'sha-1' => 'sha1', - 'sha1' => 'sha1', - 'sha-224' > 'sha224', - 'sha224' > 'sha224', - 'sha-256' => 'sha256', - 'sha256' => 'sha256', - 'sha-384' => 'sha384', - 'sha384' => 'sha384', - 'sha-512' => 'sha512', - 'sha512' => 'sha512'); - if (function_exists('hash_hmac') && isset($hashes[$hash])) - { - $this->hash = create_function('$data', 'return hash("' . $hashes[$hash] . '", $data, TRUE);'); - $this->hmac = create_function('$key,$str,$raw', 'return hash_hmac("' . $hashes[$hash] . '", $str, $key, $raw);'); - } - elseif ($hash == 'md5') - { - $this->hash = create_function('$data', 'return md5($data, true);'); - $this->hmac = array($this, '_HMAC_MD5'); - } - elseif (in_array($hash, array('sha1', 'sha-1'))) - { - $this->hash = create_function('$data', 'return sha1($data, true);'); - $this->hmac = array($this, '_HMAC_SHA1'); - } - else - return PEAR::raiseError('Invalid SASL mechanism type'); - } - - /** - * Provides the (main) client response for SCRAM-H. - * - * @param string $authcid Authentication id (username) - * @param string $pass Password - * @param string $challenge The challenge sent by the server. - * If the challenge is NULL or an empty string, the result will be the "initial response". - * @param string $authzid Authorization id (username to proxy as) - * @return string|false The response (binary, NOT base64 encoded) - * @access public - */ - public function getResponse($authcid, $pass, $challenge = NULL, $authzid = NULL) - { - $authcid = $this->_formatName($authcid); - if (empty($authcid)) - { - return false; - } - if (!empty($authzid)) - { - $authzid = $this->_formatName($authzid); - if (empty($authzid)) - { - return false; - } - } - - if (empty($challenge)) - { - return $this->_generateInitialResponse($authcid, $authzid); - } - else - { - return $this->_generateResponse($challenge, $pass); - } - - } - - /** - * Prepare a name for inclusion in a SCRAM response. - * - * @param string $username a name to be prepared. - * @return string the reformated name. - * @access private - */ - private function _formatName($username) - { - // TODO: prepare through the SASLprep profile of the stringprep algorithm. - // See RFC-4013. - - $username = str_replace('=', '=3D', $username); - $username = str_replace(',', '=2C', $username); - return $username; - } - - /** - * Generate the initial response which can be either sent directly in the first message or as a response to an empty - * server challenge. - * - * @param string $authcid Prepared authentication identity. - * @param string $authzid Prepared authorization identity. - * @return string The SCRAM response to send. - * @access private - */ - private function _generateInitialResponse($authcid, $authzid) - { - $init_rep = ''; - $gs2_cbind_flag = 'n,'; // TODO: support channel binding. - $this->gs2_header = $gs2_cbind_flag . (!empty($authzid)? 'a=' . $authzid : '') . ','; - - // I must generate a client nonce and "save" it for later comparison on second response. - $this->cnonce = $this->_getCnonce(); - // XXX: in the future, when mandatory and/or optional extensions are defined in any updated RFC, - // this message can be updated. - $this->first_message_bare = 'n=' . $authcid . ',r=' . $this->cnonce; - return $this->gs2_header . $this->first_message_bare; - } - - /** - * Parses and verifies a non-empty SCRAM challenge. - * - * @param string $challenge The SCRAM challenge - * @return string|false The response to send; false in case of wrong challenge or if an initial response has not - * been generated first. - * @access private - */ - private function _generateResponse($challenge, $password) - { - // XXX: as I don't support mandatory extension, I would fail on them. - // And I simply ignore any optional extension. - $server_message_regexp = "#^r=([\x21-\x2B\x2D-\x7E]+),s=((?:[A-Za-z0-9/+]{4})*(?:[A-Za-z0-9]{3}=|[A-Xa-z0-9]{2}==)?),i=([0-9]*)(,[A-Za-z]=[^,])*$#"; - if (!isset($this->cnonce, $this->gs2_header) - || !preg_match($server_message_regexp, $challenge, $matches)) - { - return false; - } - $nonce = $matches[1]; - $salt = base64_decode($matches[2]); - if (!$salt) - { - // Invalid Base64. - return false; - } - $i = intval($matches[3]); - - $cnonce = substr($nonce, 0, strlen($this->cnonce)); - if ($cnonce <> $this->cnonce) - { - // Invalid challenge! Are we under attack? - return false; - } - - $channel_binding = 'c=' . base64_encode($this->gs2_header); // TODO: support channel binding. - $final_message = $channel_binding . ',r=' . $nonce; // XXX: no extension. - - // TODO: $password = $this->normalize($password); // SASLprep profile of stringprep. - $saltedPassword = $this->hi($password, $salt, $i); - $this->saltedPassword = $saltedPassword; - $clientKey = call_user_func($this->hmac, $saltedPassword, "Client Key", TRUE); - $storedKey = call_user_func($this->hash, $clientKey, TRUE); - $authMessage = $this->first_message_bare . ',' . $challenge . ',' . $final_message; - $this->authMessage = $authMessage; - $clientSignature = call_user_func($this->hmac, $storedKey, $authMessage, TRUE); - $clientProof = $clientKey ^ $clientSignature; - $proof = ',p=' . base64_encode($clientProof); - - return $final_message . $proof; - } - - /** - * SCRAM has also a server verification step. On a successful outcome, it will send additional data which must - * absolutely be checked against this function. If this fails, the entity which we are communicating with is probably - * not the server as it has not access to your ServerKey. - * - * @param string $data The additional data sent along a successful outcome. - * @return bool Whether the server has been authenticated. - * If false, the client must close the connection and consider to be under a MITM attack. - * @access public - */ - public function processOutcome($data) - { - $verifier_regexp = '#^v=((?:[A-Za-z0-9/+]{4})*(?:[A-Za-z0-9]{3}=|[A-Xa-z0-9]{2}==)?)$#'; - if (!isset($this->saltedPassword, $this->authMessage) - || !preg_match($verifier_regexp, $data, $matches)) - { - // This cannot be an outcome, you never sent the challenge's response. - return false; - } - - $verifier = $matches[1]; - $proposed_serverSignature = base64_decode($verifier); - $serverKey = call_user_func($this->hmac, $this->saltedPassword, "Server Key", true); - $serverSignature = call_user_func($this->hmac, $serverKey, $this->authMessage, TRUE); - return ($proposed_serverSignature === $serverSignature); - } - - /** - * Hi() call, which is essentially PBKDF2 (RFC-2898) with HMAC-H() as the pseudorandom function. - * - * @param string $str The string to hash. - * @param string $hash The hash value. - * @param int $i The iteration count. - * @access private - */ - private function hi($str, $salt, $i) - { - $int1 = "\0\0\0\1"; - $ui = call_user_func($this->hmac, $str, $salt . $int1, true); - $result = $ui; - for ($k = 1; $k < $i; $k++) - { - $ui = call_user_func($this->hmac, $str, $ui, true); - $result = $result ^ $ui; - } - return $result; - } - - - /** - * Creates the client nonce for the response - * - * @return string The cnonce value - * @access private - * @author Richard Heyes - */ - private function _getCnonce() - { - // TODO: I reused the nonce function from the DigestMD5 class. - // I should probably make this a protected function in Common. - if (@file_exists('/dev/urandom') && $fd = @fopen('/dev/urandom', 'r')) { - return base64_encode(fread($fd, 32)); - - } elseif (@file_exists('/dev/random') && $fd = @fopen('/dev/random', 'r')) { - return base64_encode(fread($fd, 32)); - - } else { - $str = ''; - for ($i=0; $i<32; $i++) { - $str .= chr(mt_rand(0, 255)); - } - - return base64_encode($str); - } - } - -} - -?> diff --git a/program/lib/Crypt/GPG.php b/program/lib/Crypt/GPG.php deleted file mode 100644 index 5c2231289..000000000 --- a/program/lib/Crypt/GPG.php +++ /dev/null @@ -1,2386 +0,0 @@ - - * addEncryptKey($mySecretKeyId); - * $encryptedData = $gpg->encrypt($data); - * ?> - * - * - * PHP version 5 - * - * LICENSE: - * - * This library is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of the - * License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * @category Encryption - * @package Crypt_GPG - * @author Nathan Fredrickson - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://pear.php.net/manual/en/package.encryption.crypt-gpg.php - * @link http://www.gnupg.org/ - */ - -/** - * Base class for GPG methods - */ -require_once 'Crypt/GPGAbstract.php'; - -/** - * Signature handler class - */ -require_once 'Crypt/GPG/VerifyStatusHandler.php'; - -/** - * Decryption handler class - */ -require_once 'Crypt/GPG/DecryptStatusHandler.php'; - -// {{{ class Crypt_GPG - -/** - * A class to use GPG from PHP - * - * This class provides an object oriented interface to GNU Privacy Guard (GPG). - * - * Though GPG can support symmetric-key cryptography, this class is intended - * only to facilitate public-key cryptography. - * - * @category Encryption - * @package Crypt_GPG - * @author Nathan Fredrickson - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG extends Crypt_GPGAbstract -{ - // {{{ class constants for data signing modes - - /** - * Signing mode for normal signing of data. The signed message will not - * be readable without special software. - * - * This is the default signing mode. - * - * @see Crypt_GPG::sign() - * @see Crypt_GPG::signFile() - */ - const SIGN_MODE_NORMAL = 1; - - /** - * Signing mode for clearsigning data. Clearsigned signatures are ASCII - * armored data and are readable without special software. If the signed - * message is unencrypted, the message will still be readable. The message - * text will be in the original encoding. - * - * @see Crypt_GPG::sign() - * @see Crypt_GPG::signFile() - */ - const SIGN_MODE_CLEAR = 2; - - /** - * Signing mode for creating a detached signature. When using detached - * signatures, only the signature data is returned. The original message - * text may be distributed separately from the signature data. This is - * useful for miltipart/signed email messages as per - * {@link http://www.ietf.org/rfc/rfc3156.txt RFC 3156}. - * - * @see Crypt_GPG::sign() - * @see Crypt_GPG::signFile() - */ - const SIGN_MODE_DETACHED = 3; - - // }}} - // {{{ class constants for fingerprint formats - - /** - * No formatting is performed. - * - * Example: C3BC615AD9C766E5A85C1F2716D27458B1BBA1C4 - * - * @see Crypt_GPG::getFingerprint() - */ - const FORMAT_NONE = 1; - - /** - * Fingerprint is formatted in the format used by the GnuPG gpg command's - * default output. - * - * Example: C3BC 615A D9C7 66E5 A85C 1F27 16D2 7458 B1BB A1C4 - * - * @see Crypt_GPG::getFingerprint() - */ - const FORMAT_CANONICAL = 2; - - /** - * Fingerprint is formatted in the format used when displaying X.509 - * certificates - * - * Example: C3:BC:61:5A:D9:C7:66:E5:A8:5C:1F:27:16:D2:74:58:B1:BB:A1:C4 - * - * @see Crypt_GPG::getFingerprint() - */ - const FORMAT_X509 = 3; - - // }}} - // {{{ class constants for boolean options - - /** - * Use to specify ASCII armored mode for returned data - */ - const ARMOR_ASCII = true; - - /** - * Use to specify binary mode for returned data - */ - const ARMOR_BINARY = false; - - /** - * Use to specify that line breaks in signed text should be normalized - */ - const TEXT_NORMALIZED = true; - - /** - * Use to specify that line breaks in signed text should not be normalized - */ - const TEXT_RAW = false; - - // }}} - // {{{ protected class properties - - /** - * Engine used to control the GPG subprocess - * - * @var Crypt_GPG_Engine - * - * @see Crypt_GPG::setEngine() - */ - protected $engine = null; - - /** - * Keys used to encrypt - * - * The array is of the form: - * - * array( - * $key_id => array( - * 'fingerprint' => $fingerprint, - * 'passphrase' => null - * ) - * ); - * - * - * @var array - * @see Crypt_GPG::addEncryptKey() - * @see Crypt_GPG::clearEncryptKeys() - */ - protected $encryptKeys = array(); - - /** - * Keys used to decrypt - * - * The array is of the form: - * - * array( - * $key_id => array( - * 'fingerprint' => $fingerprint, - * 'passphrase' => $passphrase - * ) - * ); - * - * - * @var array - * @see Crypt_GPG::addSignKey() - * @see Crypt_GPG::clearSignKeys() - */ - protected $signKeys = array(); - - /** - * Keys used to sign - * - * The array is of the form: - * - * array( - * $key_id => array( - * 'fingerprint' => $fingerprint, - * 'passphrase' => $passphrase - * ) - * ); - * - * - * @var array - * @see Crypt_GPG::addDecryptKey() - * @see Crypt_GPG::clearDecryptKeys() - */ - protected $decryptKeys = array(); - - // }}} - // {{{ importKey() - - /** - * Imports a public or private key into the keyring - * - * Keys may be removed from the keyring using - * {@link Crypt_GPG::deletePublicKey()} or - * {@link Crypt_GPG::deletePrivateKey()}. - * - * @param string $data the key data to be imported. - * - * @return array an associative array containing the following elements: - * - fingerprint - the fingerprint of the - * imported key, - * - public_imported - the number of public - * keys imported, - * - public_unchanged - the number of unchanged - * public keys, - * - private_imported - the number of private - * keys imported, - * - private_unchanged - the number of unchanged - * private keys. - * - * @throws Crypt_GPG_NoDataException if the key data is missing or if the - * data is is not valid key data. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function importKey($data) - { - return $this->_importKey($data, false); - } - - // }}} - // {{{ importKeyFile() - - /** - * Imports a public or private key file into the keyring - * - * Keys may be removed from the keyring using - * {@link Crypt_GPG::deletePublicKey()} or - * {@link Crypt_GPG::deletePrivateKey()}. - * - * @param string $filename the key file to be imported. - * - * @return array an associative array containing the following elements: - * - fingerprint - the fingerprint of the - * imported key, - * - public_imported - the number of public - * keys imported, - * - public_unchanged - the number of unchanged - * public keys, - * - private_imported - the number of private - * keys imported, - * - private_unchanged - the number of unchanged - * private keys. - * private keys. - * - * @throws Crypt_GPG_NoDataException if the key data is missing or if the - * data is is not valid key data. - * - * @throws Crypt_GPG_FileException if the key file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function importKeyFile($filename) - { - return $this->_importKey($filename, true); - } - - // }}} - // {{{ exportPublicKey() - - /** - * Exports a public key from the keyring - * - * The exported key remains on the keyring. To delete the public key, use - * {@link Crypt_GPG::deletePublicKey()}. - * - * If more than one key fingerprint is available for the specified - * $keyId (for example, if you use a non-unique uid) only the - * first public key is exported. - * - * @param string $keyId either the full uid of the public key, the email - * part of the uid of the public key or the key id of - * the public key. For example, - * "Test User (example) ", - * "test@example.com" or a hexadecimal string. - * @param boolean $armor optional. If true, ASCII armored data is returned; - * otherwise, binary data is returned. Defaults to - * true. - * - * @return string the public key data. - * - * @throws Crypt_GPG_KeyNotFoundException if a public key with the given - * $keyId is not found. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function exportPublicKey($keyId, $armor = true) - { - $fingerprint = $this->getFingerprint($keyId); - - if ($fingerprint === null) { - throw new Crypt_GPG_KeyNotFoundException( - 'Public key not found: ' . $keyId, - self::ERROR_KEY_NOT_FOUND, - $keyId - ); - } - - $keyData = ''; - $operation = '--export ' . escapeshellarg($fingerprint); - $arguments = ($armor) ? array('--armor') : array(); - - $this->engine->reset(); - $this->engine->setOutput($keyData); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - $code = $this->engine->getErrorCode(); - - if ($code !== self::ERROR_NONE) { - throw new Crypt_GPG_Exception( - 'Unknown error exporting public key. Please use the ' . - '\'debug\' option when creating the Crypt_GPG object, and ' . - 'file a bug report at ' . self::BUG_URI, - $code - ); - } - - return $keyData; - } - - // }}} - // {{{ deletePublicKey() - - /** - * Deletes a public key from the keyring - * - * If more than one key fingerprint is available for the specified - * $keyId (for example, if you use a non-unique uid) only the - * first public key is deleted. - * - * The private key must be deleted first or an exception will be thrown. - * See {@link Crypt_GPG::deletePrivateKey()}. - * - * @param string $keyId either the full uid of the public key, the email - * part of the uid of the public key or the key id of - * the public key. For example, - * "Test User (example) ", - * "test@example.com" or a hexadecimal string. - * - * @return void - * - * @throws Crypt_GPG_KeyNotFoundException if a public key with the given - * $keyId is not found. - * - * @throws Crypt_GPG_DeletePrivateKeyException if the specified public key - * has an associated private key on the keyring. The private key - * must be deleted first. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function deletePublicKey($keyId) - { - $fingerprint = $this->getFingerprint($keyId); - - if ($fingerprint === null) { - throw new Crypt_GPG_KeyNotFoundException( - 'Public key not found: ' . $keyId, - self::ERROR_KEY_NOT_FOUND, - $keyId - ); - } - - $operation = '--delete-key ' . escapeshellarg($fingerprint); - $arguments = array( - '--batch', - '--yes' - ); - - $this->engine->reset(); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - break; - case self::ERROR_DELETE_PRIVATE_KEY: - throw new Crypt_GPG_DeletePrivateKeyException( - 'Private key must be deleted before public key can be ' . - 'deleted.', - $code, - $keyId - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error deleting public key. Please use the ' . - '\'debug\' option when creating the Crypt_GPG object, and ' . - 'file a bug report at ' . self::BUG_URI, - $code - ); - } - } - - // }}} - // {{{ deletePrivateKey() - - /** - * Deletes a private key from the keyring - * - * If more than one key fingerprint is available for the specified - * $keyId (for example, if you use a non-unique uid) only the - * first private key is deleted. - * - * Calls GPG with the --delete-secret-key command. - * - * @param string $keyId either the full uid of the private key, the email - * part of the uid of the private key or the key id of - * the private key. For example, - * "Test User (example) ", - * "test@example.com" or a hexadecimal string. - * - * @return void - * - * @throws Crypt_GPG_KeyNotFoundException if a private key with the given - * $keyId is not found. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function deletePrivateKey($keyId) - { - $fingerprint = $this->getFingerprint($keyId); - - if ($fingerprint === null) { - throw new Crypt_GPG_KeyNotFoundException( - 'Private key not found: ' . $keyId, - self::ERROR_KEY_NOT_FOUND, - $keyId - ); - } - - $operation = '--delete-secret-key ' . escapeshellarg($fingerprint); - $arguments = array( - '--batch', - '--yes' - ); - - $this->engine->reset(); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - break; - case self::ERROR_KEY_NOT_FOUND: - throw new Crypt_GPG_KeyNotFoundException( - 'Private key not found: ' . $keyId, - $code, - $keyId - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error deleting private key. Please use the ' . - '\'debug\' option when creating the Crypt_GPG object, and ' . - 'file a bug report at ' . self::BUG_URI, - $code - ); - } - } - - // }}} - // {{{ getKeys() - - /** - * Gets the available keys in the keyring - * - * Calls GPG with the --list-keys command and grabs keys. See - * the first section of doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG package} for a detailed - * description of how the GPG command output is parsed. - * - * @param string $keyId optional. Only keys with that match the specified - * pattern are returned. The pattern may be part of - * a user id, a key id or a key fingerprint. If not - * specified, all keys are returned. - * - * @return array an array of {@link Crypt_GPG_Key} objects. If no keys - * match the specified $keyId an empty array is - * returned. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG_Key - */ - public function getKeys($keyId = '') - { - return parent::_getKeys($keyId); - } - - // }}} - // {{{ getFingerprint() - - /** - * Gets a key fingerprint from the keyring - * - * If more than one key fingerprint is available (for example, if you use - * a non-unique user id) only the first key fingerprint is returned. - * - * Calls the GPG --list-keys command with the - * --with-fingerprint option to retrieve a public key - * fingerprint. - * - * @param string $keyId either the full user id of the key, the email - * part of the user id of the key, or the key id of - * the key. For example, - * "Test User (example) ", - * "test@example.com" or a hexadecimal string. - * @param integer $format optional. How the fingerprint should be formatted. - * Use {@link Crypt_GPG::FORMAT_X509} for X.509 - * certificate format, - * {@link Crypt_GPG::FORMAT_CANONICAL} for the format - * used by GnuPG output and - * {@link Crypt_GPG::FORMAT_NONE} for no formatting. - * Defaults to Crypt_GPG::FORMAT_NONE. - * - * @return string the fingerprint of the key, or null if no fingerprint - * is found for the given $keyId. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function getFingerprint($keyId, $format = self::FORMAT_NONE) - { - $output = ''; - $operation = '--list-keys ' . escapeshellarg($keyId); - $arguments = array( - '--with-colons', - '--with-fingerprint' - ); - - $this->engine->reset(); - $this->engine->setOutput($output); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - case self::ERROR_KEY_NOT_FOUND: - // ignore not found key errors - break; - default: - throw new Crypt_GPG_Exception( - 'Unknown error getting key fingerprint. Please use the ' . - '\'debug\' option when creating the Crypt_GPG object, and ' . - 'file a bug report at ' . self::BUG_URI, - $code - ); - } - - $fingerprint = null; - - $lines = explode(PHP_EOL, $output); - foreach ($lines as $line) { - if (substr($line, 0, 3) == 'fpr') { - $lineExp = explode(':', $line); - $fingerprint = $lineExp[9]; - - switch ($format) { - case self::FORMAT_CANONICAL: - $fingerprintExp = str_split($fingerprint, 4); - $format = '%s %s %s %s %s %s %s %s %s %s'; - $fingerprint = vsprintf($format, $fingerprintExp); - break; - - case self::FORMAT_X509: - $fingerprintExp = str_split($fingerprint, 2); - $fingerprint = implode(':', $fingerprintExp); - break; - } - - break; - } - } - - return $fingerprint; - } - - // }}} - // {{{ encrypt() - - /** - * Encrypts string data - * - * Data is ASCII armored by default but may optionally be returned as - * binary. - * - * @param string $data the data to be encrypted. - * @param boolean $armor optional. If true, ASCII armored data is returned; - * otherwise, binary data is returned. Defaults to - * true. - * - * @return string the encrypted data. - * - * @throws Crypt_GPG_KeyNotFoundException if no encryption key is specified. - * See {@link Crypt_GPG::addEncryptKey()}. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @sensitive $data - */ - public function encrypt($data, $armor = self::ARMOR_ASCII) - { - return $this->_encrypt($data, false, null, $armor); - } - - // }}} - // {{{ encryptFile() - - /** - * Encrypts a file - * - * Encrypted data is ASCII armored by default but may optionally be saved - * as binary. - * - * @param string $filename the filename of the file to encrypt. - * @param string $encryptedFile optional. The filename of the file in - * which to store the encrypted data. If null - * or unspecified, the encrypted data is - * returned as a string. - * @param boolean $armor optional. If true, ASCII armored data is - * returned; otherwise, binary data is - * returned. Defaults to true. - * - * @return void|string if the $encryptedFile parameter is null, - * a string containing the encrypted data is returned. - * - * @throws Crypt_GPG_KeyNotFoundException if no encryption key is specified. - * See {@link Crypt_GPG::addEncryptKey()}. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function encryptFile( - $filename, - $encryptedFile = null, - $armor = self::ARMOR_ASCII - ) { - return $this->_encrypt($filename, true, $encryptedFile, $armor); - } - - // }}} - // {{{ encryptAndSign() - - /** - * Encrypts and signs data - * - * Data is encrypted and signed in a single pass. - * - * NOTE: Until GnuPG version 1.4.10, it was not possible to verify - * encrypted-signed data without decrypting it at the same time. If you try - * to use {@link Crypt_GPG::verify()} method on encrypted-signed data with - * earlier GnuPG versions, you will get an error. Please use - * {@link Crypt_GPG::decryptAndVerify()} to verify encrypted-signed data. - * - * @param string $data the data to be encrypted and signed. - * @param boolean $armor optional. If true, ASCII armored data is returned; - * otherwise, binary data is returned. Defaults to - * true. - * - * @return string the encrypted signed data. - * - * @throws Crypt_GPG_KeyNotFoundException if no encryption key is specified - * or if no signing key is specified. See - * {@link Crypt_GPG::addEncryptKey()} and - * {@link Crypt_GPG::addSignKey()}. - * - * @throws Crypt_GPG_BadPassphraseException if a specified passphrase is - * incorrect or if a required passphrase is not specified. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG::decryptAndVerify() - */ - public function encryptAndSign($data, $armor = self::ARMOR_ASCII) - { - return $this->_encryptAndSign($data, false, null, $armor); - } - - // }}} - // {{{ encryptAndSignFile() - - /** - * Encrypts and signs a file - * - * The file is encrypted and signed in a single pass. - * - * NOTE: Until GnuPG version 1.4.10, it was not possible to verify - * encrypted-signed files without decrypting them at the same time. If you - * try to use {@link Crypt_GPG::verify()} method on encrypted-signed files - * with earlier GnuPG versions, you will get an error. Please use - * {@link Crypt_GPG::decryptAndVerifyFile()} to verify encrypted-signed - * files. - * - * @param string $filename the name of the file containing the data to - * be encrypted and signed. - * @param string $signedFile optional. The name of the file in which the - * encrypted, signed data should be stored. If - * null or unspecified, the encrypted, signed - * data is returned as a string. - * @param boolean $armor optional. If true, ASCII armored data is - * returned; otherwise, binary data is returned. - * Defaults to true. - * - * @return void|string if the $signedFile parameter is null, a - * string containing the encrypted, signed data is - * returned. - * - * @throws Crypt_GPG_KeyNotFoundException if no encryption key is specified - * or if no signing key is specified. See - * {@link Crypt_GPG::addEncryptKey()} and - * {@link Crypt_GPG::addSignKey()}. - * - * @throws Crypt_GPG_BadPassphraseException if a specified passphrase is - * incorrect or if a required passphrase is not specified. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG::decryptAndVerifyFile() - */ - public function encryptAndSignFile( - $filename, - $signedFile = null, - $armor = self::ARMOR_ASCII - ) { - return $this->_encryptAndSign($filename, true, $signedFile, $armor); - } - - // }}} - // {{{ decrypt() - - /** - * Decrypts string data - * - * This method assumes the required private key is available in the keyring - * and throws an exception if the private key is not available. To add a - * private key to the keyring, use the {@link Crypt_GPG::importKey()} or - * {@link Crypt_GPG::importKeyFile()} methods. - * - * @param string $encryptedData the data to be decrypted. - * - * @return string the decrypted data. - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function decrypt($encryptedData) - { - return $this->_decrypt($encryptedData, false, null); - } - - // }}} - // {{{ decryptFile() - - /** - * Decrypts a file - * - * This method assumes the required private key is available in the keyring - * and throws an exception if the private key is not available. To add a - * private key to the keyring, use the {@link Crypt_GPG::importKey()} or - * {@link Crypt_GPG::importKeyFile()} methods. - * - * @param string $encryptedFile the name of the encrypted file data to - * decrypt. - * @param string $decryptedFile optional. The name of the file to which the - * decrypted data should be written. If null - * or unspecified, the decrypted data is - * returned as a string. - * - * @return void|string if the $decryptedFile parameter is null, - * a string containing the decrypted data is returned. - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function decryptFile($encryptedFile, $decryptedFile = null) - { - return $this->_decrypt($encryptedFile, true, $decryptedFile); - } - - // }}} - // {{{ decryptAndVerify() - - /** - * Decrypts and verifies string data - * - * This method assumes the required private key is available in the keyring - * and throws an exception if the private key is not available. To add a - * private key to the keyring, use the {@link Crypt_GPG::importKey()} or - * {@link Crypt_GPG::importKeyFile()} methods. - * - * @param string $encryptedData the encrypted, signed data to be decrypted - * and verified. - * - * @return array two element array. The array has an element 'data' - * containing the decrypted data and an element - * 'signatures' containing an array of - * {@link Crypt_GPG_Signature} objects for the signed data. - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function decryptAndVerify($encryptedData) - { - return $this->_decryptAndVerify($encryptedData, false, null); - } - - // }}} - // {{{ decryptAndVerifyFile() - - /** - * Decrypts and verifies a signed, encrypted file - * - * This method assumes the required private key is available in the keyring - * and throws an exception if the private key is not available. To add a - * private key to the keyring, use the {@link Crypt_GPG::importKey()} or - * {@link Crypt_GPG::importKeyFile()} methods. - * - * @param string $encryptedFile the name of the signed, encrypted file to - * to decrypt and verify. - * @param string $decryptedFile optional. The name of the file to which the - * decrypted data should be written. If null - * or unspecified, the decrypted data is - * returned in the results array. - * - * @return array two element array. The array has an element 'data' - * containing the decrypted data and an element - * 'signatures' containing an array of - * {@link Crypt_GPG_Signature} objects for the signed data. - * If the decrypted data is written to a file, the 'data' - * element is null. - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function decryptAndVerifyFile($encryptedFile, $decryptedFile = null) - { - return $this->_decryptAndVerify($encryptedFile, true, $decryptedFile); - } - - // }}} - // {{{ sign() - - /** - * Signs data - * - * Data may be signed using any one of the three available signing modes: - * - {@link Crypt_GPG::SIGN_MODE_NORMAL} - * - {@link Crypt_GPG::SIGN_MODE_CLEAR} - * - {@link Crypt_GPG::SIGN_MODE_DETACHED} - * - * @param string $data the data to be signed. - * @param boolean $mode optional. The data signing mode to use. Should - * be one of {@link Crypt_GPG::SIGN_MODE_NORMAL}, - * {@link Crypt_GPG::SIGN_MODE_CLEAR} or - * {@link Crypt_GPG::SIGN_MODE_DETACHED}. If not - * specified, defaults to - * Crypt_GPG::SIGN_MODE_NORMAL. - * @param boolean $armor optional. If true, ASCII armored data is - * returned; otherwise, binary data is returned. - * Defaults to true. This has no effect if the - * mode Crypt_GPG::SIGN_MODE_CLEAR is - * used. - * @param boolean $textmode optional. If true, line-breaks in signed data - * are normalized. Use this option when signing - * e-mail, or for greater compatibility between - * systems with different line-break formats. - * Defaults to false. This has no effect if the - * mode Crypt_GPG::SIGN_MODE_CLEAR is - * used as clear-signing always uses textmode. - * - * @return string the signed data, or the signature data if a detached - * signature is requested. - * - * @throws Crypt_GPG_KeyNotFoundException if no signing key is specified. - * See {@link Crypt_GPG::addSignKey()}. - * - * @throws Crypt_GPG_BadPassphraseException if a specified passphrase is - * incorrect or if a required passphrase is not specified. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function sign( - $data, - $mode = self::SIGN_MODE_NORMAL, - $armor = self::ARMOR_ASCII, - $textmode = self::TEXT_RAW - ) { - return $this->_sign($data, false, null, $mode, $armor, $textmode); - } - - // }}} - // {{{ signFile() - - /** - * Signs a file - * - * The file may be signed using any one of the three available signing - * modes: - * - {@link Crypt_GPG::SIGN_MODE_NORMAL} - * - {@link Crypt_GPG::SIGN_MODE_CLEAR} - * - {@link Crypt_GPG::SIGN_MODE_DETACHED} - * - * @param string $filename the name of the file containing the data to - * be signed. - * @param string $signedFile optional. The name of the file in which the - * signed data should be stored. If null or - * unspecified, the signed data is returned as a - * string. - * @param boolean $mode optional. The data signing mode to use. Should - * be one of {@link Crypt_GPG::SIGN_MODE_NORMAL}, - * {@link Crypt_GPG::SIGN_MODE_CLEAR} or - * {@link Crypt_GPG::SIGN_MODE_DETACHED}. If not - * specified, defaults to - * Crypt_GPG::SIGN_MODE_NORMAL. - * @param boolean $armor optional. If true, ASCII armored data is - * returned; otherwise, binary data is returned. - * Defaults to true. This has no effect if the - * mode Crypt_GPG::SIGN_MODE_CLEAR is - * used. - * @param boolean $textmode optional. If true, line-breaks in signed data - * are normalized. Use this option when signing - * e-mail, or for greater compatibility between - * systems with different line-break formats. - * Defaults to false. This has no effect if the - * mode Crypt_GPG::SIGN_MODE_CLEAR is - * used as clear-signing always uses textmode. - * - * @return void|string if the $signedFile parameter is null, a - * string containing the signed data (or the signature - * data if a detached signature is requested) is - * returned. - * - * @throws Crypt_GPG_KeyNotFoundException if no signing key is specified. - * See {@link Crypt_GPG::addSignKey()}. - * - * @throws Crypt_GPG_BadPassphraseException if a specified passphrase is - * incorrect or if a required passphrase is not specified. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function signFile( - $filename, - $signedFile = null, - $mode = self::SIGN_MODE_NORMAL, - $armor = self::ARMOR_ASCII, - $textmode = self::TEXT_RAW - ) { - return $this->_sign( - $filename, - true, - $signedFile, - $mode, - $armor, - $textmode - ); - } - - // }}} - // {{{ verify() - - /** - * Verifies signed data - * - * The {@link Crypt_GPG::decrypt()} method may be used to get the original - * message if the signed data is not clearsigned and does not use a - * detached signature. - * - * @param string $signedData the signed data to be verified. - * @param string $signature optional. If verifying data signed using a - * detached signature, this must be the detached - * signature data. The data that was signed is - * specified in $signedData. - * - * @return array an array of {@link Crypt_GPG_Signature} objects for the - * signed data. For each signature that is valid, the - * {@link Crypt_GPG_Signature::isValid()} will return true. - * - * @throws Crypt_GPG_NoDataException if the provided data is not signed - * data. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG_Signature - */ - public function verify($signedData, $signature = '') - { - return $this->_verify($signedData, false, $signature); - } - - // }}} - // {{{ verifyFile() - - /** - * Verifies a signed file - * - * The {@link Crypt_GPG::decryptFile()} method may be used to get the - * original message if the signed data is not clearsigned and does not use - * a detached signature. - * - * @param string $filename the signed file to be verified. - * @param string $signature optional. If verifying a file signed using a - * detached signature, this must be the detached - * signature data. The file that was signed is - * specified in $filename. - * - * @return array an array of {@link Crypt_GPG_Signature} objects for the - * signed data. For each signature that is valid, the - * {@link Crypt_GPG_Signature::isValid()} will return true. - * - * @throws Crypt_GPG_NoDataException if the provided data is not signed - * data. - * - * @throws Crypt_GPG_FileException if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG_Signature - */ - public function verifyFile($filename, $signature = '') - { - return $this->_verify($filename, true, $signature); - } - - // }}} - // {{{ addDecryptKey() - - /** - * Adds a key to use for decryption - * - * @param mixed $key the key to use. This may be a key identifier, - * user id, fingerprint, {@link Crypt_GPG_Key} or - * {@link Crypt_GPG_SubKey}. The key must be able - * to encrypt. - * @param string $passphrase optional. The passphrase of the key required - * for decryption. - * - * @return Crypt_GPG the current object, for fluent interface. - * - * @see Crypt_GPG::decrypt() - * @see Crypt_GPG::decryptFile() - * @see Crypt_GPG::clearDecryptKeys() - * @see Crypt_GPG::_addKey() - * @see Crypt_GPG_DecryptStatusHandler - * - * @sensitive $passphrase - */ - public function addDecryptKey($key, $passphrase = null) - { - $this->_addKey($this->decryptKeys, true, false, $key, $passphrase); - return $this; - } - - // }}} - // {{{ addEncryptKey() - - /** - * Adds a key to use for encryption - * - * @param mixed $key the key to use. This may be a key identifier, user id - * user id, fingerprint, {@link Crypt_GPG_Key} or - * {@link Crypt_GPG_SubKey}. The key must be able to - * encrypt. - * - * @return Crypt_GPG the current object, for fluent interface. - * - * @see Crypt_GPG::encrypt() - * @see Crypt_GPG::encryptFile() - * @see Crypt_GPG::clearEncryptKeys() - * @see Crypt_GPG::_addKey() - */ - public function addEncryptKey($key) - { - $this->_addKey($this->encryptKeys, true, false, $key); - return $this; - } - - // }}} - // {{{ addSignKey() - - /** - * Adds a key to use for signing - * - * @param mixed $key the key to use. This may be a key identifier, - * user id, fingerprint, {@link Crypt_GPG_Key} or - * {@link Crypt_GPG_SubKey}. The key must be able - * to sign. - * @param string $passphrase optional. The passphrase of the key required - * for signing. - * - * @return Crypt_GPG the current object, for fluent interface. - * - * @see Crypt_GPG::sign() - * @see Crypt_GPG::signFile() - * @see Crypt_GPG::clearSignKeys() - * @see Crypt_GPG::handleSignStatus() - * @see Crypt_GPG::_addKey() - * - * @sensitive $passphrase - */ - public function addSignKey($key, $passphrase = null) - { - $this->_addKey($this->signKeys, false, true, $key, $passphrase); - return $this; - } - - // }}} - // {{{ clearDecryptKeys() - - /** - * Clears all decryption keys - * - * @return Crypt_GPG the current object, for fluent interface. - * - * @see Crypt_GPG::decrypt() - * @see Crypt_GPG::addDecryptKey() - */ - public function clearDecryptKeys() - { - $this->decryptKeys = array(); - return $this; - } - - // }}} - // {{{ clearEncryptKeys() - - /** - * Clears all encryption keys - * - * @return Crypt_GPG the current object, for fluent interface. - * - * @see Crypt_GPG::encrypt() - * @see Crypt_GPG::addEncryptKey() - */ - public function clearEncryptKeys() - { - $this->encryptKeys = array(); - return $this; - } - - // }}} - // {{{ clearSignKeys() - - /** - * Clears all signing keys - * - * @return Crypt_GPG the current object, for fluent interface. - * - * @see Crypt_GPG::sign() - * @see Crypt_GPG::addSignKey() - */ - public function clearSignKeys() - { - $this->signKeys = array(); - return $this; - } - - // }}} - // {{{ handleSignStatus() - - /** - * Handles the status output from GPG for the sign operation - * - * This method is responsible for sending the passphrase commands when - * required by the {@link Crypt_GPG::sign()} method. See doc/DETAILS - * in the {@link http://www.gnupg.org/download/ GPG distribution} for - * detailed information on GPG's status output. - * - * @param string $line the status line to handle. - * - * @return void - * - * @see Crypt_GPG::sign() - */ - public function handleSignStatus($line) - { - $tokens = explode(' ', $line); - switch ($tokens[0]) { - case 'NEED_PASSPHRASE': - $subKeyId = $tokens[1]; - if (array_key_exists($subKeyId, $this->signKeys)) { - $passphrase = $this->signKeys[$subKeyId]['passphrase']; - $this->engine->sendCommand($passphrase); - } else { - $this->engine->sendCommand(''); - } - break; - } - } - - // }}} - // {{{ handleImportKeyStatus() - - /** - * Handles the status output from GPG for the import operation - * - * This method is responsible for building the result array that is - * returned from the {@link Crypt_GPG::importKey()} method. See - * doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for detailed - * information on GPG's status output. - * - * @param string $line the status line to handle. - * @param array &$result the current result array being processed. - * - * @return void - * - * @see Crypt_GPG::importKey() - * @see Crypt_GPG::importKeyFile() - * @see Crypt_GPG_Engine::addStatusHandler() - */ - public function handleImportKeyStatus($line, array &$result) - { - $tokens = explode(' ', $line); - switch ($tokens[0]) { - case 'IMPORT_OK': - $result['fingerprint'] = $tokens[2]; - break; - - case 'IMPORT_RES': - $result['public_imported'] = intval($tokens[3]); - $result['public_unchanged'] = intval($tokens[5]); - $result['private_imported'] = intval($tokens[11]); - $result['private_unchanged'] = intval($tokens[12]); - break; - } - } - - // }}} - // {{{ _addKey() - - /** - * Adds a key to one of the internal key arrays - * - * This handles resolving full key objects from the provided - * $key value. - * - * @param array &$array the array to which the key should be added. - * @param boolean $encrypt whether or not the key must be able to - * encrypt. - * @param boolean $sign whether or not the key must be able to sign. - * @param mixed $key the key to add. This may be a key identifier, - * user id, fingerprint, {@link Crypt_GPG_Key} or - * {@link Crypt_GPG_SubKey}. - * @param string $passphrase optional. The passphrase associated with the - * key. - * - * @return void - * - * @sensitive $passphrase - */ - protected function _addKey(array &$array, $encrypt, $sign, $key, - $passphrase = null - ) { - $subKeys = array(); - - if (is_scalar($key)) { - $keys = $this->getKeys($key); - if (count($keys) == 0) { - throw new Crypt_GPG_KeyNotFoundException( - 'Key "' . $key . '" not found.', - 0, - $key - ); - } - $key = $keys[0]; - } - - if ($key instanceof Crypt_GPG_Key) { - if ($encrypt && !$key->canEncrypt()) { - throw new InvalidArgumentException( - 'Key "' . $key . '" cannot encrypt.' - ); - } - - if ($sign && !$key->canSign()) { - throw new InvalidArgumentException( - 'Key "' . $key . '" cannot sign.' - ); - } - - foreach ($key->getSubKeys() as $subKey) { - $canEncrypt = $subKey->canEncrypt(); - $canSign = $subKey->canSign(); - if ( ($encrypt && $sign && $canEncrypt && $canSign) - || ($encrypt && !$sign && $canEncrypt) - || (!$encrypt && $sign && $canSign) - ) { - // We add all subkeys that meet the requirements because we - // were not told which subkey is required. - $subKeys[] = $subKey; - } - } - } elseif ($key instanceof Crypt_GPG_SubKey) { - $subKeys[] = $key; - } - - if (count($subKeys) === 0) { - throw new InvalidArgumentException( - 'Key "' . $key . '" is not in a recognized format.' - ); - } - - foreach ($subKeys as $subKey) { - if ($encrypt && !$subKey->canEncrypt()) { - throw new InvalidArgumentException( - 'Key "' . $key . '" cannot encrypt.' - ); - } - - if ($sign && !$subKey->canSign()) { - throw new InvalidArgumentException( - 'Key "' . $key . '" cannot sign.' - ); - } - - $array[$subKey->getId()] = array( - 'fingerprint' => $subKey->getFingerprint(), - 'passphrase' => $passphrase - ); - } - } - - // }}} - // {{{ _setPinEntryEnv() - - /** - * Sets the PINENTRY_USER_DATA environment variable with the currently - * added keys and passphrases - * - * Keys and pasphrases are stored as an indexed array of associative - * arrays that is JSON encoded to a flat string. - * - * For GnuPG 2.x this is how passphrases are passed. For GnuPG 1.x the - * environment variable is set but not used. - * - * @param array $keys the internal key array to use. - * - * @return void - */ - protected function _setPinEntryEnv(array $keys) - { - $envKeys = array(); - foreach ($keys as $id => $key) { - $envKeys[] = array( - 'keyId' => $id, - 'fingerprint' => $key['fingerprint'], - 'passphrase' => $key['passphrase'] - ); - } - $envKeys = json_encode($envKeys); - $_ENV['PINENTRY_USER_DATA'] = $envKeys; - } - - // }}} - // {{{ _importKey() - - /** - * Imports a public or private key into the keyring - * - * @param string $key the key to be imported. - * @param boolean $isFile whether or not the input is a filename. - * - * @return array an associative array containing the following elements: - * - fingerprint - the fingerprint of the - * imported key, - * - public_imported - the number of public - * keys imported, - * - public_unchanged - the number of unchanged - * public keys, - * - private_imported - the number of private - * keys imported, - * - private_unchanged - the number of unchanged - * private keys. - * - * @throws Crypt_GPG_NoDataException if the key data is missing or if the - * data is is not valid key data. - * - * @throws Crypt_GPG_FileException if the key file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - protected function _importKey($key, $isFile) - { - $result = array(); - - if ($isFile) { - $input = @fopen($key, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open key file "' . $key . '" for importing.', - 0, - $key - ); - } - } else { - $input = strval($key); - if ($input == '') { - throw new Crypt_GPG_NoDataException( - 'No valid GPG key data found.', - self::ERROR_NO_DATA - ); - } - } - - $arguments = array(); - $version = $this->engine->getVersion(); - - if ( version_compare($version, '1.0.5', 'ge') - && version_compare($version, '1.0.7', 'lt') - ) { - $arguments[] = '--allow-secret-key-import'; - } - - $this->engine->reset(); - $this->engine->addStatusHandler( - array($this, 'handleImportKeyStatus'), - array(&$result) - ); - - $this->engine->setOperation('--import', $arguments); - $this->engine->setInput($input); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_DUPLICATE_KEY: - case self::ERROR_NONE: - // ignore duplicate key import errors - break; - case self::ERROR_NO_DATA: - throw new Crypt_GPG_NoDataException( - 'No valid GPG key data found.', - $code - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error importing GPG key. Please use the \'debug\' ' . - 'option when creating the Crypt_GPG object, and file a bug ' . - 'report at ' . self::BUG_URI, - $code - ); - } - - return $result; - } - - // }}} - // {{{ _encrypt() - - /** - * Encrypts data - * - * @param string $data the data to encrypt. - * @param boolean $isFile whether or not the data is a filename. - * @param string $outputFile the filename of the file in which to store - * the encrypted data. If null, the encrypted - * data is returned as a string. - * @param boolean $armor if true, ASCII armored data is returned; - * otherwise, binary data is returned. - * - * @return void|string if the $outputFile parameter is null, a - * string containing the encrypted data is returned. - * - * @throws Crypt_GPG_KeyNotFoundException if no encryption key is specified. - * See {@link Crypt_GPG::addEncryptKey()}. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - protected function _encrypt($data, $isFile, $outputFile, $armor) - { - if (count($this->encryptKeys) === 0) { - throw new Crypt_GPG_KeyNotFoundException( - 'No encryption keys specified.' - ); - } - - if ($isFile) { - $input = @fopen($data, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open input file "' . $data . - '" for encryption.', - 0, - $data - ); - } - } else { - $input = strval($data); - } - - if ($outputFile === null) { - $output = ''; - } else { - $output = @fopen($outputFile, 'wb'); - if ($output === false) { - if ($isFile) { - fclose($input); - } - throw new Crypt_GPG_FileException( - 'Could not open output file "' . $outputFile . - '" for storing encrypted data.', - 0, - $outputFile - ); - } - } - - $arguments = ($armor) ? array('--armor') : array(); - foreach ($this->encryptKeys as $key) { - $arguments[] = '--recipient ' . escapeshellarg($key['fingerprint']); - } - - $this->engine->reset(); - $this->engine->setInput($input); - $this->engine->setOutput($output); - $this->engine->setOperation('--encrypt', $arguments); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - if ($outputFile !== null) { - fclose($output); - } - - $code = $this->engine->getErrorCode(); - - if ($code !== self::ERROR_NONE) { - throw new Crypt_GPG_Exception( - 'Unknown error encrypting data. Please use the \'debug\' ' . - 'option when creating the Crypt_GPG object, and file a bug ' . - 'report at ' . self::BUG_URI, - $code - ); - } - - if ($outputFile === null) { - return $output; - } - } - - // }}} - // {{{ _decrypt() - - /** - * Decrypts data - * - * @param string $data the data to be decrypted. - * @param boolean $isFile whether or not the data is a filename. - * @param string $outputFile the name of the file to which the decrypted - * data should be written. If null, the decrypted - * data is returned as a string. - * - * @return void|string if the $outputFile parameter is null, a - * string containing the decrypted data is returned. - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - protected function _decrypt($data, $isFile, $outputFile) - { - if ($isFile) { - $input = @fopen($data, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open input file "' . $data . - '" for decryption.', - 0, - $data - ); - } - } else { - $input = strval($data); - if ($input == '') { - throw new Crypt_GPG_NoDataException( - 'Cannot decrypt data. No PGP encrypted data was found in '. - 'the provided data.', - self::ERROR_NO_DATA - ); - } - } - - if ($outputFile === null) { - $output = ''; - } else { - $output = @fopen($outputFile, 'wb'); - if ($output === false) { - if ($isFile) { - fclose($input); - } - throw new Crypt_GPG_FileException( - 'Could not open output file "' . $outputFile . - '" for storing decrypted data.', - 0, - $outputFile - ); - } - } - - $handler = new Crypt_GPG_DecryptStatusHandler( - $this->engine, - $this->decryptKeys - ); - - // If using gpg-agent, set the decrypt pins used by the pinentry - $this->_setPinEntryEnv($this->decryptKeys); - - $this->engine->reset(); - $this->engine->addStatusHandler(array($handler, 'handle')); - $this->engine->setOperation('--decrypt'); - $this->engine->setInput($input); - $this->engine->setOutput($output); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - if ($outputFile !== null) { - fclose($output); - } - - // if there was any problem decrypting the data, the handler will - // deal with it here. - $handler->throwException(); - - if ($outputFile === null) { - return $output; - } - } - - // }}} - // {{{ _sign() - - /** - * Signs data - * - * @param string $data the data to be signed. - * @param boolean $isFile whether or not the data is a filename. - * @param string $outputFile the name of the file in which the signed data - * should be stored. If null, the signed data is - * returned as a string. - * @param boolean $mode the data signing mode to use. Should be one of - * {@link Crypt_GPG::SIGN_MODE_NORMAL}, - * {@link Crypt_GPG::SIGN_MODE_CLEAR} or - * {@link Crypt_GPG::SIGN_MODE_DETACHED}. - * @param boolean $armor if true, ASCII armored data is returned; - * otherwise, binary data is returned. This has - * no effect if the mode - * Crypt_GPG::SIGN_MODE_CLEAR is - * used. - * @param boolean $textmode if true, line-breaks in signed data be - * normalized. Use this option when signing - * e-mail, or for greater compatibility between - * systems with different line-break formats. - * Defaults to false. This has no effect if the - * mode Crypt_GPG::SIGN_MODE_CLEAR is - * used as clear-signing always uses textmode. - * - * @return void|string if the $outputFile parameter is null, a - * string containing the signed data (or the signature - * data if a detached signature is requested) is - * returned. - * - * @throws Crypt_GPG_KeyNotFoundException if no signing key is specified. - * See {@link Crypt_GPG::addSignKey()}. - * - * @throws Crypt_GPG_BadPassphraseException if a specified passphrase is - * incorrect or if a required passphrase is not specified. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - protected function _sign($data, $isFile, $outputFile, $mode, $armor, - $textmode - ) { - if (count($this->signKeys) === 0) { - throw new Crypt_GPG_KeyNotFoundException( - 'No signing keys specified.' - ); - } - - if ($isFile) { - $input = @fopen($data, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open input file "' . $data . '" for signing.', - 0, - $data - ); - } - } else { - $input = strval($data); - } - - if ($outputFile === null) { - $output = ''; - } else { - $output = @fopen($outputFile, 'wb'); - if ($output === false) { - if ($isFile) { - fclose($input); - } - throw new Crypt_GPG_FileException( - 'Could not open output file "' . $outputFile . - '" for storing signed data.', - 0, - $outputFile - ); - } - } - - switch ($mode) { - case self::SIGN_MODE_DETACHED: - $operation = '--detach-sign'; - break; - case self::SIGN_MODE_CLEAR: - $operation = '--clearsign'; - break; - case self::SIGN_MODE_NORMAL: - default: - $operation = '--sign'; - break; - } - - $arguments = array(); - - if ($armor) { - $arguments[] = '--armor'; - } - if ($textmode) { - $arguments[] = '--textmode'; - } - - foreach ($this->signKeys as $key) { - $arguments[] = '--local-user ' . - escapeshellarg($key['fingerprint']); - } - - // If using gpg-agent, set the sign pins used by the pinentry - $this->_setPinEntryEnv($this->signKeys); - - $this->engine->reset(); - $this->engine->addStatusHandler(array($this, 'handleSignStatus')); - $this->engine->setInput($input); - $this->engine->setOutput($output); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - if ($outputFile !== null) { - fclose($output); - } - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - break; - case self::ERROR_KEY_NOT_FOUND: - throw new Crypt_GPG_KeyNotFoundException( - 'Cannot sign data. Private key not found. Import the '. - 'private key before trying to sign data.', - $code, - $this->engine->getErrorKeyId() - ); - case self::ERROR_BAD_PASSPHRASE: - throw new Crypt_GPG_BadPassphraseException( - 'Cannot sign data. Incorrect passphrase provided.', - $code - ); - case self::ERROR_MISSING_PASSPHRASE: - throw new Crypt_GPG_BadPassphraseException( - 'Cannot sign data. No passphrase provided.', - $code - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error signing data. Please use the \'debug\' option ' . - 'when creating the Crypt_GPG object, and file a bug report ' . - 'at ' . self::BUG_URI, - $code - ); - } - - if ($outputFile === null) { - return $output; - } - } - - // }}} - // {{{ _encryptAndSign() - - /** - * Encrypts and signs data - * - * @param string $data the data to be encrypted and signed. - * @param boolean $isFile whether or not the data is a filename. - * @param string $outputFile the name of the file in which the encrypted, - * signed data should be stored. If null, the - * encrypted, signed data is returned as a - * string. - * @param boolean $armor if true, ASCII armored data is returned; - * otherwise, binary data is returned. - * - * @return void|string if the $outputFile parameter is null, a - * string containing the encrypted, signed data is - * returned. - * - * @throws Crypt_GPG_KeyNotFoundException if no encryption key is specified - * or if no signing key is specified. See - * {@link Crypt_GPG::addEncryptKey()} and - * {@link Crypt_GPG::addSignKey()}. - * - * @throws Crypt_GPG_BadPassphraseException if a specified passphrase is - * incorrect or if a required passphrase is not specified. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - protected function _encryptAndSign($data, $isFile, $outputFile, $armor) - { - if (count($this->signKeys) === 0) { - throw new Crypt_GPG_KeyNotFoundException( - 'No signing keys specified.' - ); - } - - if (count($this->encryptKeys) === 0) { - throw new Crypt_GPG_KeyNotFoundException( - 'No encryption keys specified.' - ); - } - - - if ($isFile) { - $input = @fopen($data, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open input file "' . $data . - '" for encrypting and signing.', - 0, - $data - ); - } - } else { - $input = strval($data); - } - - if ($outputFile === null) { - $output = ''; - } else { - $output = @fopen($outputFile, 'wb'); - if ($output === false) { - if ($isFile) { - fclose($input); - } - throw new Crypt_GPG_FileException( - 'Could not open output file "' . $outputFile . - '" for storing encrypted, signed data.', - 0, - $outputFile - ); - } - } - - $arguments = ($armor) ? array('--armor') : array(); - - foreach ($this->signKeys as $key) { - $arguments[] = '--local-user ' . - escapeshellarg($key['fingerprint']); - } - - // If using gpg-agent, set the sign pins used by the pinentry - $this->_setPinEntryEnv($this->signKeys); - - foreach ($this->encryptKeys as $key) { - $arguments[] = '--recipient ' . escapeshellarg($key['fingerprint']); - } - - $this->engine->reset(); - $this->engine->addStatusHandler(array($this, 'handleSignStatus')); - $this->engine->setInput($input); - $this->engine->setOutput($output); - $this->engine->setOperation('--encrypt --sign', $arguments); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - if ($outputFile !== null) { - fclose($output); - } - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - break; - case self::ERROR_KEY_NOT_FOUND: - throw new Crypt_GPG_KeyNotFoundException( - 'Cannot sign encrypted data. Private key not found. Import '. - 'the private key before trying to sign the encrypted data.', - $code, - $this->engine->getErrorKeyId() - ); - case self::ERROR_BAD_PASSPHRASE: - throw new Crypt_GPG_BadPassphraseException( - 'Cannot sign encrypted data. Incorrect passphrase provided.', - $code - ); - case self::ERROR_MISSING_PASSPHRASE: - throw new Crypt_GPG_BadPassphraseException( - 'Cannot sign encrypted data. No passphrase provided.', - $code - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error encrypting and signing data. Please use the ' . - '\'debug\' option when creating the Crypt_GPG object, and ' . - 'file a bug report at ' . self::BUG_URI, - $code - ); - } - - if ($outputFile === null) { - return $output; - } - } - - // }}} - // {{{ _verify() - - /** - * Verifies data - * - * @param string $data the signed data to be verified. - * @param boolean $isFile whether or not the data is a filename. - * @param string $signature if verifying a file signed using a detached - * signature, this must be the detached signature - * data. Otherwise, specify ''. - * - * @return array an array of {@link Crypt_GPG_Signature} objects for the - * signed data. - * - * @throws Crypt_GPG_NoDataException if the provided data is not signed - * data. - * - * @throws Crypt_GPG_FileException if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG_Signature - */ - protected function _verify($data, $isFile, $signature) - { - if ($signature == '') { - $operation = '--verify'; - $arguments = array(); - } else { - // Signed data goes in FD_MESSAGE, detached signature data goes in - // FD_INPUT. - $operation = '--verify - "-&' . Crypt_GPG_Engine::FD_MESSAGE. '"'; - $arguments = array('--enable-special-filenames'); - } - - $handler = new Crypt_GPG_VerifyStatusHandler(); - - if ($isFile) { - $input = @fopen($data, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open input file "' . $data . '" for verifying.', - 0, - $data - ); - } - } else { - $input = strval($data); - if ($input == '') { - throw new Crypt_GPG_NoDataException( - 'No valid signature data found.', - self::ERROR_NO_DATA - ); - } - } - - $this->engine->reset(); - $this->engine->addStatusHandler(array($handler, 'handle')); - - if ($signature == '') { - // signed or clearsigned data - $this->engine->setInput($input); - } else { - // detached signature - $this->engine->setInput($signature); - $this->engine->setMessage($input); - } - - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - case self::ERROR_BAD_SIGNATURE: - break; - case self::ERROR_NO_DATA: - throw new Crypt_GPG_NoDataException( - 'No valid signature data found.', - $code - ); - case self::ERROR_KEY_NOT_FOUND: - throw new Crypt_GPG_KeyNotFoundException( - 'Public key required for data verification not in keyring.', - $code, - $this->engine->getErrorKeyId() - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error validating signature details. Please use the ' . - '\'debug\' option when creating the Crypt_GPG object, and ' . - 'file a bug report at ' . self::BUG_URI, - $code - ); - } - - return $handler->getSignatures(); - } - - // }}} - // {{{ _decryptAndVerify() - - /** - * Decrypts and verifies encrypted, signed data - * - * @param string $data the encrypted signed data to be decrypted and - * verified. - * @param boolean $isFile whether or not the data is a filename. - * @param string $outputFile the name of the file to which the decrypted - * data should be written. If null, the decrypted - * data is returned in the results array. - * - * @return array two element array. The array has an element 'data' - * containing the decrypted data and an element - * 'signatures' containing an array of - * {@link Crypt_GPG_Signature} objects for the signed data. - * If the decrypted data is written to a file, the 'data' - * element is null. - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring or it the public - * key needed for verification is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG signed, encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_FileException if the output file is not writeable or - * if the input file is not readable. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG_Signature - */ - protected function _decryptAndVerify($data, $isFile, $outputFile) - { - if ($isFile) { - $input = @fopen($data, 'rb'); - if ($input === false) { - throw new Crypt_GPG_FileException( - 'Could not open input file "' . $data . - '" for decrypting and verifying.', - 0, - $data - ); - } - } else { - $input = strval($data); - if ($input == '') { - throw new Crypt_GPG_NoDataException( - 'No valid encrypted signed data found.', - self::ERROR_NO_DATA - ); - } - } - - if ($outputFile === null) { - $output = ''; - } else { - $output = @fopen($outputFile, 'wb'); - if ($output === false) { - if ($isFile) { - fclose($input); - } - throw new Crypt_GPG_FileException( - 'Could not open output file "' . $outputFile . - '" for storing decrypted data.', - 0, - $outputFile - ); - } - } - - $verifyHandler = new Crypt_GPG_VerifyStatusHandler(); - - $decryptHandler = new Crypt_GPG_DecryptStatusHandler( - $this->engine, - $this->decryptKeys - ); - - // If using gpg-agent, set the decrypt pins used by the pinentry - $this->_setPinEntryEnv($this->decryptKeys); - - $this->engine->reset(); - $this->engine->addStatusHandler(array($verifyHandler, 'handle')); - $this->engine->addStatusHandler(array($decryptHandler, 'handle')); - $this->engine->setInput($input); - $this->engine->setOutput($output); - $this->engine->setOperation('--decrypt'); - $this->engine->run(); - - if ($isFile) { - fclose($input); - } - - if ($outputFile !== null) { - fclose($output); - } - - $return = array( - 'data' => null, - 'signatures' => $verifyHandler->getSignatures() - ); - - // if there was any problem decrypting the data, the handler will - // deal with it here. - try { - $decryptHandler->throwException(); - } catch (Exception $e) { - if ($e instanceof Crypt_GPG_KeyNotFoundException) { - throw new Crypt_GPG_KeyNotFoundException( - 'Public key required for data verification not in ', - 'the keyring. Either no suitable private decryption key ' . - 'is in the keyring or the public key required for data ' . - 'verification is not in the keyring. Import a suitable ' . - 'key before trying to decrypt and verify this data.', - self::ERROR_KEY_NOT_FOUND, - $this->engine->getErrorKeyId() - ); - } - - if ($e instanceof Crypt_GPG_NoDataException) { - throw new Crypt_GPG_NoDataException( - 'Cannot decrypt and verify data. No PGP encrypted data ' . - 'was found in the provided data.', - self::ERROR_NO_DATA - ); - } - - throw $e; - } - - if ($outputFile === null) { - $return['data'] = $output; - } - - return $return; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/ByteUtils.php b/program/lib/Crypt/GPG/ByteUtils.php deleted file mode 100644 index 342905471..000000000 --- a/program/lib/Crypt/GPG/ByteUtils.php +++ /dev/null @@ -1,105 +0,0 @@ - - * @copyright 2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -// {{{ class Crypt_GPG_ByteUtils - -/** - * A class for performing byte-wise string operations - * - * GPG I/O streams are managed using bytes rather than characters. This class - * requires the mbstring extension to be available. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://php.net/mbstring - */ -class Crypt_GPG_ByteUtils -{ - // {{{ strlen() - - /** - * Gets the length of a string in bytes - * - * This is used for stream-based communication with the GPG subprocess. - * - * @param string $string the string for which to get the length. - * - * @return integer the length of the string in bytes. - */ - public static function strlen($string) - { - return mb_strlen($string, '8bit'); - } - - // }}} - // {{{ substr() - - /** - * Gets the substring of a string in bytes - * - * This is used for stream-based communication with the GPG subprocess. - * - * @param string $string the input string. - * @param integer $start the starting point at which to get the substring. - * @param integer $length optional. The length of the substring. - * - * @return string the extracted part of the string. Unlike the default PHP - * substr() function, the returned value is - * always a string and never false. - */ - public static function substr($string, $start, $length = null) - { - if ($length === null) { - return mb_substr( - $string, - $start, - self::strlen($string) - $start, '8bit' - ); - } - - return mb_substr($string, $start, $length, '8bit'); - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/DecryptStatusHandler.php b/program/lib/Crypt/GPG/DecryptStatusHandler.php deleted file mode 100644 index 67c0dd74b..000000000 --- a/program/lib/Crypt/GPG/DecryptStatusHandler.php +++ /dev/null @@ -1,344 +0,0 @@ - - * @copyright 2008-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ - -/** - * Crypt_GPG base class - */ -require_once 'Crypt/GPG.php'; - -/** - * Crypt_GPG exception classes - */ -require_once 'Crypt/GPG/Exceptions.php'; - - -/** - * Status line handler for the decrypt operation - * - * This class is used internally by Crypt_GPG and does not need be used - * directly. See the {@link Crypt_GPG} class for end-user API. - * - * This class is responsible for sending the passphrase commands when required - * by the {@link Crypt_GPG::decrypt()} method. See doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GnuPG distribution} for detailed - * information on GnuPG's status output for the decrypt operation. - * - * This class is also responsible for parsing error status and throwing a - * meaningful exception in the event that decryption fails. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2008-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG_DecryptStatusHandler -{ - // {{{ protected properties - - /** - * Keys used to decrypt - * - * The array is of the form: - * - * array( - * $key_id => array( - * 'fingerprint' => $fingerprint, - * 'passphrase' => $passphrase - * ) - * ); - * - * - * @var array - */ - protected $keys = array(); - - /** - * Engine used to which passphrases are passed - * - * @var Crypt_GPG_Engine - */ - protected $engine = null; - - /** - * The id of the current sub-key used for decryption - * - * @var string - */ - protected $currentSubKey = ''; - - /** - * Whether or not decryption succeeded - * - * If the message is only signed (compressed) and not encrypted, this is - * always true. If the message is encrypted, this flag is set to false - * until we know the decryption succeeded. - * - * @var boolean - */ - protected $decryptionOkay = true; - - /** - * Whether or not there was no data for decryption - * - * @var boolean - */ - protected $noData = false; - - /** - * Keys for which the passhprase is missing - * - * This contains primary user ids indexed by sub-key id and is used to - * create helpful exception messages. - * - * @var array - */ - protected $missingPassphrases = array(); - - /** - * Keys for which the passhprase is incorrect - * - * This contains primary user ids indexed by sub-key id and is used to - * create helpful exception messages. - * - * @var array - */ - protected $badPassphrases = array(); - - /** - * Keys that can be used to decrypt the data but are missing from the - * keychain - * - * This is an array with both the key and value being the sub-key id of - * the missing keys. - * - * @var array - */ - protected $missingKeys = array(); - - // }}} - // {{{ __construct() - - /** - * Creates a new decryption status handler - * - * @param Crypt_GPG_Engine $engine the GPG engine to which passphrases are - * passed. - * @param array $keys the decryption keys to use. - */ - public function __construct(Crypt_GPG_Engine $engine, array $keys) - { - $this->engine = $engine; - $this->keys = $keys; - } - - // }}} - // {{{ handle() - - /** - * Handles a status line - * - * @param string $line the status line to handle. - * - * @return void - */ - public function handle($line) - { - $tokens = explode(' ', $line); - switch ($tokens[0]) { - case 'ENC_TO': - // Now we know the message is encrypted. Set flag to check if - // decryption succeeded. - $this->decryptionOkay = false; - - // this is the new key message - $this->currentSubKeyId = $tokens[1]; - break; - - case 'NEED_PASSPHRASE': - // send passphrase to the GPG engine - $subKeyId = $tokens[1]; - if (array_key_exists($subKeyId, $this->keys)) { - $passphrase = $this->keys[$subKeyId]['passphrase']; - $this->engine->sendCommand($passphrase); - } else { - $this->engine->sendCommand(''); - } - break; - - case 'USERID_HINT': - // remember the user id for pretty exception messages - $this->badPassphrases[$tokens[1]] - = implode(' ', array_splice($tokens, 2)); - - break; - - case 'GOOD_PASSPHRASE': - // if we got a good passphrase, remove the key from the list of - // bad passphrases. - unset($this->badPassphrases[$this->currentSubKeyId]); - break; - - case 'MISSING_PASSPHRASE': - $this->missingPassphrases[$this->currentSubKeyId] - = $this->currentSubKeyId; - - break; - - case 'NO_SECKEY': - // note: this message is also received if there are multiple - // recipients and a previous key had a correct passphrase. - $this->missingKeys[$tokens[1]] = $tokens[1]; - break; - - case 'NODATA': - $this->noData = true; - break; - - case 'DECRYPTION_OKAY': - // If the message is encrypted, this is the all-clear signal. - $this->decryptionOkay = true; - break; - } - } - - // }}} - // {{{ throwException() - - /** - * Takes the final status of the decrypt operation and throws an - * appropriate exception - * - * If decryption was successful, no exception is thrown. - * - * @return void - * - * @throws Crypt_GPG_KeyNotFoundException if the private key needed to - * decrypt the data is not in the user's keyring. - * - * @throws Crypt_GPG_NoDataException if specified data does not contain - * GPG encrypted data. - * - * @throws Crypt_GPG_BadPassphraseException if a required passphrase is - * incorrect or if a required passphrase is not specified. See - * {@link Crypt_GPG::addDecryptKey()}. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function throwException() - { - $code = Crypt_GPG::ERROR_NONE; - - if (!$this->decryptionOkay) { - if (count($this->badPassphrases) > 0) { - $code = Crypt_GPG::ERROR_BAD_PASSPHRASE; - } elseif (count($this->missingKeys) > 0) { - $code = Crypt_GPG::ERROR_KEY_NOT_FOUND; - } else { - $code = Crypt_GPG::ERROR_UNKNOWN; - } - } elseif ($this->noData) { - $code = Crypt_GPG::ERROR_NO_DATA; - } - - switch ($code) { - case Crypt_GPG::ERROR_NONE: - break; - - case Crypt_GPG::ERROR_KEY_NOT_FOUND: - if (count($this->missingKeys) > 0) { - $keyId = reset($this->missingKeys); - } else { - $keyId = ''; - } - throw new Crypt_GPG_KeyNotFoundException( - 'Cannot decrypt data. No suitable private key is in the ' . - 'keyring. Import a suitable private key before trying to ' . - 'decrypt this data.', - $code, - $keyId - ); - case Crypt_GPG::ERROR_BAD_PASSPHRASE: - $badPassphrases = array_diff_key( - $this->badPassphrases, - $this->missingPassphrases - ); - - $missingPassphrases = array_intersect_key( - $this->badPassphrases, - $this->missingPassphrases - ); - - $message = 'Cannot decrypt data.'; - if (count($badPassphrases) > 0) { - $message = ' Incorrect passphrase provided for keys: "' . - implode('", "', $badPassphrases) . '".'; - } - if (count($missingPassphrases) > 0) { - $message = ' No passphrase provided for keys: "' . - implode('", "', $badPassphrases) . '".'; - } - - throw new Crypt_GPG_BadPassphraseException( - $message, - $code, - $badPassphrases, - $missingPassphrases - ); - case Crypt_GPG::ERROR_NO_DATA: - throw new Crypt_GPG_NoDataException( - 'Cannot decrypt data. No PGP encrypted data was found in '. - 'the provided data.', - $code - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error decrypting data.', - $code - ); - } - } - - // }}} -} - -?> diff --git a/program/lib/Crypt/GPG/Engine.php b/program/lib/Crypt/GPG/Engine.php deleted file mode 100644 index 601541443..000000000 --- a/program/lib/Crypt/GPG/Engine.php +++ /dev/null @@ -1,2006 +0,0 @@ - - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ - -/** - * Crypt_GPG base class. - */ -require_once 'Crypt/GPG.php'; - -/** - * GPG exception classes. - */ -require_once 'Crypt/GPG/Exceptions.php'; - -/** - * Byte string operations. - */ -require_once 'Crypt/GPG/ByteUtils.php'; - -/** - * Process control methods. - */ -require_once 'Crypt/GPG/ProcessControl.php'; - -/** - * Standard PEAR exception is used if GPG binary is not found. - */ -require_once 'PEAR/Exception.php'; - -// {{{ class Crypt_GPG_Engine - -/** - * Native PHP Crypt_GPG I/O engine - * - * This class is used internally by Crypt_GPG and does not need be used - * directly. See the {@link Crypt_GPG} class for end-user API. - * - * This engine uses PHP's native process control functions to directly control - * the GPG process. The GPG executable is required to be on the system. - * - * All data is passed to the GPG subprocess using file descriptors. This is the - * most secure method of passing data to the GPG subprocess. - * - * @category Encryption - * @package Crypt_GPG - * @author Nathan Fredrickson - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG_Engine -{ - // {{{ constants - - /** - * Size of data chunks that are sent to and retrieved from the IPC pipes. - * - * PHP reads 8192 bytes. If this is set to less than 8192, PHP reads 8192 - * and buffers the rest so we might as well just read 8192. - * - * Using values other than 8192 also triggers PHP bugs. - * - * @see http://bugs.php.net/bug.php?id=35224 - */ - const CHUNK_SIZE = 8192; - - /** - * Standard input file descriptor. This is used to pass data to the GPG - * process. - */ - const FD_INPUT = 0; - - /** - * Standard output file descriptor. This is used to receive normal output - * from the GPG process. - */ - const FD_OUTPUT = 1; - - /** - * Standard output file descriptor. This is used to receive error output - * from the GPG process. - */ - const FD_ERROR = 2; - - /** - * GPG status output file descriptor. The status file descriptor outputs - * detailed information for many GPG commands. See the second section of - * the file doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG package} for a detailed - * description of GPG's status output. - */ - const FD_STATUS = 3; - - /** - * Command input file descriptor. This is used for methods requiring - * passphrases. - */ - const FD_COMMAND = 4; - - /** - * Extra message input file descriptor. This is used for passing signed - * data when verifying a detached signature. - */ - const FD_MESSAGE = 5; - - /** - * Minimum version of GnuPG that is supported. - */ - const MIN_VERSION = '1.0.2'; - - // }}} - // {{{ private class properties - - /** - * Whether or not to use debugging mode - * - * When set to true, every GPG command is echoed before it is run. Sensitive - * data is always handled using pipes and is not specified as part of the - * command. As a result, sensitive data is never displayed when debug is - * enabled. Sensitive data includes private key data and passphrases. - * - * Debugging is off by default. - * - * @var boolean - * @see Crypt_GPG_Engine::__construct() - */ - private $_debug = false; - - /** - * Location of GPG binary - * - * @var string - * @see Crypt_GPG_Engine::__construct() - * @see Crypt_GPG_Engine::_getBinary() - */ - private $_binary = ''; - - /** - * Location of GnuPG agent binary - * - * Only used for GnuPG 2.x - * - * @var string - * @see Crypt_GPG_Engine::__construct() - * @see Crypt_GPG_Engine::_getAgent() - */ - private $_agent = ''; - - /** - * Directory containing the GPG key files - * - * This property only contains the path when the homedir option - * is specified in the constructor. - * - * @var string - * @see Crypt_GPG_Engine::__construct() - */ - private $_homedir = ''; - - /** - * File path of the public keyring - * - * This property only contains the file path when the public_keyring - * option is specified in the constructor. - * - * If the specified file path starts with ~/, the path is - * relative to the homedir if specified, otherwise to - * ~/.gnupg. - * - * @var string - * @see Crypt_GPG_Engine::__construct() - */ - private $_publicKeyring = ''; - - /** - * File path of the private (secret) keyring - * - * This property only contains the file path when the private_keyring - * option is specified in the constructor. - * - * If the specified file path starts with ~/, the path is - * relative to the homedir if specified, otherwise to - * ~/.gnupg. - * - * @var string - * @see Crypt_GPG_Engine::__construct() - */ - private $_privateKeyring = ''; - - /** - * File path of the trust database - * - * This property only contains the file path when the trust_db - * option is specified in the constructor. - * - * If the specified file path starts with ~/, the path is - * relative to the homedir if specified, otherwise to - * ~/.gnupg. - * - * @var string - * @see Crypt_GPG_Engine::__construct() - */ - private $_trustDb = ''; - - /** - * Array of pipes used for communication with the GPG binary - * - * This is an array of file descriptor resources. - * - * @var array - */ - private $_pipes = array(); - - /** - * Array of pipes used for communication with the gpg-agent binary - * - * This is an array of file descriptor resources. - * - * @var array - */ - private $_agentPipes = array(); - - /** - * Array of currently opened pipes - * - * This array is used to keep track of remaining opened pipes so they can - * be closed when the GPG subprocess is finished. This array is a subset of - * the {@link Crypt_GPG_Engine::$_pipes} array and contains opened file - * descriptor resources. - * - * @var array - * @see Crypt_GPG_Engine::_closePipe() - */ - private $_openPipes = array(); - - /** - * A handle for the GPG process - * - * @var resource - */ - private $_process = null; - - /** - * A handle for the gpg-agent process - * - * @var resource - */ - private $_agentProcess = null; - - /** - * GPG agent daemon socket and PID for running gpg-agent - * - * @var string - */ - private $_agentInfo = null; - - /** - * Whether or not the operating system is Darwin (OS X) - * - * @var boolean - */ - private $_isDarwin = false; - - /** - * Commands to be sent to GPG's command input stream - * - * @var string - * @see Crypt_GPG_Engine::sendCommand() - */ - private $_commandBuffer = ''; - - /** - * Array of status line handlers - * - * @var array - * @see Crypt_GPG_Engine::addStatusHandler() - */ - private $_statusHandlers = array(); - - /** - * Array of error line handlers - * - * @var array - * @see Crypt_GPG_Engine::addErrorHandler() - */ - private $_errorHandlers = array(); - - /** - * The error code of the current operation - * - * @var integer - * @see Crypt_GPG_Engine::getErrorCode() - */ - private $_errorCode = Crypt_GPG::ERROR_NONE; - - /** - * File related to the error code of the current operation - * - * @var string - * @see Crypt_GPG_Engine::getErrorFilename() - */ - private $_errorFilename = ''; - - /** - * Key id related to the error code of the current operation - * - * @var string - * @see Crypt_GPG_Engine::getErrorKeyId() - */ - private $_errorkeyId = ''; - - /** - * The number of currently needed passphrases - * - * If this is not zero when the GPG command is completed, the error code is - * set to {@link Crypt_GPG::ERROR_MISSING_PASSPHRASE}. - * - * @var integer - */ - private $_needPassphrase = 0; - - /** - * The input source - * - * This is data to send to GPG. Either a string or a stream resource. - * - * @var string|resource - * @see Crypt_GPG_Engine::setInput() - */ - private $_input = null; - - /** - * The extra message input source - * - * Either a string or a stream resource. - * - * @var string|resource - * @see Crypt_GPG_Engine::setMessage() - */ - private $_message = null; - - /** - * The output location - * - * This is where the output from GPG is sent. Either a string or a stream - * resource. - * - * @var string|resource - * @see Crypt_GPG_Engine::setOutput() - */ - private $_output = ''; - - /** - * The GPG operation to execute - * - * @var string - * @see Crypt_GPG_Engine::setOperation() - */ - private $_operation; - - /** - * Arguments for the current operation - * - * @var array - * @see Crypt_GPG_Engine::setOperation() - */ - private $_arguments = array(); - - /** - * The version number of the GPG binary - * - * @var string - * @see Crypt_GPG_Engine::getVersion() - */ - private $_version = ''; - - // }}} - // {{{ __construct() - - /** - * Creates a new GPG engine - * - * Available options are: - * - * - string homedir - the directory where the GPG - * keyring files are stored. If not - * specified, Crypt_GPG uses the - * default of ~/.gnupg. - * - string publicKeyring - the file path of the public - * keyring. Use this if the public - * keyring is not in the homedir, or - * if the keyring is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * keyring with this option - * (/foo/bar/pubring.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string privateKeyring - the file path of the private - * keyring. Use this if the private - * keyring is not in the homedir, or - * if the keyring is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * keyring with this option - * (/foo/bar/secring.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string trustDb - the file path of the web-of-trust - * database. Use this if the trust - * database is not in the homedir, or - * if the database is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * trust database with this option - * (/foo/bar/trustdb.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string binary - the location of the GPG binary. If - * not specified, the driver attempts - * to auto-detect the GPG binary - * location using a list of known - * default locations for the current - * operating system. The option - * gpgBinary is a - * deprecated alias for this option. - * - string agent - the location of the GnuPG agent - * binary. The gpg-agent is only - * used for GnuPG 2.x. If not - * specified, the engine attempts - * to auto-detect the gpg-agent - * binary location using a list of - * know default locations for the - * current operating system. - * - boolean debug - whether or not to use debug mode. - * When debug mode is on, all - * communication to and from the GPG - * subprocess is logged. This can be - * useful to diagnose errors when - * using Crypt_GPG. - * - * @param array $options optional. An array of options used to create the - * GPG object. All options are optional and are - * represented as key-value pairs. - * - * @throws Crypt_GPG_FileException if the homedir does not exist - * and cannot be created. This can happen if homedir is - * not specified, Crypt_GPG is run as the web user, and the web - * user has no home directory. This exception is also thrown if any - * of the options publicKeyring, - * privateKeyring or trustDb options are - * specified but the files do not exist or are are not readable. - * This can happen if the user running the Crypt_GPG process (for - * example, the Apache user) does not have permission to read the - * files. - * - * @throws PEAR_Exception if the provided binary is invalid, or - * if no binary is provided and no suitable binary could - * be found. - * - * @throws PEAR_Exception if the provided agent is invalid, or - * if no agent is provided and no suitable gpg-agent - * cound be found. - */ - public function __construct(array $options = array()) - { - $this->_isDarwin = (strncmp(strtoupper(PHP_OS), 'DARWIN', 6) === 0); - - // get homedir - if (array_key_exists('homedir', $options)) { - $this->_homedir = (string)$options['homedir']; - } else { - if (extension_loaded('posix')) { - // note: this requires the package OS dep exclude 'windows' - $info = posix_getpwuid(posix_getuid()); - $this->_homedir = $info['dir'].'/.gnupg'; - } else { - if (isset($_SERVER['HOME'])) { - $this->_homedir = $_SERVER['HOME']; - } else { - $this->_homedir = getenv('HOME'); - } - } - - if ($this->_homedir === false) { - throw new Crypt_GPG_FileException( - 'Could not locate homedir. Please specify the homedir ' . - 'to use with the \'homedir\' option when instantiating ' . - 'the Crypt_GPG object.' - ); - } - } - - // attempt to create homedir if it does not exist - if (!is_dir($this->_homedir)) { - if (@mkdir($this->_homedir, 0777, true)) { - // Set permissions on homedir. Parent directories are created - // with 0777, homedir is set to 0700. - chmod($this->_homedir, 0700); - } else { - throw new Crypt_GPG_FileException( - 'The \'homedir\' "' . $this->_homedir . '" is not ' . - 'readable or does not exist and cannot be created. This ' . - 'can happen if \'homedir\' is not specified in the ' . - 'Crypt_GPG options, Crypt_GPG is run as the web user, ' . - 'and the web user has no home directory.', - 0, - $this->_homedir - ); - } - } - - // check homedir permissions (See Bug #19833) - if (!is_executable($this->_homedir)) { - throw new Crypt_GPG_FileException( - 'The \'homedir\' "' . $this->_homedir . '" is not enterable ' . - 'by the current user. Please check the permissions on your ' . - 'homedir and make sure the current user can both enter and ' . - 'write to the directory.', - 0, - $this->_homedir - ); - } - if (!is_writeable($this->_homedir)) { - throw new Crypt_GPG_FileException( - 'The \'homedir\' "' . $this->_homedir . '" is not writable ' . - 'by the current user. Please check the permissions on your ' . - 'homedir and make sure the current user can both enter and ' . - 'write to the directory.', - 0, - $this->_homedir - ); - } - - // get binary - if (array_key_exists('binary', $options)) { - $this->_binary = (string)$options['binary']; - } elseif (array_key_exists('gpgBinary', $options)) { - // deprecated alias - $this->_binary = (string)$options['gpgBinary']; - } else { - $this->_binary = $this->_getBinary(); - } - - if ($this->_binary == '' || !is_executable($this->_binary)) { - throw new PEAR_Exception( - 'GPG binary not found. If you are sure the GPG binary is ' . - 'installed, please specify the location of the GPG binary ' . - 'using the \'binary\' driver option.' - ); - } - - // get agent - if (array_key_exists('agent', $options)) { - $this->_agent = (string)$options['agent']; - } else { - $this->_agent = $this->_getAgent(); - } - - if ($this->_agent == '' || !is_executable($this->_agent)) { - throw new PEAR_Exception( - 'gpg-agent binary not found. If you are sure the gpg-agent ' . - 'is installed, please specify the location of the gpg-agent ' . - 'binary using the \'agent\' driver option.' - ); - } - - /* - * Note: - * - * Normally, GnuPG expects keyrings to be in the homedir and expects - * to be able to write temporary files in the homedir. Sometimes, - * keyrings are not in the homedir, or location of the keyrings does - * not allow writing temporary files. In this case, the homedir - * option by itself is not enough to specify the keyrings because GnuPG - * can not write required temporary files. Additional options are - * provided so you can specify the location of the keyrings separately - * from the homedir. - */ - - // get public keyring - if (array_key_exists('publicKeyring', $options)) { - $this->_publicKeyring = (string)$options['publicKeyring']; - if (!is_readable($this->_publicKeyring)) { - throw new Crypt_GPG_FileException('The \'publicKeyring\' "' . - $this->_publicKeyring . '" does not exist or is ' . - 'not readable. Check the location and ensure the file ' . - 'permissions are correct.', 0, $this->_publicKeyring); - } - } - - // get private keyring - if (array_key_exists('privateKeyring', $options)) { - $this->_privateKeyring = (string)$options['privateKeyring']; - if (!is_readable($this->_privateKeyring)) { - throw new Crypt_GPG_FileException('The \'privateKeyring\' "' . - $this->_privateKeyring . '" does not exist or is ' . - 'not readable. Check the location and ensure the file ' . - 'permissions are correct.', 0, $this->_privateKeyring); - } - } - - // get trust database - if (array_key_exists('trustDb', $options)) { - $this->_trustDb = (string)$options['trustDb']; - if (!is_readable($this->_trustDb)) { - throw new Crypt_GPG_FileException('The \'trustDb\' "' . - $this->_trustDb . '" does not exist or is not readable. ' . - 'Check the location and ensure the file permissions are ' . - 'correct.', 0, $this->_trustDb); - } - } - - if (array_key_exists('debug', $options)) { - $this->_debug = (boolean)$options['debug']; - } - } - - // }}} - // {{{ __destruct() - - /** - * Closes open GPG subprocesses when this object is destroyed - * - * Subprocesses should never be left open by this class unless there is - * an unknown error and unexpected script termination occurs. - */ - public function __destruct() - { - $this->_closeSubprocess(); - } - - // }}} - // {{{ addErrorHandler() - - /** - * Adds an error handler method - * - * The method is run every time a new error line is received from the GPG - * subprocess. The handler method must accept the error line to be handled - * as its first parameter. - * - * @param callback $callback the callback method to use. - * @param array $args optional. Additional arguments to pass as - * parameters to the callback method. - * - * @return void - */ - public function addErrorHandler($callback, array $args = array()) - { - $this->_errorHandlers[] = array( - 'callback' => $callback, - 'args' => $args - ); - } - - // }}} - // {{{ addStatusHandler() - - /** - * Adds a status handler method - * - * The method is run every time a new status line is received from the - * GPG subprocess. The handler method must accept the status line to be - * handled as its first parameter. - * - * @param callback $callback the callback method to use. - * @param array $args optional. Additional arguments to pass as - * parameters to the callback method. - * - * @return void - */ - public function addStatusHandler($callback, array $args = array()) - { - $this->_statusHandlers[] = array( - 'callback' => $callback, - 'args' => $args - ); - } - - // }}} - // {{{ sendCommand() - - /** - * Sends a command to the GPG subprocess over the command file-descriptor - * pipe - * - * @param string $command the command to send. - * - * @return void - * - * @sensitive $command - */ - public function sendCommand($command) - { - if (array_key_exists(self::FD_COMMAND, $this->_openPipes)) { - $this->_commandBuffer .= $command . PHP_EOL; - } - } - - // }}} - // {{{ reset() - - /** - * Resets the GPG engine, preparing it for a new operation - * - * @return void - * - * @see Crypt_GPG_Engine::run() - * @see Crypt_GPG_Engine::setOperation() - */ - public function reset() - { - $this->_operation = ''; - $this->_arguments = array(); - $this->_input = null; - $this->_message = null; - $this->_output = ''; - $this->_errorCode = Crypt_GPG::ERROR_NONE; - $this->_needPassphrase = 0; - $this->_commandBuffer = ''; - - $this->_statusHandlers = array(); - $this->_errorHandlers = array(); - - $this->addStatusHandler(array($this, '_handleErrorStatus')); - $this->addErrorHandler(array($this, '_handleErrorError')); - - if ($this->_debug) { - $this->addStatusHandler(array($this, '_handleDebugStatus')); - $this->addErrorHandler(array($this, '_handleDebugError')); - } - } - - // }}} - // {{{ run() - - /** - * Runs the current GPG operation - * - * This creates and manages the GPG subprocess. - * - * The operation must be set with {@link Crypt_GPG_Engine::setOperation()} - * before this method is called. - * - * @return void - * - * @throws Crypt_GPG_InvalidOperationException if no operation is specified. - * - * @see Crypt_GPG_Engine::reset() - * @see Crypt_GPG_Engine::setOperation() - */ - public function run() - { - if ($this->_operation === '') { - throw new Crypt_GPG_InvalidOperationException('No GPG operation ' . - 'specified. Use Crypt_GPG_Engine::setOperation() before ' . - 'calling Crypt_GPG_Engine::run().'); - } - - $this->_openSubprocess(); - $this->_process(); - $this->_closeSubprocess(); - } - - // }}} - // {{{ getErrorCode() - - /** - * Gets the error code of the last executed operation - * - * This value is only meaningful after {@link Crypt_GPG_Engine::run()} has - * been executed. - * - * @return integer the error code of the last executed operation. - */ - public function getErrorCode() - { - return $this->_errorCode; - } - - // }}} - // {{{ getErrorFilename() - - /** - * Gets the file related to the error code of the last executed operation - * - * This value is only meaningful after {@link Crypt_GPG_Engine::run()} has - * been executed. If there is no file related to the error, an empty string - * is returned. - * - * @return string the file related to the error code of the last executed - * operation. - */ - public function getErrorFilename() - { - return $this->_errorFilename; - } - - // }}} - // {{{ getErrorKeyId() - - /** - * Gets the key id related to the error code of the last executed operation - * - * This value is only meaningful after {@link Crypt_GPG_Engine::run()} has - * been executed. If there is no key id related to the error, an empty - * string is returned. - * - * @return string the key id related to the error code of the last executed - * operation. - */ - public function getErrorKeyId() - { - return $this->_errorKeyId; - } - - // }}} - // {{{ setInput() - - /** - * Sets the input source for the current GPG operation - * - * @param string|resource &$input either a reference to the string - * containing the input data or an open - * stream resource containing the input - * data. - * - * @return void - */ - public function setInput(&$input) - { - $this->_input =& $input; - } - - // }}} - // {{{ setMessage() - - /** - * Sets the message source for the current GPG operation - * - * Detached signature data should be specified here. - * - * @param string|resource &$message either a reference to the string - * containing the message data or an open - * stream resource containing the message - * data. - * - * @return void - */ - public function setMessage(&$message) - { - $this->_message =& $message; - } - - // }}} - // {{{ setOutput() - - /** - * Sets the output destination for the current GPG operation - * - * @param string|resource &$output either a reference to the string in - * which to store GPG output or an open - * stream resource to which the output data - * should be written. - * - * @return void - */ - public function setOutput(&$output) - { - $this->_output =& $output; - } - - // }}} - // {{{ setOperation() - - /** - * Sets the operation to perform - * - * @param string $operation the operation to perform. This should be one - * of GPG's operations. For example, - * --encrypt, --decrypt, - * --sign, etc. - * @param array $arguments optional. Additional arguments for the GPG - * subprocess. See the GPG manual for specific - * values. - * - * @return void - * - * @see Crypt_GPG_Engine::reset() - * @see Crypt_GPG_Engine::run() - */ - public function setOperation($operation, array $arguments = array()) - { - $this->_operation = $operation; - $this->_arguments = $arguments; - } - - // }}} - // {{{ getVersion() - - /** - * Gets the version of the GnuPG binary - * - * @return string a version number string containing the version of GnuPG - * being used. This value is suitable to use with PHP's - * version_compare() function. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @throws Crypt_GPG_UnsupportedException if the provided binary is not - * GnuPG or if the GnuPG version is less than 1.0.2. - */ - public function getVersion() - { - if ($this->_version == '') { - - $options = array( - 'homedir' => $this->_homedir, - 'binary' => $this->_binary, - 'debug' => $this->_debug - ); - - $engine = new self($options); - $info = ''; - - // Set a garbage version so we do not end up looking up the version - // recursively. - $engine->_version = '1.0.0'; - - $engine->reset(); - $engine->setOutput($info); - $engine->setOperation('--version'); - $engine->run(); - - $code = $this->getErrorCode(); - - if ($code !== Crypt_GPG::ERROR_NONE) { - throw new Crypt_GPG_Exception( - 'Unknown error getting GnuPG version information. Please ' . - 'use the \'debug\' option when creating the Crypt_GPG ' . - 'object, and file a bug report at ' . Crypt_GPG::BUG_URI, - $code); - } - - $matches = array(); - $expression = '#gpg \(GnuPG[A-Za-z0-9/]*?\) (\S+)#'; - - if (preg_match($expression, $info, $matches) === 1) { - $this->_version = $matches[1]; - } else { - throw new Crypt_GPG_Exception( - 'No GnuPG version information provided by the binary "' . - $this->_binary . '". Are you sure it is GnuPG?'); - } - - if (version_compare($this->_version, self::MIN_VERSION, 'lt')) { - throw new Crypt_GPG_Exception( - 'The version of GnuPG being used (' . $this->_version . - ') is not supported by Crypt_GPG. The minimum version ' . - 'required by Crypt_GPG is ' . self::MIN_VERSION); - } - } - - - return $this->_version; - } - - // }}} - // {{{ _handleErrorStatus() - - /** - * Handles error values in the status output from GPG - * - * This method is responsible for setting the - * {@link Crypt_GPG_Engine::$_errorCode}. See doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for detailed - * information on GPG's status output. - * - * @param string $line the status line to handle. - * - * @return void - */ - private function _handleErrorStatus($line) - { - $tokens = explode(' ', $line); - switch ($tokens[0]) { - case 'BAD_PASSPHRASE': - $this->_errorCode = Crypt_GPG::ERROR_BAD_PASSPHRASE; - break; - - case 'MISSING_PASSPHRASE': - $this->_errorCode = Crypt_GPG::ERROR_MISSING_PASSPHRASE; - break; - - case 'NODATA': - $this->_errorCode = Crypt_GPG::ERROR_NO_DATA; - break; - - case 'DELETE_PROBLEM': - if ($tokens[1] == '1') { - $this->_errorCode = Crypt_GPG::ERROR_KEY_NOT_FOUND; - break; - } elseif ($tokens[1] == '2') { - $this->_errorCode = Crypt_GPG::ERROR_DELETE_PRIVATE_KEY; - break; - } - break; - - case 'IMPORT_RES': - if ($tokens[12] > 0) { - $this->_errorCode = Crypt_GPG::ERROR_DUPLICATE_KEY; - } - break; - - case 'NO_PUBKEY': - case 'NO_SECKEY': - $this->_errorKeyId = $tokens[1]; - $this->_errorCode = Crypt_GPG::ERROR_KEY_NOT_FOUND; - break; - - case 'NEED_PASSPHRASE': - $this->_needPassphrase++; - break; - - case 'GOOD_PASSPHRASE': - $this->_needPassphrase--; - break; - - case 'EXPSIG': - case 'EXPKEYSIG': - case 'REVKEYSIG': - case 'BADSIG': - $this->_errorCode = Crypt_GPG::ERROR_BAD_SIGNATURE; - break; - - } - } - - // }}} - // {{{ _handleErrorError() - - /** - * Handles error values in the error output from GPG - * - * This method is responsible for setting the - * {@link Crypt_GPG_Engine::$_errorCode}. - * - * @param string $line the error line to handle. - * - * @return void - */ - private function _handleErrorError($line) - { - if ($this->_errorCode === Crypt_GPG::ERROR_NONE) { - $pattern = '/no valid OpenPGP data found/'; - if (preg_match($pattern, $line) === 1) { - $this->_errorCode = Crypt_GPG::ERROR_NO_DATA; - } - } - - if ($this->_errorCode === Crypt_GPG::ERROR_NONE) { - $pattern = '/No secret key|secret key not available/'; - if (preg_match($pattern, $line) === 1) { - $this->_errorCode = Crypt_GPG::ERROR_KEY_NOT_FOUND; - } - } - - if ($this->_errorCode === Crypt_GPG::ERROR_NONE) { - $pattern = '/No public key|public key not found/'; - if (preg_match($pattern, $line) === 1) { - $this->_errorCode = Crypt_GPG::ERROR_KEY_NOT_FOUND; - } - } - - if ($this->_errorCode === Crypt_GPG::ERROR_NONE) { - $matches = array(); - $pattern = '/can\'t (?:access|open) `(.*?)\'/'; - if (preg_match($pattern, $line, $matches) === 1) { - $this->_errorFilename = $matches[1]; - $this->_errorCode = Crypt_GPG::ERROR_FILE_PERMISSIONS; - } - } - } - - // }}} - // {{{ _handleDebugStatus() - - /** - * Displays debug output for status lines - * - * @param string $line the status line to handle. - * - * @return void - */ - private function _handleDebugStatus($line) - { - $this->_debug('STATUS: ' . $line); - } - - // }}} - // {{{ _handleDebugError() - - /** - * Displays debug output for error lines - * - * @param string $line the error line to handle. - * - * @return void - */ - private function _handleDebugError($line) - { - $this->_debug('ERROR: ' . $line); - } - - // }}} - // {{{ _process() - - /** - * Performs internal streaming operations for the subprocess using either - * strings or streams as input / output points - * - * This is the main I/O loop for streaming to and from the GPG subprocess. - * - * The implementation of this method is verbose mainly for performance - * reasons. Adding streams to a lookup array and looping the array inside - * the main I/O loop would be siginficantly slower for large streams. - * - * @return void - * - * @throws Crypt_GPG_Exception if there is an error selecting streams for - * reading or writing. If this occurs, please file a bug report at - * http://pear.php.net/bugs/report.php?package=Crypt_GPG. - */ - private function _process() - { - $this->_debug('BEGIN PROCESSING'); - - $this->_commandBuffer = ''; // buffers input to GPG - $messageBuffer = ''; // buffers input to GPG - $inputBuffer = ''; // buffers input to GPG - $outputBuffer = ''; // buffers output from GPG - $statusBuffer = ''; // buffers output from GPG - $errorBuffer = ''; // buffers output from GPG - $inputComplete = false; // input stream is completely buffered - $messageComplete = false; // message stream is completely buffered - - if (is_string($this->_input)) { - $inputBuffer = $this->_input; - $inputComplete = true; - } - - if (is_string($this->_message)) { - $messageBuffer = $this->_message; - $messageComplete = true; - } - - if (is_string($this->_output)) { - $outputBuffer =& $this->_output; - } - - // convenience variables - $fdInput = $this->_pipes[self::FD_INPUT]; - $fdOutput = $this->_pipes[self::FD_OUTPUT]; - $fdError = $this->_pipes[self::FD_ERROR]; - $fdStatus = $this->_pipes[self::FD_STATUS]; - $fdCommand = $this->_pipes[self::FD_COMMAND]; - $fdMessage = $this->_pipes[self::FD_MESSAGE]; - - // select loop delay in milliseconds - $delay = 0; - - while (true) { - - $inputStreams = array(); - $outputStreams = array(); - $exceptionStreams = array(); - - // set up input streams - if (is_resource($this->_input) && !$inputComplete) { - if (feof($this->_input)) { - $inputComplete = true; - } else { - $inputStreams[] = $this->_input; - } - } - - // close GPG input pipe if there is no more data - if ($inputBuffer == '' && $inputComplete) { - $this->_debug('=> closing GPG input pipe'); - $this->_closePipe(self::FD_INPUT); - } - - if (is_resource($this->_message) && !$messageComplete) { - if (feof($this->_message)) { - $messageComplete = true; - } else { - $inputStreams[] = $this->_message; - } - } - - // close GPG message pipe if there is no more data - if ($messageBuffer == '' && $messageComplete) { - $this->_debug('=> closing GPG message pipe'); - $this->_closePipe(self::FD_MESSAGE); - } - - if (!feof($fdOutput)) { - $inputStreams[] = $fdOutput; - } - - if (!feof($fdStatus)) { - $inputStreams[] = $fdStatus; - } - - if (!feof($fdError)) { - $inputStreams[] = $fdError; - } - - // set up output streams - if ($outputBuffer != '' && is_resource($this->_output)) { - $outputStreams[] = $this->_output; - } - - if ($this->_commandBuffer != '' && is_resource($fdCommand)) { - $outputStreams[] = $fdCommand; - } - - if ($messageBuffer != '' && is_resource($fdMessage)) { - $outputStreams[] = $fdMessage; - } - - if ($inputBuffer != '' && is_resource($fdInput)) { - $outputStreams[] = $fdInput; - } - - // no streams left to read or write, we're all done - if (count($inputStreams) === 0 && count($outputStreams) === 0) { - break; - } - - $this->_debug('selecting streams'); - - $ready = stream_select( - $inputStreams, - $outputStreams, - $exceptionStreams, - null - ); - - $this->_debug('=> got ' . $ready); - - if ($ready === false) { - throw new Crypt_GPG_Exception( - 'Error selecting stream for communication with GPG ' . - 'subprocess. Please file a bug report at: ' . - 'http://pear.php.net/bugs/report.php?package=Crypt_GPG'); - } - - if ($ready === 0) { - throw new Crypt_GPG_Exception( - 'stream_select() returned 0. This can not happen! Please ' . - 'file a bug report at: ' . - 'http://pear.php.net/bugs/report.php?package=Crypt_GPG'); - } - - // write input (to GPG) - if (in_array($fdInput, $outputStreams, true)) { - $this->_debug('GPG is ready for input'); - - $chunk = Crypt_GPG_ByteUtils::substr( - $inputBuffer, - 0, - self::CHUNK_SIZE - ); - - $length = Crypt_GPG_ByteUtils::strlen($chunk); - - $this->_debug( - '=> about to write ' . $length . ' bytes to GPG input' - ); - - $length = fwrite($fdInput, $chunk, $length); - if ($length === 0) { - // If we wrote 0 bytes it was either EAGAIN or EPIPE. Since - // the pipe was seleted for writing, we assume it was EPIPE. - // There's no way to get the actual erorr code in PHP. See - // PHP Bug #39598. https://bugs.php.net/bug.php?id=39598 - $this->_debug('=> broken pipe on GPG input'); - $this->_debug('=> closing pipe GPG input'); - $this->_closePipe(self::FD_INPUT); - } else { - $this->_debug('=> wrote ' . $length . ' bytes'); - $inputBuffer = Crypt_GPG_ByteUtils::substr( - $inputBuffer, - $length - ); - } - } - - // read input (from PHP stream) - if (in_array($this->_input, $inputStreams, true)) { - $this->_debug('input stream is ready for reading'); - $this->_debug( - '=> about to read ' . self::CHUNK_SIZE . - ' bytes from input stream' - ); - - $chunk = fread($this->_input, self::CHUNK_SIZE); - $length = Crypt_GPG_ByteUtils::strlen($chunk); - $inputBuffer .= $chunk; - - $this->_debug('=> read ' . $length . ' bytes'); - } - - // write message (to GPG) - if (in_array($fdMessage, $outputStreams, true)) { - $this->_debug('GPG is ready for message data'); - - $chunk = Crypt_GPG_ByteUtils::substr( - $messageBuffer, - 0, - self::CHUNK_SIZE - ); - - $length = Crypt_GPG_ByteUtils::strlen($chunk); - - $this->_debug( - '=> about to write ' . $length . ' bytes to GPG message' - ); - - $length = fwrite($fdMessage, $chunk, $length); - if ($length === 0) { - // If we wrote 0 bytes it was either EAGAIN or EPIPE. Since - // the pipe was seleted for writing, we assume it was EPIPE. - // There's no way to get the actual erorr code in PHP. See - // PHP Bug #39598. https://bugs.php.net/bug.php?id=39598 - $this->_debug('=> broken pipe on GPG message'); - $this->_debug('=> closing pipe GPG message'); - $this->_closePipe(self::FD_MESSAGE); - } else { - $this->_debug('=> wrote ' . $length . ' bytes'); - $messageBuffer = Crypt_GPG_ByteUtils::substr( - $messageBuffer, - $length - ); - } - } - - // read message (from PHP stream) - if (in_array($this->_message, $inputStreams, true)) { - $this->_debug('message stream is ready for reading'); - $this->_debug( - '=> about to read ' . self::CHUNK_SIZE . - ' bytes from message stream' - ); - - $chunk = fread($this->_message, self::CHUNK_SIZE); - $length = Crypt_GPG_ByteUtils::strlen($chunk); - $messageBuffer .= $chunk; - - $this->_debug('=> read ' . $length . ' bytes'); - } - - // read output (from GPG) - if (in_array($fdOutput, $inputStreams, true)) { - $this->_debug('GPG output stream ready for reading'); - $this->_debug( - '=> about to read ' . self::CHUNK_SIZE . - ' bytes from GPG output' - ); - - $chunk = fread($fdOutput, self::CHUNK_SIZE); - $length = Crypt_GPG_ByteUtils::strlen($chunk); - $outputBuffer .= $chunk; - - $this->_debug('=> read ' . $length . ' bytes'); - } - - // write output (to PHP stream) - if (in_array($this->_output, $outputStreams, true)) { - $this->_debug('output stream is ready for data'); - - $chunk = Crypt_GPG_ByteUtils::substr( - $outputBuffer, - 0, - self::CHUNK_SIZE - ); - - $length = Crypt_GPG_ByteUtils::strlen($chunk); - - $this->_debug( - '=> about to write ' . $length . ' bytes to output stream' - ); - - $length = fwrite($this->_output, $chunk, $length); - - $this->_debug('=> wrote ' . $length . ' bytes'); - - $outputBuffer = Crypt_GPG_ByteUtils::substr( - $outputBuffer, - $length - ); - } - - // read error (from GPG) - if (in_array($fdError, $inputStreams, true)) { - $this->_debug('GPG error stream ready for reading'); - $this->_debug( - '=> about to read ' . self::CHUNK_SIZE . - ' bytes from GPG error' - ); - - $chunk = fread($fdError, self::CHUNK_SIZE); - $length = Crypt_GPG_ByteUtils::strlen($chunk); - $errorBuffer .= $chunk; - - $this->_debug('=> read ' . $length . ' bytes'); - - // pass lines to error handlers - while (($pos = strpos($errorBuffer, PHP_EOL)) !== false) { - $line = Crypt_GPG_ByteUtils::substr($errorBuffer, 0, $pos); - foreach ($this->_errorHandlers as $handler) { - array_unshift($handler['args'], $line); - call_user_func_array( - $handler['callback'], - $handler['args'] - ); - - array_shift($handler['args']); - } - $errorBuffer = Crypt_GPG_ByteUtils::substr( - $errorBuffer, - $pos + Crypt_GPG_ByteUtils::strlen(PHP_EOL) - ); - } - } - - // read status (from GPG) - if (in_array($fdStatus, $inputStreams, true)) { - $this->_debug('GPG status stream ready for reading'); - $this->_debug( - '=> about to read ' . self::CHUNK_SIZE . - ' bytes from GPG status' - ); - - $chunk = fread($fdStatus, self::CHUNK_SIZE); - $length = Crypt_GPG_ByteUtils::strlen($chunk); - $statusBuffer .= $chunk; - - $this->_debug('=> read ' . $length . ' bytes'); - - // pass lines to status handlers - while (($pos = strpos($statusBuffer, PHP_EOL)) !== false) { - $line = Crypt_GPG_ByteUtils::substr($statusBuffer, 0, $pos); - // only pass lines beginning with magic prefix - if (Crypt_GPG_ByteUtils::substr($line, 0, 9) == '[GNUPG:] ') { - $line = Crypt_GPG_ByteUtils::substr($line, 9); - foreach ($this->_statusHandlers as $handler) { - array_unshift($handler['args'], $line); - call_user_func_array( - $handler['callback'], - $handler['args'] - ); - - array_shift($handler['args']); - } - } - $statusBuffer = Crypt_GPG_ByteUtils::substr( - $statusBuffer, - $pos + Crypt_GPG_ByteUtils::strlen(PHP_EOL) - ); - } - } - - // write command (to GPG) - if (in_array($fdCommand, $outputStreams, true)) { - $this->_debug('GPG is ready for command data'); - - // send commands - $chunk = Crypt_GPG_ByteUtils::substr( - $this->_commandBuffer, - 0, - self::CHUNK_SIZE - ); - - $length = Crypt_GPG_ByteUtils::strlen($chunk); - - $this->_debug( - '=> about to write ' . $length . ' bytes to GPG command' - ); - - $length = fwrite($fdCommand, $chunk, $length); - if ($length === 0) { - // If we wrote 0 bytes it was either EAGAIN or EPIPE. Since - // the pipe was seleted for writing, we assume it was EPIPE. - // There's no way to get the actual erorr code in PHP. See - // PHP Bug #39598. https://bugs.php.net/bug.php?id=39598 - $this->_debug('=> broken pipe on GPG command'); - $this->_debug('=> closing pipe GPG command'); - $this->_closePipe(self::FD_COMMAND); - } else { - $this->_debug('=> wrote ' . $length); - $this->_commandBuffer = Crypt_GPG_ByteUtils::substr( - $this->_commandBuffer, - $length - ); - } - } - - if (count($outputStreams) === 0 || count($inputStreams) === 0) { - // we have an I/O imbalance, increase the select loop delay - // to smooth things out - $delay += 10; - } else { - // things are running smoothly, decrease the delay - $delay -= 8; - $delay = max(0, $delay); - } - - if ($delay > 0) { - usleep($delay); - } - - } // end loop while streams are open - - $this->_debug('END PROCESSING'); - } - - // }}} - // {{{ _openSubprocess() - - /** - * Opens an internal GPG subprocess for the current operation - * - * Opens a GPG subprocess, then connects the subprocess to some pipes. Sets - * the private class property {@link Crypt_GPG_Engine::$_process} to - * the new subprocess. - * - * @return void - * - * @throws Crypt_GPG_OpenSubprocessException if the subprocess could not be - * opened. - * - * @see Crypt_GPG_Engine::setOperation() - * @see Crypt_GPG_Engine::_closeSubprocess() - * @see Crypt_GPG_Engine::$_process - */ - private function _openSubprocess() - { - $version = $this->getVersion(); - - // Binary operations will not work on Windows with PHP < 5.2.6. This is - // in case stream_select() ever works on Windows. - $rb = (version_compare(PHP_VERSION, '5.2.6') < 0) ? 'r' : 'rb'; - $wb = (version_compare(PHP_VERSION, '5.2.6') < 0) ? 'w' : 'wb'; - - $env = $_ENV; - - // Newer versions of GnuPG return localized results. Crypt_GPG only - // works with English, so set the locale to 'C' for the subprocess. - $env['LC_ALL'] = 'C'; - - // If using GnuPG 2.x start the gpg-agent - if (version_compare($version, '2.0.0', 'ge')) { - $agentCommandLine = $this->_agent; - - $agentArguments = array( - '--options /dev/null', // ignore any saved options - '--csh', // output is easier to parse - '--keep-display', // prevent passing --display to pinentry - '--no-grab', - '--ignore-cache-for-signing', - '--pinentry-touch-file /dev/null', - '--disable-scdaemon', - '--no-use-standard-socket', - '--pinentry-program ' . escapeshellarg($this->_getPinEntry()) - ); - - if ($this->_homedir) { - $agentArguments[] = '--homedir ' . - escapeshellarg($this->_homedir); - } - - - $agentCommandLine .= ' ' . implode(' ', $agentArguments) - . ' --daemon'; - - $agentDescriptorSpec = array( - self::FD_INPUT => array('pipe', $rb), // stdin - self::FD_OUTPUT => array('pipe', $wb), // stdout - self::FD_ERROR => array('pipe', $wb) // stderr - ); - - $this->_debug('OPENING GPG-AGENT SUBPROCESS WITH THE FOLLOWING COMMAND:'); - $this->_debug($agentCommandLine); - - $this->_agentProcess = proc_open( - $agentCommandLine, - $agentDescriptorSpec, - $this->_agentPipes, - null, - $env, - array('binary_pipes' => true) - ); - - if (!is_resource($this->_agentProcess)) { - throw new Crypt_GPG_OpenSubprocessException( - 'Unable to open gpg-agent subprocess.', - 0, - $agentCommandLine - ); - } - - // Get GPG_AGENT_INFO and set environment variable for gpg process. - // This is a blocking read, but is only 1 line. - $agentInfo = fread( - $this->_agentPipes[self::FD_OUTPUT], - self::CHUNK_SIZE - ); - - $agentInfo = explode(' ', $agentInfo, 3); - $this->_agentInfo = $agentInfo[2]; - $env['GPG_AGENT_INFO'] = $this->_agentInfo; - - // gpg-agent daemon is started, we can close the launching process - $this->_closeAgentLaunchProcess(); - } - - $commandLine = $this->_binary; - - $defaultArguments = array( - '--status-fd ' . escapeshellarg(self::FD_STATUS), - '--command-fd ' . escapeshellarg(self::FD_COMMAND), - '--no-secmem-warning', - '--no-tty', - '--no-default-keyring', // ignored if keying files are not specified - '--no-options' // prevent creation of ~/.gnupg directory - ); - - if (version_compare($version, '1.0.7', 'ge')) { - if (version_compare($version, '2.0.0', 'lt')) { - $defaultArguments[] = '--no-use-agent'; - } - $defaultArguments[] = '--no-permission-warning'; - } - - if (version_compare($version, '1.4.2', 'ge')) { - $defaultArguments[] = '--exit-on-status-write-error'; - } - - if (version_compare($version, '1.3.2', 'ge')) { - $defaultArguments[] = '--trust-model always'; - } else { - $defaultArguments[] = '--always-trust'; - } - - $arguments = array_merge($defaultArguments, $this->_arguments); - - if ($this->_homedir) { - $arguments[] = '--homedir ' . escapeshellarg($this->_homedir); - - // the random seed file makes subsequent actions faster so only - // disable it if we have to. - if (!is_writeable($this->_homedir)) { - $arguments[] = '--no-random-seed-file'; - } - } - - if ($this->_publicKeyring) { - $arguments[] = '--keyring ' . escapeshellarg($this->_publicKeyring); - } - - if ($this->_privateKeyring) { - $arguments[] = '--secret-keyring ' . - escapeshellarg($this->_privateKeyring); - } - - if ($this->_trustDb) { - $arguments[] = '--trustdb-name ' . escapeshellarg($this->_trustDb); - } - - $commandLine .= ' ' . implode(' ', $arguments) . ' ' . - $this->_operation; - - $descriptorSpec = array( - self::FD_INPUT => array('pipe', $rb), // stdin - self::FD_OUTPUT => array('pipe', $wb), // stdout - self::FD_ERROR => array('pipe', $wb), // stderr - self::FD_STATUS => array('pipe', $wb), // status - self::FD_COMMAND => array('pipe', $rb), // command - self::FD_MESSAGE => array('pipe', $rb) // message - ); - - $this->_debug('OPENING GPG SUBPROCESS WITH THE FOLLOWING COMMAND:'); - $this->_debug($commandLine); - - $this->_process = proc_open( - $commandLine, - $descriptorSpec, - $this->_pipes, - null, - $env, - array('binary_pipes' => true) - ); - - if (!is_resource($this->_process)) { - throw new Crypt_GPG_OpenSubprocessException( - 'Unable to open GPG subprocess.', 0, $commandLine); - } - - // Set streams as non-blocking. See Bug #18618. - foreach ($this->_pipes as $pipe) { - stream_set_blocking($pipe, 0); - } - - $this->_openPipes = $this->_pipes; - $this->_errorCode = Crypt_GPG::ERROR_NONE; - } - - // }}} - // {{{ _closeSubprocess() - - /** - * Closes a the internal GPG subprocess - * - * Closes the internal GPG subprocess. Sets the private class property - * {@link Crypt_GPG_Engine::$_process} to null. - * - * @return void - * - * @see Crypt_GPG_Engine::_openSubprocess() - * @see Crypt_GPG_Engine::$_process - */ - private function _closeSubprocess() - { - // clear PINs from environment if they were set - $_ENV['PINENTRY_USER_DATA'] = null; - - if (is_resource($this->_process)) { - $this->_debug('CLOSING GPG SUBPROCESS'); - - // close remaining open pipes - foreach (array_keys($this->_openPipes) as $pipeNumber) { - $this->_closePipe($pipeNumber); - } - - $exitCode = proc_close($this->_process); - - if ($exitCode != 0) { - $this->_debug( - '=> subprocess returned an unexpected exit code: ' . - $exitCode - ); - - if ($this->_errorCode === Crypt_GPG::ERROR_NONE) { - if ($this->_needPassphrase > 0) { - $this->_errorCode = Crypt_GPG::ERROR_MISSING_PASSPHRASE; - } else { - $this->_errorCode = Crypt_GPG::ERROR_UNKNOWN; - } - } - } - - $this->_process = null; - $this->_pipes = array(); - } - - $this->_closeAgentLaunchProcess(); - - if ($this->_agentInfo !== null) { - $this->_debug('STOPPING GPG-AGENT DAEMON'); - - $parts = explode(':', $this->_agentInfo, 3); - $pid = $parts[1]; - $process = new Crypt_GPG_ProcessControl($pid); - - // terminate agent daemon - $process->terminate(); - - while ($process->isRunning()) { - usleep(10000); // 10 ms - $process->terminate(); - } - - $this->_agentInfo = null; - - $this->_debug('GPG-AGENT DAEMON STOPPED'); - } - } - - // }}} - // {{ _closeAgentLaunchProcess() - - private function _closeAgentLaunchProcess() - { - if (is_resource($this->_agentProcess)) { - $this->_debug('CLOSING GPG-AGENT LAUNCH PROCESS'); - - // close agent pipes - foreach ($this->_agentPipes as $pipe) { - fflush($pipe); - fclose($pipe); - } - - // close agent launching process - proc_close($this->_agentProcess); - - $this->_agentProcess = null; - $this->_agentPipes = array(); - - $this->_debug('GPG-AGENT LAUNCH PROCESS CLOSED'); - } - } - - // }} - // {{{ _closePipe() - - /** - * Closes an opened pipe used to communicate with the GPG subprocess - * - * If the pipe is already closed, it is ignored. If the pipe is open, it - * is flushed and then closed. - * - * @param integer $pipeNumber the file descriptor number of the pipe to - * close. - * - * @return void - */ - private function _closePipe($pipeNumber) - { - $pipeNumber = intval($pipeNumber); - if (array_key_exists($pipeNumber, $this->_openPipes)) { - fflush($this->_openPipes[$pipeNumber]); - fclose($this->_openPipes[$pipeNumber]); - unset($this->_openPipes[$pipeNumber]); - } - } - - // }}} - // {{{ _getBinary() - - /** - * Gets the name of the GPG binary for the current operating system - * - * This method is called if the 'binary' option is not - * specified when creating this driver. - * - * @return string the name of the GPG binary for the current operating - * system. If no suitable binary could be found, an empty - * string is returned. - */ - private function _getBinary() - { - $binary = ''; - - if ($this->_isDarwin) { - $binaryFiles = array( - '/opt/local/bin/gpg', // MacPorts - '/usr/local/bin/gpg', // Mac GPG - '/sw/bin/gpg', // Fink - '/usr/bin/gpg' - ); - } else { - $binaryFiles = array( - '/usr/bin/gpg', - '/usr/local/bin/gpg' - ); - } - - foreach ($binaryFiles as $binaryFile) { - if (is_executable($binaryFile)) { - $binary = $binaryFile; - break; - } - } - - return $binary; - } - - // }}} - // {{ _getAgent() - - private function _getAgent() - { - $agent = ''; - - if ($this->_isDarwin) { - $agentFiles = array( - '/opt/local/bin/gpg-agent', // MacPorts - '/usr/local/bin/gpg-agent', // Mac GPG - '/sw/bin/gpg-agent', // Fink - '/usr/bin/gpg-agent' - ); - } else { - $agentFiles = array( - '/usr/bin/gpg-agent', - '/usr/local/bin/gpg-agent' - ); - } - - foreach ($agentFiles as $agentFile) { - if (is_executable($agentFile)) { - $agent = $agentFile; - break; - } - } - - return $agent; - } - - // }} - // {{ _getPinEntry() - - private function _getPinEntry() - { - // Check if we're running directly from git or if we're using a - // PEAR-packaged version - $pinEntry = '@bin-dir@' . DIRECTORY_SEPARATOR . 'crypt-gpg-pinentry'; - - if ($pinEntry[0] === '@') { - $pinEntry = dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' - . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'scripts' - . DIRECTORY_SEPARATOR . 'crypt-gpg-pinentry'; - } - - return $pinEntry; - } - - // }} - // {{{ _debug() - - /** - * Displays debug text if debugging is turned on - * - * Debugging text is prepended with a debug identifier and echoed to stdout. - * - * @param string $text the debugging text to display. - * - * @return void - */ - private function _debug($text) - { - if ($this->_debug) { - if (php_sapi_name() === 'cli') { - foreach (explode(PHP_EOL, $text) as $line) { - echo "Crypt_GPG DEBUG: ", $line, PHP_EOL; - } - } else { - // running on a web server, format debug output nicely - foreach (explode(PHP_EOL, $text) as $line) { - echo "Crypt_GPG DEBUG: ", $line, - '
    ', PHP_EOL; - } - } - } - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/Exceptions.php b/program/lib/Crypt/GPG/Exceptions.php deleted file mode 100644 index 0ca917db6..000000000 --- a/program/lib/Crypt/GPG/Exceptions.php +++ /dev/null @@ -1,598 +0,0 @@ - - * @author Michael Gauthier - * @copyright 2005-2011 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -/** - * PEAR Exception handler and base class - */ -require_once 'PEAR/Exception.php'; - -// {{{ class Crypt_GPG_Exception - -/** - * An exception thrown by the Crypt_GPG package - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2005 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_Exception extends PEAR_Exception -{ -} - -// }}} -// {{{ class Crypt_GPG_FileException - -/** - * An exception thrown when a file is used in ways it cannot be used - * - * For example, if an output file is specified and the file is not writeable, or - * if an input file is specified and the file is not readable, this exception - * is thrown. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2007-2008 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_FileException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * The name of the file that caused this exception - * - * @var string - */ - private $_filename = ''; - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_FileException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $filename the name of the file that caused this exception. - */ - public function __construct($message, $code = 0, $filename = '') - { - $this->_filename = $filename; - parent::__construct($message, $code); - } - - // }}} - // {{{ getFilename() - - /** - * Returns the filename of the file that caused this exception - * - * @return string the filename of the file that caused this exception. - * - * @see Crypt_GPG_FileException::$_filename - */ - public function getFilename() - { - return $this->_filename; - } - - // }}} -} - -// }}} -// {{{ class Crypt_GPG_OpenSubprocessException - -/** - * An exception thrown when the GPG subprocess cannot be opened - * - * This exception is thrown when the {@link Crypt_GPG_Engine} tries to open a - * new subprocess and fails. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2005 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_OpenSubprocessException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * The command used to try to open the subprocess - * - * @var string - */ - private $_command = ''; - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_OpenSubprocessException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $command the command that was called to open the - * new subprocess. - * - * @see Crypt_GPG::_openSubprocess() - */ - public function __construct($message, $code = 0, $command = '') - { - $this->_command = $command; - parent::__construct($message, $code); - } - - // }}} - // {{{ getCommand() - - /** - * Returns the contents of the internal _command property - * - * @return string the command used to open the subprocess. - * - * @see Crypt_GPG_OpenSubprocessException::$_command - */ - public function getCommand() - { - return $this->_command; - } - - // }}} -} - -// }}} -// {{{ class Crypt_GPG_InvalidOperationException - -/** - * An exception thrown when an invalid GPG operation is attempted - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2008 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_InvalidOperationException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * The attempted operation - * - * @var string - */ - private $_operation = ''; - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_OpenSubprocessException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $operation the operation. - */ - public function __construct($message, $code = 0, $operation = '') - { - $this->_operation = $operation; - parent::__construct($message, $code); - } - - // }}} - // {{{ getOperation() - - /** - * Returns the contents of the internal _operation property - * - * @return string the attempted operation. - * - * @see Crypt_GPG_InvalidOperationException::$_operation - */ - public function getOperation() - { - return $this->_operation; - } - - // }}} -} - -// }}} -// {{{ class Crypt_GPG_KeyNotFoundException - -/** - * An exception thrown when Crypt_GPG fails to find the key for various - * operations - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2005 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_KeyNotFoundException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * The key identifier that was searched for - * - * @var string - */ - private $_keyId = ''; - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_KeyNotFoundException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $keyId the key identifier of the key. - */ - public function __construct($message, $code = 0, $keyId= '') - { - $this->_keyId = $keyId; - parent::__construct($message, $code); - } - - // }}} - // {{{ getKeyId() - - /** - * Gets the key identifier of the key that was not found - * - * @return string the key identifier of the key that was not found. - */ - public function getKeyId() - { - return $this->_keyId; - } - - // }}} -} - -// }}} -// {{{ class Crypt_GPG_NoDataException - -/** - * An exception thrown when Crypt_GPG cannot find valid data for various - * operations - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2006 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_NoDataException extends Crypt_GPG_Exception -{ -} - -// }}} -// {{{ class Crypt_GPG_BadPassphraseException - -/** - * An exception thrown when a required passphrase is incorrect or missing - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2006-2008 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_BadPassphraseException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * Keys for which the passhprase is missing - * - * This contains primary user ids indexed by sub-key id. - * - * @var array - */ - private $_missingPassphrases = array(); - - /** - * Keys for which the passhprase is incorrect - * - * This contains primary user ids indexed by sub-key id. - * - * @var array - */ - private $_badPassphrases = array(); - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_BadPassphraseException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $badPassphrases an array containing user ids of keys - * for which the passphrase is incorrect. - * @param string $missingPassphrases an array containing user ids of keys - * for which the passphrase is missing. - */ - public function __construct($message, $code = 0, - array $badPassphrases = array(), array $missingPassphrases = array() - ) { - $this->_badPassphrases = $badPassphrases; - $this->_missingPassphrases = $missingPassphrases; - - parent::__construct($message, $code); - } - - // }}} - // {{{ getBadPassphrases() - - /** - * Gets keys for which the passhprase is incorrect - * - * @return array an array of keys for which the passphrase is incorrect. - * The array contains primary user ids indexed by the sub-key - * id. - */ - public function getBadPassphrases() - { - return $this->_badPassphrases; - } - - // }}} - // {{{ getMissingPassphrases() - - /** - * Gets keys for which the passhprase is missing - * - * @return array an array of keys for which the passphrase is missing. - * The array contains primary user ids indexed by the sub-key - * id. - */ - public function getMissingPassphrases() - { - return $this->_missingPassphrases; - } - - // }}} -} - -// }}} -// {{{ class Crypt_GPG_DeletePrivateKeyException - -/** - * An exception thrown when an attempt is made to delete public key that has an - * associated private key on the keyring - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2008 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_DeletePrivateKeyException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * The key identifier the deletion attempt was made upon - * - * @var string - */ - private $_keyId = ''; - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_DeletePrivateKeyException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $keyId the key identifier of the public key that was - * attempted to delete. - * - * @see Crypt_GPG::deletePublicKey() - */ - public function __construct($message, $code = 0, $keyId = '') - { - $this->_keyId = $keyId; - parent::__construct($message, $code); - } - - // }}} - // {{{ getKeyId() - - /** - * Gets the key identifier of the key that was not found - * - * @return string the key identifier of the key that was not found. - */ - public function getKeyId() - { - return $this->_keyId; - } - - // }}} -} - -// }}} -// {{{ class Crypt_GPG_KeyNotCreatedException - -/** - * An exception thrown when an attempt is made to generate a key and the - * attempt fails - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2011 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_KeyNotCreatedException extends Crypt_GPG_Exception -{ -} - -// }}} -// {{{ class Crypt_GPG_InvalidKeyParamsException - -/** - * An exception thrown when an attempt is made to generate a key and the - * key parameters set on the key generator are invalid - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2011 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_InvalidKeyParamsException extends Crypt_GPG_Exception -{ - // {{{ private class properties - - /** - * The key algorithm - * - * @var integer - */ - private $_algorithm = 0; - - /** - * The key size - * - * @var integer - */ - private $_size = 0; - - /** - * The key usage - * - * @var integer - */ - private $_usage = 0; - - // }}} - // {{{ __construct() - - /** - * Creates a new Crypt_GPG_InvalidKeyParamsException - * - * @param string $message an error message. - * @param integer $code a user defined error code. - * @param string $algorithm the key algorithm. - * @param string $size the key size. - * @param string $usage the key usage. - */ - public function __construct( - $message, - $code = 0, - $algorithm = 0, - $size = 0, - $usage = 0 - ) { - parent::__construct($message, $code); - - $this->_algorithm = $algorithm; - $this->_size = $size; - $this->_usage = $usage; - } - - // }}} - // {{{ getAlgorithm() - - /** - * Gets the key algorithm - * - * @return integer the key algorithm. - */ - public function getAlgorithm() - { - return $this->_algorithm; - } - - // }}} - // {{{ getSize() - - /** - * Gets the key size - * - * @return integer the key size. - */ - public function getSize() - { - return $this->_size; - } - - // }}} - // {{{ getUsage() - - /** - * Gets the key usage - * - * @return integer the key usage. - */ - public function getUsage() - { - return $this->_usage; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/Key.php b/program/lib/Crypt/GPG/Key.php deleted file mode 100644 index 6ecb538bc..000000000 --- a/program/lib/Crypt/GPG/Key.php +++ /dev/null @@ -1,223 +0,0 @@ - - * @copyright 2008-2010 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -/** - * Sub-key class definition - */ -require_once 'Crypt/GPG/SubKey.php'; - -/** - * User id class definition - */ -require_once 'Crypt/GPG/UserId.php'; - -// {{{ class Crypt_GPG_Key - -/** - * A data class for GPG key information - * - * This class is used to store the results of the {@link Crypt_GPG::getKeys()} - * method. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2008-2010 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @see Crypt_GPG::getKeys() - */ -class Crypt_GPG_Key -{ - // {{{ class properties - - /** - * The user ids associated with this key - * - * This is an array of {@link Crypt_GPG_UserId} objects. - * - * @var array - * - * @see Crypt_GPG_Key::addUserId() - * @see Crypt_GPG_Key::getUserIds() - */ - private $_userIds = array(); - - /** - * The subkeys of this key - * - * This is an array of {@link Crypt_GPG_SubKey} objects. - * - * @var array - * - * @see Crypt_GPG_Key::addSubKey() - * @see Crypt_GPG_Key::getSubKeys() - */ - private $_subKeys = array(); - - // }}} - // {{{ getSubKeys() - - /** - * Gets the sub-keys of this key - * - * @return array the sub-keys of this key. - * - * @see Crypt_GPG_Key::addSubKey() - */ - public function getSubKeys() - { - return $this->_subKeys; - } - - // }}} - // {{{ getUserIds() - - /** - * Gets the user ids of this key - * - * @return array the user ids of this key. - * - * @see Crypt_GPG_Key::addUserId() - */ - public function getUserIds() - { - return $this->_userIds; - } - - // }}} - // {{{ getPrimaryKey() - - /** - * Gets the primary sub-key of this key - * - * The primary key is the first added sub-key. - * - * @return Crypt_GPG_SubKey the primary sub-key of this key. - */ - public function getPrimaryKey() - { - $primary_key = null; - if (count($this->_subKeys) > 0) { - $primary_key = $this->_subKeys[0]; - } - return $primary_key; - } - - // }}} - // {{{ canSign() - - /** - * Gets whether or not this key can sign data - * - * This key can sign data if any sub-key of this key can sign data. - * - * @return boolean true if this key can sign data and false if this key - * cannot sign data. - */ - public function canSign() - { - $canSign = false; - foreach ($this->_subKeys as $subKey) { - if ($subKey->canSign()) { - $canSign = true; - break; - } - } - return $canSign; - } - - // }}} - // {{{ canEncrypt() - - /** - * Gets whether or not this key can encrypt data - * - * This key can encrypt data if any sub-key of this key can encrypt data. - * - * @return boolean true if this key can encrypt data and false if this - * key cannot encrypt data. - */ - public function canEncrypt() - { - $canEncrypt = false; - foreach ($this->_subKeys as $subKey) { - if ($subKey->canEncrypt()) { - $canEncrypt = true; - break; - } - } - return $canEncrypt; - } - - // }}} - // {{{ addSubKey() - - /** - * Adds a sub-key to this key - * - * The first added sub-key will be the primary key of this key. - * - * @param Crypt_GPG_SubKey $subKey the sub-key to add. - * - * @return Crypt_GPG_Key the current object, for fluent interface. - */ - public function addSubKey(Crypt_GPG_SubKey $subKey) - { - $this->_subKeys[] = $subKey; - return $this; - } - - // }}} - // {{{ addUserId() - - /** - * Adds a user id to this key - * - * @param Crypt_GPG_UserId $userId the user id to add. - * - * @return Crypt_GPG_Key the current object, for fluent interface. - */ - public function addUserId(Crypt_GPG_UserId $userId) - { - $this->_userIds[] = $userId; - return $this; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/KeyGenerator.php b/program/lib/Crypt/GPG/KeyGenerator.php deleted file mode 100644 index f59c0ee3a..000000000 --- a/program/lib/Crypt/GPG/KeyGenerator.php +++ /dev/null @@ -1,790 +0,0 @@ - - * @copyright 2011-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id:$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ - -/** - * Base class for GPG methods - */ -require_once 'Crypt/GPGAbstract.php'; - -/** - * Status output handler for key generation - */ -require_once 'Crypt/GPG/KeyGeneratorStatusHandler.php'; - -/** - * Error output handler for key generation - */ -require_once 'Crypt/GPG/KeyGeneratorErrorHandler.php'; - -// {{{ class Crypt_GPG_KeyGenerator - -/** - * GnuPG key generator - * - * This class provides an object oriented interface for generating keys with - * the GNU Privacy Guard (GPG). - * - * Secure key generation requires true random numbers, and as such can be slow. - * If the operating system runs out of entropy, key generation will block until - * more entropy is available. - * - * If quick key generation is important, a hardware entropy generator, or an - * entropy gathering daemon may be installed. For example, administrators of - * Debian systems may want to install the 'randomsound' package. - * - * This class uses the experimental automated key generation support available - * in GnuPG. See doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for detailed - * information on the key generation format. - * - * @category Encryption - * @package Crypt_GPG - * @author Nathan Fredrickson - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG_KeyGenerator extends Crypt_GPGAbstract -{ - // {{{ protected properties - - /** - * The expiration date of generated keys - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setExpirationDate() - */ - protected $expirationDate = 0; - - /** - * The passphrase of generated keys - * - * @var string - * - * @see Crypt_GPG_KeyGenerator::setPassphrase() - */ - protected $passphrase = ''; - - /** - * The algorithm for generated primary keys - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setKeyParams() - */ - protected $keyAlgorithm = Crypt_GPG_SubKey::ALGORITHM_DSA; - - /** - * The size of generated primary keys - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setKeyParams() - */ - protected $keySize = 1024; - - /** - * The usages of generated primary keys - * - * This is a bitwise combination of the usage constants in - * {@link Crypt_GPG_SubKey}. - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setKeyParams() - */ - protected $keyUsage = 6; // USAGE_SIGN | USAGE_CERTIFY - - /** - * The algorithm for generated sub-keys - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setSubKeyParams() - */ - protected $subKeyAlgorithm = Crypt_GPG_SubKey::ALGORITHM_ELGAMAL_ENC; - - /** - * The size of generated sub-keys - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setSubKeyParams() - */ - protected $subKeySize = 2048; - - /** - * The usages of generated sub-keys - * - * This is a bitwise combination of the usage constants in - * {@link Crypt_GPG_SubKey}. - * - * @var integer - * - * @see Crypt_GPG_KeyGenerator::setSubKeyParams() - */ - protected $subKeyUsage = Crypt_GPG_SubKey::USAGE_ENCRYPT; - - /** - * The GnuPG status handler to use for key generation - * - * @var Crypt_GPG_KeyGeneratorStatusHandler - * - * @see Crypt_GPG_KeyGenerator::setStatusHandler() - */ - protected $statusHandler = null; - - /** - * The GnuPG error handler to use for key generation - * - * @var Crypt_GPG_KeyGeneratorErrorHandler - * - * @see Crypt_GPG_KeyGenerator::setErrorHandler() - */ - protected $errorHandler = null; - - // }}} - // {{{ __construct() - - /** - * Creates a new GnuPG key generator - * - * Available options are: - * - * - string homedir - the directory where the GPG - * keyring files are stored. If not - * specified, Crypt_GPG uses the - * default of ~/.gnupg. - * - string publicKeyring - the file path of the public - * keyring. Use this if the public - * keyring is not in the homedir, or - * if the keyring is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * keyring with this option - * (/foo/bar/pubring.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string privateKeyring - the file path of the private - * keyring. Use this if the private - * keyring is not in the homedir, or - * if the keyring is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * keyring with this option - * (/foo/bar/secring.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string trustDb - the file path of the web-of-trust - * database. Use this if the trust - * database is not in the homedir, or - * if the database is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * trust database with this option - * (/foo/bar/trustdb.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string binary - the location of the GPG binary. If - * not specified, the driver attempts - * to auto-detect the GPG binary - * location using a list of known - * default locations for the current - * operating system. The option - * gpgBinary is a - * deprecated alias for this option. - * - string agent - the location of the GnuPG agent - * binary. The gpg-agent is only - * used for GnuPG 2.x. If not - * specified, the engine attempts - * to auto-detect the gpg-agent - * binary location using a list of - * know default locations for the - * current operating system. - * - boolean debug - whether or not to use debug mode. - * When debug mode is on, all - * communication to and from the GPG - * subprocess is logged. This can be - * - * @param array $options optional. An array of options used to create the - * GPG object. All options are optional and are - * represented as key-value pairs. - * - * @throws Crypt_GPG_FileException if the homedir does not exist - * and cannot be created. This can happen if homedir is - * not specified, Crypt_GPG is run as the web user, and the web - * user has no home directory. This exception is also thrown if any - * of the options publicKeyring, - * privateKeyring or trustDb options are - * specified but the files do not exist or are are not readable. - * This can happen if the user running the Crypt_GPG process (for - * example, the Apache user) does not have permission to read the - * files. - * - * @throws PEAR_Exception if the provided binary is invalid, or - * if no binary is provided and no suitable binary could - * be found. - * - * @throws PEAR_Exception if the provided agent is invalid, or - * if no agent is provided and no suitable gpg-agent - * cound be found. - */ - public function __construct(array $options = array()) - { - parent::__construct($options); - - $this->statusHandler = new Crypt_GPG_KeyGeneratorStatusHandler(); - $this->errorHandler = new Crypt_GPG_KeyGeneratorErrorHandler(); - } - - // }}} - // {{{ setExpirationDate() - - /** - * Sets the expiration date of generated keys - * - * @param string|integer $date either a string that may be parsed by - * PHP's strtotime() function, or an integer - * timestamp representing the number of seconds - * since the UNIX epoch. This date must be at - * least one date in the future. Keys that - * expire in the past may not be generated. Use - * an expiration date of 0 for keys that do not - * expire. - * - * @throws InvalidArgumentException if the date is not a valid format, or - * if the date is not at least one day in - * the future, or if the date is greater - * than 2038-01-19T03:14:07. - * - * @return Crypt_GPG_KeyGenerator the current object, for fluent interface. - */ - public function setExpirationDate($date) - { - if (is_int($date) || ctype_digit(strval($date))) { - $expirationDate = intval($date); - } else { - $expirationDate = strtotime($date); - } - - if ($expirationDate === false) { - throw new InvalidArgumentException( - sprintf( - 'Invalid expiration date format: "%s". Please use a ' . - 'format compatible with PHP\'s strtotime().', - $date - ) - ); - } - - if ($expirationDate !== 0 && $expirationDate < time() + 86400) { - throw new InvalidArgumentException( - 'Expiration date must be at least a day in the future.' - ); - } - - // GnuPG suffers from the 2038 bug - if ($expirationDate > 2147483647) { - throw new InvalidArgumentException( - 'Expiration date must not be greater than 2038-01-19T03:14:07.' - ); - } - - $this->expirationDate = $expirationDate; - - return $this; - } - - // }}} - // {{{ setPassphrase() - - /** - * Sets the passphrase of generated keys - * - * @param string $passphrase the passphrase to use for generated keys. Use - * null or an empty string for no passphrase. - * - * @return Crypt_GPG_KeyGenerator the current object, for fluent interface. - */ - public function setPassphrase($passphrase) - { - $this->passphrase = strval($passphrase); - return $this; - } - - // }}} - // {{{ setKeyParams() - - /** - * Sets the parameters for the primary key of generated key-pairs - * - * @param integer $algorithm the algorithm used by the key. This should be - * one of the Crypt_GPG_SubKey::ALGORITHM_* - * constants. - * @param integer $size optional. The size of the key. Different - * algorithms have different size requirements. - * If not specified, the default size for the - * specified algorithm will be used. If an - * invalid key size is used, GnuPG will do its - * best to round it to a valid size. - * @param integer $usage optional. A bitwise combination of key usages. - * If not specified, the primary key will be used - * only to sign and certify. This is the default - * behavior of GnuPG in interactive mode. Use - * the Crypt_GPG_SubKey::USAGE_* constants here. - * The primary key may be used to certify even - * if the certify usage is not specified. - * - * @return Crypt_GPG_KeyGenerator the current object, for fluent interface. - */ - public function setKeyParams($algorithm, $size = 0, $usage = 0) - { - $apgorithm = intval($algorithm); - - if ($algorithm === Crypt_GPG_SubKey::ALGORITHM_ELGAMAL_ENC) { - throw new Crypt_GPG_InvalidKeyParamsException( - 'Primary key algorithm must be capable of signing. The ' . - 'Elgamal algorithm can only encrypt.', - 0, - $algorithm, - $size, - $usage - ); - } - - if ($size != 0) { - $size = intval($size); - } - - if ($usage != 0) { - $usage = intval($usage); - } - - $usageEncrypt = Crypt_GPG_SubKey::USAGE_ENCRYPT; - - if ( $algorithm === Crypt_GPG_SubKey::ALGORITHM_DSA - && ($usage & $usageEncrypt) === $usageEncrypt - ) { - throw new Crypt_GPG_InvalidKeyParamsException( - 'The DSA algorithm is not capable of encrypting. Please ' . - 'specify a different algorithm or do not include encryption ' . - 'as a usage for the primary key.', - 0, - $algorithm, - $size, - $usage - ); - } - - $this->keyAlgorithm = $algorithm; - - if ($size != 0) { - $this->keySize = $size; - } - - if ($usage != 0) { - $this->keyUsage = $usage; - } - - return $this; - } - - // }}} - // {{{ setSubKeyParams() - - /** - * Sets the parameters for the sub-key of generated key-pairs - * - * @param integer $algorithm the algorithm used by the key. This should be - * one of the Crypt_GPG_SubKey::ALGORITHM_* - * constants. - * @param integer $size optional. The size of the key. Different - * algorithms have different size requirements. - * If not specified, the default size for the - * specified algorithm will be used. If an - * invalid key size is used, GnuPG will do its - * best to round it to a valid size. - * @param integer $usage optional. A bitwise combination of key usages. - * If not specified, the sub-key will be used - * only to encrypt. This is the default behavior - * of GnuPG in interactive mode. Use the - * Crypt_GPG_SubKey::USAGE_* constants here. - * - * @return Crypt_GPG_KeyGenerator the current object, for fluent interface. - */ - public function setSubKeyParams($algorithm, $size = '', $usage = 0) - { - $apgorithm = intval($algorithm); - - if ($size != 0) { - $size = intval($size); - } - - if ($usage != 0) { - $usage = intval($usage); - } - - $usageSign = Crypt_GPG_SubKey::USAGE_SIGN; - - if ( $algorithm === Crypt_GPG_SubKey::ALGORITHM_ELGAMAL_ENC - && ($usage & $usageSign) === $usageSign - ) { - throw new Crypt_GPG_InvalidKeyParamsException( - 'The Elgamal algorithm is not capable of signing. Please ' . - 'specify a different algorithm or do not include signing ' . - 'as a usage for the sub-key.', - 0, - $algorithm, - $size, - $usage - ); - } - - $usageEncrypt = Crypt_GPG_SubKey::USAGE_ENCRYPT; - - if ( $algorithm === Crypt_GPG_SubKey::ALGORITHM_DSA - && ($usage & $usageEncrypt) === $usageEncrypt - ) { - throw new Crypt_GPG_InvalidKeyParamsException( - 'The DSA algorithm is not capable of encrypting. Please ' . - 'specify a different algorithm or do not include encryption ' . - 'as a usage for the sub-key.', - 0, - $algorithm, - $size, - $usage - ); - } - - $this->subKeyAlgorithm = $algorithm; - - if ($size != 0) { - $this->subKeySize = $size; - } - - if ($usage != 0) { - $this->subKeyUsage = $usage; - } - - return $this; - } - - // }}} - // {{{ setStatusHandler() - - /** - * Sets the status handler to use for key generation - * - * Normally this method does not need to be used. It provides a means for - * dependency injection. - * - * @param Crypt_GPG_KeyStatusHandler $handler the key status handler to - * use. - * - * @return Crypt_GPG_KeyGenerator the current object, for fluent interface. - */ - public function setStatusHandler( - Crypt_GPG_KeyGeneratorStatusHandler $handler - ) { - $this->statusHandler = $handler; - return $this; - } - - // }}} - // {{{ setErrorHandler() - - /** - * Sets the error handler to use for key generation - * - * Normally this method does not need to be used. It provides a means for - * dependency injection. - * - * @param Crypt_GPG_KeyErrorHandler $handler the key error handler to - * use. - * - * @return Crypt_GPG_KeyGenerator the current object, for fluent interface. - */ - public function setErrorHandler( - Crypt_GPG_KeyGeneratorErrorHandler $handler - ) { - $this->errorHandler = $handler; - return $this; - } - - // }}} - // {{{ generateKey() - - /** - * Generates a new key-pair in the current keyring - * - * Secure key generation requires true random numbers, and as such can be - * solw. If the operating system runs out of entropy, key generation will - * block until more entropy is available. - * - * If quick key generation is important, a hardware entropy generator, or - * an entropy gathering daemon may be installed. For example, - * administrators of Debian systems may want to install the 'randomsound' - * package. - * - * @param string|Crypt_GPG_UserId $name either a {@link Crypt_GPG_UserId} - * object, or a string containing - * the name of the user id. - * @param string $email optional. If $name is - * specified as a string, this is - * the email address of the user id. - * @param string $comment optional. If $name is - * specified as a string, this is - * the comment of the user id. - * - * @return Crypt_GPG_Key the newly generated key. - * - * @throws Crypt_GPG_KeyNotCreatedException if the key parameters are - * incorrect, if an unknown error occurs during key generation, or - * if the newly generated key is not found in the keyring. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - */ - public function generateKey($name, $email = '', $comment = '') - { - $handle = uniqid('key', true); - - $userId = $this->getUserId($name, $email, $comment); - - $keyParams = array( - 'Key-Type' => $this->keyAlgorithm, - 'Key-Length' => $this->keySize, - 'Key-Usage' => $this->getUsage($this->keyUsage), - 'Subkey-Type' => $this->subKeyAlgorithm, - 'Subkey-Length' => $this->subKeySize, - 'Subkey-Usage' => $this->getUsage($this->subKeyUsage), - 'Name-Real' => $userId->getName(), - 'Handle' => $handle, - ); - - if ($this->expirationDate != 0) { - // GnuPG only accepts granularity of days - $expirationDate = date('Y-m-d', $this->expirationDate); - $keyParams['Expire-Date'] = $expirationDate; - } - - if ($this->passphrase != '') { - $keyParams['Passphrase'] = $this->passphrase; - } - - if ($userId->getEmail() != '') { - $keyParams['Name-Email'] = $userId->getEmail(); - } - - if ($userId->getComment() != '') { - $keyParams['Name-Comment'] = $userId->getComment(); - } - - - $keyParamsFormatted = array(); - foreach ($keyParams as $name => $value) { - $keyParamsFormatted[] = $name . ': ' . $value; - } - - $input = implode("\n", $keyParamsFormatted) . "\n%commit\n"; - - $statusHandler = clone $this->statusHandler; - $statusHandler->setHandle($handle); - - $errorHandler = clone $this->errorHandler; - - $this->engine->reset(); - $this->engine->addStatusHandler(array($statusHandler, 'handle')); - $this->engine->addErrorHandler(array($errorHandler, 'handle')); - $this->engine->setInput($input); - $this->engine->setOutput($output); - $this->engine->setOperation('--gen-key', array('--batch')); - $this->engine->run(); - - $code = $errorHandler->getErrorCode(); - switch ($code) { - case self::ERROR_BAD_KEY_PARAMS: - switch ($errorHandler->getLineNumber()) { - case 1: - throw new Crypt_GPG_InvalidKeyParamsException( - 'Invalid primary key algorithm specified.', - 0, - $this->keyAlgorithm, - $this->keySize, - $this->keyUsage - ); - case 4: - throw new Crypt_GPG_InvalidKeyParamsException( - 'Invalid sub-key algorithm specified.', - 0, - $this->subKeyAlgorithm, - $this->subKeySize, - $this->subKeyUsage - ); - default: - throw new Crypt_GPG_InvalidKeyParamsException( - 'Invalid key algorithm specified.' - ); - } - } - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - break; - default: - throw new Crypt_GPG_Exception( - 'Unknown error generating key-pair. Please use the \'debug\' ' . - 'option when creating the Crypt_GPG object, and file a bug ' . - 'report at ' . self::BUG_URI, - $code - ); - } - - $code = $statusHandler->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - break; - case self::ERROR_KEY_NOT_CREATED: - throw new Crypt_GPG_KeyNotCreatedException( - 'Unable to create new key-pair. Invalid key parameters. ' . - 'Make sure the specified key algorithms and sizes are ' . - 'correct.', - $code - ); - } - - $fingerprint = $statusHandler->getKeyFingerprint(); - $keys = $this->_getKeys($fingerprint); - - if (count($keys) === 0) { - throw new Crypt_GPG_KeyNotCreatedException( - sprintf( - 'Newly created key "%s" not found in keyring.', - $fingerprint - ) - ); - } - - return $keys[0]; - } - - // }}} - // {{{ getUsage() - - /** - * Builds a GnuPG key usage string suitable for key generation - * - * See doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for detailed - * information on the key usage format. - * - * @param integer $usage a bitwise combination of the key usages. This is - * a combination of the Crypt_GPG_SubKey::USAGE_* - * constants. - * - * @return string the key usage string. - */ - protected function getUsage($usage) - { - $map = array( - Crypt_GPG_SubKey::USAGE_ENCRYPT => 'encrypt', - Crypt_GPG_SubKey::USAGE_SIGN => 'sign', - Crypt_GPG_SubKey::USAGE_CERTIFY => 'cert', - Crypt_GPG_SubKey::USAGE_AUTHENTICATION => 'auth', - ); - - // cert is always used for primary keys and does not need to be - // specified - $usage &= ~Crypt_GPG_SubKey::USAGE_CERTIFY; - - $usageArray = array(); - - foreach ($map as $key => $value) { - if (($usage & $key) === $key) { - $usageArray[] = $value; - } - } - - return implode(',', $usageArray); - } - - // }}} - // {{{ getUserId() - - /** - * Gets a user id object from parameters - * - * @param string|Crypt_GPG_UserId $name either a {@link Crypt_GPG_UserId} - * object, or a string containing - * the name of the user id. - * @param string $email optional. If $name is - * specified as a string, this is - * the email address of the user id. - * @param string $comment optional. If $name is - * specified as a string, this is - * the comment of the user id. - * - * @return Crypt_GPG_UserId a user id object for the specified parameters. - */ - protected function getUserId($name, $email = '', $comment = '') - { - if ($name instanceof Crypt_GPG_UserId) { - $userId = $name; - } else { - $userId = new Crypt_GPG_UserId(); - $userId->setName($name)->setEmail($email)->setComment($comment); - } - - return $userId; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/KeyGeneratorErrorHandler.php b/program/lib/Crypt/GPG/KeyGeneratorErrorHandler.php deleted file mode 100644 index ad9ebf395..000000000 --- a/program/lib/Crypt/GPG/KeyGeneratorErrorHandler.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright 2011-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id:$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ - -/** - * Error line handler for the key generation operation - * - * This class is used internally by Crypt_GPG and does not need be used - * directly. See the {@link Crypt_GPG} class for end-user API. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2011-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG_KeyGeneratorErrorHandler -{ - // {{{ protected properties - - /** - * Error code (if any) caused by key generation - * - * @var integer - */ - protected $errorCode = Crypt_GPG::ERROR_NONE; - - /** - * Line number at which the error occurred - * - * @var integer - */ - protected $lineNumber = null; - - // }}} - // {{{ handle() - - /** - * Handles an error line - * - * @param string $line the error line to handle. - * - * @return void - */ - public function handle($line) - { - $matches = array(); - $pattern = '/:([0-9]+): invalid algorithm$/'; - if (preg_match($pattern, $line, $matches) === 1) { - $this->errorCode = Crypt_GPG::ERROR_BAD_KEY_PARAMS; - $this->lineNumber = intval($matches[1]); - } - } - - // }}} - // {{{ getErrorCode() - - /** - * Gets the error code resulting from key gneration - * - * @return integer the error code resulting from key generation. - */ - public function getErrorCode() - { - return $this->errorCode; - } - - // }}} - // {{{ getLineNumber() - - /** - * Gets the line number at which the error occurred - * - * @return integer the line number at which the error occurred. Null if - * no error occurred. - */ - public function getLineNumber() - { - return $this->lineNumber; - } - - // }}} -} - -?> diff --git a/program/lib/Crypt/GPG/KeyGeneratorStatusHandler.php b/program/lib/Crypt/GPG/KeyGeneratorStatusHandler.php deleted file mode 100644 index 8b4c85c7a..000000000 --- a/program/lib/Crypt/GPG/KeyGeneratorStatusHandler.php +++ /dev/null @@ -1,173 +0,0 @@ - - * @copyright 2011-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id:$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ - -/** - * Status line handler for the key generation operation - * - * This class is used internally by Crypt_GPG and does not need be used - * directly. See the {@link Crypt_GPG} class for end-user API. - * - * This class is responsible for parsing the final key fingerprint from the - * status output and for updating the key generation progress file. See - * doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for detailed - * information on GPG's status output for the batch key generation operation. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2011-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG_KeyGeneratorStatusHandler -{ - // {{{ protected properties - - /** - * The key fingerprint - * - * Ths key fingerprint is emitted by GPG after the key generation is - * complete. - * - * @var string - */ - protected $keyFingerprint = ''; - - /** - * The unique key handle used by this handler - * - * The key handle is used to track GPG status output for a particular key - * before the key has its own identifier. - * - * @var string - * - * @see Crypt_GPG_KeyGeneratorStatusHandler::setHandle() - */ - protected $handle = ''; - - /** - * Error code (if any) caused by key generation - * - * @var integer - */ - protected $errorCode = Crypt_GPG::ERROR_NONE; - - // }}} - // {{{ setHandle() - - /** - * Sets the unique key handle used by this handler - * - * The key handle is used to track GPG status output for a particular key - * before the key has its own identifier. - * - * @param string $handle the key handle this status handle will use. - * - * @return Crypt_GPG_KeyGeneratorStatusHandler the current object, for - * fluent interface. - */ - public function setHandle($handle) - { - $this->handle = strval($handle); - return $this; - } - - // }}} - // {{{ handle() - - /** - * Handles a status line - * - * @param string $line the status line to handle. - * - * @return void - */ - public function handle($line) - { - $tokens = explode(' ', $line); - switch ($tokens[0]) { - case 'KEY_CREATED': - if ($tokens[3] == $this->handle) { - $this->keyFingerprint = $tokens[2]; - } - break; - - case 'KEY_NOT_CREATED': - if ($tokens[1] == $this->handle) { - $this->errorCode = Crypt_GPG::ERROR_KEY_NOT_CREATED; - } - break; - - case 'PROGRESS': - // todo: at some point, support reporting status async - break; - } - } - - // }}} - // {{{ getKeyFingerprint() - - /** - * Gets the key fingerprint parsed by this handler - * - * @return array the key fingerprint parsed by this handler. - */ - public function getKeyFingerprint() - { - return $this->keyFingerprint; - } - - // }}} - // {{{ getErrorCode() - - /** - * Gets the error code resulting from key gneration - * - * @return integer the error code resulting from key generation. - */ - public function getErrorCode() - { - return $this->errorCode; - } - - // }}} -} - -?> diff --git a/program/lib/Crypt/GPG/PinEntry.php b/program/lib/Crypt/GPG/PinEntry.php deleted file mode 100644 index c09703617..000000000 --- a/program/lib/Crypt/GPG/PinEntry.php +++ /dev/null @@ -1,875 +0,0 @@ - - * @copyright 2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -/** - * CLI user-interface and parser. - */ -require_once 'Console/CommandLine.php'; - -// {{{ class Crypt_GPG_PinEntry - -/** - * A command-line dummy pinentry program for use with gpg-agent and Crypt_GPG - * - * This pinentry receives passphrases through en environment variable and - * automatically enters the PIN in response to gpg-agent requests. No user- - * interaction required. - * - * Thie pinentry can be run independently for testing and debugging with the - * following syntax: - * - *
    - * Usage:
    - *   crypt-gpg-pinentry [options]
    - *
    - * Options:
    - *   -l log, --log=log  Optional location to log pinentry activity.
    - *   -v, --verbose      Sets verbosity level. Use multiples for more detail
    - *                      (e.g. "-vv").
    - *   -h, --help         show this help message and exit
    - *   --version          show the program version and exit
    - * 
    - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @see Crypt_GPG::getKeys() - */ -class Crypt_GPG_PinEntry -{ - // {{{ class constants - - /** - * Verbosity level for showing no output. - */ - const VERBOSITY_NONE = 0; - - /** - * Verbosity level for showing error output. - */ - const VERBOSITY_ERRORS = 1; - - /** - * Verbosity level for showing all output, including Assuan protocol - * messages. - */ - const VERBOSITY_ALL = 2; - - /** - * Length of buffer for reading lines from the Assuan server. - * - * PHP reads 8192 bytes. If this is set to less than 8192, PHP reads 8192 - * and buffers the rest so we might as well just read 8192. - * - * Using values other than 8192 also triggers PHP bugs. - * - * @see http://bugs.php.net/bug.php?id=35224 - */ - const CHUNK_SIZE = 8192; - - // }}} - // {{{ protected properties - - /** - * File handle for the input stream - * - * @var resource - */ - protected $stdin = null; - - /** - * File handle for the output stream - * - * @var resource - */ - protected $stdout = null; - - /** - * File handle for the log file if a log file is used - * - * @var resource - */ - protected $logFile = null; - - /** - * Whether or not this pinentry is finished and is exiting - * - * @var boolean - */ - protected $moribund = false; - - /** - * Verbosity level - * - * One of: - * - {@link Crypt_GPG_PinEntry::VERBOSITY_NONE}, - * - {@link Crypt_GPG_PinEntry::VERBOSITY_ERRORS}, or - * - {@link Crypt_GPG_PinEntry::VERBOSITY_ALL} - * - * @var integer - */ - protected $verbosity = self::VERBOSITY_NONE; - - /** - * The command-line interface parser for this pinentry - * - * @var Console_CommandLine - * - * @see Crypt_GPG_PinEntry::getParser() - */ - protected $parser = null; - - /** - * PINs to be entered by this pinentry - * - * An indexed array of associative arrays in the form: - * - * $keyId, - * 'passphrase' => $passphrase - * ), - * ... - * ); - * ?> - * - * - * This array is parsed from the environment variable - * PINENTRY_USER_DATA. - * - * @var array - * - * @see Crypt_GPG_PinEntry::initPinsFromENV() - */ - protected $pins = array(); - - /** - * PINs that have been tried for the current PIN - * - * This is an associative array indexed by the key identifier with - * values being the same as elements in the {@link Crypt_GPG_PinEntry::$pins} - * array. - * - * @var array - */ - protected $triedPins = array(); - - /** - * The PIN currently being requested by the Assuan server - * - * If set, this is an associative array in the form: - * - * $shortKeyId, - * 'userId' => $userIdString - * ); - * ?> - * - * - * @var array|null - */ - protected $currentPin = null; - - // }}} - // {{{ __invoke() - - /** - * Runs this pinentry - * - * @return void - */ - public function __invoke() - { - $this->parser = $this->getCommandLineParser(); - - try { - $result = $this->parser->parse(); - - $this->setVerbosity($result->options['verbose']); - $this->setLogFilename($result->options['log']); - - $this->connect(); - $this->initPinsFromENV(); - - while (($line = fgets($this->stdin, self::CHUNK_SIZE)) !== false) { - $this->parseCommand(mb_substr($line, 0, -1, '8bit')); - if ($this->moribund) { - break; - } - } - - $this->disconnect(); - - } catch (Console_CommandLineException $e) { - $this->log($e->getMessage() . PHP_EOL, slf::VERBOSITY_ERRORS); - exit(1); - } catch (Exception $e) { - $this->log($e->getMessage() . PHP_EOL, self::VERBOSITY_ERRORS); - $this->log($e->getTraceAsString() . PHP_EOL, self::VERBOSITY_ERRORS); - exit(1); - } - } - - // }}} - // {{{ setVerbosity() - - /** - * Sets the verbosity of logging for this pinentry - * - * Verbosity levels are: - * - * - {@link Crypt_GPG_PinEntry::VERBOSITY_NONE} - no logging. - * - {@link Crypt_GPG_PinEntry::VERBOSITY_ERRORS} - log errors only. - * - {@link Crypt_GPG_PinEntry::VERBOSITY_ALL} - log everything, including - * the assuan protocol. - * - * @param integer $verbosity the level of verbosity of this pinentry. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - public function setVerbosity($verbosity) - { - $this->verbosity = (integer)$verbosity; - return $this; - } - - // }}} - // {{{ setLogFilename() - - /** - * Sets the log file location - * - * @param string $filename the new log filename to use. If an empty string - * is used, file-based logging is disabled. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - public function setLogFilename($filename) - { - if (is_resource($this->logFile)) { - fflush($this->logFile); - fclose($this->logFile); - $this->logFile = null; - } - - if ($filename != '') { - if (($this->logFile = fopen($filename, 'w')) === false) { - $this->log( - 'Unable to open log file "' . $filename . '" ' - . 'for writing.' . PHP_EOL, - self::VERBOSITY_ERRORS - ); - exit(1); - } else { - stream_set_write_buffer($this->logFile, 0); - } - } - - return $this; - } - - // }}} - // {{{ getUIXML() - - /** - * Gets the CLI user-interface definition for this pinentry - * - * Detects whether or not this package is PEAR-installed and appropriately - * locates the XML UI definition. - * - * @return string the location of the CLI user-interface definition XML. - */ - protected function getUIXML() - { - $dir = '@data-dir@' . DIRECTORY_SEPARATOR - . '@package-name@' . DIRECTORY_SEPARATOR . 'data'; - - // Check if we're running directly from a git checkout or if we're - // running from a PEAR-packaged version. - if ($dir[0] == '@') { - $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' - . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'data'; - } - - return $dir . DIRECTORY_SEPARATOR . 'pinentry-cli.xml'; - } - - // }}} - // {{{ getCommandLineParser() - - /** - * Gets the CLI parser for this pinentry - * - * @return Console_CommandLine the CLI parser for this pinentry. - */ - protected function getCommandLineParser() - { - return Console_CommandLine::fromXmlFile($this->getUIXML()); - } - - // }}} - // {{{ log() - - /** - * Logs a message at the specified verbosity level - * - * If a log file is used, the message is written to the log. Otherwise, - * the message is sent to STDERR. - * - * @param string $data the message to log. - * @param integer $level the verbosity level above which the message should - * be logged. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function log($data, $level) - { - if ($this->verbosity >= $level) { - if (is_resource($this->logFile)) { - fwrite($this->logFile, $data); - fflush($this->logFile); - } else { - $this->parser->outputter->stderr($data); - } - } - - return $this; - } - - // }}} - // {{{ connect() - - /** - * Connects this pinentry to the assuan server - * - * Opens I/O streams and sends initial handshake. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function connect() - { - // Binary operations will not work on Windows with PHP < 5.2.6. - $rb = (version_compare(PHP_VERSION, '5.2.6') < 0) ? 'r' : 'rb'; - $wb = (version_compare(PHP_VERSION, '5.2.6') < 0) ? 'w' : 'wb'; - - $this->stdin = fopen('php://stdin', $rb); - $this->stdout = fopen('php://stdout', $wb); - - if (function_exists('stream_set_read_buffer')) { - stream_set_read_buffer($this->stdin, 0); - } - stream_set_write_buffer($this->stdout, 0); - - // initial handshake - $this->send($this->getOK('Crypt_GPG pinentry ready and waiting')); - - return $this; - } - - // }}} - // {{{ parseCommand() - - /** - * Parses an assuan command and performs the appropriate action - * - * Documentation of the assuan commands for pinentry is limited to - * non-existent. Most of these commands were taken from the C source code - * to gpg-agent and pinentry. - * - * Additional context was provided by using strace -f when calling the - * gpg-agent. - * - * @param string $line the assuan command line to parse - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function parseCommand($line) - { - $this->log('<- ' . $line . PHP_EOL, self::VERBOSITY_ALL); - - $parts = explode(' ', $line, 2); - - $command = $parts[0]; - - if (count($parts) === 2) { - $data = $parts[1]; - } else { - $data = null; - } - - switch ($command) { - case 'SETDESC': - return $this->sendSetDescription($data); - - case 'SETPROMPT': - case 'SETERROR': - case 'SETOK': - case 'SETNOTOK': - case 'SETCANCEL': - case 'SETQUALITYBAR': - case 'SETQUALITYBAR_TT': - case 'OPTION': - return $this->sendNotImplementedOK(); - - case 'MESSAGE': - return $this->sendMessage(); - - case 'CONFIRM': - return $this->sendConfirm(); - - case 'GETINFO': - return $this->sendGetInfo($data); - - case 'GETPIN': - return $this->sendGetPin($data); - - case 'RESET': - return $this->sendReset(); - - case 'BYE': - return $this->sendBye(); - } - } - - // }}} - // {{{ initPinsFromENV() - - /** - * Initializes the PINs to be entered by this pinentry from the environment - * variable PINENTRY_USER_DATA - * - * The PINs are parsed from a JSON-encoded string. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function initPinsFromENV() - { - if (($userData = getenv('PINENTRY_USER_DATA')) !== false) { - $pins = json_decode($userData, true); - if ($pins === null) { - $this->log( - '-- failed to parse user data' . PHP_EOL, - self::VERBOSITY_ERRORS - ); - } else { - $this->pins = $pins; - $this->log( - '-- got user data [not showing passphrases]' . PHP_EOL, - self::VERBOSITY_ALL - ); - } - } - - return $this; - } - - // }}} - // {{{ disconnect() - - /** - * Disconnects this pinentry from the Assuan server - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function disconnect() - { - $this->log('-- disconnecting' . PHP_EOL, self::VERBOSITY_ALL); - - fflush($this->stdout); - fclose($this->stdout); - fclose($this->stdin); - - $this->stdin = null; - $this->stdout = null; - - $this->log('-- disconnected' . PHP_EOL, self::VERBOSITY_ALL); - - if (is_resource($this->logFile)) { - fflush($this->logFile); - fclose($this->logFile); - $this->logFile = null; - } - - return $this; - } - - // }}} - // {{{ sendNotImplementedOK() - - /** - * Sends an OK response for a not implemented feature - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendNotImplementedOK() - { - return $this->send($this->getOK()); - } - - // }}} - // {{{ sendSetDescription() - - /** - * Parses the currently requested key identifier and user identifier from - * the description passed to this pinentry - * - * @param string $text the raw description sent from gpg-agent. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendSetDescription($text) - { - $text = rawurldecode($text); - $matches = array(); - // TODO: handle user id with quotation marks - $exp = '/\n"(.+)"\n.*\sID ([A-Z0-9]+),\n/mu'; - if (preg_match($exp, $text, $matches) === 1) { - $userId = $matches[1]; - $keyId = $matches[2]; - - // only reset tried pins for new requested pin - if ( $this->currentPin === null - || $this->currentPin['keyId'] !== $keyId - ) { - $this->currentPin = array( - 'userId' => $userId, - 'keyId' => $keyId - ); - $this->triedPins = array(); - $this->log( - '-- looking for PIN for ' . $keyId . PHP_EOL, - self::VERBOSITY_ALL - ); - } - } - - return $this->send($this->getOK()); - } - - // }}} - // {{{ sendConfirm() - - /** - * Tells the assuan server the PIN entry was confirmed (not cancelled) - * by pressing the fake 'close' button - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendConfirm() - { - return $this->sendButtonInfo('close'); - } - - // }}} - // {{{ sendMessage() - - /** - * Tells the assuan server that any requested pop-up messages were confirmed - * by pressing the fake 'close' button - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendMessage() - { - return $this->sendButtonInfo('close'); - } - - // }}} - // {{{ sendButtonInfo() - - /** - * Sends information about pressed buttons to the assuan server - * - * This is used to fake a user-interface for this pinentry. - * - * @param string $text the button status to send. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendButtonInfo($text) - { - return $this->send('BUTTON_INFO ' . $text . "\n"); - } - - // }}} - // {{{ sendGetPin() - - /** - * Sends the PIN value for the currently requested key - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendGetPin() - { - $foundPin = ''; - - if (is_array($this->currentPin)) { - $keyIdLength = mb_strlen($this->currentPin['keyId'], '8bit'); - - // search for the pin - foreach ($this->pins as $pin) { - // only check pins we haven't tried - if (!isset($this->triedPins[$pin['keyId']])) { - - // get last X characters of key identifier to compare - $keyId = mb_substr( - $pin['keyId'], - -$keyIdLength, - mb_strlen($pin['keyId'], '8bit'), - '8bit' - ); - - if ($keyId === $this->currentPin['keyId']) { - $foundPin = $pin['passphrase']; - $this->triedPins[$pin['keyId']] = $pin; - break; - } - } - } - } - - return $this - ->send($this->getData($foundPin)) - ->send($this->getOK()); - } - - // }}} - // {{{ sendGetInfo() - - /** - * Sends information about this pinentry - * - * @param string $data the information requested by the assuan server. - * Currently only 'pid' is supported. Other requests - * return no information. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendGetInfo($data) - { - $parts = explode(' ', $data, 2); - $command = reset($parts); - - switch ($command) { - case 'pid': - return $this->sendGetInfoPID(); - default: - return $this->send($this->getOK()); - } - - return $this; - } - // }}} - // {{{ sendGetInfoPID() - - /** - * Sends the PID of this pinentry to the assuan server - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendGetInfoPID() - { - return $this - ->send($this->getData(getmypid())) - ->send($this->getOK()); - } - - // }}} - // {{{ sendBye() - - /** - * Flags this pinentry for disconnection and sends an OK response - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendBye() - { - $return = $this->send($this->getOK('closing connection')); - $this->moribund = true; - return $return; - } - - // }}} - // {{{ sendReset() - - /** - * Resets this pinentry and sends an OK response - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function sendReset() - { - $this->currentPin = null; - $this->triedPins = array(); - return $this->send($this->getOK()); - } - - // }}} - // {{{ getOK() - - /** - * Gets an OK response to send to the assuan server - * - * @param string $data an optional message to include with the OK response. - * - * @return string the OK response. - */ - protected function getOK($data = null) - { - $return = 'OK'; - - if ($data) { - $return .= ' ' . $data; - } - - return $return . "\n"; - } - - // }}} - // {{{ getData() - - /** - * Gets data ready to send to the assuan server - * - * Data is appropriately escaped and long lines are wrapped. - * - * @param string $data the data to send to the assuan server. - * - * @return string the properly escaped, formatted data. - * - * @see http://www.gnupg.org/documentation/manuals/assuan/Server-responses.html - */ - protected function getData($data) - { - // Escape data. Only %, \n and \r need to be escaped but other - // values are allowed to be escaped. See - // http://www.gnupg.org/documentation/manuals/assuan/Server-responses.html - $data = rawurlencode($data); - $data = $this->getWordWrappedData($data, 'D'); - return $data; - } - - // }}} - // {{{ getComment() - - /** - * Gets a comment ready to send to the assuan server - * - * @param string $data the comment to send to the assuan server. - * - * @return string the properly formatted comment. - * - * @see http://www.gnupg.org/documentation/manuals/assuan/Server-responses.html - */ - protected function getComment($data) - { - return $this->getWordWrappedData($data, '#'); - } - - // }}} - // {{{ getWordWrappedData() - - /** - * Wraps strings at 1,000 bytes without splitting UTF-8 multibyte - * characters - * - * Each line is prepended with the specified line prefix. Wrapped lines - * are automatically appended with \ characters. - * - * Protocol strings are UTF-8 but maximum line length is 1,000 bytes. - * mb_strcut() is used so we can limit line length by bytes - * and not split characters across multiple lines. - * - * @param string $data the data to wrap. - * @param string $prefix a single character to use as the line prefix. For - * example, 'D' or '#'. - * - * @return string the word-wrapped, prefixed string. - * - * @see http://www.gnupg.org/documentation/manuals/assuan/Server-responses.html - */ - protected function getWordWrappedData($data, $prefix) - { - $lines = array(); - - do { - if (mb_strlen($data, '8bit') > 997) { - $line = $prefix . ' ' . mb_strcut($data, 0, 996, 'utf-8') . "\\\n"; - $lines[] = $line; - $lineLength = mb_strlen($line, '8bit') - 1; - $dataLength = mb_substr($data, '8bit'); - $data = mb_substr( - $data, - $lineLength, - $dataLength - $lineLength, - '8bit' - ); - } else { - $lines[] = $prefix . ' ' . $data . "\n"; - $data = ''; - } - } while ($data != ''); - - return implode('', $lines); - } - - // }}} - // {{{ send() - - /** - * Sends raw data to the assuan server - * - * @param string $data the data to send. - * - * @return Crypt_GPG_PinEntry the current object, for fluent interface. - */ - protected function send($data) - { - $this->log('-> ' . $data, self::VERBOSITY_ALL); - fwrite($this->stdout, $data); - fflush($this->stdout); - return $this; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/ProcessControl.php b/program/lib/Crypt/GPG/ProcessControl.php deleted file mode 100644 index d6dae0325..000000000 --- a/program/lib/Crypt/GPG/ProcessControl.php +++ /dev/null @@ -1,150 +0,0 @@ - - * @copyright 2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -// {{{ class Crypt_GPG_ProcessControl - -/** - * A class for monitoring and terminating processes by PID - * - * This is used to safely terminate the gpg-agent for GnuPG 2.x. This class - * is limited in its abilities and can only check if a PID is running and - * send a PID SIGTERM. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - */ -class Crypt_GPG_ProcessControl -{ - // {{{ protected properties - - /** - * The PID (process identifier) being monitored - * - * @var integer - */ - protected $pid; - - // }}} - // {{{ __construct() - - /** - * Creates a new process controller from the given PID (process identifier) - * - * @param integer $pid the PID (process identifier). - */ - public function __construct($pid) - { - $this->pid = $pid; - } - - // }}} - // {{{ public function getPid() - - /** - * Gets the PID (process identifier) being controlled - * - * @return integer the PID being controlled. - */ - public function getPid() - { - return $this->pid; - } - - // }}} - // {{{ isRunning() - - /** - * Checks if the process is running - * - * Uses ps on UNIX-like systems and tasklist on - * Windows. - * - * @return boolean true if the process is running, false if not. - */ - public function isRunning() - { - $running = false; - - if (PHP_OS === 'WINNT') { - $command = 'tasklist /fo csv /nh /fi ' - . escapeshellarg('PID eq ' . $this->pid); - - $result = exec($command); - $parts = explode(',', $result); - $running = (count($parts) > 1 && trim($parts[1], '"') == $this->pid); - } else { - $result = exec('ps -p ' . escapeshellarg($this->pid) . ' -o pid='); - $running = (trim($result) == $this->pid); - } - - return $running; - } - - // }}} - // {{{ terminate() - - /** - * Ends the process gracefully - * - * The signal SIGTERM is sent to the process. The gpg-agent process will - * end gracefully upon receiving the SIGTERM signal. Upon 3 consecutive - * SIGTERM signals the gpg-agent will forcefully shut down. - * - * If the posix extension is available, posix_kill() - * is used. Otherwise kill is used on UNIX-like systems and - * taskkill is used in Windows. - * - * @return void - */ - public function terminate() - { - if (function_exists('posix_kill')) { - posix_kill($this->pid, 15); - } elseif (PHP_OS === 'WINNT') { - exec('taskkill /PID ' . escapeshellarg($this->pid)); - } else { - exec('kill -15 ' . escapeshellarg($this->pid)); - } - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/Signature.php b/program/lib/Crypt/GPG/Signature.php deleted file mode 100644 index 1d28a1188..000000000 --- a/program/lib/Crypt/GPG/Signature.php +++ /dev/null @@ -1,427 +0,0 @@ - - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -/** - * User id class definition - */ -require_once 'Crypt/GPG/UserId.php'; - -// {{{ class Crypt_GPG_Signature - -/** - * A class for GPG signature information - * - * This class is used to store the results of the Crypt_GPG::verify() method. - * - * @category Encryption - * @package Crypt_GPG - * @author Nathan Fredrickson - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @see Crypt_GPG::verify() - */ -class Crypt_GPG_Signature -{ - // {{{ class properties - - /** - * A base64-encoded string containing a unique id for this signature if - * this signature has been verified as ok - * - * This id is used to prevent replay attacks and is not present for all - * types of signatures. - * - * @var string - */ - private $_id = ''; - - /** - * The fingerprint of the key used to create the signature - * - * @var string - */ - private $_keyFingerprint = ''; - - /** - * The id of the key used to create the signature - * - * @var string - */ - private $_keyId = ''; - - /** - * The creation date of this signature - * - * This is a Unix timestamp. - * - * @var integer - */ - private $_creationDate = 0; - - /** - * The expiration date of the signature - * - * This is a Unix timestamp. If this signature does not expire, this will - * be zero. - * - * @var integer - */ - private $_expirationDate = 0; - - /** - * The user id associated with this signature - * - * @var Crypt_GPG_UserId - */ - private $_userId = null; - - /** - * Whether or not this signature is valid - * - * @var boolean - */ - private $_isValid = false; - - // }}} - // {{{ __construct() - - /** - * Creates a new signature - * - * Signatures can be initialized from an array of named values. Available - * names are: - * - * - string id - the unique id of this signature. - * - string fingerprint - the fingerprint of the key used to - * create the signature. The fingerprint - * should not contain formatting - * characters. - * - string keyId - the id of the key used to create the - * the signature. - * - integer creation - the date the signature was created. - * This is a UNIX timestamp. - * - integer expiration - the date the signature expired. This - * is a UNIX timestamp. If the signature - * does not expire, use 0. - * - boolean valid - whether or not the signature is valid. - * - string userId - the user id associated with the - * signature. This may also be a - * {@link Crypt_GPG_UserId} object. - * - * @param Crypt_GPG_Signature|array $signature optional. Either an existing - * signature object, which is copied; or an array of initial values. - */ - public function __construct($signature = null) - { - // copy from object - if ($signature instanceof Crypt_GPG_Signature) { - $this->_id = $signature->_id; - $this->_keyFingerprint = $signature->_keyFingerprint; - $this->_keyId = $signature->_keyId; - $this->_creationDate = $signature->_creationDate; - $this->_expirationDate = $signature->_expirationDate; - $this->_isValid = $signature->_isValid; - - if ($signature->_userId instanceof Crypt_GPG_UserId) { - $this->_userId = clone $signature->_userId; - } - } - - // initialize from array - if (is_array($signature)) { - if (array_key_exists('id', $signature)) { - $this->setId($signature['id']); - } - - if (array_key_exists('fingerprint', $signature)) { - $this->setKeyFingerprint($signature['fingerprint']); - } - - if (array_key_exists('keyId', $signature)) { - $this->setKeyId($signature['keyId']); - } - - if (array_key_exists('creation', $signature)) { - $this->setCreationDate($signature['creation']); - } - - if (array_key_exists('expiration', $signature)) { - $this->setExpirationDate($signature['expiration']); - } - - if (array_key_exists('valid', $signature)) { - $this->setValid($signature['valid']); - } - - if (array_key_exists('userId', $signature)) { - $userId = new Crypt_GPG_UserId($signature['userId']); - $this->setUserId($userId); - } - } - } - - // }}} - // {{{ getId() - - /** - * Gets the id of this signature - * - * @return string a base64-encoded string containing a unique id for this - * signature. This id is used to prevent replay attacks and - * is not present for all types of signatures. - */ - public function getId() - { - return $this->_id; - } - - // }}} - // {{{ getKeyFingerprint() - - /** - * Gets the fingerprint of the key used to create this signature - * - * @return string the fingerprint of the key used to create this signature. - */ - public function getKeyFingerprint() - { - return $this->_keyFingerprint; - } - - // }}} - // {{{ getKeyId() - - /** - * Gets the id of the key used to create this signature - * - * Whereas the fingerprint of the signing key may not always be available - * (for example if the signature is bad), the id should always be - * available. - * - * @return string the id of the key used to create this signature. - */ - public function getKeyId() - { - return $this->_keyId; - } - - // }}} - // {{{ getCreationDate() - - /** - * Gets the creation date of this signature - * - * @return integer the creation date of this signature. This is a Unix - * timestamp. - */ - public function getCreationDate() - { - return $this->_creationDate; - } - - // }}} - // {{{ getExpirationDate() - - /** - * Gets the expiration date of the signature - * - * @return integer the expiration date of this signature. This is a Unix - * timestamp. If this signature does not expire, this will - * be zero. - */ - public function getExpirationDate() - { - return $this->_expirationDate; - } - - // }}} - // {{{ getUserId() - - /** - * Gets the user id associated with this signature - * - * @return Crypt_GPG_UserId the user id associated with this signature. - */ - public function getUserId() - { - return $this->_userId; - } - - // }}} - // {{{ isValid() - - /** - * Gets whether or no this signature is valid - * - * @return boolean true if this signature is valid and false if it is not. - */ - public function isValid() - { - return $this->_isValid; - } - - // }}} - // {{{ setId() - - /** - * Sets the id of this signature - * - * @param string $id a base64-encoded string containing a unique id for - * this signature. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - * - * @see Crypt_GPG_Signature::getId() - */ - public function setId($id) - { - $this->_id = strval($id); - return $this; - } - - // }}} - // {{{ setKeyFingerprint() - - /** - * Sets the key fingerprint of this signature - * - * @param string $fingerprint the key fingerprint of this signature. This - * is the fingerprint of the primary key used to - * create this signature. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - */ - public function setKeyFingerprint($fingerprint) - { - $this->_keyFingerprint = strval($fingerprint); - return $this; - } - - // }}} - // {{{ setKeyId() - - /** - * Sets the key id of this signature - * - * @param string $id the key id of this signature. This is the id of the - * primary key used to create this signature. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - */ - public function setKeyId($id) - { - $this->_keyId = strval($id); - return $this; - } - - // }}} - // {{{ setCreationDate() - - /** - * Sets the creation date of this signature - * - * @param integer $creationDate the creation date of this signature. This - * is a Unix timestamp. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - */ - public function setCreationDate($creationDate) - { - $this->_creationDate = intval($creationDate); - return $this; - } - - // }}} - // {{{ setExpirationDate() - - /** - * Sets the expiration date of this signature - * - * @param integer $expirationDate the expiration date of this signature. - * This is a Unix timestamp. Specify zero if - * this signature does not expire. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - */ - public function setExpirationDate($expirationDate) - { - $this->_expirationDate = intval($expirationDate); - return $this; - } - - // }}} - // {{{ setUserId() - - /** - * Sets the user id associated with this signature - * - * @param Crypt_GPG_UserId $userId the user id associated with this - * signature. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - */ - public function setUserId(Crypt_GPG_UserId $userId) - { - $this->_userId = $userId; - return $this; - } - - // }}} - // {{{ setValid() - - /** - * Sets whether or not this signature is valid - * - * @param boolean $isValid true if this signature is valid and false if it - * is not. - * - * @return Crypt_GPG_Signature the current object, for fluent interface. - */ - public function setValid($isValid) - { - $this->_isValid = ($isValid) ? true : false; - return $this; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/SubKey.php b/program/lib/Crypt/GPG/SubKey.php deleted file mode 100644 index 59245cac1..000000000 --- a/program/lib/Crypt/GPG/SubKey.php +++ /dev/null @@ -1,672 +0,0 @@ - - * @author Nathan Fredrickson - * @copyright 2005-2010 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -// {{{ class Crypt_GPG_SubKey - -/** - * A class for GPG sub-key information - * - * This class is used to store the results of the {@link Crypt_GPG::getKeys()} - * method. Sub-key objects are members of a {@link Crypt_GPG_Key} object. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @author Nathan Fredrickson - * @copyright 2005-2010 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @see Crypt_GPG::getKeys() - * @see Crypt_GPG_Key::getSubKeys() - */ -class Crypt_GPG_SubKey -{ - // {{{ algorithm class constants - - /** - * RSA encryption algorithm. - */ - const ALGORITHM_RSA = 1; - - /** - * Elgamal encryption algorithm (encryption only). - */ - const ALGORITHM_ELGAMAL_ENC = 16; - - /** - * DSA encryption algorithm (sometimes called DH, sign only). - */ - const ALGORITHM_DSA = 17; - - /** - * Elgamal encryption algorithm (signage and encryption - should not be - * used). - */ - const ALGORITHM_ELGAMAL_ENC_SGN = 20; - - // }}} - // {{{ usage class constants - - /** - * Key can be used to encrypt - */ - const USAGE_ENCRYPT = 1; - - /** - * Key can be used to sign - */ - const USAGE_SIGN = 2; - - /** - * Key can be used to certify other keys - */ - const USAGE_CERTIFY = 4; - - /** - * Key can be used for authentication - */ - const USAGE_AUTHENTICATION = 8; - - // }}} - // {{{ class properties - - /** - * The id of this sub-key - * - * @var string - */ - private $_id = ''; - - /** - * The algorithm used to create this sub-key - * - * The value is one of the Crypt_GPG_SubKey::ALGORITHM_* constants. - * - * @var integer - */ - private $_algorithm = 0; - - /** - * The fingerprint of this sub-key - * - * @var string - */ - private $_fingerprint = ''; - - /** - * Length of this sub-key in bits - * - * @var integer - */ - private $_length = 0; - - /** - * Date this sub-key was created - * - * This is a Unix timestamp. - * - * @var integer - */ - private $_creationDate = 0; - - /** - * Date this sub-key expires - * - * This is a Unix timestamp. If this sub-key does not expire, this will be - * zero. - * - * @var integer - */ - private $_expirationDate = 0; - - /** - * Whether or not this sub-key can sign data - * - * @var boolean - */ - private $_canSign = false; - - /** - * Whether or not this sub-key can encrypt data - * - * @var boolean - */ - private $_canEncrypt = false; - - /** - * Whether or not the private key for this sub-key exists in the keyring - * - * @var boolean - */ - private $_hasPrivate = false; - - /** - * Whether or not this sub-key is revoked - * - * @var boolean - */ - private $_isRevoked = false; - - // }}} - // {{{ __construct() - - /** - * Creates a new sub-key object - * - * Sub-keys can be initialized from an array of named values. Available - * names are: - * - * - string id - the key id of the sub-key. - * - integer algorithm - the encryption algorithm of the - * sub-key. - * - string fingerprint - the fingerprint of the sub-key. The - * fingerprint should not contain - * formatting characters. - * - integer length - the length of the sub-key in bits. - * - integer creation - the date the sub-key was created. - * This is a UNIX timestamp. - * - integer expiration - the date the sub-key expires. This - * is a UNIX timestamp. If the sub-key - * does not expire, use 0. - * - boolean canSign - whether or not the sub-key can be - * used to sign data. - * - boolean canEncrypt - whether or not the sub-key can be - * used to encrypt data. - * - boolean hasPrivate - whether or not the private key for - * the sub-key exists in the keyring. - * - boolean isRevoked - whether or not this sub-key is - * revoked. - * - * @param Crypt_GPG_SubKey|string|array $key optional. Either an existing - * sub-key object, which is copied; a sub-key string, which is - * parsed; or an array of initial values. - */ - public function __construct($key = null) - { - // parse from string - if (is_string($key)) { - $key = self::parse($key); - } - - // copy from object - if ($key instanceof Crypt_GPG_SubKey) { - $this->_id = $key->_id; - $this->_algorithm = $key->_algorithm; - $this->_fingerprint = $key->_fingerprint; - $this->_length = $key->_length; - $this->_creationDate = $key->_creationDate; - $this->_expirationDate = $key->_expirationDate; - $this->_canSign = $key->_canSign; - $this->_canEncrypt = $key->_canEncrypt; - $this->_hasPrivate = $key->_hasPrivate; - $this->_isRevoked = $key->_isRevoked; - } - - // initialize from array - if (is_array($key)) { - if (array_key_exists('id', $key)) { - $this->setId($key['id']); - } - - if (array_key_exists('algorithm', $key)) { - $this->setAlgorithm($key['algorithm']); - } - - if (array_key_exists('fingerprint', $key)) { - $this->setFingerprint($key['fingerprint']); - } - - if (array_key_exists('length', $key)) { - $this->setLength($key['length']); - } - - if (array_key_exists('creation', $key)) { - $this->setCreationDate($key['creation']); - } - - if (array_key_exists('expiration', $key)) { - $this->setExpirationDate($key['expiration']); - } - - if (array_key_exists('canSign', $key)) { - $this->setCanSign($key['canSign']); - } - - if (array_key_exists('canEncrypt', $key)) { - $this->setCanEncrypt($key['canEncrypt']); - } - - if (array_key_exists('hasPrivate', $key)) { - $this->setHasPrivate($key['hasPrivate']); - } - - if (array_key_exists('isRevoked', $key)) { - $this->setRevoked($key['isRevoked']); - } - } - } - - // }}} - // {{{ getId() - - /** - * Gets the id of this sub-key - * - * @return string the id of this sub-key. - */ - public function getId() - { - return $this->_id; - } - - // }}} - // {{{ getAlgorithm() - - /** - * Gets the algorithm used by this sub-key - * - * The algorithm should be one of the Crypt_GPG_SubKey::ALGORITHM_* - * constants. - * - * @return integer the algorithm used by this sub-key. - */ - public function getAlgorithm() - { - return $this->_algorithm; - } - - // }}} - // {{{ getCreationDate() - - /** - * Gets the creation date of this sub-key - * - * This is a Unix timestamp. - * - * @return integer the creation date of this sub-key. - */ - public function getCreationDate() - { - return $this->_creationDate; - } - - // }}} - // {{{ getExpirationDate() - - /** - * Gets the date this sub-key expires - * - * This is a Unix timestamp. If this sub-key does not expire, this will be - * zero. - * - * @return integer the date this sub-key expires. - */ - public function getExpirationDate() - { - return $this->_expirationDate; - } - - // }}} - // {{{ getFingerprint() - - /** - * Gets the fingerprint of this sub-key - * - * @return string the fingerprint of this sub-key. - */ - public function getFingerprint() - { - return $this->_fingerprint; - } - - // }}} - // {{{ getLength() - - /** - * Gets the length of this sub-key in bits - * - * @return integer the length of this sub-key in bits. - */ - public function getLength() - { - return $this->_length; - } - - // }}} - // {{{ canSign() - - /** - * Gets whether or not this sub-key can sign data - * - * @return boolean true if this sub-key can sign data and false if this - * sub-key can not sign data. - */ - public function canSign() - { - return $this->_canSign; - } - - // }}} - // {{{ canEncrypt() - - /** - * Gets whether or not this sub-key can encrypt data - * - * @return boolean true if this sub-key can encrypt data and false if this - * sub-key can not encrypt data. - */ - public function canEncrypt() - { - return $this->_canEncrypt; - } - - // }}} - // {{{ hasPrivate() - - /** - * Gets whether or not the private key for this sub-key exists in the - * keyring - * - * @return boolean true the private key for this sub-key exists in the - * keyring and false if it does not. - */ - public function hasPrivate() - { - return $this->_hasPrivate; - } - - // }}} - // {{{ isRevoked() - - /** - * Gets whether or not this sub-key is revoked - * - * @return boolean true if this sub-key is revoked and false if it is not. - */ - public function isRevoked() - { - return $this->_isRevoked; - } - - // }}} - // {{{ setCreationDate() - - /** - * Sets the creation date of this sub-key - * - * The creation date is a Unix timestamp. - * - * @param integer $creationDate the creation date of this sub-key. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setCreationDate($creationDate) - { - $this->_creationDate = intval($creationDate); - return $this; - } - - // }}} - // {{{ setExpirationDate() - - /** - * Sets the expiration date of this sub-key - * - * The expiration date is a Unix timestamp. Specify zero if this sub-key - * does not expire. - * - * @param integer $expirationDate the expiration date of this sub-key. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setExpirationDate($expirationDate) - { - $this->_expirationDate = intval($expirationDate); - return $this; - } - - // }}} - // {{{ setId() - - /** - * Sets the id of this sub-key - * - * @param string $id the id of this sub-key. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setId($id) - { - $this->_id = strval($id); - return $this; - } - - // }}} - // {{{ setAlgorithm() - - /** - * Sets the algorithm used by this sub-key - * - * @param integer $algorithm the algorithm used by this sub-key. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setAlgorithm($algorithm) - { - $this->_algorithm = intval($algorithm); - return $this; - } - - // }}} - // {{{ setFingerprint() - - /** - * Sets the fingerprint of this sub-key - * - * @param string $fingerprint the fingerprint of this sub-key. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setFingerprint($fingerprint) - { - $this->_fingerprint = strval($fingerprint); - return $this; - } - - // }}} - // {{{ setLength() - - /** - * Sets the length of this sub-key in bits - * - * @param integer $length the length of this sub-key in bits. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setLength($length) - { - $this->_length = intval($length); - return $this; - } - - // }}} - // {{{ setCanSign() - - /** - * Sets whether of not this sub-key can sign data - * - * @param boolean $canSign true if this sub-key can sign data and false if - * it can not. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setCanSign($canSign) - { - $this->_canSign = ($canSign) ? true : false; - return $this; - } - - // }}} - // {{{ setCanEncrypt() - - /** - * Sets whether of not this sub-key can encrypt data - * - * @param boolean $canEncrypt true if this sub-key can encrypt data and - * false if it can not. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setCanEncrypt($canEncrypt) - { - $this->_canEncrypt = ($canEncrypt) ? true : false; - return $this; - } - - // }}} - // {{{ setHasPrivate() - - /** - * Sets whether of not the private key for this sub-key exists in the - * keyring - * - * @param boolean $hasPrivate true if the private key for this sub-key - * exists in the keyring and false if it does - * not. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setHasPrivate($hasPrivate) - { - $this->_hasPrivate = ($hasPrivate) ? true : false; - return $this; - } - - // }}} - // {{{ setRevoked() - - /** - * Sets whether or not this sub-key is revoked - * - * @param boolean $isRevoked whether or not this sub-key is revoked. - * - * @return Crypt_GPG_SubKey the current object, for fluent interface. - */ - public function setRevoked($isRevoked) - { - $this->_isRevoked = ($isRevoked) ? true : false; - return $this; - } - - // }}} - // {{{ parse() - - /** - * Parses a sub-key object from a sub-key string - * - * See doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for information - * on how the sub-key string is parsed. - * - * @param string $string the string containing the sub-key. - * - * @return Crypt_GPG_SubKey the sub-key object parsed from the string. - */ - public static function parse($string) - { - $tokens = explode(':', $string); - - $subKey = new Crypt_GPG_SubKey(); - - $subKey->setId($tokens[4]); - $subKey->setLength($tokens[2]); - $subKey->setAlgorithm($tokens[3]); - $subKey->setCreationDate(self::_parseDate($tokens[5])); - $subKey->setExpirationDate(self::_parseDate($tokens[6])); - - if ($tokens[1] == 'r') { - $subKey->setRevoked(true); - } - - if (strpos($tokens[11], 's') !== false) { - $subKey->setCanSign(true); - } - - if (strpos($tokens[11], 'e') !== false) { - $subKey->setCanEncrypt(true); - } - - return $subKey; - } - - // }}} - // {{{ _parseDate() - - /** - * Parses a date string as provided by GPG into a UNIX timestamp - * - * @param string $string the date string. - * - * @return integer the UNIX timestamp corresponding to the provided date - * string. - */ - private static function _parseDate($string) - { - if ($string == '') { - $timestamp = 0; - } else { - // all times are in UTC according to GPG documentation - $timeZone = new DateTimeZone('UTC'); - - if (strpos($string, 'T') === false) { - // interpret as UNIX timestamp - $string = '@' . $string; - } - - $date = new DateTime($string, $timeZone); - - // convert to UNIX timestamp - $timestamp = intval($date->format('U')); - } - - return $timestamp; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/UserId.php b/program/lib/Crypt/GPG/UserId.php deleted file mode 100644 index a367bceb3..000000000 --- a/program/lib/Crypt/GPG/UserId.php +++ /dev/null @@ -1,373 +0,0 @@ - - * @copyright 2008-2010 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - */ - -// {{{ class Crypt_GPG_UserId - -/** - * A class for GPG user id information - * - * This class is used to store the results of the {@link Crypt_GPG::getKeys()} - * method. User id objects are members of a {@link Crypt_GPG_Key} object. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2008-2010 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @see Crypt_GPG::getKeys() - * @see Crypt_GPG_Key::getUserIds() - */ -class Crypt_GPG_UserId -{ - // {{{ class properties - - /** - * The name field of this user id - * - * @var string - */ - private $_name = ''; - - /** - * The comment field of this user id - * - * @var string - */ - private $_comment = ''; - - /** - * The email field of this user id - * - * @var string - */ - private $_email = ''; - - /** - * Whether or not this user id is revoked - * - * @var boolean - */ - private $_isRevoked = false; - - /** - * Whether or not this user id is valid - * - * @var boolean - */ - private $_isValid = true; - - // }}} - // {{{ __construct() - - /** - * Creates a new user id - * - * User ids can be initialized from an array of named values. Available - * names are: - * - * - string name - the name field of the user id. - * - string comment - the comment field of the user id. - * - string email - the email field of the user id. - * - boolean valid - whether or not the user id is valid. - * - boolean revoked - whether or not the user id is revoked. - * - * @param Crypt_GPG_UserId|string|array $userId optional. Either an - * existing user id object, which is copied; a user id string, which - * is parsed; or an array of initial values. - */ - public function __construct($userId = null) - { - // parse from string - if (is_string($userId)) { - $userId = self::parse($userId); - } - - // copy from object - if ($userId instanceof Crypt_GPG_UserId) { - $this->_name = $userId->_name; - $this->_comment = $userId->_comment; - $this->_email = $userId->_email; - $this->_isRevoked = $userId->_isRevoked; - $this->_isValid = $userId->_isValid; - } - - // initialize from array - if (is_array($userId)) { - if (array_key_exists('name', $userId)) { - $this->setName($userId['name']); - } - - if (array_key_exists('comment', $userId)) { - $this->setComment($userId['comment']); - } - - if (array_key_exists('email', $userId)) { - $this->setEmail($userId['email']); - } - - if (array_key_exists('revoked', $userId)) { - $this->setRevoked($userId['revoked']); - } - - if (array_key_exists('valid', $userId)) { - $this->setValid($userId['valid']); - } - } - } - - // }}} - // {{{ getName() - - /** - * Gets the name field of this user id - * - * @return string the name field of this user id. - */ - public function getName() - { - return $this->_name; - } - - // }}} - // {{{ getComment() - - /** - * Gets the comments field of this user id - * - * @return string the comments field of this user id. - */ - public function getComment() - { - return $this->_comment; - } - - // }}} - // {{{ getEmail() - - /** - * Gets the email field of this user id - * - * @return string the email field of this user id. - */ - public function getEmail() - { - return $this->_email; - } - - // }}} - // {{{ isRevoked() - - /** - * Gets whether or not this user id is revoked - * - * @return boolean true if this user id is revoked and false if it is not. - */ - public function isRevoked() - { - return $this->_isRevoked; - } - - // }}} - // {{{ isValid() - - /** - * Gets whether or not this user id is valid - * - * @return boolean true if this user id is valid and false if it is not. - */ - public function isValid() - { - return $this->_isValid; - } - - // }}} - // {{{ __toString() - - /** - * Gets a string representation of this user id - * - * The string is formatted as: - * name (comment) . - * - * @return string a string representation of this user id. - */ - public function __toString() - { - $components = array(); - - if (strlen($this->_name) > 0) { - $components[] = $this->_name; - } - - if (strlen($this->_comment) > 0) { - $components[] = '(' . $this->_comment . ')'; - } - - if (strlen($this->_email) > 0) { - $components[] = '<' . $this->_email. '>'; - } - - return implode(' ', $components); - } - - // }}} - // {{{ setName() - - /** - * Sets the name field of this user id - * - * @param string $name the name field of this user id. - * - * @return Crypt_GPG_UserId the current object, for fluent interface. - */ - public function setName($name) - { - $this->_name = strval($name); - return $this; - } - - // }}} - // {{{ setComment() - - /** - * Sets the comment field of this user id - * - * @param string $comment the comment field of this user id. - * - * @return Crypt_GPG_UserId the current object, for fluent interface. - */ - public function setComment($comment) - { - $this->_comment = strval($comment); - return $this; - } - - // }}} - // {{{ setEmail() - - /** - * Sets the email field of this user id - * - * @param string $email the email field of this user id. - * - * @return Crypt_GPG_UserId the current object, for fluent interface. - */ - public function setEmail($email) - { - $this->_email = strval($email); - return $this; - } - - // }}} - // {{{ setRevoked() - - /** - * Sets whether or not this user id is revoked - * - * @param boolean $isRevoked whether or not this user id is revoked. - * - * @return Crypt_GPG_UserId the current object, for fluent interface. - */ - public function setRevoked($isRevoked) - { - $this->_isRevoked = ($isRevoked) ? true : false; - return $this; - } - - // }}} - // {{{ setValid() - - /** - * Sets whether or not this user id is valid - * - * @param boolean $isValid whether or not this user id is valid. - * - * @return Crypt_GPG_UserId the current object, for fluent interface. - */ - public function setValid($isValid) - { - $this->_isValid = ($isValid) ? true : false; - return $this; - } - - // }}} - // {{{ parse() - - /** - * Parses a user id object from a user id string - * - * A user id string is of the form: - * name (comment) with the comment - * and email-address fields being optional. - * - * @param string $string the user id string to parse. - * - * @return Crypt_GPG_UserId the user id object parsed from the string. - */ - public static function parse($string) - { - $userId = new Crypt_GPG_UserId(); - $email = ''; - $comment = ''; - - // get email address from end of string if it exists - $matches = array(); - if (preg_match('/^(.+?) <([^>]+)>$/', $string, $matches) === 1) { - $string = $matches[1]; - $email = $matches[2]; - } - - // get comment from end of string if it exists - $matches = array(); - if (preg_match('/^(.+?) \(([^\)]+)\)$/', $string, $matches) === 1) { - $string = $matches[1]; - $comment = $matches[2]; - } - - $name = $string; - - $userId->setName($name); - $userId->setComment($comment); - $userId->setEmail($email); - - return $userId; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Crypt/GPG/VerifyStatusHandler.php b/program/lib/Crypt/GPG/VerifyStatusHandler.php deleted file mode 100644 index 8904be149..000000000 --- a/program/lib/Crypt/GPG/VerifyStatusHandler.php +++ /dev/null @@ -1,216 +0,0 @@ - - * @copyright 2008 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id$ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ - -/** - * Signature object class definition - */ -require_once 'Crypt/GPG/Signature.php'; - -/** - * Status line handler for the verify operation - * - * This class is used internally by Crypt_GPG and does not need be used - * directly. See the {@link Crypt_GPG} class for end-user API. - * - * This class is responsible for building signature objects that are returned - * by the {@link Crypt_GPG::verify()} method. See doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG distribution} for detailed - * information on GPG's status output for the verify operation. - * - * @category Encryption - * @package Crypt_GPG - * @author Michael Gauthier - * @copyright 2008 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -class Crypt_GPG_VerifyStatusHandler -{ - // {{{ protected properties - - /** - * The current signature id - * - * Ths signature id is emitted by GPG before the new signature line so we - * must remember it temporarily. - * - * @var string - */ - protected $signatureId = ''; - - /** - * List of parsed {@link Crypt_GPG_Signature} objects - * - * @var array - */ - protected $signatures = array(); - - /** - * Array index of the current signature - * - * @var integer - */ - protected $index = -1; - - // }}} - // {{{ handle() - - /** - * Handles a status line - * - * @param string $line the status line to handle. - * - * @return void - */ - public function handle($line) - { - $tokens = explode(' ', $line); - switch ($tokens[0]) { - case 'GOODSIG': - case 'EXPSIG': - case 'EXPKEYSIG': - case 'REVKEYSIG': - case 'BADSIG': - $signature = new Crypt_GPG_Signature(); - - // if there was a signature id, set it on the new signature - if ($this->signatureId != '') { - $signature->setId($this->signatureId); - $this->signatureId = ''; - } - - // Detect whether fingerprint or key id was returned and set - // signature values appropriately. Key ids are strings of either - // 16 or 8 hexadecimal characters. Fingerprints are strings of 40 - // hexadecimal characters. The key id is the last 16 characters of - // the key fingerprint. - if (strlen($tokens[1]) > 16) { - $signature->setKeyFingerprint($tokens[1]); - $signature->setKeyId(substr($tokens[1], -16)); - } else { - $signature->setKeyId($tokens[1]); - } - - // get user id string - $string = implode(' ', array_splice($tokens, 2)); - $string = rawurldecode($string); - - $signature->setUserId(Crypt_GPG_UserId::parse($string)); - - $this->index++; - $this->signatures[$this->index] = $signature; - break; - - case 'ERRSIG': - $signature = new Crypt_GPG_Signature(); - - // if there was a signature id, set it on the new signature - if ($this->signatureId != '') { - $signature->setId($this->signatureId); - $this->signatureId = ''; - } - - // Detect whether fingerprint or key id was returned and set - // signature values appropriately. Key ids are strings of either - // 16 or 8 hexadecimal characters. Fingerprints are strings of 40 - // hexadecimal characters. The key id is the last 16 characters of - // the key fingerprint. - if (strlen($tokens[1]) > 16) { - $signature->setKeyFingerprint($tokens[1]); - $signature->setKeyId(substr($tokens[1], -16)); - } else { - $signature->setKeyId($tokens[1]); - } - - $this->index++; - $this->signatures[$this->index] = $signature; - - break; - - case 'VALIDSIG': - if (!array_key_exists($this->index, $this->signatures)) { - break; - } - - $signature = $this->signatures[$this->index]; - - $signature->setValid(true); - $signature->setKeyFingerprint($tokens[1]); - - if (strpos($tokens[3], 'T') === false) { - $signature->setCreationDate($tokens[3]); - } else { - $signature->setCreationDate(strtotime($tokens[3])); - } - - if (array_key_exists(4, $tokens)) { - if (strpos($tokens[4], 'T') === false) { - $signature->setExpirationDate($tokens[4]); - } else { - $signature->setExpirationDate(strtotime($tokens[4])); - } - } - - break; - - case 'SIG_ID': - // note: signature id comes before new signature line and may not - // exist for some signature types - $this->signatureId = $tokens[1]; - break; - } - } - - // }}} - // {{{ getSignatures() - - /** - * Gets the {@link Crypt_GPG_Signature} objects parsed by this handler - * - * @return array the signature objects parsed by this handler. - */ - public function getSignatures() - { - return $this->signatures; - } - - // }}} -} - -?> diff --git a/program/lib/Crypt/GPGAbstract.php b/program/lib/Crypt/GPGAbstract.php deleted file mode 100644 index 214133936..000000000 --- a/program/lib/Crypt/GPGAbstract.php +++ /dev/null @@ -1,508 +0,0 @@ - - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @version CVS: $Id: GPG.php 305428 2010-11-17 02:47:56Z gauthierm $ - * @link http://pear.php.net/package/Crypt_GPG - * @link http://pear.php.net/manual/en/package.encryption.crypt-gpg.php - * @link http://www.gnupg.org/ - */ - -/** - * GPG key class - */ -require_once 'Crypt/GPG/Key.php'; - -/** - * GPG sub-key class - */ -require_once 'Crypt/GPG/SubKey.php'; - -/** - * GPG user id class - */ -require_once 'Crypt/GPG/UserId.php'; - -/** - * GPG process and I/O engine class - */ -require_once 'Crypt/GPG/Engine.php'; - -/** - * GPG exception classes - */ -require_once 'Crypt/GPG/Exceptions.php'; - -// {{{ class Crypt_GPGAbstract - -/** - * Base class for implementing a user of {@link Crypt_GPG_Engine} - * - * @category Encryption - * @package Crypt_GPG - * @author Nathan Fredrickson - * @author Michael Gauthier - * @copyright 2005-2013 silverorange - * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 - * @link http://pear.php.net/package/Crypt_GPG - * @link http://www.gnupg.org/ - */ -abstract class Crypt_GPGAbstract -{ - // {{{ class error constants - - /** - * Error code returned when there is no error. - */ - const ERROR_NONE = 0; - - /** - * Error code returned when an unknown or unhandled error occurs. - */ - const ERROR_UNKNOWN = 1; - - /** - * Error code returned when a bad passphrase is used. - */ - const ERROR_BAD_PASSPHRASE = 2; - - /** - * Error code returned when a required passphrase is missing. - */ - const ERROR_MISSING_PASSPHRASE = 3; - - /** - * Error code returned when a key that is already in the keyring is - * imported. - */ - const ERROR_DUPLICATE_KEY = 4; - - /** - * Error code returned the required data is missing for an operation. - * - * This could be missing key data, missing encrypted data or missing - * signature data. - */ - const ERROR_NO_DATA = 5; - - /** - * Error code returned when an unsigned key is used. - */ - const ERROR_UNSIGNED_KEY = 6; - - /** - * Error code returned when a key that is not self-signed is used. - */ - const ERROR_NOT_SELF_SIGNED = 7; - - /** - * Error code returned when a public or private key that is not in the - * keyring is used. - */ - const ERROR_KEY_NOT_FOUND = 8; - - /** - * Error code returned when an attempt to delete public key having a - * private key is made. - */ - const ERROR_DELETE_PRIVATE_KEY = 9; - - /** - * Error code returned when one or more bad signatures are detected. - */ - const ERROR_BAD_SIGNATURE = 10; - - /** - * Error code returned when there is a problem reading GnuPG data files. - */ - const ERROR_FILE_PERMISSIONS = 11; - - /** - * Error code returned when a key could not be created. - */ - const ERROR_KEY_NOT_CREATED = 12; - - /** - * Error code returned when bad key parameters are used during key - * generation. - */ - const ERROR_BAD_KEY_PARAMS = 13; - - // }}} - // {{{ other class constants - - /** - * URI at which package bugs may be reported. - */ - const BUG_URI = 'http://pear.php.net/bugs/report.php?package=Crypt_GPG'; - - // }}} - // {{{ protected class properties - - /** - * Engine used to control the GPG subprocess - * - * @var Crypt_GPG_Engine - * - * @see Crypt_GPGAbstract::setEngine() - */ - protected $engine = null; - - // }}} - // {{{ __construct() - - /** - * Creates a new GPG object - * - * Available options are: - * - * - string homedir - the directory where the GPG - * keyring files are stored. If not - * specified, Crypt_GPG uses the - * default of ~/.gnupg. - * - string publicKeyring - the file path of the public - * keyring. Use this if the public - * keyring is not in the homedir, or - * if the keyring is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * keyring with this option - * (/foo/bar/pubring.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string privateKeyring - the file path of the private - * keyring. Use this if the private - * keyring is not in the homedir, or - * if the keyring is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * keyring with this option - * (/foo/bar/secring.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string trustDb - the file path of the web-of-trust - * database. Use this if the trust - * database is not in the homedir, or - * if the database is in a directory - * not writable by the process - * invoking GPG (like Apache). Then - * you can specify the path to the - * trust database with this option - * (/foo/bar/trustdb.gpg), and specify - * a writable directory (like /tmp) - * using the homedir option. - * - string binary - the location of the GPG binary. If - * not specified, the driver attempts - * to auto-detect the GPG binary - * location using a list of known - * default locations for the current - * operating system. The option - * gpgBinary is a - * deprecated alias for this option. - * - string agent - the location of the GnuPG agent - * binary. The gpg-agent is only - * used for GnuPG 2.x. If not - * specified, the engine attempts - * to auto-detect the gpg-agent - * binary location using a list of - * know default locations for the - * current operating system. - * - boolean debug - whether or not to use debug mode. - * When debug mode is on, all - * communication to and from the GPG - * subprocess is logged. This can be - * - * @param array $options optional. An array of options used to create the - * GPG object. All options are optional and are - * represented as key-value pairs. - * - * @throws Crypt_GPG_FileException if the homedir does not exist - * and cannot be created. This can happen if homedir is - * not specified, Crypt_GPG is run as the web user, and the web - * user has no home directory. This exception is also thrown if any - * of the options publicKeyring, - * privateKeyring or trustDb options are - * specified but the files do not exist or are are not readable. - * This can happen if the user running the Crypt_GPG process (for - * example, the Apache user) does not have permission to read the - * files. - * - * @throws PEAR_Exception if the provided binary is invalid, or - * if no binary is provided and no suitable binary could - * be found. - * - * @throws PEAR_Exception if the provided agent is invalid, or - * if no agent is provided and no suitable gpg-agent - * cound be found. - */ - public function __construct(array $options = array()) - { - $this->setEngine(new Crypt_GPG_Engine($options)); - } - - // }}} - // {{{ setEngine() - - /** - * Sets the I/O engine to use for GnuPG operations - * - * Normally this method does not need to be used. It provides a means for - * dependency injection. - * - * @param Crypt_GPG_Engine $engine the engine to use. - * - * @return Crypt_GPGAbstract the current object, for fluent interface. - */ - public function setEngine(Crypt_GPG_Engine $engine) - { - $this->engine = $engine; - return $this; - } - - // }}} - // {{{ _getKeys() - - /** - * Gets the available keys in the keyring - * - * Calls GPG with the --list-keys command and grabs keys. See - * the first section of doc/DETAILS in the - * {@link http://www.gnupg.org/download/ GPG package} for a detailed - * description of how the GPG command output is parsed. - * - * @param string $keyId optional. Only keys with that match the specified - * pattern are returned. The pattern may be part of - * a user id, a key id or a key fingerprint. If not - * specified, all keys are returned. - * - * @return array an array of {@link Crypt_GPG_Key} objects. If no keys - * match the specified $keyId an empty array is - * returned. - * - * @throws Crypt_GPG_Exception if an unknown or unexpected error occurs. - * Use the debug option and file a bug report if these - * exceptions occur. - * - * @see Crypt_GPG_Key - */ - protected function _getKeys($keyId = '') - { - // get private key fingerprints - if ($keyId == '') { - $operation = '--list-secret-keys'; - } else { - $operation = '--list-secret-keys ' . escapeshellarg($keyId); - } - - // According to The file 'doc/DETAILS' in the GnuPG distribution, using - // double '--with-fingerprint' also prints the fingerprint for subkeys. - $arguments = array( - '--with-colons', - '--with-fingerprint', - '--with-fingerprint', - '--fixed-list-mode' - ); - - $output = ''; - - $this->engine->reset(); - $this->engine->setOutput($output); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - case self::ERROR_KEY_NOT_FOUND: - // ignore not found key errors - break; - case self::ERROR_FILE_PERMISSIONS: - $filename = $this->engine->getErrorFilename(); - if ($filename) { - throw new Crypt_GPG_FileException( - sprintf( - 'Error reading GnuPG data file \'%s\'. Check to make ' . - 'sure it is readable by the current user.', - $filename - ), - $code, - $filename - ); - } - throw new Crypt_GPG_FileException( - 'Error reading GnuPG data file. Check to make GnuPG data ' . - 'files are readable by the current user.', - $code - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error getting keys. Please use the \'debug\' option ' . - 'when creating the Crypt_GPG object, and file a bug report ' . - 'at ' . self::BUG_URI, - $code - ); - } - - $privateKeyFingerprints = array(); - - $lines = explode(PHP_EOL, $output); - foreach ($lines as $line) { - $lineExp = explode(':', $line); - if ($lineExp[0] == 'fpr') { - $privateKeyFingerprints[] = $lineExp[9]; - } - } - - // get public keys - if ($keyId == '') { - $operation = '--list-public-keys'; - } else { - $operation = '--list-public-keys ' . escapeshellarg($keyId); - } - - $output = ''; - - $this->engine->reset(); - $this->engine->setOutput($output); - $this->engine->setOperation($operation, $arguments); - $this->engine->run(); - - $code = $this->engine->getErrorCode(); - - switch ($code) { - case self::ERROR_NONE: - case self::ERROR_KEY_NOT_FOUND: - // ignore not found key errors - break; - case self::ERROR_FILE_PERMISSIONS: - $filename = $this->engine->getErrorFilename(); - if ($filename) { - throw new Crypt_GPG_FileException( - sprintf( - 'Error reading GnuPG data file \'%s\'. Check to make ' . - 'sure it is readable by the current user.', - $filename - ), - $code, - $filename - ); - } - throw new Crypt_GPG_FileException( - 'Error reading GnuPG data file. Check to make GnuPG data ' . - 'files are readable by the current user.', - $code - ); - default: - throw new Crypt_GPG_Exception( - 'Unknown error getting keys. Please use the \'debug\' option ' . - 'when creating the Crypt_GPG object, and file a bug report ' . - 'at ' . self::BUG_URI, - $code - ); - } - - $keys = array(); - - $key = null; // current key - $subKey = null; // current sub-key - - $lines = explode(PHP_EOL, $output); - foreach ($lines as $line) { - $lineExp = explode(':', $line); - - if ($lineExp[0] == 'pub') { - - // new primary key means last key should be added to the array - if ($key !== null) { - $keys[] = $key; - } - - $key = new Crypt_GPG_Key(); - - $subKey = Crypt_GPG_SubKey::parse($line); - $key->addSubKey($subKey); - - } elseif ($lineExp[0] == 'sub') { - - $subKey = Crypt_GPG_SubKey::parse($line); - $key->addSubKey($subKey); - - } elseif ($lineExp[0] == 'fpr') { - - $fingerprint = $lineExp[9]; - - // set current sub-key fingerprint - $subKey->setFingerprint($fingerprint); - - // if private key exists, set has private to true - if (in_array($fingerprint, $privateKeyFingerprints)) { - $subKey->setHasPrivate(true); - } - - } elseif ($lineExp[0] == 'uid') { - - $string = stripcslashes($lineExp[9]); // as per documentation - $userId = new Crypt_GPG_UserId($string); - - if ($lineExp[1] == 'r') { - $userId->setRevoked(true); - } - - $key->addUserId($userId); - - } - } - - // add last key - if ($key !== null) { - $keys[] = $key; - } - - return $keys; - } - - // }}} -} - -// }}} - -?> diff --git a/program/lib/Mail/mime.php b/program/lib/Mail/mime.php deleted file mode 100644 index db0fd1fc2..000000000 --- a/program/lib/Mail/mime.php +++ /dev/null @@ -1,1499 +0,0 @@ - - * Copyright (c) 2003-2006, PEAR - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - Neither the name of the authors, nor the names of its contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Mail - * @package Mail_Mime - * @author Richard Heyes - * @author Tomas V.V. Cox - * @author Cipriano Groenendal - * @author Sean Coates - * @author Aleksander Machniak - * @copyright 2003-2006 PEAR - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version CVS: $Id$ - * @link http://pear.php.net/package/Mail_mime - * - * This class is based on HTML Mime Mail class from - * Richard Heyes which was based also - * in the mime_mail.class by Tobias Ratschiller - * and Sascha Schumann - */ - - -/** - * require PEAR - * - * This package depends on PEAR to raise errors. - */ -require_once 'PEAR.php'; - -/** - * require Mail_mimePart - * - * Mail_mimePart contains the code required to - * create all the different parts a mail can - * consist of. - */ -require_once 'Mail/mimePart.php'; - - -/** - * The Mail_Mime class provides an OO interface to create MIME - * enabled email messages. This way you can create emails that - * contain plain-text bodies, HTML bodies, attachments, inline - * images and specific headers. - * - * @category Mail - * @package Mail_Mime - * @author Richard Heyes - * @author Tomas V.V. Cox - * @author Cipriano Groenendal - * @author Sean Coates - * @copyright 2003-2006 PEAR - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version Release: @package_version@ - * @link http://pear.php.net/package/Mail_mime - */ -class Mail_mime -{ - /** - * Contains the plain text part of the email - * - * @var string - * @access private - */ - var $_txtbody; - - /** - * Contains the html part of the email - * - * @var string - * @access private - */ - var $_htmlbody; - - /** - * list of the attached images - * - * @var array - * @access private - */ - var $_html_images = array(); - - /** - * list of the attachements - * - * @var array - * @access private - */ - var $_parts = array(); - - /** - * Headers for the mail - * - * @var array - * @access private - */ - var $_headers = array(); - - /** - * Build parameters - * - * @var array - * @access private - */ - var $_build_params = array( - // What encoding to use for the headers - // Options: quoted-printable or base64 - 'head_encoding' => 'quoted-printable', - // What encoding to use for plain text - // Options: 7bit, 8bit, base64, or quoted-printable - 'text_encoding' => 'quoted-printable', - // What encoding to use for html - // Options: 7bit, 8bit, base64, or quoted-printable - 'html_encoding' => 'quoted-printable', - // The character set to use for html - 'html_charset' => 'ISO-8859-1', - // The character set to use for text - 'text_charset' => 'ISO-8859-1', - // The character set to use for headers - 'head_charset' => 'ISO-8859-1', - // End-of-line sequence - 'eol' => "\r\n", - // Delay attachment files IO until building the message - 'delay_file_io' => false - ); - - /** - * Constructor function - * - * @param mixed $params Build parameters that change the way the email - * is built. Should be an associative array. - * See $_build_params. - * - * @return void - * @access public - */ - function Mail_mime($params = array()) - { - // Backward-compatible EOL setting - if (is_string($params)) { - $this->_build_params['eol'] = $params; - } else if (defined('MAIL_MIME_CRLF') && !isset($params['eol'])) { - $this->_build_params['eol'] = MAIL_MIME_CRLF; - } - - // Update build parameters - if (!empty($params) && is_array($params)) { - while (list($key, $value) = each($params)) { - $this->_build_params[$key] = $value; - } - } - } - - /** - * Set build parameter value - * - * @param string $name Parameter name - * @param string $value Parameter value - * - * @return void - * @access public - * @since 1.6.0 - */ - function setParam($name, $value) - { - $this->_build_params[$name] = $value; - } - - /** - * Get build parameter value - * - * @param string $name Parameter name - * - * @return mixed Parameter value - * @access public - * @since 1.6.0 - */ - function getParam($name) - { - return isset($this->_build_params[$name]) ? $this->_build_params[$name] : null; - } - - /** - * Accessor function to set the body text. Body text is used if - * it's not an html mail being sent or else is used to fill the - * text/plain part that emails clients who don't support - * html should show. - * - * @param string $data Either a string or - * the file name with the contents - * @param bool $isfile If true the first param should be treated - * as a file name, else as a string (default) - * @param bool $append If true the text or file is appended to - * the existing body, else the old body is - * overwritten - * - * @return mixed True on success or PEAR_Error object - * @access public - */ - function setTXTBody($data, $isfile = false, $append = false) - { - if (!$isfile) { - if (!$append) { - $this->_txtbody = $data; - } else { - $this->_txtbody .= $data; - } - } else { - $cont = $this->_file2str($data); - if ($this->_isError($cont)) { - return $cont; - } - if (!$append) { - $this->_txtbody = $cont; - } else { - $this->_txtbody .= $cont; - } - } - - return true; - } - - /** - * Get message text body - * - * @return string Text body - * @access public - * @since 1.6.0 - */ - function getTXTBody() - { - return $this->_txtbody; - } - - /** - * Adds a html part to the mail. - * - * @param string $data Either a string or the file name with the - * contents - * @param bool $isfile A flag that determines whether $data is a - * filename, or a string(false, default) - * - * @return bool True on success - * @access public - */ - function setHTMLBody($data, $isfile = false) - { - if (!$isfile) { - $this->_htmlbody = $data; - } else { - $cont = $this->_file2str($data); - if ($this->_isError($cont)) { - return $cont; - } - $this->_htmlbody = $cont; - } - - return true; - } - - /** - * Get message HTML body - * - * @return string HTML body - * @access public - * @since 1.6.0 - */ - function getHTMLBody() - { - return $this->_htmlbody; - } - - /** - * Adds an image to the list of embedded images. - * - * @param string $file The image file name OR image data itself - * @param string $c_type The content type - * @param string $name The filename of the image. - * Only used if $file is the image data. - * @param bool $isfile Whether $file is a filename or not. - * Defaults to true - * @param string $content_id Desired Content-ID of MIME part - * Defaults to generated unique ID - * - * @return bool True on success - * @access public - */ - function addHTMLImage($file, - $c_type='application/octet-stream', - $name = '', - $isfile = true, - $content_id = null - ) { - $bodyfile = null; - - if ($isfile) { - // Don't load file into memory - if ($this->_build_params['delay_file_io']) { - $filedata = null; - $bodyfile = $file; - } else { - if ($this->_isError($filedata = $this->_file2str($file))) { - return $filedata; - } - } - $filename = ($name ? $name : $file); - } else { - $filedata = $file; - $filename = $name; - } - - if (!$content_id) { - $content_id = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true)); - } - - $this->_html_images[] = array( - 'body' => $filedata, - 'body_file' => $bodyfile, - 'name' => $filename, - 'c_type' => $c_type, - 'cid' => $content_id - ); - - return true; - } - - /** - * Adds a file to the list of attachments. - * - * @param string $file The file name of the file to attach - * or the file contents itself - * @param string $c_type The content type - * @param string $name The filename of the attachment - * Only use if $file is the contents - * @param bool $isfile Whether $file is a filename or not. Defaults to true - * @param string $encoding The type of encoding to use. Defaults to base64. - * Possible values: 7bit, 8bit, base64 or quoted-printable. - * @param string $disposition The content-disposition of this file - * Defaults to attachment. - * Possible values: attachment, inline. - * @param string $charset The character set of attachment's content. - * @param string $language The language of the attachment - * @param string $location The RFC 2557.4 location of the attachment - * @param string $n_encoding Encoding of the attachment's name in Content-Type - * By default filenames are encoded using RFC2231 method - * Here you can set RFC2047 encoding (quoted-printable - * or base64) instead - * @param string $f_encoding Encoding of the attachment's filename - * in Content-Disposition header. - * @param string $description Content-Description header - * @param string $h_charset The character set of the headers e.g. filename - * If not specified, $charset will be used - * @param array $add_headers Additional part headers. Array keys can be in form - * of : - * - * @return mixed True on success or PEAR_Error object - * @access public - */ - function addAttachment($file, - $c_type = 'application/octet-stream', - $name = '', - $isfile = true, - $encoding = 'base64', - $disposition = 'attachment', - $charset = '', - $language = '', - $location = '', - $n_encoding = null, - $f_encoding = null, - $description = '', - $h_charset = null, - $add_headers = array() - ) { - $bodyfile = null; - - if ($isfile) { - // Don't load file into memory - if ($this->_build_params['delay_file_io']) { - $filedata = null; - $bodyfile = $file; - } else { - if ($this->_isError($filedata = $this->_file2str($file))) { - return $filedata; - } - } - // Force the name the user supplied, otherwise use $file - $filename = ($name ? $name : $this->_basename($file)); - } else { - $filedata = $file; - $filename = $name; - } - - if (!strlen($filename)) { - $msg = "The supplied filename for the attachment can't be empty"; - return $this->_raiseError($msg); - } - - $this->_parts[] = array( - 'body' => $filedata, - 'body_file' => $bodyfile, - 'name' => $filename, - 'c_type' => $c_type, - 'charset' => $charset, - 'encoding' => $encoding, - 'language' => $language, - 'location' => $location, - 'disposition' => $disposition, - 'description' => $description, - 'add_headers' => $add_headers, - 'name_encoding' => $n_encoding, - 'filename_encoding' => $f_encoding, - 'headers_charset' => $h_charset, - ); - - return true; - } - - /** - * Get the contents of the given file name as string - * - * @param string $file_name Path of file to process - * - * @return string Contents of $file_name - * @access private - */ - function _file2str($file_name) - { - // Check state of file and raise an error properly - if (!file_exists($file_name)) { - return $this->_raiseError('File not found: ' . $file_name); - } - if (!is_file($file_name)) { - return $this->_raiseError('Not a regular file: ' . $file_name); - } - if (!is_readable($file_name)) { - return $this->_raiseError('File is not readable: ' . $file_name); - } - - // Temporarily reset magic_quotes_runtime and read file contents - if ($magic_quote_setting = get_magic_quotes_runtime()) { - @ini_set('magic_quotes_runtime', 0); - } - $cont = file_get_contents($file_name); - if ($magic_quote_setting) { - @ini_set('magic_quotes_runtime', $magic_quote_setting); - } - - return $cont; - } - - /** - * Adds a text subpart to the mimePart object and - * returns it during the build process. - * - * @param mixed &$obj The object to add the part to, or - * anything else if a new object is to be created. - * @param string $text The text to add. - * - * @return object The text mimePart object - * @access private - */ - function &_addTextPart(&$obj, $text = '') - { - $params['content_type'] = 'text/plain'; - $params['encoding'] = $this->_build_params['text_encoding']; - $params['charset'] = $this->_build_params['text_charset']; - $params['eol'] = $this->_build_params['eol']; - - if (is_object($obj)) { - $ret = $obj->addSubpart($text, $params); - } else { - $ret = new Mail_mimePart($text, $params); - } - - return $ret; - } - - /** - * Adds a html subpart to the mimePart object and - * returns it during the build process. - * - * @param mixed &$obj The object to add the part to, or - * anything else if a new object is to be created. - * - * @return object The html mimePart object - * @access private - */ - function &_addHtmlPart(&$obj) - { - $params['content_type'] = 'text/html'; - $params['encoding'] = $this->_build_params['html_encoding']; - $params['charset'] = $this->_build_params['html_charset']; - $params['eol'] = $this->_build_params['eol']; - - if (is_object($obj)) { - $ret = $obj->addSubpart($this->_htmlbody, $params); - } else { - $ret = new Mail_mimePart($this->_htmlbody, $params); - } - - return $ret; - } - - /** - * Creates a new mimePart object, using multipart/mixed as - * the initial content-type and returns it during the - * build process. - * - * @return object The multipart/mixed mimePart object - * @access private - */ - function &_addMixedPart() - { - $params['content_type'] = 'multipart/mixed'; - $params['eol'] = $this->_build_params['eol']; - - // Create empty multipart/mixed Mail_mimePart object to return - $ret = new Mail_mimePart('', $params); - return $ret; - } - - /** - * Adds a multipart/alternative part to a mimePart - * object (or creates one), and returns it during - * the build process. - * - * @param mixed &$obj The object to add the part to, or - * anything else if a new object is to be created. - * - * @return object The multipart/mixed mimePart object - * @access private - */ - function &_addAlternativePart(&$obj) - { - $params['content_type'] = 'multipart/alternative'; - $params['eol'] = $this->_build_params['eol']; - - if (is_object($obj)) { - $ret = $obj->addSubpart('', $params); - } else { - $ret = new Mail_mimePart('', $params); - } - - return $ret; - } - - /** - * Adds a multipart/related part to a mimePart - * object (or creates one), and returns it during - * the build process. - * - * @param mixed &$obj The object to add the part to, or - * anything else if a new object is to be created - * - * @return object The multipart/mixed mimePart object - * @access private - */ - function &_addRelatedPart(&$obj) - { - $params['content_type'] = 'multipart/related'; - $params['eol'] = $this->_build_params['eol']; - - if (is_object($obj)) { - $ret = $obj->addSubpart('', $params); - } else { - $ret = new Mail_mimePart('', $params); - } - - return $ret; - } - - /** - * Adds an html image subpart to a mimePart object - * and returns it during the build process. - * - * @param object &$obj The mimePart to add the image to - * @param array $value The image information - * - * @return object The image mimePart object - * @access private - */ - function &_addHtmlImagePart(&$obj, $value) - { - $params['content_type'] = $value['c_type']; - $params['encoding'] = 'base64'; - $params['disposition'] = 'inline'; - $params['filename'] = $value['name']; - $params['cid'] = $value['cid']; - $params['body_file'] = $value['body_file']; - $params['eol'] = $this->_build_params['eol']; - - if (!empty($value['name_encoding'])) { - $params['name_encoding'] = $value['name_encoding']; - } - if (!empty($value['filename_encoding'])) { - $params['filename_encoding'] = $value['filename_encoding']; - } - - $ret = $obj->addSubpart($value['body'], $params); - return $ret; - } - - /** - * Adds an attachment subpart to a mimePart object - * and returns it during the build process. - * - * @param object &$obj The mimePart to add the image to - * @param array $value The attachment information - * - * @return object The image mimePart object - * @access private - */ - function &_addAttachmentPart(&$obj, $value) - { - $params['eol'] = $this->_build_params['eol']; - $params['filename'] = $value['name']; - $params['encoding'] = $value['encoding']; - $params['content_type'] = $value['c_type']; - $params['body_file'] = $value['body_file']; - $params['disposition'] = isset($value['disposition']) ? - $value['disposition'] : 'attachment'; - - // content charset - if (!empty($value['charset'])) { - $params['charset'] = $value['charset']; - } - // headers charset (filename, description) - if (!empty($value['headers_charset'])) { - $params['headers_charset'] = $value['headers_charset']; - } - if (!empty($value['language'])) { - $params['language'] = $value['language']; - } - if (!empty($value['location'])) { - $params['location'] = $value['location']; - } - if (!empty($value['name_encoding'])) { - $params['name_encoding'] = $value['name_encoding']; - } - if (!empty($value['filename_encoding'])) { - $params['filename_encoding'] = $value['filename_encoding']; - } - if (!empty($value['description'])) { - $params['description'] = $value['description']; - } - if (is_array($value['add_headers'])) { - $params['headers'] = $value['add_headers']; - } - - $ret = $obj->addSubpart($value['body'], $params); - return $ret; - } - - /** - * Returns the complete e-mail, ready to send using an alternative - * mail delivery method. Note that only the mailpart that is made - * with Mail_Mime is created. This means that, - * YOU WILL HAVE NO TO: HEADERS UNLESS YOU SET IT YOURSELF - * using the $headers parameter! - * - * @param string $separation The separation between these two parts. - * @param array $params The Build parameters passed to the - * get() function. See get() for more info. - * @param array $headers The extra headers that should be passed - * to the headers() method. - * See that function for more info. - * @param bool $overwrite Overwrite the existing headers with new. - * - * @return mixed The complete e-mail or PEAR error object - * @access public - */ - function getMessage($separation = null, $params = null, $headers = null, - $overwrite = false - ) { - if ($separation === null) { - $separation = $this->_build_params['eol']; - } - - $body = $this->get($params); - - if ($this->_isError($body)) { - return $body; - } - - return $this->txtHeaders($headers, $overwrite) . $separation . $body; - } - - /** - * Returns the complete e-mail body, ready to send using an alternative - * mail delivery method. - * - * @param array $params The Build parameters passed to the - * get() method. See get() for more info. - * - * @return mixed The e-mail body or PEAR error object - * @access public - * @since 1.6.0 - */ - function getMessageBody($params = null) - { - return $this->get($params, null, true); - } - - /** - * Writes (appends) the complete e-mail into file. - * - * @param string $filename Output file location - * @param array $params The Build parameters passed to the - * get() method. See get() for more info. - * @param array $headers The extra headers that should be passed - * to the headers() function. - * See that function for more info. - * @param bool $overwrite Overwrite the existing headers with new. - * - * @return mixed True or PEAR error object - * @access public - * @since 1.6.0 - */ - function saveMessage($filename, $params = null, $headers = null, $overwrite = false) - { - // Check state of file and raise an error properly - if (file_exists($filename) && !is_writable($filename)) { - return $this->_raiseError('File is not writable: ' . $filename); - } - - // Temporarily reset magic_quotes_runtime and read file contents - if ($magic_quote_setting = get_magic_quotes_runtime()) { - @ini_set('magic_quotes_runtime', 0); - } - - if (!($fh = fopen($filename, 'ab'))) { - return $this->_raiseError('Unable to open file: ' . $filename); - } - - // Write message headers into file (skipping Content-* headers) - $head = $this->txtHeaders($headers, $overwrite, true); - if (fwrite($fh, $head) === false) { - return $this->_raiseError('Error writing to file: ' . $filename); - } - - fclose($fh); - - if ($magic_quote_setting) { - @ini_set('magic_quotes_runtime', $magic_quote_setting); - } - - // Write the rest of the message into file - $res = $this->get($params, $filename); - - return $res ? $res : true; - } - - /** - * Writes (appends) the complete e-mail body into file. - * - * @param string $filename Output file location - * @param array $params The Build parameters passed to the - * get() method. See get() for more info. - * - * @return mixed True or PEAR error object - * @access public - * @since 1.6.0 - */ - function saveMessageBody($filename, $params = null) - { - // Check state of file and raise an error properly - if (file_exists($filename) && !is_writable($filename)) { - return $this->_raiseError('File is not writable: ' . $filename); - } - - // Temporarily reset magic_quotes_runtime and read file contents - if ($magic_quote_setting = get_magic_quotes_runtime()) { - @ini_set('magic_quotes_runtime', 0); - } - - if (!($fh = fopen($filename, 'ab'))) { - return $this->_raiseError('Unable to open file: ' . $filename); - } - - // Write the rest of the message into file - $res = $this->get($params, $filename, true); - - return $res ? $res : true; - } - - /** - * Builds the multipart message from the list ($this->_parts) and - * returns the mime content. - * - * @param array $params Build parameters that change the way the email - * is built. Should be associative. See $_build_params. - * @param resource $filename Output file where to save the message instead of - * returning it - * @param boolean $skip_head True if you want to return/save only the message - * without headers - * - * @return mixed The MIME message content string, null or PEAR error object - * @access public - */ - function get($params = null, $filename = null, $skip_head = false) - { - if (isset($params)) { - while (list($key, $value) = each($params)) { - $this->_build_params[$key] = $value; - } - } - - if (isset($this->_headers['From'])) { - // Bug #11381: Illegal characters in domain ID - if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $this->_headers['From'], $matches)) { - $domainID = $matches[1]; - } else { - $domainID = '@localhost'; - } - foreach ($this->_html_images as $i => $img) { - $cid = $this->_html_images[$i]['cid']; - if (!preg_match('#'.preg_quote($domainID).'$#', $cid)) { - $this->_html_images[$i]['cid'] = $cid . $domainID; - } - } - } - - if (count($this->_html_images) && isset($this->_htmlbody)) { - foreach ($this->_html_images as $key => $value) { - $regex = array(); - $regex[] = '#(\s)((?i)src|background|href(?-i))\s*=\s*(["\']?)' . - preg_quote($value['name'], '#') . '\3#'; - $regex[] = '#(?i)url(?-i)\(\s*(["\']?)' . - preg_quote($value['name'], '#') . '\1\s*\)#'; - - $rep = array(); - $rep[] = '\1\2=\3cid:' . $value['cid'] .'\3'; - $rep[] = 'url(\1cid:' . $value['cid'] . '\1)'; - - $this->_htmlbody = preg_replace($regex, $rep, $this->_htmlbody); - $this->_html_images[$key]['name'] - = $this->_basename($this->_html_images[$key]['name']); - } - } - - $this->_checkParams(); - - $null = -1; - $attachments = count($this->_parts) > 0; - $html_images = count($this->_html_images) > 0; - $html = strlen($this->_htmlbody) > 0; - $text = !$html && strlen($this->_txtbody); - - switch (true) { - case $text && !$attachments: - $message =& $this->_addTextPart($null, $this->_txtbody); - break; - - case !$text && !$html && $attachments: - $message =& $this->_addMixedPart(); - for ($i = 0; $i < count($this->_parts); $i++) { - $this->_addAttachmentPart($message, $this->_parts[$i]); - } - break; - - case $text && $attachments: - $message =& $this->_addMixedPart(); - $this->_addTextPart($message, $this->_txtbody); - for ($i = 0; $i < count($this->_parts); $i++) { - $this->_addAttachmentPart($message, $this->_parts[$i]); - } - break; - - case $html && !$attachments && !$html_images: - if (isset($this->_txtbody)) { - $message =& $this->_addAlternativePart($null); - $this->_addTextPart($message, $this->_txtbody); - $this->_addHtmlPart($message); - } else { - $message =& $this->_addHtmlPart($null); - } - break; - - case $html && !$attachments && $html_images: - // * Content-Type: multipart/alternative; - // * text - // * Content-Type: multipart/related; - // * html - // * image... - if (isset($this->_txtbody)) { - $message =& $this->_addAlternativePart($null); - $this->_addTextPart($message, $this->_txtbody); - - $ht =& $this->_addRelatedPart($message); - $this->_addHtmlPart($ht); - for ($i = 0; $i < count($this->_html_images); $i++) { - $this->_addHtmlImagePart($ht, $this->_html_images[$i]); - } - } else { - // * Content-Type: multipart/related; - // * html - // * image... - $message =& $this->_addRelatedPart($null); - $this->_addHtmlPart($message); - for ($i = 0; $i < count($this->_html_images); $i++) { - $this->_addHtmlImagePart($message, $this->_html_images[$i]); - } - } - /* - // #13444, #9725: the code below was a non-RFC compliant hack - // * Content-Type: multipart/related; - // * Content-Type: multipart/alternative; - // * text - // * html - // * image... - $message =& $this->_addRelatedPart($null); - if (isset($this->_txtbody)) { - $alt =& $this->_addAlternativePart($message); - $this->_addTextPart($alt, $this->_txtbody); - $this->_addHtmlPart($alt); - } else { - $this->_addHtmlPart($message); - } - for ($i = 0; $i < count($this->_html_images); $i++) { - $this->_addHtmlImagePart($message, $this->_html_images[$i]); - } - */ - break; - - case $html && $attachments && !$html_images: - $message =& $this->_addMixedPart(); - if (isset($this->_txtbody)) { - $alt =& $this->_addAlternativePart($message); - $this->_addTextPart($alt, $this->_txtbody); - $this->_addHtmlPart($alt); - } else { - $this->_addHtmlPart($message); - } - for ($i = 0; $i < count($this->_parts); $i++) { - $this->_addAttachmentPart($message, $this->_parts[$i]); - } - break; - - case $html && $attachments && $html_images: - $message =& $this->_addMixedPart(); - if (isset($this->_txtbody)) { - $alt =& $this->_addAlternativePart($message); - $this->_addTextPart($alt, $this->_txtbody); - $rel =& $this->_addRelatedPart($alt); - } else { - $rel =& $this->_addRelatedPart($message); - } - $this->_addHtmlPart($rel); - for ($i = 0; $i < count($this->_html_images); $i++) { - $this->_addHtmlImagePart($rel, $this->_html_images[$i]); - } - for ($i = 0; $i < count($this->_parts); $i++) { - $this->_addAttachmentPart($message, $this->_parts[$i]); - } - break; - } - - if (!isset($message)) { - return null; - } - - // Use saved boundary - if (!empty($this->_build_params['boundary'])) { - $boundary = $this->_build_params['boundary']; - } else { - $boundary = null; - } - - // Write output to file - if ($filename) { - // Append mimePart message headers and body into file - $headers = $message->encodeToFile($filename, $boundary, $skip_head); - if ($this->_isError($headers)) { - return $headers; - } - $this->_headers = array_merge($this->_headers, $headers); - return null; - } else { - $output = $message->encode($boundary, $skip_head); - if ($this->_isError($output)) { - return $output; - } - $this->_headers = array_merge($this->_headers, $output['headers']); - return $output['body']; - } - } - - /** - * Returns an array with the headers needed to prepend to the email - * (MIME-Version and Content-Type). Format of argument is: - * $array['header-name'] = 'header-value'; - * - * @param array $xtra_headers Assoc array with any extra headers (optional) - * (Don't set Content-Type for multipart messages here!) - * @param bool $overwrite Overwrite already existing headers. - * @param bool $skip_content Don't return content headers: Content-Type, - * Content-Disposition and Content-Transfer-Encoding - * - * @return array Assoc array with the mime headers - * @access public - */ - function headers($xtra_headers = null, $overwrite = false, $skip_content = false) - { - // Add mime version header - $headers['MIME-Version'] = '1.0'; - - // Content-Type and Content-Transfer-Encoding headers should already - // be present if get() was called, but we'll re-set them to make sure - // we got them when called before get() or something in the message - // has been changed after get() [#14780] - if (!$skip_content) { - $headers += $this->_contentHeaders(); - } - - if (!empty($xtra_headers)) { - $headers = array_merge($headers, $xtra_headers); - } - - if ($overwrite) { - $this->_headers = array_merge($this->_headers, $headers); - } else { - $this->_headers = array_merge($headers, $this->_headers); - } - - $headers = $this->_headers; - - if ($skip_content) { - unset($headers['Content-Type']); - unset($headers['Content-Transfer-Encoding']); - unset($headers['Content-Disposition']); - } else if (!empty($this->_build_params['ctype'])) { - $headers['Content-Type'] = $this->_build_params['ctype']; - } - - $encodedHeaders = $this->_encodeHeaders($headers); - return $encodedHeaders; - } - - /** - * Get the text version of the headers - * (usefull if you want to use the PHP mail() function) - * - * @param array $xtra_headers Assoc array with any extra headers (optional) - * (Don't set Content-Type for multipart messages here!) - * @param bool $overwrite Overwrite the existing headers with new. - * @param bool $skip_content Don't return content headers: Content-Type, - * Content-Disposition and Content-Transfer-Encoding - * - * @return string Plain text headers - * @access public - */ - function txtHeaders($xtra_headers = null, $overwrite = false, $skip_content = false) - { - $headers = $this->headers($xtra_headers, $overwrite, $skip_content); - - // Place Received: headers at the beginning of the message - // Spam detectors often flag messages with it after the Subject: as spam - if (isset($headers['Received'])) { - $received = $headers['Received']; - unset($headers['Received']); - $headers = array('Received' => $received) + $headers; - } - - $ret = ''; - $eol = $this->_build_params['eol']; - - foreach ($headers as $key => $val) { - if (is_array($val)) { - foreach ($val as $value) { - $ret .= "$key: $value" . $eol; - } - } else { - $ret .= "$key: $val" . $eol; - } - } - - return $ret; - } - - /** - * Sets message Content-Type header. - * Use it to build messages with various content-types e.g. miltipart/raport - * not supported by _contentHeaders() function. - * - * @param string $type Type name - * @param array $params Hash array of header parameters - * - * @return void - * @access public - * @since 1.7.0 - */ - function setContentType($type, $params = array()) - { - $header = $type; - - $eol = !empty($this->_build_params['eol']) - ? $this->_build_params['eol'] : "\r\n"; - - // add parameters - $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D' - . '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#'; - if (is_array($params)) { - foreach ($params as $name => $value) { - if ($name == 'boundary') { - $this->_build_params['boundary'] = $value; - } - if (!preg_match($token_regexp, $value)) { - $header .= ";$eol $name=$value"; - } else { - $value = addcslashes($value, '\\"'); - $header .= ";$eol $name=\"$value\""; - } - } - } - - // add required boundary parameter if not defined - if (preg_match('/^multipart\//i', $type)) { - if (empty($this->_build_params['boundary'])) { - $this->_build_params['boundary'] = '=_' . md5(rand() . microtime()); - } - - $header .= ";$eol boundary=\"".$this->_build_params['boundary']."\""; - } - - $this->_build_params['ctype'] = $header; - } - - /** - * Sets the Subject header - * - * @param string $subject String to set the subject to. - * - * @return void - * @access public - */ - function setSubject($subject) - { - $this->_headers['Subject'] = $subject; - } - - /** - * Set an email to the From (the sender) header - * - * @param string $email The email address to use - * - * @return void - * @access public - */ - function setFrom($email) - { - $this->_headers['From'] = $email; - } - - /** - * Add an email to the To header - * (multiple calls to this method are allowed) - * - * @param string $email The email direction to add - * - * @return void - * @access public - */ - function addTo($email) - { - if (isset($this->_headers['To'])) { - $this->_headers['To'] .= ", $email"; - } else { - $this->_headers['To'] = $email; - } - } - - /** - * Add an email to the Cc (carbon copy) header - * (multiple calls to this method are allowed) - * - * @param string $email The email direction to add - * - * @return void - * @access public - */ - function addCc($email) - { - if (isset($this->_headers['Cc'])) { - $this->_headers['Cc'] .= ", $email"; - } else { - $this->_headers['Cc'] = $email; - } - } - - /** - * Add an email to the Bcc (blank carbon copy) header - * (multiple calls to this method are allowed) - * - * @param string $email The email direction to add - * - * @return void - * @access public - */ - function addBcc($email) - { - if (isset($this->_headers['Bcc'])) { - $this->_headers['Bcc'] .= ", $email"; - } else { - $this->_headers['Bcc'] = $email; - } - } - - /** - * Since the PHP send function requires you to specify - * recipients (To: header) separately from the other - * headers, the To: header is not properly encoded. - * To fix this, you can use this public method to - * encode your recipients before sending to the send - * function - * - * @param string $recipients A comma-delimited list of recipients - * - * @return string Encoded data - * @access public - */ - function encodeRecipients($recipients) - { - $input = array("To" => $recipients); - $retval = $this->_encodeHeaders($input); - return $retval["To"] ; - } - - /** - * Encodes headers as per RFC2047 - * - * @param array $input The header data to encode - * @param array $params Extra build parameters - * - * @return array Encoded data - * @access private - */ - function _encodeHeaders($input, $params = array()) - { - $build_params = $this->_build_params; - while (list($key, $value) = each($params)) { - $build_params[$key] = $value; - } - - foreach ($input as $hdr_name => $hdr_value) { - if (is_array($hdr_value)) { - foreach ($hdr_value as $idx => $value) { - $input[$hdr_name][$idx] = $this->encodeHeader( - $hdr_name, $value, - $build_params['head_charset'], $build_params['head_encoding'] - ); - } - } else { - $input[$hdr_name] = $this->encodeHeader( - $hdr_name, $hdr_value, - $build_params['head_charset'], $build_params['head_encoding'] - ); - } - } - - return $input; - } - - /** - * Encodes a header as per RFC2047 - * - * @param string $name The header name - * @param string $value The header data to encode - * @param string $charset Character set name - * @param string $encoding Encoding name (base64 or quoted-printable) - * - * @return string Encoded header data (without a name) - * @access public - * @since 1.5.3 - */ - function encodeHeader($name, $value, $charset, $encoding) - { - $mime_part = new Mail_mimePart; - return $mime_part->encodeHeader( - $name, $value, $charset, $encoding, $this->_build_params['eol'] - ); - } - - /** - * Get file's basename (locale independent) - * - * @param string $filename Filename - * - * @return string Basename - * @access private - */ - function _basename($filename) - { - // basename() is not unicode safe and locale dependent - if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) { - return preg_replace('/^.*[\\\\\\/]/', '', $filename); - } else { - return preg_replace('/^.*[\/]/', '', $filename); - } - } - - /** - * Get Content-Type and Content-Transfer-Encoding headers of the message - * - * @return array Headers array - * @access private - */ - function _contentHeaders() - { - $attachments = count($this->_parts) ? true : false; - $html_images = count($this->_html_images) ? true : false; - $html = strlen($this->_htmlbody) ? true : false; - $text = (!$html && strlen($this->_txtbody)) ? true : false; - $headers = array(); - - // See get() - switch (true) { - case $text && !$attachments: - $headers['Content-Type'] = 'text/plain'; - break; - - case !$text && !$html && $attachments: - case $text && $attachments: - case $html && $attachments && !$html_images: - case $html && $attachments && $html_images: - $headers['Content-Type'] = 'multipart/mixed'; - break; - - case $html && !$attachments && !$html_images && isset($this->_txtbody): - case $html && !$attachments && $html_images && isset($this->_txtbody): - $headers['Content-Type'] = 'multipart/alternative'; - break; - - case $html && !$attachments && !$html_images && !isset($this->_txtbody): - $headers['Content-Type'] = 'text/html'; - break; - - case $html && !$attachments && $html_images && !isset($this->_txtbody): - $headers['Content-Type'] = 'multipart/related'; - break; - - default: - return $headers; - } - - $this->_checkParams(); - - $eol = !empty($this->_build_params['eol']) - ? $this->_build_params['eol'] : "\r\n"; - - if ($headers['Content-Type'] == 'text/plain') { - // single-part message: add charset and encoding - if ($this->_build_params['text_charset']) { - $charset = 'charset=' . $this->_build_params['text_charset']; - // place charset parameter in the same line, if possible - // 26 = strlen("Content-Type: text/plain; ") - $headers['Content-Type'] - .= (strlen($charset) + 26 <= 76) ? "; $charset" : ";$eol $charset"; - } - - $headers['Content-Transfer-Encoding'] - = $this->_build_params['text_encoding']; - } else if ($headers['Content-Type'] == 'text/html') { - // single-part message: add charset and encoding - if ($this->_build_params['html_charset']) { - $charset = 'charset=' . $this->_build_params['html_charset']; - // place charset parameter in the same line, if possible - $headers['Content-Type'] - .= (strlen($charset) + 25 <= 76) ? "; $charset" : ";$eol $charset"; - } - $headers['Content-Transfer-Encoding'] - = $this->_build_params['html_encoding']; - } else { - // multipart message: and boundary - if (!empty($this->_build_params['boundary'])) { - $boundary = $this->_build_params['boundary']; - } else if (!empty($this->_headers['Content-Type']) - && preg_match('/boundary="([^"]+)"/', $this->_headers['Content-Type'], $m) - ) { - $boundary = $m[1]; - } else { - $boundary = '=_' . md5(rand() . microtime()); - } - - $this->_build_params['boundary'] = $boundary; - $headers['Content-Type'] .= ";$eol boundary=\"$boundary\""; - } - - return $headers; - } - - /** - * Validate and set build parameters - * - * @return void - * @access private - */ - function _checkParams() - { - $encodings = array('7bit', '8bit', 'base64', 'quoted-printable'); - - $this->_build_params['text_encoding'] - = strtolower($this->_build_params['text_encoding']); - $this->_build_params['html_encoding'] - = strtolower($this->_build_params['html_encoding']); - - if (!in_array($this->_build_params['text_encoding'], $encodings)) { - $this->_build_params['text_encoding'] = '7bit'; - } - if (!in_array($this->_build_params['html_encoding'], $encodings)) { - $this->_build_params['html_encoding'] = '7bit'; - } - - // text body - if ($this->_build_params['text_encoding'] == '7bit' - && !preg_match('/ascii/i', $this->_build_params['text_charset']) - && preg_match('/[^\x00-\x7F]/', $this->_txtbody) - ) { - $this->_build_params['text_encoding'] = 'quoted-printable'; - } - // html body - if ($this->_build_params['html_encoding'] == '7bit' - && !preg_match('/ascii/i', $this->_build_params['html_charset']) - && preg_match('/[^\x00-\x7F]/', $this->_htmlbody) - ) { - $this->_build_params['html_encoding'] = 'quoted-printable'; - } - } - - /** - * PEAR::isError implementation - * - * @param mixed $data Object - * - * @return bool True if object is an instance of PEAR_Error - * @access private - */ - function _isError($data) - { - // PEAR::isError() is not PHP 5.4 compatible (see Bug #19473) - if (is_object($data) && is_a($data, 'PEAR_Error')) { - return true; - } - - return false; - } - - /** - * PEAR::raiseError implementation - * - * @param $message A text error message - * - * @return PEAR_Error Instance of PEAR_Error - * @access private - */ - function _raiseError($message) - { - // PEAR::raiseError() is not PHP 5.4 compatible - return new PEAR_Error($message); - } - -} // End of class diff --git a/program/lib/Mail/mimeDecode.php b/program/lib/Mail/mimeDecode.php deleted file mode 100644 index 9f4589441..000000000 --- a/program/lib/Mail/mimeDecode.php +++ /dev/null @@ -1,1003 +0,0 @@ - - * Copyright (c) 2003-2006, PEAR - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - Neither the name of the authors, nor the names of its contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Mail - * @package Mail_Mime - * @author Richard Heyes - * @author George Schlossnagle - * @author Cipriano Groenendal - * @author Sean Coates - * @copyright 2003-2006 PEAR - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version CVS: $Id: mimeDecode.php 305875 2010-12-01 07:17:10Z alan_k $ - * @link http://pear.php.net/package/Mail_mime - */ - - -/** - * require PEAR - * - * This package depends on PEAR to raise errors. - */ -require_once 'PEAR.php'; - - -/** - * The Mail_mimeDecode class is used to decode mail/mime messages - * - * This class will parse a raw mime email and return the structure. - * Returned structure is similar to that returned by imap_fetchstructure(). - * - * +----------------------------- IMPORTANT ------------------------------+ - * | Usage of this class compared to native php extensions such as | - * | mailparse or imap, is slow and may be feature deficient. If available| - * | you are STRONGLY recommended to use the php extensions. | - * +----------------------------------------------------------------------+ - * - * @category Mail - * @package Mail_Mime - * @author Richard Heyes - * @author George Schlossnagle - * @author Cipriano Groenendal - * @author Sean Coates - * @copyright 2003-2006 PEAR - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version Release: 1.5.5 - * @link http://pear.php.net/package/Mail_mime - */ -class Mail_mimeDecode extends PEAR -{ - /** - * The raw email to decode - * - * @var string - * @access private - */ - var $_input; - - /** - * The header part of the input - * - * @var string - * @access private - */ - var $_header; - - /** - * The body part of the input - * - * @var string - * @access private - */ - var $_body; - - /** - * If an error occurs, this is used to store the message - * - * @var string - * @access private - */ - var $_error; - - /** - * Flag to determine whether to include bodies in the - * returned object. - * - * @var boolean - * @access private - */ - var $_include_bodies; - - /** - * Flag to determine whether to decode bodies - * - * @var boolean - * @access private - */ - var $_decode_bodies; - - /** - * Flag to determine whether to decode headers - * - * @var boolean - * @access private - */ - var $_decode_headers; - - /** - * Flag to determine whether to include attached messages - * as body in the returned object. Depends on $_include_bodies - * - * @var boolean - * @access private - */ - var $_rfc822_bodies; - - /** - * Constructor. - * - * Sets up the object, initialise the variables, and splits and - * stores the header and body of the input. - * - * @param string The input to decode - * @access public - */ - function Mail_mimeDecode($input) - { - list($header, $body) = $this->_splitBodyHeader($input); - - $this->_input = $input; - $this->_header = $header; - $this->_body = $body; - $this->_decode_bodies = false; - $this->_include_bodies = true; - $this->_rfc822_bodies = false; - } - - /** - * Begins the decoding process. If called statically - * it will create an object and call the decode() method - * of it. - * - * @param array An array of various parameters that determine - * various things: - * include_bodies - Whether to include the body in the returned - * object. - * decode_bodies - Whether to decode the bodies - * of the parts. (Transfer encoding) - * decode_headers - Whether to decode headers - * input - If called statically, this will be treated - * as the input - * @return object Decoded results - * @access public - */ - function decode($params = null) - { - // determine if this method has been called statically - $isStatic = empty($this) || !is_a($this, __CLASS__); - - // Have we been called statically? - // If so, create an object and pass details to that. - if ($isStatic AND isset($params['input'])) { - - $obj = new Mail_mimeDecode($params['input']); - $structure = $obj->decode($params); - - // Called statically but no input - } elseif ($isStatic) { - return PEAR::raiseError('Called statically and no input given'); - - // Called via an object - } else { - $this->_include_bodies = isset($params['include_bodies']) ? - $params['include_bodies'] : false; - $this->_decode_bodies = isset($params['decode_bodies']) ? - $params['decode_bodies'] : false; - $this->_decode_headers = isset($params['decode_headers']) ? - $params['decode_headers'] : false; - $this->_rfc822_bodies = isset($params['rfc_822bodies']) ? - $params['rfc_822bodies'] : false; - - $structure = $this->_decode($this->_header, $this->_body); - if ($structure === false) { - $structure = $this->raiseError($this->_error); - } - } - - return $structure; - } - - /** - * Performs the decoding. Decodes the body string passed to it - * If it finds certain content-types it will call itself in a - * recursive fashion - * - * @param string Header section - * @param string Body section - * @return object Results of decoding process - * @access private - */ - function _decode($headers, $body, $default_ctype = 'text/plain') - { - $return = new stdClass; - $return->headers = array(); - $headers = $this->_parseHeaders($headers); - - foreach ($headers as $value) { - $value['value'] = $this->_decode_headers ? $this->_decodeHeader($value['value']) : $value['value']; - if (isset($return->headers[strtolower($value['name'])]) AND !is_array($return->headers[strtolower($value['name'])])) { - $return->headers[strtolower($value['name'])] = array($return->headers[strtolower($value['name'])]); - $return->headers[strtolower($value['name'])][] = $value['value']; - - } elseif (isset($return->headers[strtolower($value['name'])])) { - $return->headers[strtolower($value['name'])][] = $value['value']; - - } else { - $return->headers[strtolower($value['name'])] = $value['value']; - } - } - - - foreach ($headers as $key => $value) { - $headers[$key]['name'] = strtolower($headers[$key]['name']); - switch ($headers[$key]['name']) { - - case 'content-type': - $content_type = $this->_parseHeaderValue($headers[$key]['value']); - - if (preg_match('/([0-9a-z+.-]+)\/([0-9a-z+.-]+)/i', $content_type['value'], $regs)) { - $return->ctype_primary = $regs[1]; - $return->ctype_secondary = $regs[2]; - } - - if (isset($content_type['other'])) { - foreach($content_type['other'] as $p_name => $p_value) { - $return->ctype_parameters[$p_name] = $p_value; - } - } - break; - - case 'content-disposition': - $content_disposition = $this->_parseHeaderValue($headers[$key]['value']); - $return->disposition = $content_disposition['value']; - if (isset($content_disposition['other'])) { - foreach($content_disposition['other'] as $p_name => $p_value) { - $return->d_parameters[$p_name] = $p_value; - } - } - break; - - case 'content-transfer-encoding': - $content_transfer_encoding = $this->_parseHeaderValue($headers[$key]['value']); - break; - } - } - - if (isset($content_type)) { - switch (strtolower($content_type['value'])) { - case 'text/plain': - $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit'; - $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null; - break; - - case 'text/html': - $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit'; - $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null; - break; - - case 'multipart/parallel': - case 'multipart/appledouble': // Appledouble mail - case 'multipart/report': // RFC1892 - case 'multipart/signed': // PGP - case 'multipart/digest': - case 'multipart/alternative': - case 'multipart/related': - case 'multipart/mixed': - case 'application/vnd.wap.multipart.related': - if(!isset($content_type['other']['boundary'])){ - $this->_error = 'No boundary found for ' . $content_type['value'] . ' part'; - return false; - } - - $default_ctype = (strtolower($content_type['value']) === 'multipart/digest') ? 'message/rfc822' : 'text/plain'; - - $parts = $this->_boundarySplit($body, $content_type['other']['boundary']); - for ($i = 0; $i < count($parts); $i++) { - list($part_header, $part_body) = $this->_splitBodyHeader($parts[$i]); - $part = $this->_decode($part_header, $part_body, $default_ctype); - if($part === false) - $part = $this->raiseError($this->_error); - $return->parts[] = $part; - } - break; - - case 'message/rfc822': - if ($this->_rfc822_bodies) { - $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit'; - $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body); - } - $obj = new Mail_mimeDecode($body); - $return->parts[] = $obj->decode(array('include_bodies' => $this->_include_bodies, - 'decode_bodies' => $this->_decode_bodies, - 'decode_headers' => $this->_decode_headers)); - unset($obj); - break; - - default: - if(!isset($content_transfer_encoding['value'])) - $content_transfer_encoding['value'] = '7bit'; - $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $content_transfer_encoding['value']) : $body) : null; - break; - } - - } else { - $ctype = explode('/', $default_ctype); - $return->ctype_primary = $ctype[0]; - $return->ctype_secondary = $ctype[1]; - $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body) : $body) : null; - } - - return $return; - } - - /** - * Given the output of the above function, this will return an - * array of references to the parts, indexed by mime number. - * - * @param object $structure The structure to go through - * @param string $mime_number Internal use only. - * @return array Mime numbers - */ - function &getMimeNumbers(&$structure, $no_refs = false, $mime_number = '', $prepend = '') - { - $return = array(); - if (!empty($structure->parts)) { - if ($mime_number != '') { - $structure->mime_id = $prepend . $mime_number; - $return[$prepend . $mime_number] = &$structure; - } - for ($i = 0; $i < count($structure->parts); $i++) { - - - if (!empty($structure->headers['content-type']) AND substr(strtolower($structure->headers['content-type']), 0, 8) == 'message/') { - $prepend = $prepend . $mime_number . '.'; - $_mime_number = ''; - } else { - $_mime_number = ($mime_number == '' ? $i + 1 : sprintf('%s.%s', $mime_number, $i + 1)); - } - - $arr = &Mail_mimeDecode::getMimeNumbers($structure->parts[$i], $no_refs, $_mime_number, $prepend); - foreach ($arr as $key => $val) { - $no_refs ? $return[$key] = '' : $return[$key] = &$arr[$key]; - } - } - } else { - if ($mime_number == '') { - $mime_number = '1'; - } - $structure->mime_id = $prepend . $mime_number; - $no_refs ? $return[$prepend . $mime_number] = '' : $return[$prepend . $mime_number] = &$structure; - } - - return $return; - } - - /** - * Given a string containing a header and body - * section, this function will split them (at the first - * blank line) and return them. - * - * @param string Input to split apart - * @return array Contains header and body section - * @access private - */ - function _splitBodyHeader($input) - { - if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) { - return array($match[1], $match[2]); - } - // bug #17325 - empty bodies are allowed. - we just check that at least one line - // of headers exist.. - if (count(explode("\n",$input))) { - return array($input, ''); - } - $this->_error = 'Could not split header and body'; - return false; - } - - /** - * Parse headers given in $input and return - * as assoc array. - * - * @param string Headers to parse - * @return array Contains parsed headers - * @access private - */ - function _parseHeaders($input) - { - - if ($input !== '') { - // Unfold the input - $input = preg_replace("/\r?\n/", "\r\n", $input); - //#7065 - wrapping.. with encoded stuff.. - probably not needed, - // wrapping space should only get removed if the trailing item on previous line is a - // encoded character - $input = preg_replace("/=\r\n(\t| )+/", '=', $input); - $input = preg_replace("/\r\n(\t| )+/", ' ', $input); - - $headers = explode("\r\n", trim($input)); - - foreach ($headers as $value) { - $hdr_name = substr($value, 0, $pos = strpos($value, ':')); - $hdr_value = substr($value, $pos+1); - if($hdr_value[0] == ' ') - $hdr_value = substr($hdr_value, 1); - - $return[] = array( - 'name' => $hdr_name, - 'value' => $hdr_value - ); - } - } else { - $return = array(); - } - - return $return; - } - - /** - * Function to parse a header value, - * extract first part, and any secondary - * parts (after ;) This function is not as - * robust as it could be. Eg. header comments - * in the wrong place will probably break it. - * - * @param string Header value to parse - * @return array Contains parsed result - * @access private - */ - function _parseHeaderValue($input) - { - - if (($pos = strpos($input, ';')) === false) { - $input = $this->_decode_headers ? $this->_decodeHeader($input) : $input; - $return['value'] = trim($input); - return $return; - } - - - - $value = substr($input, 0, $pos); - $value = $this->_decode_headers ? $this->_decodeHeader($value) : $value; - $return['value'] = trim($value); - $input = trim(substr($input, $pos+1)); - - if (!strlen($input) > 0) { - return $return; - } - // at this point input contains xxxx=".....";zzzz="...." - // since we are dealing with quoted strings, we need to handle this properly.. - $i = 0; - $l = strlen($input); - $key = ''; - $val = false; // our string - including quotes.. - $q = false; // in quote.. - $lq = ''; // last quote.. - - while ($i < $l) { - - $c = $input[$i]; - //var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val)); - - $escaped = false; - if ($c == '\\') { - $i++; - if ($i == $l-1) { // end of string. - break; - } - $escaped = true; - $c = $input[$i]; - } - - - // state - in key.. - if ($val === false) { - if (!$escaped && $c == '=') { - $val = ''; - $key = trim($key); - $i++; - continue; - } - if (!$escaped && $c == ';') { - if ($key) { // a key without a value.. - $key= trim($key); - $return['other'][$key] = ''; - $return['other'][strtolower($key)] = ''; - } - $key = ''; - } - $key .= $c; - $i++; - continue; - } - - // state - in value.. (as $val is set..) - - if ($q === false) { - // not in quote yet. - if ((!strlen($val) || $lq !== false) && $c == ' ' || $c == "\t") { - $i++; - continue; // skip leading spaces after '=' or after '"' - } - if (!$escaped && ($c == '"' || $c == "'")) { - // start quoted area.. - $q = $c; - // in theory should not happen raw text in value part.. - // but we will handle it as a merged part of the string.. - $val = !strlen(trim($val)) ? '' : trim($val); - $i++; - continue; - } - // got end.... - if (!$escaped && $c == ';') { - - $val = trim($val); - $added = false; - if (preg_match('/\*[0-9]+$/', $key)) { - // this is the extended aaa*0=...;aaa*1=.... code - // it assumes the pieces arrive in order, and are valid... - $key = preg_replace('/\*[0-9]+$/', '', $key); - if (isset($return['other'][$key])) { - $return['other'][$key] .= $val; - if (strtolower($key) != $key) { - $return['other'][strtolower($key)] .= $val; - } - $added = true; - } - // continue and use standard setters.. - } - if (!$added) { - $return['other'][$key] = $val; - $return['other'][strtolower($key)] = $val; - } - $val = false; - $key = ''; - $lq = false; - $i++; - continue; - } - - $val .= $c; - $i++; - continue; - } - - // state - in quote.. - if (!$escaped && $c == $q) { // potential exit state.. - - // end of quoted string.. - $lq = $q; - $q = false; - $i++; - continue; - } - - // normal char inside of quoted string.. - $val.= $c; - $i++; - } - - // do we have anything left.. - if (strlen(trim($key)) || $val !== false) { - - $val = trim($val); - $added = false; - if ($val !== false && preg_match('/\*[0-9]+$/', $key)) { - // no dupes due to our crazy regexp. - $key = preg_replace('/\*[0-9]+$/', '', $key); - if (isset($return['other'][$key])) { - $return['other'][$key] .= $val; - if (strtolower($key) != $key) { - $return['other'][strtolower($key)] .= $val; - } - $added = true; - } - // continue and use standard setters.. - } - if (!$added) { - $return['other'][$key] = $val; - $return['other'][strtolower($key)] = $val; - } - } - // decode values. - foreach($return['other'] as $key =>$val) { - $return['other'][$key] = $this->_decode_headers ? $this->_decodeHeader($val) : $val; - } - //print_r($return); - return $return; - } - - /** - * This function splits the input based - * on the given boundary - * - * @param string Input to parse - * @return array Contains array of resulting mime parts - * @access private - */ - function _boundarySplit($input, $boundary) - { - $parts = array(); - - $bs_possible = substr($boundary, 2, -2); - $bs_check = '\"' . $bs_possible . '\"'; - - if ($boundary == $bs_check) { - $boundary = $bs_possible; - } - $tmp = preg_split("/--".preg_quote($boundary, '/')."((?=\s)|--)/", $input); - - $len = count($tmp) -1; - for ($i = 1; $i < $len; $i++) { - if (strlen(trim($tmp[$i]))) { - $parts[] = $tmp[$i]; - } - } - - // add the last part on if it does not end with the 'closing indicator' - if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') { - $parts[] = $tmp[$len]; - } - return $parts; - } - - /** - * Given a header, this function will decode it - * according to RFC2047. Probably not *exactly* - * conformant, but it does pass all the given - * examples (in RFC2047). - * - * @param string Input header value to decode - * @return string Decoded header value - * @access private - */ - function _decodeHeader($input) - { - // Remove white space between encoded-words - $input = preg_replace('/(=\?[^?]+\?(q|b)\?[^?]*\?=)(\s)+=\?/i', '\1=?', $input); - - // For each encoded-word... - while (preg_match('/(=\?([^?]+)\?(q|b)\?([^?]*)\?=)/i', $input, $matches)) { - - $encoded = $matches[1]; - $charset = $matches[2]; - $encoding = $matches[3]; - $text = $matches[4]; - - switch (strtolower($encoding)) { - case 'b': - $text = base64_decode($text); - break; - - case 'q': - $text = str_replace('_', ' ', $text); - preg_match_all('/=([a-f0-9]{2})/i', $text, $matches); - foreach($matches[1] as $value) - $text = str_replace('='.$value, chr(hexdec($value)), $text); - break; - } - - $input = str_replace($encoded, $text, $input); - } - - return $input; - } - - /** - * Given a body string and an encoding type, - * this function will decode and return it. - * - * @param string Input body to decode - * @param string Encoding type to use. - * @return string Decoded body - * @access private - */ - function _decodeBody($input, $encoding = '7bit') - { - switch (strtolower($encoding)) { - case '7bit': - return $input; - break; - - case 'quoted-printable': - return $this->_quotedPrintableDecode($input); - break; - - case 'base64': - return base64_decode($input); - break; - - default: - return $input; - } - } - - /** - * Given a quoted-printable string, this - * function will decode and return it. - * - * @param string Input body to decode - * @return string Decoded body - * @access private - */ - function _quotedPrintableDecode($input) - { - // Remove soft line breaks - $input = preg_replace("/=\r?\n/", '', $input); - - // Replace encoded characters - $input = preg_replace('/=([a-f0-9]{2})/ie', "chr(hexdec('\\1'))", $input); - - return $input; - } - - /** - * Checks the input for uuencoded files and returns - * an array of them. Can be called statically, eg: - * - * $files =& Mail_mimeDecode::uudecode($some_text); - * - * It will check for the begin 666 ... end syntax - * however and won't just blindly decode whatever you - * pass it. - * - * @param string Input body to look for attahcments in - * @return array Decoded bodies, filenames and permissions - * @access public - * @author Unknown - */ - function &uudecode($input) - { - // Find all uuencoded sections - preg_match_all("/begin ([0-7]{3}) (.+)\r?\n(.+)\r?\nend/Us", $input, $matches); - - for ($j = 0; $j < count($matches[3]); $j++) { - - $str = $matches[3][$j]; - $filename = $matches[2][$j]; - $fileperm = $matches[1][$j]; - - $file = ''; - $str = preg_split("/\r?\n/", trim($str)); - $strlen = count($str); - - for ($i = 0; $i < $strlen; $i++) { - $pos = 1; - $d = 0; - $len=(int)(((ord(substr($str[$i],0,1)) -32) - ' ') & 077); - - while (($d + 3 <= $len) AND ($pos + 4 <= strlen($str[$i]))) { - $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20); - $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20); - $c2 = (ord(substr($str[$i],$pos+2,1)) ^ 0x20); - $c3 = (ord(substr($str[$i],$pos+3,1)) ^ 0x20); - $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4)); - - $file .= chr(((($c1 - ' ') & 077) << 4) | ((($c2 - ' ') & 077) >> 2)); - - $file .= chr(((($c2 - ' ') & 077) << 6) | (($c3 - ' ') & 077)); - - $pos += 4; - $d += 3; - } - - if (($d + 2 <= $len) && ($pos + 3 <= strlen($str[$i]))) { - $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20); - $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20); - $c2 = (ord(substr($str[$i],$pos+2,1)) ^ 0x20); - $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4)); - - $file .= chr(((($c1 - ' ') & 077) << 4) | ((($c2 - ' ') & 077) >> 2)); - - $pos += 3; - $d += 2; - } - - if (($d + 1 <= $len) && ($pos + 2 <= strlen($str[$i]))) { - $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20); - $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20); - $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4)); - - } - } - $files[] = array('filename' => $filename, 'fileperm' => $fileperm, 'filedata' => $file); - } - - return $files; - } - - /** - * getSendArray() returns the arguments required for Mail::send() - * used to build the arguments for a mail::send() call - * - * Usage: - * $mailtext = Full email (for example generated by a template) - * $decoder = new Mail_mimeDecode($mailtext); - * $parts = $decoder->getSendArray(); - * if (!PEAR::isError($parts) { - * list($recipents,$headers,$body) = $parts; - * $mail = Mail::factory('smtp'); - * $mail->send($recipents,$headers,$body); - * } else { - * echo $parts->message; - * } - * @return mixed array of recipeint, headers,body or Pear_Error - * @access public - * @author Alan Knowles - */ - function getSendArray() - { - // prevent warning if this is not set - $this->_decode_headers = FALSE; - $headerlist =$this->_parseHeaders($this->_header); - $to = ""; - if (!$headerlist) { - return $this->raiseError("Message did not contain headers"); - } - foreach($headerlist as $item) { - $header[$item['name']] = $item['value']; - switch (strtolower($item['name'])) { - case "to": - case "cc": - case "bcc": - $to .= ",".$item['value']; - default: - break; - } - } - if ($to == "") { - return $this->raiseError("Message did not contain any recipents"); - } - $to = substr($to,1); - return array($to,$header,$this->_body); - } - - /** - * Returns a xml copy of the output of - * Mail_mimeDecode::decode. Pass the output in as the - * argument. This function can be called statically. Eg: - * - * $output = $obj->decode(); - * $xml = Mail_mimeDecode::getXML($output); - * - * The DTD used for this should have been in the package. Or - * alternatively you can get it from cvs, or here: - * http://www.phpguru.org/xmail/xmail.dtd. - * - * @param object Input to convert to xml. This should be the - * output of the Mail_mimeDecode::decode function - * @return string XML version of input - * @access public - */ - function getXML($input) - { - $crlf = "\r\n"; - $output = '' . $crlf . - '' . $crlf . - '' . $crlf . - Mail_mimeDecode::_getXML($input) . - ''; - - return $output; - } - - /** - * Function that does the actual conversion to xml. Does a single - * mimepart at a time. - * - * @param object Input to convert to xml. This is a mimepart object. - * It may or may not contain subparts. - * @param integer Number of tabs to indent - * @return string XML version of input - * @access private - */ - function _getXML($input, $indent = 1) - { - $htab = "\t"; - $crlf = "\r\n"; - $output = ''; - $headers = @(array)$input->headers; - - foreach ($headers as $hdr_name => $hdr_value) { - - // Multiple headers with this name - if (is_array($headers[$hdr_name])) { - for ($i = 0; $i < count($hdr_value); $i++) { - $output .= Mail_mimeDecode::_getXML_helper($hdr_name, $hdr_value[$i], $indent); - } - - // Only one header of this sort - } else { - $output .= Mail_mimeDecode::_getXML_helper($hdr_name, $hdr_value, $indent); - } - } - - if (!empty($input->parts)) { - for ($i = 0; $i < count($input->parts); $i++) { - $output .= $crlf . str_repeat($htab, $indent) . '' . $crlf . - Mail_mimeDecode::_getXML($input->parts[$i], $indent+1) . - str_repeat($htab, $indent) . '' . $crlf; - } - } elseif (isset($input->body)) { - $output .= $crlf . str_repeat($htab, $indent) . 'body . ']]>' . $crlf; - } - - return $output; - } - - /** - * Helper function to _getXML(). Returns xml of a header. - * - * @param string Name of header - * @param string Value of header - * @param integer Number of tabs to indent - * @return string XML version of input - * @access private - */ - function _getXML_helper($hdr_name, $hdr_value, $indent) - { - $htab = "\t"; - $crlf = "\r\n"; - $return = ''; - - $new_hdr_value = ($hdr_name != 'received') ? Mail_mimeDecode::_parseHeaderValue($hdr_value) : array('value' => $hdr_value); - $new_hdr_name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $hdr_name))); - - // Sort out any parameters - if (!empty($new_hdr_value['other'])) { - foreach ($new_hdr_value['other'] as $paramname => $paramvalue) { - $params[] = str_repeat($htab, $indent) . $htab . '' . $crlf . - str_repeat($htab, $indent) . $htab . $htab . '' . htmlspecialchars($paramname) . '' . $crlf . - str_repeat($htab, $indent) . $htab . $htab . '' . htmlspecialchars($paramvalue) . '' . $crlf . - str_repeat($htab, $indent) . $htab . '' . $crlf; - } - - $params = implode('', $params); - } else { - $params = ''; - } - - $return = str_repeat($htab, $indent) . '
    ' . $crlf . - str_repeat($htab, $indent) . $htab . '' . htmlspecialchars($new_hdr_name) . '' . $crlf . - str_repeat($htab, $indent) . $htab . '' . htmlspecialchars($new_hdr_value['value']) . '' . $crlf . - $params . - str_repeat($htab, $indent) . '
    ' . $crlf; - - return $return; - } - -} // End of class diff --git a/program/lib/Mail/mimePart.php b/program/lib/Mail/mimePart.php deleted file mode 100644 index 93e891bc6..000000000 --- a/program/lib/Mail/mimePart.php +++ /dev/null @@ -1,1260 +0,0 @@ - - * Copyright (c) 2003-2006, PEAR - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - Neither the name of the authors, nor the names of its contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Mail - * @package Mail_Mime - * @author Richard Heyes - * @author Cipriano Groenendal - * @author Sean Coates - * @author Aleksander Machniak - * @copyright 2003-2006 PEAR - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version CVS: $Id$ - * @link http://pear.php.net/package/Mail_mime - */ - - -/** - * The Mail_mimePart class is used to create MIME E-mail messages - * - * This class enables you to manipulate and build a mime email - * from the ground up. The Mail_Mime class is a userfriendly api - * to this class for people who aren't interested in the internals - * of mime mail. - * This class however allows full control over the email. - * - * @category Mail - * @package Mail_Mime - * @author Richard Heyes - * @author Cipriano Groenendal - * @author Sean Coates - * @author Aleksander Machniak - * @copyright 2003-2006 PEAR - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version Release: @package_version@ - * @link http://pear.php.net/package/Mail_mime - */ -class Mail_mimePart -{ - /** - * The encoding type of this part - * - * @var string - * @access private - */ - var $_encoding; - - /** - * An array of subparts - * - * @var array - * @access private - */ - var $_subparts; - - /** - * The output of this part after being built - * - * @var string - * @access private - */ - var $_encoded; - - /** - * Headers for this part - * - * @var array - * @access private - */ - var $_headers; - - /** - * The body of this part (not encoded) - * - * @var string - * @access private - */ - var $_body; - - /** - * The location of file with body of this part (not encoded) - * - * @var string - * @access private - */ - var $_body_file; - - /** - * The end-of-line sequence - * - * @var string - * @access private - */ - var $_eol = "\r\n"; - - - /** - * Constructor. - * - * Sets up the object. - * - * @param string $body The body of the mime part if any. - * @param array $params An associative array of optional parameters: - * content_type - The content type for this part eg multipart/mixed - * encoding - The encoding to use, 7bit, 8bit, - * base64, or quoted-printable - * charset - Content character set - * cid - Content ID to apply - * disposition - Content disposition, inline or attachment - * filename - Filename parameter for content disposition - * description - Content description - * name_encoding - Encoding of the attachment name (Content-Type) - * By default filenames are encoded using RFC2231 - * Here you can set RFC2047 encoding (quoted-printable - * or base64) instead - * filename_encoding - Encoding of the attachment filename (Content-Disposition) - * See 'name_encoding' - * headers_charset - Charset of the headers e.g. filename, description. - * If not set, 'charset' will be used - * eol - End of line sequence. Default: "\r\n" - * headers - Hash array with additional part headers. Array keys can be - * in form of : - * body_file - Location of file with part's body (instead of $body) - * - * @access public - */ - function Mail_mimePart($body = '', $params = array()) - { - if (!empty($params['eol'])) { - $this->_eol = $params['eol']; - } else if (defined('MAIL_MIMEPART_CRLF')) { // backward-copat. - $this->_eol = MAIL_MIMEPART_CRLF; - } - - // Additional part headers - if (!empty($params['headers']) && is_array($params['headers'])) { - $headers = $params['headers']; - } - - foreach ($params as $key => $value) { - switch ($key) { - case 'encoding': - $this->_encoding = $value; - $headers['Content-Transfer-Encoding'] = $value; - break; - - case 'cid': - $headers['Content-ID'] = '<' . $value . '>'; - break; - - case 'location': - $headers['Content-Location'] = $value; - break; - - case 'body_file': - $this->_body_file = $value; - break; - - // for backward compatibility - case 'dfilename': - $params['filename'] = $value; - break; - } - } - - // Default content-type - if (empty($params['content_type'])) { - $params['content_type'] = 'text/plain'; - } - - // Content-Type - $headers['Content-Type'] = $params['content_type']; - if (!empty($params['charset'])) { - $charset = "charset={$params['charset']}"; - // place charset parameter in the same line, if possible - if ((strlen($headers['Content-Type']) + strlen($charset) + 16) <= 76) { - $headers['Content-Type'] .= '; '; - } else { - $headers['Content-Type'] .= ';' . $this->_eol . ' '; - } - $headers['Content-Type'] .= $charset; - - // Default headers charset - if (!isset($params['headers_charset'])) { - $params['headers_charset'] = $params['charset']; - } - } - - // header values encoding parameters - $h_charset = !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII'; - $h_language = !empty($params['language']) ? $params['language'] : null; - $h_encoding = !empty($params['name_encoding']) ? $params['name_encoding'] : null; - - - if (!empty($params['filename'])) { - $headers['Content-Type'] .= ';' . $this->_eol; - $headers['Content-Type'] .= $this->_buildHeaderParam( - 'name', $params['filename'], $h_charset, $h_language, $h_encoding - ); - } - - // Content-Disposition - if (!empty($params['disposition'])) { - $headers['Content-Disposition'] = $params['disposition']; - if (!empty($params['filename'])) { - $headers['Content-Disposition'] .= ';' . $this->_eol; - $headers['Content-Disposition'] .= $this->_buildHeaderParam( - 'filename', $params['filename'], $h_charset, $h_language, - !empty($params['filename_encoding']) ? $params['filename_encoding'] : null - ); - } - - // add attachment size - $size = $this->_body_file ? filesize($this->_body_file) : strlen($body); - if ($size) { - $headers['Content-Disposition'] .= ';' . $this->_eol . ' size=' . $size; - } - } - - if (!empty($params['description'])) { - $headers['Content-Description'] = $this->encodeHeader( - 'Content-Description', $params['description'], $h_charset, $h_encoding, - $this->_eol - ); - } - - // Search and add existing headers' parameters - foreach ($headers as $key => $value) { - $items = explode(':', $key); - if (count($items) == 2) { - $header = $items[0]; - $param = $items[1]; - if (isset($headers[$header])) { - $headers[$header] .= ';' . $this->_eol; - } - $headers[$header] .= $this->_buildHeaderParam( - $param, $value, $h_charset, $h_language, $h_encoding - ); - unset($headers[$key]); - } - } - - // Default encoding - if (!isset($this->_encoding)) { - $this->_encoding = '7bit'; - } - - // Assign stuff to member variables - $this->_encoded = array(); - $this->_headers = $headers; - $this->_body = $body; - } - - /** - * Encodes and returns the email. Also stores - * it in the encoded member variable - * - * @param string $boundary Pre-defined boundary string - * - * @return An associative array containing two elements, - * body and headers. The headers element is itself - * an indexed array. On error returns PEAR error object. - * @access public - */ - function encode($boundary=null) - { - $encoded =& $this->_encoded; - - if (count($this->_subparts)) { - $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime()); - $eol = $this->_eol; - - $this->_headers['Content-Type'] .= ";$eol boundary=\"$boundary\""; - - $encoded['body'] = ''; - - for ($i = 0; $i < count($this->_subparts); $i++) { - $encoded['body'] .= '--' . $boundary . $eol; - $tmp = $this->_subparts[$i]->encode(); - if ($this->_isError($tmp)) { - return $tmp; - } - foreach ($tmp['headers'] as $key => $value) { - $encoded['body'] .= $key . ': ' . $value . $eol; - } - $encoded['body'] .= $eol . $tmp['body'] . $eol; - } - - $encoded['body'] .= '--' . $boundary . '--' . $eol; - - } else if ($this->_body) { - $encoded['body'] = $this->_getEncodedData($this->_body, $this->_encoding); - } else if ($this->_body_file) { - // Temporarily reset magic_quotes_runtime for file reads and writes - if ($magic_quote_setting = get_magic_quotes_runtime()) { - @ini_set('magic_quotes_runtime', 0); - } - $body = $this->_getEncodedDataFromFile($this->_body_file, $this->_encoding); - if ($magic_quote_setting) { - @ini_set('magic_quotes_runtime', $magic_quote_setting); - } - - if ($this->_isError($body)) { - return $body; - } - $encoded['body'] = $body; - } else { - $encoded['body'] = ''; - } - - // Add headers to $encoded - $encoded['headers'] =& $this->_headers; - - return $encoded; - } - - /** - * Encodes and saves the email into file. File must exist. - * Data will be appended to the file. - * - * @param string $filename Output file location - * @param string $boundary Pre-defined boundary string - * @param boolean $skip_head True if you don't want to save headers - * - * @return array An associative array containing message headers - * or PEAR error object - * @access public - * @since 1.6.0 - */ - function encodeToFile($filename, $boundary=null, $skip_head=false) - { - if (file_exists($filename) && !is_writable($filename)) { - $err = $this->_raiseError('File is not writeable: ' . $filename); - return $err; - } - - if (!($fh = fopen($filename, 'ab'))) { - $err = $this->_raiseError('Unable to open file: ' . $filename); - return $err; - } - - // Temporarily reset magic_quotes_runtime for file reads and writes - if ($magic_quote_setting = get_magic_quotes_runtime()) { - @ini_set('magic_quotes_runtime', 0); - } - - $res = $this->_encodePartToFile($fh, $boundary, $skip_head); - - fclose($fh); - - if ($magic_quote_setting) { - @ini_set('magic_quotes_runtime', $magic_quote_setting); - } - - return $this->_isError($res) ? $res : $this->_headers; - } - - /** - * Encodes given email part into file - * - * @param string $fh Output file handle - * @param string $boundary Pre-defined boundary string - * @param boolean $skip_head True if you don't want to save headers - * - * @return array True on sucess or PEAR error object - * @access private - */ - function _encodePartToFile($fh, $boundary=null, $skip_head=false) - { - $eol = $this->_eol; - - if (count($this->_subparts)) { - $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime()); - $this->_headers['Content-Type'] .= ";$eol boundary=\"$boundary\""; - } - - if (!$skip_head) { - foreach ($this->_headers as $key => $value) { - fwrite($fh, $key . ': ' . $value . $eol); - } - $f_eol = $eol; - } else { - $f_eol = ''; - } - - if (count($this->_subparts)) { - for ($i = 0; $i < count($this->_subparts); $i++) { - fwrite($fh, $f_eol . '--' . $boundary . $eol); - $res = $this->_subparts[$i]->_encodePartToFile($fh); - if ($this->_isError($res)) { - return $res; - } - $f_eol = $eol; - } - - fwrite($fh, $eol . '--' . $boundary . '--' . $eol); - - } else if ($this->_body) { - fwrite($fh, $f_eol . $this->_getEncodedData($this->_body, $this->_encoding)); - } else if ($this->_body_file) { - fwrite($fh, $f_eol); - $res = $this->_getEncodedDataFromFile( - $this->_body_file, $this->_encoding, $fh - ); - if ($this->_isError($res)) { - return $res; - } - } - - return true; - } - - /** - * Adds a subpart to current mime part and returns - * a reference to it - * - * @param string $body The body of the subpart, if any. - * @param array $params The parameters for the subpart, same - * as the $params argument for constructor. - * - * @return Mail_mimePart A reference to the part you just added. In PHP4, it is - * crucial if using multipart/* in your subparts that - * you use =& in your script when calling this function, - * otherwise you will not be able to add further subparts. - * @access public - */ - function &addSubpart($body, $params) - { - $this->_subparts[] = $part = new Mail_mimePart($body, $params); - return $part; - } - - /** - * Returns encoded data based upon encoding passed to it - * - * @param string $data The data to encode. - * @param string $encoding The encoding type to use, 7bit, base64, - * or quoted-printable. - * - * @return string - * @access private - */ - function _getEncodedData($data, $encoding) - { - switch ($encoding) { - case 'quoted-printable': - return $this->_quotedPrintableEncode($data); - break; - - case 'base64': - return rtrim(chunk_split(base64_encode($data), 76, $this->_eol)); - break; - - case '8bit': - case '7bit': - default: - return $data; - } - } - - /** - * Returns encoded data based upon encoding passed to it - * - * @param string $filename Data file location - * @param string $encoding The encoding type to use, 7bit, base64, - * or quoted-printable. - * @param resource $fh Output file handle. If set, data will be - * stored into it instead of returning it - * - * @return string Encoded data or PEAR error object - * @access private - */ - function _getEncodedDataFromFile($filename, $encoding, $fh=null) - { - if (!is_readable($filename)) { - $err = $this->_raiseError('Unable to read file: ' . $filename); - return $err; - } - - if (!($fd = fopen($filename, 'rb'))) { - $err = $this->_raiseError('Could not open file: ' . $filename); - return $err; - } - - $data = ''; - - switch ($encoding) { - case 'quoted-printable': - while (!feof($fd)) { - $buffer = $this->_quotedPrintableEncode(fgets($fd)); - if ($fh) { - fwrite($fh, $buffer); - } else { - $data .= $buffer; - } - } - break; - - case 'base64': - while (!feof($fd)) { - // Should read in a multiple of 57 bytes so that - // the output is 76 bytes per line. Don't use big chunks - // because base64 encoding is memory expensive - $buffer = fread($fd, 57 * 9198); // ca. 0.5 MB - $buffer = base64_encode($buffer); - $buffer = chunk_split($buffer, 76, $this->_eol); - if (feof($fd)) { - $buffer = rtrim($buffer); - } - - if ($fh) { - fwrite($fh, $buffer); - } else { - $data .= $buffer; - } - } - break; - - case '8bit': - case '7bit': - default: - while (!feof($fd)) { - $buffer = fread($fd, 1048576); // 1 MB - if ($fh) { - fwrite($fh, $buffer); - } else { - $data .= $buffer; - } - } - } - - fclose($fd); - - if (!$fh) { - return $data; - } - } - - /** - * Encodes data to quoted-printable standard. - * - * @param string $input The data to encode - * @param int $line_max Optional max line length. Should - * not be more than 76 chars - * - * @return string Encoded data - * - * @access private - */ - function _quotedPrintableEncode($input , $line_max = 76) - { - $eol = $this->_eol; - /* - // imap_8bit() is extremely fast, but doesn't handle properly some characters - if (function_exists('imap_8bit') && $line_max == 76) { - $input = preg_replace('/\r?\n/', "\r\n", $input); - $input = imap_8bit($input); - if ($eol != "\r\n") { - $input = str_replace("\r\n", $eol, $input); - } - return $input; - } - */ - $lines = preg_split("/\r?\n/", $input); - $escape = '='; - $output = ''; - - while (list($idx, $line) = each($lines)) { - $newline = ''; - $i = 0; - - while (isset($line[$i])) { - $char = $line[$i]; - $dec = ord($char); - $i++; - - if (($dec == 32) && (!isset($line[$i]))) { - // convert space at eol only - $char = '=20'; - } elseif ($dec == 9 && isset($line[$i])) { - ; // Do nothing if a TAB is not on eol - } elseif (($dec == 61) || ($dec < 32) || ($dec > 126)) { - $char = $escape . sprintf('%02X', $dec); - } elseif (($dec == 46) && (($newline == '') - || ((strlen($newline) + strlen("=2E")) >= $line_max)) - ) { - // Bug #9722: convert full-stop at bol, - // some Windows servers need this, won't break anything (cipri) - // Bug #11731: full-stop at bol also needs to be encoded - // if this line would push us over the line_max limit. - $char = '=2E'; - } - - // Note, when changing this line, also change the ($dec == 46) - // check line, as it mimics this line due to Bug #11731 - // EOL is not counted - if ((strlen($newline) + strlen($char)) >= $line_max) { - // soft line break; " =\r\n" is okay - $output .= $newline . $escape . $eol; - $newline = ''; - } - $newline .= $char; - } // end of for - $output .= $newline . $eol; - unset($lines[$idx]); - } - // Don't want last crlf - $output = substr($output, 0, -1 * strlen($eol)); - return $output; - } - - /** - * Encodes the parameter of a header. - * - * @param string $name The name of the header-parameter - * @param string $value The value of the paramter - * @param string $charset The characterset of $value - * @param string $language The language used in $value - * @param string $encoding Parameter encoding. If not set, parameter value - * is encoded according to RFC2231 - * @param int $maxLength The maximum length of a line. Defauls to 75 - * - * @return string - * - * @access private - */ - function _buildHeaderParam($name, $value, $charset=null, $language=null, - $encoding=null, $maxLength=75 - ) { - // RFC 2045: - // value needs encoding if contains non-ASCII chars or is longer than 78 chars - if (!preg_match('#[^\x20-\x7E]#', $value)) { - $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D' - . '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#'; - if (!preg_match($token_regexp, $value)) { - // token - if (strlen($name) + strlen($value) + 3 <= $maxLength) { - return " {$name}={$value}"; - } - } else { - // quoted-string - $quoted = addcslashes($value, '\\"'); - if (strlen($name) + strlen($quoted) + 5 <= $maxLength) { - return " {$name}=\"{$quoted}\""; - } - } - } - - // RFC2047: use quoted-printable/base64 encoding - if ($encoding == 'quoted-printable' || $encoding == 'base64') { - return $this->_buildRFC2047Param($name, $value, $charset, $encoding); - } - - // RFC2231: - $encValue = preg_replace_callback( - '/([^\x21\x23\x24\x26\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])/', - array($this, '_encodeReplaceCallback'), $value - ); - $value = "$charset'$language'$encValue"; - - $header = " {$name}*={$value}"; - if (strlen($header) <= $maxLength) { - return $header; - } - - $preLength = strlen(" {$name}*0*="); - $maxLength = max(16, $maxLength - $preLength - 3); - $maxLengthReg = "|(.{0,$maxLength}[^\%][^\%])|"; - - $headers = array(); - $headCount = 0; - while ($value) { - $matches = array(); - $found = preg_match($maxLengthReg, $value, $matches); - if ($found) { - $headers[] = " {$name}*{$headCount}*={$matches[0]}"; - $value = substr($value, strlen($matches[0])); - } else { - $headers[] = " {$name}*{$headCount}*={$value}"; - $value = ''; - } - $headCount++; - } - - $headers = implode(';' . $this->_eol, $headers); - return $headers; - } - - /** - * Encodes header parameter as per RFC2047 if needed - * - * @param string $name The parameter name - * @param string $value The parameter value - * @param string $charset The parameter charset - * @param string $encoding Encoding type (quoted-printable or base64) - * @param int $maxLength Encoded parameter max length. Default: 76 - * - * @return string Parameter line - * @access private - */ - function _buildRFC2047Param($name, $value, $charset, - $encoding='quoted-printable', $maxLength=76 - ) { - // WARNING: RFC 2047 says: "An 'encoded-word' MUST NOT be used in - // parameter of a MIME Content-Type or Content-Disposition field", - // but... it's supported by many clients/servers - $quoted = ''; - - if ($encoding == 'base64') { - $value = base64_encode($value); - $prefix = '=?' . $charset . '?B?'; - $suffix = '?='; - - // 2 x SPACE, 2 x '"', '=', ';' - $add_len = strlen($prefix . $suffix) + strlen($name) + 6; - $len = $add_len + strlen($value); - - while ($len > $maxLength) { - // We can cut base64-encoded string every 4 characters - $real_len = floor(($maxLength - $add_len) / 4) * 4; - $_quote = substr($value, 0, $real_len); - $value = substr($value, $real_len); - - $quoted .= $prefix . $_quote . $suffix . $this->_eol . ' '; - $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';' - $len = strlen($value) + $add_len; - } - $quoted .= $prefix . $value . $suffix; - - } else { - // quoted-printable - $value = $this->encodeQP($value); - $prefix = '=?' . $charset . '?Q?'; - $suffix = '?='; - - // 2 x SPACE, 2 x '"', '=', ';' - $add_len = strlen($prefix . $suffix) + strlen($name) + 6; - $len = $add_len + strlen($value); - - while ($len > $maxLength) { - $length = $maxLength - $add_len; - // don't break any encoded letters - if (preg_match("/^(.{0,$length}[^\=][^\=])/", $value, $matches)) { - $_quote = $matches[1]; - } - - $quoted .= $prefix . $_quote . $suffix . $this->_eol . ' '; - $value = substr($value, strlen($_quote)); - $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';' - $len = strlen($value) + $add_len; - } - - $quoted .= $prefix . $value . $suffix; - } - - return " {$name}=\"{$quoted}\""; - } - - /** - * Encodes a header as per RFC2047 - * - * @param string $name The header name - * @param string $value The header data to encode - * @param string $charset Character set name - * @param string $encoding Encoding name (base64 or quoted-printable) - * @param string $eol End-of-line sequence. Default: "\r\n" - * - * @return string Encoded header data (without a name) - * @access public - * @since 1.6.1 - */ - function encodeHeader($name, $value, $charset='ISO-8859-1', - $encoding='quoted-printable', $eol="\r\n" - ) { - // Structured headers - $comma_headers = array( - 'from', 'to', 'cc', 'bcc', 'sender', 'reply-to', - 'resent-from', 'resent-to', 'resent-cc', 'resent-bcc', - 'resent-sender', 'resent-reply-to', - 'mail-reply-to', 'mail-followup-to', - 'return-receipt-to', 'disposition-notification-to', - ); - $other_headers = array( - 'references', 'in-reply-to', 'message-id', 'resent-message-id', - ); - - $name = strtolower($name); - - if (in_array($name, $comma_headers)) { - $separator = ','; - } else if (in_array($name, $other_headers)) { - $separator = ' '; - } - - if (!$charset) { - $charset = 'ISO-8859-1'; - } - - // Structured header (make sure addr-spec inside is not encoded) - if (!empty($separator)) { - // Simple e-mail address regexp - $email_regexp = '([^\s<]+|("[^\r\n"]+"))@\S+'; - - $parts = Mail_mimePart::_explodeQuotedString("[\t$separator]", $value); - $value = ''; - - foreach ($parts as $part) { - $part = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $part); - $part = trim($part); - - if (!$part) { - continue; - } - if ($value) { - $value .= $separator == ',' ? $separator . ' ' : ' '; - } else { - $value = $name . ': '; - } - - // let's find phrase (name) and/or addr-spec - if (preg_match('/^<' . $email_regexp . '>$/', $part)) { - $value .= $part; - } else if (preg_match('/^' . $email_regexp . '$/', $part)) { - // address without brackets and without name - $value .= $part; - } else if (preg_match('/<*' . $email_regexp . '>*$/', $part, $matches)) { - // address with name (handle name) - $address = $matches[0]; - $word = str_replace($address, '', $part); - $word = trim($word); - // check if phrase requires quoting - if ($word) { - // non-ASCII: require encoding - if (preg_match('#([^\s\x21-\x7E]){1}#', $word)) { - if ($word[0] == '"' && $word[strlen($word)-1] == '"') { - // de-quote quoted-string, encoding changes - // string to atom - $search = array("\\\"", "\\\\"); - $replace = array("\"", "\\"); - $word = str_replace($search, $replace, $word); - $word = substr($word, 1, -1); - } - // find length of last line - if (($pos = strrpos($value, $eol)) !== false) { - $last_len = strlen($value) - $pos; - } else { - $last_len = strlen($value); - } - $word = Mail_mimePart::encodeHeaderValue( - $word, $charset, $encoding, $last_len, $eol - ); - } else if (($word[0] != '"' || $word[strlen($word)-1] != '"') - && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $word) - ) { - // ASCII: quote string if needed - $word = '"'.addcslashes($word, '\\"').'"'; - } - } - $value .= $word.' '.$address; - } else { - // addr-spec not found, don't encode (?) - $value .= $part; - } - - // RFC2822 recommends 78 characters limit, use 76 from RFC2047 - $value = wordwrap($value, 76, $eol . ' '); - } - - // remove header name prefix (there could be EOL too) - $value = preg_replace( - '/^'.$name.':('.preg_quote($eol, '/').')* /', '', $value - ); - } else { - // Unstructured header - // non-ASCII: require encoding - if (preg_match('#([^\s\x21-\x7E]){1}#', $value)) { - if ($value[0] == '"' && $value[strlen($value)-1] == '"') { - // de-quote quoted-string, encoding changes - // string to atom - $search = array("\\\"", "\\\\"); - $replace = array("\"", "\\"); - $value = str_replace($search, $replace, $value); - $value = substr($value, 1, -1); - } - $value = Mail_mimePart::encodeHeaderValue( - $value, $charset, $encoding, strlen($name) + 2, $eol - ); - } else if (strlen($name.': '.$value) > 78) { - // ASCII: check if header line isn't too long and use folding - $value = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $value); - $tmp = wordwrap($name.': '.$value, 78, $eol . ' '); - $value = preg_replace('/^'.$name.':\s*/', '', $tmp); - // hard limit 998 (RFC2822) - $value = wordwrap($value, 998, $eol . ' ', true); - } - } - - return $value; - } - - /** - * Explode quoted string - * - * @param string $delimiter Delimiter expression string for preg_match() - * @param string $string Input string - * - * @return array String tokens array - * @access private - */ - function _explodeQuotedString($delimiter, $string) - { - $result = array(); - $strlen = strlen($string); - - for ($q=$p=$i=0; $i < $strlen; $i++) { - if ($string[$i] == "\"" - && (empty($string[$i-1]) || $string[$i-1] != "\\") - ) { - $q = $q ? false : true; - } else if (!$q && preg_match("/$delimiter/", $string[$i])) { - $result[] = substr($string, $p, $i - $p); - $p = $i + 1; - } - } - - $result[] = substr($string, $p); - return $result; - } - - /** - * Encodes a header value as per RFC2047 - * - * @param string $value The header data to encode - * @param string $charset Character set name - * @param string $encoding Encoding name (base64 or quoted-printable) - * @param int $prefix_len Prefix length. Default: 0 - * @param string $eol End-of-line sequence. Default: "\r\n" - * - * @return string Encoded header data - * @access public - * @since 1.6.1 - */ - function encodeHeaderValue($value, $charset, $encoding, $prefix_len=0, $eol="\r\n") - { - // #17311: Use multibyte aware method (requires mbstring extension) - if ($result = Mail_mimePart::encodeMB($value, $charset, $encoding, $prefix_len, $eol)) { - return $result; - } - - // Generate the header using the specified params and dynamicly - // determine the maximum length of such strings. - // 75 is the value specified in the RFC. - $encoding = $encoding == 'base64' ? 'B' : 'Q'; - $prefix = '=?' . $charset . '?' . $encoding .'?'; - $suffix = '?='; - $maxLength = 75 - strlen($prefix . $suffix); - $maxLength1stLine = $maxLength - $prefix_len; - - if ($encoding == 'B') { - // Base64 encode the entire string - $value = base64_encode($value); - - // We can cut base64 every 4 characters, so the real max - // we can get must be rounded down. - $maxLength = $maxLength - ($maxLength % 4); - $maxLength1stLine = $maxLength1stLine - ($maxLength1stLine % 4); - - $cutpoint = $maxLength1stLine; - $output = ''; - - while ($value) { - // Split translated string at every $maxLength - $part = substr($value, 0, $cutpoint); - $value = substr($value, $cutpoint); - $cutpoint = $maxLength; - // RFC 2047 specifies that any split header should - // be separated by a CRLF SPACE. - if ($output) { - $output .= $eol . ' '; - } - $output .= $prefix . $part . $suffix; - } - $value = $output; - } else { - // quoted-printable encoding has been selected - $value = Mail_mimePart::encodeQP($value); - - // This regexp will break QP-encoded text at every $maxLength - // but will not break any encoded letters. - $reg1st = "|(.{0,$maxLength1stLine}[^\=][^\=])|"; - $reg2nd = "|(.{0,$maxLength}[^\=][^\=])|"; - - if (strlen($value) > $maxLength1stLine) { - // Begin with the regexp for the first line. - $reg = $reg1st; - $output = ''; - while ($value) { - // Split translated string at every $maxLength - // But make sure not to break any translated chars. - $found = preg_match($reg, $value, $matches); - - // After this first line, we need to use a different - // regexp for the first line. - $reg = $reg2nd; - - // Save the found part and encapsulate it in the - // prefix & suffix. Then remove the part from the - // $value_out variable. - if ($found) { - $part = $matches[0]; - $len = strlen($matches[0]); - $value = substr($value, $len); - } else { - $part = $value; - $value = ''; - } - - // RFC 2047 specifies that any split header should - // be separated by a CRLF SPACE - if ($output) { - $output .= $eol . ' '; - } - $output .= $prefix . $part . $suffix; - } - $value = $output; - } else { - $value = $prefix . $value . $suffix; - } - } - - return $value; - } - - /** - * Encodes the given string using quoted-printable - * - * @param string $str String to encode - * - * @return string Encoded string - * @access public - * @since 1.6.0 - */ - function encodeQP($str) - { - // Bug #17226 RFC 2047 restricts some characters - // if the word is inside a phrase, permitted chars are only: - // ASCII letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_" - - // "=", "_", "?" must be encoded - $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/'; - $str = preg_replace_callback( - $regexp, array('Mail_mimePart', '_qpReplaceCallback'), $str - ); - - return str_replace(' ', '_', $str); - } - - /** - * Encodes the given string using base64 or quoted-printable. - * This method makes sure that encoded-word represents an integral - * number of characters as per RFC2047. - * - * @param string $str String to encode - * @param string $charset Character set name - * @param string $encoding Encoding name (base64 or quoted-printable) - * @param int $prefix_len Prefix length. Default: 0 - * @param string $eol End-of-line sequence. Default: "\r\n" - * - * @return string Encoded string - * @access public - * @since 1.8.0 - */ - function encodeMB($str, $charset, $encoding, $prefix_len=0, $eol="\r\n") - { - if (!function_exists('mb_substr') || !function_exists('mb_strlen')) { - return; - } - - $encoding = $encoding == 'base64' ? 'B' : 'Q'; - // 75 is the value specified in the RFC - $prefix = '=?' . $charset . '?'.$encoding.'?'; - $suffix = '?='; - $maxLength = 75 - strlen($prefix . $suffix); - - // A multi-octet character may not be split across adjacent encoded-words - // So, we'll loop over each character - // mb_stlen() with wrong charset will generate a warning here and return null - $length = mb_strlen($str, $charset); - $result = ''; - $line_length = $prefix_len; - - if ($encoding == 'B') { - // base64 - $start = 0; - $prev = ''; - - for ($i=1; $i<=$length; $i++) { - // See #17311 - $chunk = mb_substr($str, $start, $i-$start, $charset); - $chunk = base64_encode($chunk); - $chunk_len = strlen($chunk); - - if ($line_length + $chunk_len == $maxLength || $i == $length) { - if ($result) { - $result .= "\n"; - } - $result .= $chunk; - $line_length = 0; - $start = $i; - } else if ($line_length + $chunk_len > $maxLength) { - if ($result) { - $result .= "\n"; - } - if ($prev) { - $result .= $prev; - } - $line_length = 0; - $start = $i - 1; - } else { - $prev = $chunk; - } - } - } else { - // quoted-printable - // see encodeQP() - $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/'; - - for ($i=0; $i<=$length; $i++) { - $char = mb_substr($str, $i, 1, $charset); - // RFC recommends underline (instead of =20) in place of the space - // that's one of the reasons why we're not using iconv_mime_encode() - if ($char == ' ') { - $char = '_'; - $char_len = 1; - } else { - $char = preg_replace_callback( - $regexp, array('Mail_mimePart', '_qpReplaceCallback'), $char - ); - $char_len = strlen($char); - } - - if ($line_length + $char_len > $maxLength) { - if ($result) { - $result .= "\n"; - } - $line_length = 0; - } - - $result .= $char; - $line_length += $char_len; - } - } - - if ($result) { - $result = $prefix - .str_replace("\n", $suffix.$eol.' '.$prefix, $result).$suffix; - } - - return $result; - } - - /** - * Callback function to replace extended characters (\x80-xFF) with their - * ASCII values (RFC2047: quoted-printable) - * - * @param array $matches Preg_replace's matches array - * - * @return string Encoded character string - * @access private - */ - function _qpReplaceCallback($matches) - { - return sprintf('=%02X', ord($matches[1])); - } - - /** - * Callback function to replace extended characters (\x80-xFF) with their - * ASCII values (RFC2231) - * - * @param array $matches Preg_replace's matches array - * - * @return string Encoded character string - * @access private - */ - function _encodeReplaceCallback($matches) - { - return sprintf('%%%02X', ord($matches[1])); - } - - /** - * PEAR::isError implementation - * - * @param mixed $data Object - * - * @return bool True if object is an instance of PEAR_Error - * @access private - */ - function _isError($data) - { - // PEAR::isError() is not PHP 5.4 compatible (see Bug #19473) - if (is_object($data) && is_a($data, 'PEAR_Error')) { - return true; - } - - return false; - } - - /** - * PEAR::raiseError implementation - * - * @param $message A text error message - * - * @return PEAR_Error Instance of PEAR_Error - * @access private - */ - function _raiseError($message) - { - // PEAR::raiseError() is not PHP 5.4 compatible - return new PEAR_Error($message); - } - -} // End of class diff --git a/program/lib/Net/IDNA2.php b/program/lib/Net/IDNA2.php deleted file mode 100644 index 8c366fb8a..000000000 --- a/program/lib/Net/IDNA2.php +++ /dev/null @@ -1,3402 +0,0 @@ - - * @author Matthias Sommerfeld - * @author Stefan Neufeind - * @version $Id: IDNA2.php 305344 2010-11-14 23:52:42Z neufeind $ - */ -class Net_IDNA2 -{ - // {{{ npdata - /** - * These Unicode codepoints are - * mapped to nothing, See RFC3454 for details - * - * @static - * @var array - * @access private - */ - private static $_np_map_nothing = array( - 0xAD, - 0x34F, - 0x1806, - 0x180B, - 0x180C, - 0x180D, - 0x200B, - 0x200C, - 0x200D, - 0x2060, - 0xFE00, - 0xFE01, - 0xFE02, - 0xFE03, - 0xFE04, - 0xFE05, - 0xFE06, - 0xFE07, - 0xFE08, - 0xFE09, - 0xFE0A, - 0xFE0B, - 0xFE0C, - 0xFE0D, - 0xFE0E, - 0xFE0F, - 0xFEFF - ); - - /** - * Prohibited codepints - * - * @static - * @var array - * @access private - */ - private static $_general_prohibited = array( - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0xA, - 0xB, - 0xC, - 0xD, - 0xE, - 0xF, - 0x10, - 0x11, - 0x12, - 0x13, - 0x14, - 0x15, - 0x16, - 0x17, - 0x18, - 0x19, - 0x1A, - 0x1B, - 0x1C, - 0x1D, - 0x1E, - 0x1F, - 0x20, - 0x21, - 0x22, - 0x23, - 0x24, - 0x25, - 0x26, - 0x27, - 0x28, - 0x29, - 0x2A, - 0x2B, - 0x2C, - 0x2F, - 0x3B, - 0x3C, - 0x3D, - 0x3E, - 0x3F, - 0x40, - 0x5B, - 0x5C, - 0x5D, - 0x5E, - 0x5F, - 0x60, - 0x7B, - 0x7C, - 0x7D, - 0x7E, - 0x7F, - 0x3002 - ); - - /** - * Codepints prohibited by Nameprep - * @static - * @var array - * @access private - */ - private static $_np_prohibit = array( - 0xA0, - 0x1680, - 0x2000, - 0x2001, - 0x2002, - 0x2003, - 0x2004, - 0x2005, - 0x2006, - 0x2007, - 0x2008, - 0x2009, - 0x200A, - 0x200B, - 0x202F, - 0x205F, - 0x3000, - 0x6DD, - 0x70F, - 0x180E, - 0x200C, - 0x200D, - 0x2028, - 0x2029, - 0xFEFF, - 0xFFF9, - 0xFFFA, - 0xFFFB, - 0xFFFC, - 0xFFFE, - 0xFFFF, - 0x1FFFE, - 0x1FFFF, - 0x2FFFE, - 0x2FFFF, - 0x3FFFE, - 0x3FFFF, - 0x4FFFE, - 0x4FFFF, - 0x5FFFE, - 0x5FFFF, - 0x6FFFE, - 0x6FFFF, - 0x7FFFE, - 0x7FFFF, - 0x8FFFE, - 0x8FFFF, - 0x9FFFE, - 0x9FFFF, - 0xAFFFE, - 0xAFFFF, - 0xBFFFE, - 0xBFFFF, - 0xCFFFE, - 0xCFFFF, - 0xDFFFE, - 0xDFFFF, - 0xEFFFE, - 0xEFFFF, - 0xFFFFE, - 0xFFFFF, - 0x10FFFE, - 0x10FFFF, - 0xFFF9, - 0xFFFA, - 0xFFFB, - 0xFFFC, - 0xFFFD, - 0x340, - 0x341, - 0x200E, - 0x200F, - 0x202A, - 0x202B, - 0x202C, - 0x202D, - 0x202E, - 0x206A, - 0x206B, - 0x206C, - 0x206D, - 0x206E, - 0x206F, - 0xE0001 - ); - - /** - * Codepoint ranges prohibited by nameprep - * - * @static - * @var array - * @access private - */ - private static $_np_prohibit_ranges = array( - array(0x80, 0x9F ), - array(0x2060, 0x206F ), - array(0x1D173, 0x1D17A ), - array(0xE000, 0xF8FF ), - array(0xF0000, 0xFFFFD ), - array(0x100000, 0x10FFFD), - array(0xFDD0, 0xFDEF ), - array(0xD800, 0xDFFF ), - array(0x2FF0, 0x2FFB ), - array(0xE0020, 0xE007F ) - ); - - /** - * Replacement mappings (casemapping, replacement sequences, ...) - * - * @static - * @var array - * @access private - */ - private static $_np_replacemaps = array( - 0x41 => array(0x61), - 0x42 => array(0x62), - 0x43 => array(0x63), - 0x44 => array(0x64), - 0x45 => array(0x65), - 0x46 => array(0x66), - 0x47 => array(0x67), - 0x48 => array(0x68), - 0x49 => array(0x69), - 0x4A => array(0x6A), - 0x4B => array(0x6B), - 0x4C => array(0x6C), - 0x4D => array(0x6D), - 0x4E => array(0x6E), - 0x4F => array(0x6F), - 0x50 => array(0x70), - 0x51 => array(0x71), - 0x52 => array(0x72), - 0x53 => array(0x73), - 0x54 => array(0x74), - 0x55 => array(0x75), - 0x56 => array(0x76), - 0x57 => array(0x77), - 0x58 => array(0x78), - 0x59 => array(0x79), - 0x5A => array(0x7A), - 0xB5 => array(0x3BC), - 0xC0 => array(0xE0), - 0xC1 => array(0xE1), - 0xC2 => array(0xE2), - 0xC3 => array(0xE3), - 0xC4 => array(0xE4), - 0xC5 => array(0xE5), - 0xC6 => array(0xE6), - 0xC7 => array(0xE7), - 0xC8 => array(0xE8), - 0xC9 => array(0xE9), - 0xCA => array(0xEA), - 0xCB => array(0xEB), - 0xCC => array(0xEC), - 0xCD => array(0xED), - 0xCE => array(0xEE), - 0xCF => array(0xEF), - 0xD0 => array(0xF0), - 0xD1 => array(0xF1), - 0xD2 => array(0xF2), - 0xD3 => array(0xF3), - 0xD4 => array(0xF4), - 0xD5 => array(0xF5), - 0xD6 => array(0xF6), - 0xD8 => array(0xF8), - 0xD9 => array(0xF9), - 0xDA => array(0xFA), - 0xDB => array(0xFB), - 0xDC => array(0xFC), - 0xDD => array(0xFD), - 0xDE => array(0xFE), - 0xDF => array(0x73, 0x73), - 0x100 => array(0x101), - 0x102 => array(0x103), - 0x104 => array(0x105), - 0x106 => array(0x107), - 0x108 => array(0x109), - 0x10A => array(0x10B), - 0x10C => array(0x10D), - 0x10E => array(0x10F), - 0x110 => array(0x111), - 0x112 => array(0x113), - 0x114 => array(0x115), - 0x116 => array(0x117), - 0x118 => array(0x119), - 0x11A => array(0x11B), - 0x11C => array(0x11D), - 0x11E => array(0x11F), - 0x120 => array(0x121), - 0x122 => array(0x123), - 0x124 => array(0x125), - 0x126 => array(0x127), - 0x128 => array(0x129), - 0x12A => array(0x12B), - 0x12C => array(0x12D), - 0x12E => array(0x12F), - 0x130 => array(0x69, 0x307), - 0x132 => array(0x133), - 0x134 => array(0x135), - 0x136 => array(0x137), - 0x139 => array(0x13A), - 0x13B => array(0x13C), - 0x13D => array(0x13E), - 0x13F => array(0x140), - 0x141 => array(0x142), - 0x143 => array(0x144), - 0x145 => array(0x146), - 0x147 => array(0x148), - 0x149 => array(0x2BC, 0x6E), - 0x14A => array(0x14B), - 0x14C => array(0x14D), - 0x14E => array(0x14F), - 0x150 => array(0x151), - 0x152 => array(0x153), - 0x154 => array(0x155), - 0x156 => array(0x157), - 0x158 => array(0x159), - 0x15A => array(0x15B), - 0x15C => array(0x15D), - 0x15E => array(0x15F), - 0x160 => array(0x161), - 0x162 => array(0x163), - 0x164 => array(0x165), - 0x166 => array(0x167), - 0x168 => array(0x169), - 0x16A => array(0x16B), - 0x16C => array(0x16D), - 0x16E => array(0x16F), - 0x170 => array(0x171), - 0x172 => array(0x173), - 0x174 => array(0x175), - 0x176 => array(0x177), - 0x178 => array(0xFF), - 0x179 => array(0x17A), - 0x17B => array(0x17C), - 0x17D => array(0x17E), - 0x17F => array(0x73), - 0x181 => array(0x253), - 0x182 => array(0x183), - 0x184 => array(0x185), - 0x186 => array(0x254), - 0x187 => array(0x188), - 0x189 => array(0x256), - 0x18A => array(0x257), - 0x18B => array(0x18C), - 0x18E => array(0x1DD), - 0x18F => array(0x259), - 0x190 => array(0x25B), - 0x191 => array(0x192), - 0x193 => array(0x260), - 0x194 => array(0x263), - 0x196 => array(0x269), - 0x197 => array(0x268), - 0x198 => array(0x199), - 0x19C => array(0x26F), - 0x19D => array(0x272), - 0x19F => array(0x275), - 0x1A0 => array(0x1A1), - 0x1A2 => array(0x1A3), - 0x1A4 => array(0x1A5), - 0x1A6 => array(0x280), - 0x1A7 => array(0x1A8), - 0x1A9 => array(0x283), - 0x1AC => array(0x1AD), - 0x1AE => array(0x288), - 0x1AF => array(0x1B0), - 0x1B1 => array(0x28A), - 0x1B2 => array(0x28B), - 0x1B3 => array(0x1B4), - 0x1B5 => array(0x1B6), - 0x1B7 => array(0x292), - 0x1B8 => array(0x1B9), - 0x1BC => array(0x1BD), - 0x1C4 => array(0x1C6), - 0x1C5 => array(0x1C6), - 0x1C7 => array(0x1C9), - 0x1C8 => array(0x1C9), - 0x1CA => array(0x1CC), - 0x1CB => array(0x1CC), - 0x1CD => array(0x1CE), - 0x1CF => array(0x1D0), - 0x1D1 => array(0x1D2), - 0x1D3 => array(0x1D4), - 0x1D5 => array(0x1D6), - 0x1D7 => array(0x1D8), - 0x1D9 => array(0x1DA), - 0x1DB => array(0x1DC), - 0x1DE => array(0x1DF), - 0x1E0 => array(0x1E1), - 0x1E2 => array(0x1E3), - 0x1E4 => array(0x1E5), - 0x1E6 => array(0x1E7), - 0x1E8 => array(0x1E9), - 0x1EA => array(0x1EB), - 0x1EC => array(0x1ED), - 0x1EE => array(0x1EF), - 0x1F0 => array(0x6A, 0x30C), - 0x1F1 => array(0x1F3), - 0x1F2 => array(0x1F3), - 0x1F4 => array(0x1F5), - 0x1F6 => array(0x195), - 0x1F7 => array(0x1BF), - 0x1F8 => array(0x1F9), - 0x1FA => array(0x1FB), - 0x1FC => array(0x1FD), - 0x1FE => array(0x1FF), - 0x200 => array(0x201), - 0x202 => array(0x203), - 0x204 => array(0x205), - 0x206 => array(0x207), - 0x208 => array(0x209), - 0x20A => array(0x20B), - 0x20C => array(0x20D), - 0x20E => array(0x20F), - 0x210 => array(0x211), - 0x212 => array(0x213), - 0x214 => array(0x215), - 0x216 => array(0x217), - 0x218 => array(0x219), - 0x21A => array(0x21B), - 0x21C => array(0x21D), - 0x21E => array(0x21F), - 0x220 => array(0x19E), - 0x222 => array(0x223), - 0x224 => array(0x225), - 0x226 => array(0x227), - 0x228 => array(0x229), - 0x22A => array(0x22B), - 0x22C => array(0x22D), - 0x22E => array(0x22F), - 0x230 => array(0x231), - 0x232 => array(0x233), - 0x345 => array(0x3B9), - 0x37A => array(0x20, 0x3B9), - 0x386 => array(0x3AC), - 0x388 => array(0x3AD), - 0x389 => array(0x3AE), - 0x38A => array(0x3AF), - 0x38C => array(0x3CC), - 0x38E => array(0x3CD), - 0x38F => array(0x3CE), - 0x390 => array(0x3B9, 0x308, 0x301), - 0x391 => array(0x3B1), - 0x392 => array(0x3B2), - 0x393 => array(0x3B3), - 0x394 => array(0x3B4), - 0x395 => array(0x3B5), - 0x396 => array(0x3B6), - 0x397 => array(0x3B7), - 0x398 => array(0x3B8), - 0x399 => array(0x3B9), - 0x39A => array(0x3BA), - 0x39B => array(0x3BB), - 0x39C => array(0x3BC), - 0x39D => array(0x3BD), - 0x39E => array(0x3BE), - 0x39F => array(0x3BF), - 0x3A0 => array(0x3C0), - 0x3A1 => array(0x3C1), - 0x3A3 => array(0x3C3), - 0x3A4 => array(0x3C4), - 0x3A5 => array(0x3C5), - 0x3A6 => array(0x3C6), - 0x3A7 => array(0x3C7), - 0x3A8 => array(0x3C8), - 0x3A9 => array(0x3C9), - 0x3AA => array(0x3CA), - 0x3AB => array(0x3CB), - 0x3B0 => array(0x3C5, 0x308, 0x301), - 0x3C2 => array(0x3C3), - 0x3D0 => array(0x3B2), - 0x3D1 => array(0x3B8), - 0x3D2 => array(0x3C5), - 0x3D3 => array(0x3CD), - 0x3D4 => array(0x3CB), - 0x3D5 => array(0x3C6), - 0x3D6 => array(0x3C0), - 0x3D8 => array(0x3D9), - 0x3DA => array(0x3DB), - 0x3DC => array(0x3DD), - 0x3DE => array(0x3DF), - 0x3E0 => array(0x3E1), - 0x3E2 => array(0x3E3), - 0x3E4 => array(0x3E5), - 0x3E6 => array(0x3E7), - 0x3E8 => array(0x3E9), - 0x3EA => array(0x3EB), - 0x3EC => array(0x3ED), - 0x3EE => array(0x3EF), - 0x3F0 => array(0x3BA), - 0x3F1 => array(0x3C1), - 0x3F2 => array(0x3C3), - 0x3F4 => array(0x3B8), - 0x3F5 => array(0x3B5), - 0x400 => array(0x450), - 0x401 => array(0x451), - 0x402 => array(0x452), - 0x403 => array(0x453), - 0x404 => array(0x454), - 0x405 => array(0x455), - 0x406 => array(0x456), - 0x407 => array(0x457), - 0x408 => array(0x458), - 0x409 => array(0x459), - 0x40A => array(0x45A), - 0x40B => array(0x45B), - 0x40C => array(0x45C), - 0x40D => array(0x45D), - 0x40E => array(0x45E), - 0x40F => array(0x45F), - 0x410 => array(0x430), - 0x411 => array(0x431), - 0x412 => array(0x432), - 0x413 => array(0x433), - 0x414 => array(0x434), - 0x415 => array(0x435), - 0x416 => array(0x436), - 0x417 => array(0x437), - 0x418 => array(0x438), - 0x419 => array(0x439), - 0x41A => array(0x43A), - 0x41B => array(0x43B), - 0x41C => array(0x43C), - 0x41D => array(0x43D), - 0x41E => array(0x43E), - 0x41F => array(0x43F), - 0x420 => array(0x440), - 0x421 => array(0x441), - 0x422 => array(0x442), - 0x423 => array(0x443), - 0x424 => array(0x444), - 0x425 => array(0x445), - 0x426 => array(0x446), - 0x427 => array(0x447), - 0x428 => array(0x448), - 0x429 => array(0x449), - 0x42A => array(0x44A), - 0x42B => array(0x44B), - 0x42C => array(0x44C), - 0x42D => array(0x44D), - 0x42E => array(0x44E), - 0x42F => array(0x44F), - 0x460 => array(0x461), - 0x462 => array(0x463), - 0x464 => array(0x465), - 0x466 => array(0x467), - 0x468 => array(0x469), - 0x46A => array(0x46B), - 0x46C => array(0x46D), - 0x46E => array(0x46F), - 0x470 => array(0x471), - 0x472 => array(0x473), - 0x474 => array(0x475), - 0x476 => array(0x477), - 0x478 => array(0x479), - 0x47A => array(0x47B), - 0x47C => array(0x47D), - 0x47E => array(0x47F), - 0x480 => array(0x481), - 0x48A => array(0x48B), - 0x48C => array(0x48D), - 0x48E => array(0x48F), - 0x490 => array(0x491), - 0x492 => array(0x493), - 0x494 => array(0x495), - 0x496 => array(0x497), - 0x498 => array(0x499), - 0x49A => array(0x49B), - 0x49C => array(0x49D), - 0x49E => array(0x49F), - 0x4A0 => array(0x4A1), - 0x4A2 => array(0x4A3), - 0x4A4 => array(0x4A5), - 0x4A6 => array(0x4A7), - 0x4A8 => array(0x4A9), - 0x4AA => array(0x4AB), - 0x4AC => array(0x4AD), - 0x4AE => array(0x4AF), - 0x4B0 => array(0x4B1), - 0x4B2 => array(0x4B3), - 0x4B4 => array(0x4B5), - 0x4B6 => array(0x4B7), - 0x4B8 => array(0x4B9), - 0x4BA => array(0x4BB), - 0x4BC => array(0x4BD), - 0x4BE => array(0x4BF), - 0x4C1 => array(0x4C2), - 0x4C3 => array(0x4C4), - 0x4C5 => array(0x4C6), - 0x4C7 => array(0x4C8), - 0x4C9 => array(0x4CA), - 0x4CB => array(0x4CC), - 0x4CD => array(0x4CE), - 0x4D0 => array(0x4D1), - 0x4D2 => array(0x4D3), - 0x4D4 => array(0x4D5), - 0x4D6 => array(0x4D7), - 0x4D8 => array(0x4D9), - 0x4DA => array(0x4DB), - 0x4DC => array(0x4DD), - 0x4DE => array(0x4DF), - 0x4E0 => array(0x4E1), - 0x4E2 => array(0x4E3), - 0x4E4 => array(0x4E5), - 0x4E6 => array(0x4E7), - 0x4E8 => array(0x4E9), - 0x4EA => array(0x4EB), - 0x4EC => array(0x4ED), - 0x4EE => array(0x4EF), - 0x4F0 => array(0x4F1), - 0x4F2 => array(0x4F3), - 0x4F4 => array(0x4F5), - 0x4F8 => array(0x4F9), - 0x500 => array(0x501), - 0x502 => array(0x503), - 0x504 => array(0x505), - 0x506 => array(0x507), - 0x508 => array(0x509), - 0x50A => array(0x50B), - 0x50C => array(0x50D), - 0x50E => array(0x50F), - 0x531 => array(0x561), - 0x532 => array(0x562), - 0x533 => array(0x563), - 0x534 => array(0x564), - 0x535 => array(0x565), - 0x536 => array(0x566), - 0x537 => array(0x567), - 0x538 => array(0x568), - 0x539 => array(0x569), - 0x53A => array(0x56A), - 0x53B => array(0x56B), - 0x53C => array(0x56C), - 0x53D => array(0x56D), - 0x53E => array(0x56E), - 0x53F => array(0x56F), - 0x540 => array(0x570), - 0x541 => array(0x571), - 0x542 => array(0x572), - 0x543 => array(0x573), - 0x544 => array(0x574), - 0x545 => array(0x575), - 0x546 => array(0x576), - 0x547 => array(0x577), - 0x548 => array(0x578), - 0x549 => array(0x579), - 0x54A => array(0x57A), - 0x54B => array(0x57B), - 0x54C => array(0x57C), - 0x54D => array(0x57D), - 0x54E => array(0x57E), - 0x54F => array(0x57F), - 0x550 => array(0x580), - 0x551 => array(0x581), - 0x552 => array(0x582), - 0x553 => array(0x583), - 0x554 => array(0x584), - 0x555 => array(0x585), - 0x556 => array(0x586), - 0x587 => array(0x565, 0x582), - 0x1E00 => array(0x1E01), - 0x1E02 => array(0x1E03), - 0x1E04 => array(0x1E05), - 0x1E06 => array(0x1E07), - 0x1E08 => array(0x1E09), - 0x1E0A => array(0x1E0B), - 0x1E0C => array(0x1E0D), - 0x1E0E => array(0x1E0F), - 0x1E10 => array(0x1E11), - 0x1E12 => array(0x1E13), - 0x1E14 => array(0x1E15), - 0x1E16 => array(0x1E17), - 0x1E18 => array(0x1E19), - 0x1E1A => array(0x1E1B), - 0x1E1C => array(0x1E1D), - 0x1E1E => array(0x1E1F), - 0x1E20 => array(0x1E21), - 0x1E22 => array(0x1E23), - 0x1E24 => array(0x1E25), - 0x1E26 => array(0x1E27), - 0x1E28 => array(0x1E29), - 0x1E2A => array(0x1E2B), - 0x1E2C => array(0x1E2D), - 0x1E2E => array(0x1E2F), - 0x1E30 => array(0x1E31), - 0x1E32 => array(0x1E33), - 0x1E34 => array(0x1E35), - 0x1E36 => array(0x1E37), - 0x1E38 => array(0x1E39), - 0x1E3A => array(0x1E3B), - 0x1E3C => array(0x1E3D), - 0x1E3E => array(0x1E3F), - 0x1E40 => array(0x1E41), - 0x1E42 => array(0x1E43), - 0x1E44 => array(0x1E45), - 0x1E46 => array(0x1E47), - 0x1E48 => array(0x1E49), - 0x1E4A => array(0x1E4B), - 0x1E4C => array(0x1E4D), - 0x1E4E => array(0x1E4F), - 0x1E50 => array(0x1E51), - 0x1E52 => array(0x1E53), - 0x1E54 => array(0x1E55), - 0x1E56 => array(0x1E57), - 0x1E58 => array(0x1E59), - 0x1E5A => array(0x1E5B), - 0x1E5C => array(0x1E5D), - 0x1E5E => array(0x1E5F), - 0x1E60 => array(0x1E61), - 0x1E62 => array(0x1E63), - 0x1E64 => array(0x1E65), - 0x1E66 => array(0x1E67), - 0x1E68 => array(0x1E69), - 0x1E6A => array(0x1E6B), - 0x1E6C => array(0x1E6D), - 0x1E6E => array(0x1E6F), - 0x1E70 => array(0x1E71), - 0x1E72 => array(0x1E73), - 0x1E74 => array(0x1E75), - 0x1E76 => array(0x1E77), - 0x1E78 => array(0x1E79), - 0x1E7A => array(0x1E7B), - 0x1E7C => array(0x1E7D), - 0x1E7E => array(0x1E7F), - 0x1E80 => array(0x1E81), - 0x1E82 => array(0x1E83), - 0x1E84 => array(0x1E85), - 0x1E86 => array(0x1E87), - 0x1E88 => array(0x1E89), - 0x1E8A => array(0x1E8B), - 0x1E8C => array(0x1E8D), - 0x1E8E => array(0x1E8F), - 0x1E90 => array(0x1E91), - 0x1E92 => array(0x1E93), - 0x1E94 => array(0x1E95), - 0x1E96 => array(0x68, 0x331), - 0x1E97 => array(0x74, 0x308), - 0x1E98 => array(0x77, 0x30A), - 0x1E99 => array(0x79, 0x30A), - 0x1E9A => array(0x61, 0x2BE), - 0x1E9B => array(0x1E61), - 0x1EA0 => array(0x1EA1), - 0x1EA2 => array(0x1EA3), - 0x1EA4 => array(0x1EA5), - 0x1EA6 => array(0x1EA7), - 0x1EA8 => array(0x1EA9), - 0x1EAA => array(0x1EAB), - 0x1EAC => array(0x1EAD), - 0x1EAE => array(0x1EAF), - 0x1EB0 => array(0x1EB1), - 0x1EB2 => array(0x1EB3), - 0x1EB4 => array(0x1EB5), - 0x1EB6 => array(0x1EB7), - 0x1EB8 => array(0x1EB9), - 0x1EBA => array(0x1EBB), - 0x1EBC => array(0x1EBD), - 0x1EBE => array(0x1EBF), - 0x1EC0 => array(0x1EC1), - 0x1EC2 => array(0x1EC3), - 0x1EC4 => array(0x1EC5), - 0x1EC6 => array(0x1EC7), - 0x1EC8 => array(0x1EC9), - 0x1ECA => array(0x1ECB), - 0x1ECC => array(0x1ECD), - 0x1ECE => array(0x1ECF), - 0x1ED0 => array(0x1ED1), - 0x1ED2 => array(0x1ED3), - 0x1ED4 => array(0x1ED5), - 0x1ED6 => array(0x1ED7), - 0x1ED8 => array(0x1ED9), - 0x1EDA => array(0x1EDB), - 0x1EDC => array(0x1EDD), - 0x1EDE => array(0x1EDF), - 0x1EE0 => array(0x1EE1), - 0x1EE2 => array(0x1EE3), - 0x1EE4 => array(0x1EE5), - 0x1EE6 => array(0x1EE7), - 0x1EE8 => array(0x1EE9), - 0x1EEA => array(0x1EEB), - 0x1EEC => array(0x1EED), - 0x1EEE => array(0x1EEF), - 0x1EF0 => array(0x1EF1), - 0x1EF2 => array(0x1EF3), - 0x1EF4 => array(0x1EF5), - 0x1EF6 => array(0x1EF7), - 0x1EF8 => array(0x1EF9), - 0x1F08 => array(0x1F00), - 0x1F09 => array(0x1F01), - 0x1F0A => array(0x1F02), - 0x1F0B => array(0x1F03), - 0x1F0C => array(0x1F04), - 0x1F0D => array(0x1F05), - 0x1F0E => array(0x1F06), - 0x1F0F => array(0x1F07), - 0x1F18 => array(0x1F10), - 0x1F19 => array(0x1F11), - 0x1F1A => array(0x1F12), - 0x1F1B => array(0x1F13), - 0x1F1C => array(0x1F14), - 0x1F1D => array(0x1F15), - 0x1F28 => array(0x1F20), - 0x1F29 => array(0x1F21), - 0x1F2A => array(0x1F22), - 0x1F2B => array(0x1F23), - 0x1F2C => array(0x1F24), - 0x1F2D => array(0x1F25), - 0x1F2E => array(0x1F26), - 0x1F2F => array(0x1F27), - 0x1F38 => array(0x1F30), - 0x1F39 => array(0x1F31), - 0x1F3A => array(0x1F32), - 0x1F3B => array(0x1F33), - 0x1F3C => array(0x1F34), - 0x1F3D => array(0x1F35), - 0x1F3E => array(0x1F36), - 0x1F3F => array(0x1F37), - 0x1F48 => array(0x1F40), - 0x1F49 => array(0x1F41), - 0x1F4A => array(0x1F42), - 0x1F4B => array(0x1F43), - 0x1F4C => array(0x1F44), - 0x1F4D => array(0x1F45), - 0x1F50 => array(0x3C5, 0x313), - 0x1F52 => array(0x3C5, 0x313, 0x300), - 0x1F54 => array(0x3C5, 0x313, 0x301), - 0x1F56 => array(0x3C5, 0x313, 0x342), - 0x1F59 => array(0x1F51), - 0x1F5B => array(0x1F53), - 0x1F5D => array(0x1F55), - 0x1F5F => array(0x1F57), - 0x1F68 => array(0x1F60), - 0x1F69 => array(0x1F61), - 0x1F6A => array(0x1F62), - 0x1F6B => array(0x1F63), - 0x1F6C => array(0x1F64), - 0x1F6D => array(0x1F65), - 0x1F6E => array(0x1F66), - 0x1F6F => array(0x1F67), - 0x1F80 => array(0x1F00, 0x3B9), - 0x1F81 => array(0x1F01, 0x3B9), - 0x1F82 => array(0x1F02, 0x3B9), - 0x1F83 => array(0x1F03, 0x3B9), - 0x1F84 => array(0x1F04, 0x3B9), - 0x1F85 => array(0x1F05, 0x3B9), - 0x1F86 => array(0x1F06, 0x3B9), - 0x1F87 => array(0x1F07, 0x3B9), - 0x1F88 => array(0x1F00, 0x3B9), - 0x1F89 => array(0x1F01, 0x3B9), - 0x1F8A => array(0x1F02, 0x3B9), - 0x1F8B => array(0x1F03, 0x3B9), - 0x1F8C => array(0x1F04, 0x3B9), - 0x1F8D => array(0x1F05, 0x3B9), - 0x1F8E => array(0x1F06, 0x3B9), - 0x1F8F => array(0x1F07, 0x3B9), - 0x1F90 => array(0x1F20, 0x3B9), - 0x1F91 => array(0x1F21, 0x3B9), - 0x1F92 => array(0x1F22, 0x3B9), - 0x1F93 => array(0x1F23, 0x3B9), - 0x1F94 => array(0x1F24, 0x3B9), - 0x1F95 => array(0x1F25, 0x3B9), - 0x1F96 => array(0x1F26, 0x3B9), - 0x1F97 => array(0x1F27, 0x3B9), - 0x1F98 => array(0x1F20, 0x3B9), - 0x1F99 => array(0x1F21, 0x3B9), - 0x1F9A => array(0x1F22, 0x3B9), - 0x1F9B => array(0x1F23, 0x3B9), - 0x1F9C => array(0x1F24, 0x3B9), - 0x1F9D => array(0x1F25, 0x3B9), - 0x1F9E => array(0x1F26, 0x3B9), - 0x1F9F => array(0x1F27, 0x3B9), - 0x1FA0 => array(0x1F60, 0x3B9), - 0x1FA1 => array(0x1F61, 0x3B9), - 0x1FA2 => array(0x1F62, 0x3B9), - 0x1FA3 => array(0x1F63, 0x3B9), - 0x1FA4 => array(0x1F64, 0x3B9), - 0x1FA5 => array(0x1F65, 0x3B9), - 0x1FA6 => array(0x1F66, 0x3B9), - 0x1FA7 => array(0x1F67, 0x3B9), - 0x1FA8 => array(0x1F60, 0x3B9), - 0x1FA9 => array(0x1F61, 0x3B9), - 0x1FAA => array(0x1F62, 0x3B9), - 0x1FAB => array(0x1F63, 0x3B9), - 0x1FAC => array(0x1F64, 0x3B9), - 0x1FAD => array(0x1F65, 0x3B9), - 0x1FAE => array(0x1F66, 0x3B9), - 0x1FAF => array(0x1F67, 0x3B9), - 0x1FB2 => array(0x1F70, 0x3B9), - 0x1FB3 => array(0x3B1, 0x3B9), - 0x1FB4 => array(0x3AC, 0x3B9), - 0x1FB6 => array(0x3B1, 0x342), - 0x1FB7 => array(0x3B1, 0x342, 0x3B9), - 0x1FB8 => array(0x1FB0), - 0x1FB9 => array(0x1FB1), - 0x1FBA => array(0x1F70), - 0x1FBB => array(0x1F71), - 0x1FBC => array(0x3B1, 0x3B9), - 0x1FBE => array(0x3B9), - 0x1FC2 => array(0x1F74, 0x3B9), - 0x1FC3 => array(0x3B7, 0x3B9), - 0x1FC4 => array(0x3AE, 0x3B9), - 0x1FC6 => array(0x3B7, 0x342), - 0x1FC7 => array(0x3B7, 0x342, 0x3B9), - 0x1FC8 => array(0x1F72), - 0x1FC9 => array(0x1F73), - 0x1FCA => array(0x1F74), - 0x1FCB => array(0x1F75), - 0x1FCC => array(0x3B7, 0x3B9), - 0x1FD2 => array(0x3B9, 0x308, 0x300), - 0x1FD3 => array(0x3B9, 0x308, 0x301), - 0x1FD6 => array(0x3B9, 0x342), - 0x1FD7 => array(0x3B9, 0x308, 0x342), - 0x1FD8 => array(0x1FD0), - 0x1FD9 => array(0x1FD1), - 0x1FDA => array(0x1F76), - 0x1FDB => array(0x1F77), - 0x1FE2 => array(0x3C5, 0x308, 0x300), - 0x1FE3 => array(0x3C5, 0x308, 0x301), - 0x1FE4 => array(0x3C1, 0x313), - 0x1FE6 => array(0x3C5, 0x342), - 0x1FE7 => array(0x3C5, 0x308, 0x342), - 0x1FE8 => array(0x1FE0), - 0x1FE9 => array(0x1FE1), - 0x1FEA => array(0x1F7A), - 0x1FEB => array(0x1F7B), - 0x1FEC => array(0x1FE5), - 0x1FF2 => array(0x1F7C, 0x3B9), - 0x1FF3 => array(0x3C9, 0x3B9), - 0x1FF4 => array(0x3CE, 0x3B9), - 0x1FF6 => array(0x3C9, 0x342), - 0x1FF7 => array(0x3C9, 0x342, 0x3B9), - 0x1FF8 => array(0x1F78), - 0x1FF9 => array(0x1F79), - 0x1FFA => array(0x1F7C), - 0x1FFB => array(0x1F7D), - 0x1FFC => array(0x3C9, 0x3B9), - 0x20A8 => array(0x72, 0x73), - 0x2102 => array(0x63), - 0x2103 => array(0xB0, 0x63), - 0x2107 => array(0x25B), - 0x2109 => array(0xB0, 0x66), - 0x210B => array(0x68), - 0x210C => array(0x68), - 0x210D => array(0x68), - 0x2110 => array(0x69), - 0x2111 => array(0x69), - 0x2112 => array(0x6C), - 0x2115 => array(0x6E), - 0x2116 => array(0x6E, 0x6F), - 0x2119 => array(0x70), - 0x211A => array(0x71), - 0x211B => array(0x72), - 0x211C => array(0x72), - 0x211D => array(0x72), - 0x2120 => array(0x73, 0x6D), - 0x2121 => array(0x74, 0x65, 0x6C), - 0x2122 => array(0x74, 0x6D), - 0x2124 => array(0x7A), - 0x2126 => array(0x3C9), - 0x2128 => array(0x7A), - 0x212A => array(0x6B), - 0x212B => array(0xE5), - 0x212C => array(0x62), - 0x212D => array(0x63), - 0x2130 => array(0x65), - 0x2131 => array(0x66), - 0x2133 => array(0x6D), - 0x213E => array(0x3B3), - 0x213F => array(0x3C0), - 0x2145 => array(0x64), - 0x2160 => array(0x2170), - 0x2161 => array(0x2171), - 0x2162 => array(0x2172), - 0x2163 => array(0x2173), - 0x2164 => array(0x2174), - 0x2165 => array(0x2175), - 0x2166 => array(0x2176), - 0x2167 => array(0x2177), - 0x2168 => array(0x2178), - 0x2169 => array(0x2179), - 0x216A => array(0x217A), - 0x216B => array(0x217B), - 0x216C => array(0x217C), - 0x216D => array(0x217D), - 0x216E => array(0x217E), - 0x216F => array(0x217F), - 0x24B6 => array(0x24D0), - 0x24B7 => array(0x24D1), - 0x24B8 => array(0x24D2), - 0x24B9 => array(0x24D3), - 0x24BA => array(0x24D4), - 0x24BB => array(0x24D5), - 0x24BC => array(0x24D6), - 0x24BD => array(0x24D7), - 0x24BE => array(0x24D8), - 0x24BF => array(0x24D9), - 0x24C0 => array(0x24DA), - 0x24C1 => array(0x24DB), - 0x24C2 => array(0x24DC), - 0x24C3 => array(0x24DD), - 0x24C4 => array(0x24DE), - 0x24C5 => array(0x24DF), - 0x24C6 => array(0x24E0), - 0x24C7 => array(0x24E1), - 0x24C8 => array(0x24E2), - 0x24C9 => array(0x24E3), - 0x24CA => array(0x24E4), - 0x24CB => array(0x24E5), - 0x24CC => array(0x24E6), - 0x24CD => array(0x24E7), - 0x24CE => array(0x24E8), - 0x24CF => array(0x24E9), - 0x3371 => array(0x68, 0x70, 0x61), - 0x3373 => array(0x61, 0x75), - 0x3375 => array(0x6F, 0x76), - 0x3380 => array(0x70, 0x61), - 0x3381 => array(0x6E, 0x61), - 0x3382 => array(0x3BC, 0x61), - 0x3383 => array(0x6D, 0x61), - 0x3384 => array(0x6B, 0x61), - 0x3385 => array(0x6B, 0x62), - 0x3386 => array(0x6D, 0x62), - 0x3387 => array(0x67, 0x62), - 0x338A => array(0x70, 0x66), - 0x338B => array(0x6E, 0x66), - 0x338C => array(0x3BC, 0x66), - 0x3390 => array(0x68, 0x7A), - 0x3391 => array(0x6B, 0x68, 0x7A), - 0x3392 => array(0x6D, 0x68, 0x7A), - 0x3393 => array(0x67, 0x68, 0x7A), - 0x3394 => array(0x74, 0x68, 0x7A), - 0x33A9 => array(0x70, 0x61), - 0x33AA => array(0x6B, 0x70, 0x61), - 0x33AB => array(0x6D, 0x70, 0x61), - 0x33AC => array(0x67, 0x70, 0x61), - 0x33B4 => array(0x70, 0x76), - 0x33B5 => array(0x6E, 0x76), - 0x33B6 => array(0x3BC, 0x76), - 0x33B7 => array(0x6D, 0x76), - 0x33B8 => array(0x6B, 0x76), - 0x33B9 => array(0x6D, 0x76), - 0x33BA => array(0x70, 0x77), - 0x33BB => array(0x6E, 0x77), - 0x33BC => array(0x3BC, 0x77), - 0x33BD => array(0x6D, 0x77), - 0x33BE => array(0x6B, 0x77), - 0x33BF => array(0x6D, 0x77), - 0x33C0 => array(0x6B, 0x3C9), - 0x33C1 => array(0x6D, 0x3C9), - /* 0x33C2 => array(0x61, 0x2E, 0x6D, 0x2E), */ - 0x33C3 => array(0x62, 0x71), - 0x33C6 => array(0x63, 0x2215, 0x6B, 0x67), - 0x33C7 => array(0x63, 0x6F, 0x2E), - 0x33C8 => array(0x64, 0x62), - 0x33C9 => array(0x67, 0x79), - 0x33CB => array(0x68, 0x70), - 0x33CD => array(0x6B, 0x6B), - 0x33CE => array(0x6B, 0x6D), - 0x33D7 => array(0x70, 0x68), - 0x33D9 => array(0x70, 0x70, 0x6D), - 0x33DA => array(0x70, 0x72), - 0x33DC => array(0x73, 0x76), - 0x33DD => array(0x77, 0x62), - 0xFB00 => array(0x66, 0x66), - 0xFB01 => array(0x66, 0x69), - 0xFB02 => array(0x66, 0x6C), - 0xFB03 => array(0x66, 0x66, 0x69), - 0xFB04 => array(0x66, 0x66, 0x6C), - 0xFB05 => array(0x73, 0x74), - 0xFB06 => array(0x73, 0x74), - 0xFB13 => array(0x574, 0x576), - 0xFB14 => array(0x574, 0x565), - 0xFB15 => array(0x574, 0x56B), - 0xFB16 => array(0x57E, 0x576), - 0xFB17 => array(0x574, 0x56D), - 0xFF21 => array(0xFF41), - 0xFF22 => array(0xFF42), - 0xFF23 => array(0xFF43), - 0xFF24 => array(0xFF44), - 0xFF25 => array(0xFF45), - 0xFF26 => array(0xFF46), - 0xFF27 => array(0xFF47), - 0xFF28 => array(0xFF48), - 0xFF29 => array(0xFF49), - 0xFF2A => array(0xFF4A), - 0xFF2B => array(0xFF4B), - 0xFF2C => array(0xFF4C), - 0xFF2D => array(0xFF4D), - 0xFF2E => array(0xFF4E), - 0xFF2F => array(0xFF4F), - 0xFF30 => array(0xFF50), - 0xFF31 => array(0xFF51), - 0xFF32 => array(0xFF52), - 0xFF33 => array(0xFF53), - 0xFF34 => array(0xFF54), - 0xFF35 => array(0xFF55), - 0xFF36 => array(0xFF56), - 0xFF37 => array(0xFF57), - 0xFF38 => array(0xFF58), - 0xFF39 => array(0xFF59), - 0xFF3A => array(0xFF5A), - 0x10400 => array(0x10428), - 0x10401 => array(0x10429), - 0x10402 => array(0x1042A), - 0x10403 => array(0x1042B), - 0x10404 => array(0x1042C), - 0x10405 => array(0x1042D), - 0x10406 => array(0x1042E), - 0x10407 => array(0x1042F), - 0x10408 => array(0x10430), - 0x10409 => array(0x10431), - 0x1040A => array(0x10432), - 0x1040B => array(0x10433), - 0x1040C => array(0x10434), - 0x1040D => array(0x10435), - 0x1040E => array(0x10436), - 0x1040F => array(0x10437), - 0x10410 => array(0x10438), - 0x10411 => array(0x10439), - 0x10412 => array(0x1043A), - 0x10413 => array(0x1043B), - 0x10414 => array(0x1043C), - 0x10415 => array(0x1043D), - 0x10416 => array(0x1043E), - 0x10417 => array(0x1043F), - 0x10418 => array(0x10440), - 0x10419 => array(0x10441), - 0x1041A => array(0x10442), - 0x1041B => array(0x10443), - 0x1041C => array(0x10444), - 0x1041D => array(0x10445), - 0x1041E => array(0x10446), - 0x1041F => array(0x10447), - 0x10420 => array(0x10448), - 0x10421 => array(0x10449), - 0x10422 => array(0x1044A), - 0x10423 => array(0x1044B), - 0x10424 => array(0x1044C), - 0x10425 => array(0x1044D), - 0x1D400 => array(0x61), - 0x1D401 => array(0x62), - 0x1D402 => array(0x63), - 0x1D403 => array(0x64), - 0x1D404 => array(0x65), - 0x1D405 => array(0x66), - 0x1D406 => array(0x67), - 0x1D407 => array(0x68), - 0x1D408 => array(0x69), - 0x1D409 => array(0x6A), - 0x1D40A => array(0x6B), - 0x1D40B => array(0x6C), - 0x1D40C => array(0x6D), - 0x1D40D => array(0x6E), - 0x1D40E => array(0x6F), - 0x1D40F => array(0x70), - 0x1D410 => array(0x71), - 0x1D411 => array(0x72), - 0x1D412 => array(0x73), - 0x1D413 => array(0x74), - 0x1D414 => array(0x75), - 0x1D415 => array(0x76), - 0x1D416 => array(0x77), - 0x1D417 => array(0x78), - 0x1D418 => array(0x79), - 0x1D419 => array(0x7A), - 0x1D434 => array(0x61), - 0x1D435 => array(0x62), - 0x1D436 => array(0x63), - 0x1D437 => array(0x64), - 0x1D438 => array(0x65), - 0x1D439 => array(0x66), - 0x1D43A => array(0x67), - 0x1D43B => array(0x68), - 0x1D43C => array(0x69), - 0x1D43D => array(0x6A), - 0x1D43E => array(0x6B), - 0x1D43F => array(0x6C), - 0x1D440 => array(0x6D), - 0x1D441 => array(0x6E), - 0x1D442 => array(0x6F), - 0x1D443 => array(0x70), - 0x1D444 => array(0x71), - 0x1D445 => array(0x72), - 0x1D446 => array(0x73), - 0x1D447 => array(0x74), - 0x1D448 => array(0x75), - 0x1D449 => array(0x76), - 0x1D44A => array(0x77), - 0x1D44B => array(0x78), - 0x1D44C => array(0x79), - 0x1D44D => array(0x7A), - 0x1D468 => array(0x61), - 0x1D469 => array(0x62), - 0x1D46A => array(0x63), - 0x1D46B => array(0x64), - 0x1D46C => array(0x65), - 0x1D46D => array(0x66), - 0x1D46E => array(0x67), - 0x1D46F => array(0x68), - 0x1D470 => array(0x69), - 0x1D471 => array(0x6A), - 0x1D472 => array(0x6B), - 0x1D473 => array(0x6C), - 0x1D474 => array(0x6D), - 0x1D475 => array(0x6E), - 0x1D476 => array(0x6F), - 0x1D477 => array(0x70), - 0x1D478 => array(0x71), - 0x1D479 => array(0x72), - 0x1D47A => array(0x73), - 0x1D47B => array(0x74), - 0x1D47C => array(0x75), - 0x1D47D => array(0x76), - 0x1D47E => array(0x77), - 0x1D47F => array(0x78), - 0x1D480 => array(0x79), - 0x1D481 => array(0x7A), - 0x1D49C => array(0x61), - 0x1D49E => array(0x63), - 0x1D49F => array(0x64), - 0x1D4A2 => array(0x67), - 0x1D4A5 => array(0x6A), - 0x1D4A6 => array(0x6B), - 0x1D4A9 => array(0x6E), - 0x1D4AA => array(0x6F), - 0x1D4AB => array(0x70), - 0x1D4AC => array(0x71), - 0x1D4AE => array(0x73), - 0x1D4AF => array(0x74), - 0x1D4B0 => array(0x75), - 0x1D4B1 => array(0x76), - 0x1D4B2 => array(0x77), - 0x1D4B3 => array(0x78), - 0x1D4B4 => array(0x79), - 0x1D4B5 => array(0x7A), - 0x1D4D0 => array(0x61), - 0x1D4D1 => array(0x62), - 0x1D4D2 => array(0x63), - 0x1D4D3 => array(0x64), - 0x1D4D4 => array(0x65), - 0x1D4D5 => array(0x66), - 0x1D4D6 => array(0x67), - 0x1D4D7 => array(0x68), - 0x1D4D8 => array(0x69), - 0x1D4D9 => array(0x6A), - 0x1D4DA => array(0x6B), - 0x1D4DB => array(0x6C), - 0x1D4DC => array(0x6D), - 0x1D4DD => array(0x6E), - 0x1D4DE => array(0x6F), - 0x1D4DF => array(0x70), - 0x1D4E0 => array(0x71), - 0x1D4E1 => array(0x72), - 0x1D4E2 => array(0x73), - 0x1D4E3 => array(0x74), - 0x1D4E4 => array(0x75), - 0x1D4E5 => array(0x76), - 0x1D4E6 => array(0x77), - 0x1D4E7 => array(0x78), - 0x1D4E8 => array(0x79), - 0x1D4E9 => array(0x7A), - 0x1D504 => array(0x61), - 0x1D505 => array(0x62), - 0x1D507 => array(0x64), - 0x1D508 => array(0x65), - 0x1D509 => array(0x66), - 0x1D50A => array(0x67), - 0x1D50D => array(0x6A), - 0x1D50E => array(0x6B), - 0x1D50F => array(0x6C), - 0x1D510 => array(0x6D), - 0x1D511 => array(0x6E), - 0x1D512 => array(0x6F), - 0x1D513 => array(0x70), - 0x1D514 => array(0x71), - 0x1D516 => array(0x73), - 0x1D517 => array(0x74), - 0x1D518 => array(0x75), - 0x1D519 => array(0x76), - 0x1D51A => array(0x77), - 0x1D51B => array(0x78), - 0x1D51C => array(0x79), - 0x1D538 => array(0x61), - 0x1D539 => array(0x62), - 0x1D53B => array(0x64), - 0x1D53C => array(0x65), - 0x1D53D => array(0x66), - 0x1D53E => array(0x67), - 0x1D540 => array(0x69), - 0x1D541 => array(0x6A), - 0x1D542 => array(0x6B), - 0x1D543 => array(0x6C), - 0x1D544 => array(0x6D), - 0x1D546 => array(0x6F), - 0x1D54A => array(0x73), - 0x1D54B => array(0x74), - 0x1D54C => array(0x75), - 0x1D54D => array(0x76), - 0x1D54E => array(0x77), - 0x1D54F => array(0x78), - 0x1D550 => array(0x79), - 0x1D56C => array(0x61), - 0x1D56D => array(0x62), - 0x1D56E => array(0x63), - 0x1D56F => array(0x64), - 0x1D570 => array(0x65), - 0x1D571 => array(0x66), - 0x1D572 => array(0x67), - 0x1D573 => array(0x68), - 0x1D574 => array(0x69), - 0x1D575 => array(0x6A), - 0x1D576 => array(0x6B), - 0x1D577 => array(0x6C), - 0x1D578 => array(0x6D), - 0x1D579 => array(0x6E), - 0x1D57A => array(0x6F), - 0x1D57B => array(0x70), - 0x1D57C => array(0x71), - 0x1D57D => array(0x72), - 0x1D57E => array(0x73), - 0x1D57F => array(0x74), - 0x1D580 => array(0x75), - 0x1D581 => array(0x76), - 0x1D582 => array(0x77), - 0x1D583 => array(0x78), - 0x1D584 => array(0x79), - 0x1D585 => array(0x7A), - 0x1D5A0 => array(0x61), - 0x1D5A1 => array(0x62), - 0x1D5A2 => array(0x63), - 0x1D5A3 => array(0x64), - 0x1D5A4 => array(0x65), - 0x1D5A5 => array(0x66), - 0x1D5A6 => array(0x67), - 0x1D5A7 => array(0x68), - 0x1D5A8 => array(0x69), - 0x1D5A9 => array(0x6A), - 0x1D5AA => array(0x6B), - 0x1D5AB => array(0x6C), - 0x1D5AC => array(0x6D), - 0x1D5AD => array(0x6E), - 0x1D5AE => array(0x6F), - 0x1D5AF => array(0x70), - 0x1D5B0 => array(0x71), - 0x1D5B1 => array(0x72), - 0x1D5B2 => array(0x73), - 0x1D5B3 => array(0x74), - 0x1D5B4 => array(0x75), - 0x1D5B5 => array(0x76), - 0x1D5B6 => array(0x77), - 0x1D5B7 => array(0x78), - 0x1D5B8 => array(0x79), - 0x1D5B9 => array(0x7A), - 0x1D5D4 => array(0x61), - 0x1D5D5 => array(0x62), - 0x1D5D6 => array(0x63), - 0x1D5D7 => array(0x64), - 0x1D5D8 => array(0x65), - 0x1D5D9 => array(0x66), - 0x1D5DA => array(0x67), - 0x1D5DB => array(0x68), - 0x1D5DC => array(0x69), - 0x1D5DD => array(0x6A), - 0x1D5DE => array(0x6B), - 0x1D5DF => array(0x6C), - 0x1D5E0 => array(0x6D), - 0x1D5E1 => array(0x6E), - 0x1D5E2 => array(0x6F), - 0x1D5E3 => array(0x70), - 0x1D5E4 => array(0x71), - 0x1D5E5 => array(0x72), - 0x1D5E6 => array(0x73), - 0x1D5E7 => array(0x74), - 0x1D5E8 => array(0x75), - 0x1D5E9 => array(0x76), - 0x1D5EA => array(0x77), - 0x1D5EB => array(0x78), - 0x1D5EC => array(0x79), - 0x1D5ED => array(0x7A), - 0x1D608 => array(0x61), - 0x1D609 => array(0x62), - 0x1D60A => array(0x63), - 0x1D60B => array(0x64), - 0x1D60C => array(0x65), - 0x1D60D => array(0x66), - 0x1D60E => array(0x67), - 0x1D60F => array(0x68), - 0x1D610 => array(0x69), - 0x1D611 => array(0x6A), - 0x1D612 => array(0x6B), - 0x1D613 => array(0x6C), - 0x1D614 => array(0x6D), - 0x1D615 => array(0x6E), - 0x1D616 => array(0x6F), - 0x1D617 => array(0x70), - 0x1D618 => array(0x71), - 0x1D619 => array(0x72), - 0x1D61A => array(0x73), - 0x1D61B => array(0x74), - 0x1D61C => array(0x75), - 0x1D61D => array(0x76), - 0x1D61E => array(0x77), - 0x1D61F => array(0x78), - 0x1D620 => array(0x79), - 0x1D621 => array(0x7A), - 0x1D63C => array(0x61), - 0x1D63D => array(0x62), - 0x1D63E => array(0x63), - 0x1D63F => array(0x64), - 0x1D640 => array(0x65), - 0x1D641 => array(0x66), - 0x1D642 => array(0x67), - 0x1D643 => array(0x68), - 0x1D644 => array(0x69), - 0x1D645 => array(0x6A), - 0x1D646 => array(0x6B), - 0x1D647 => array(0x6C), - 0x1D648 => array(0x6D), - 0x1D649 => array(0x6E), - 0x1D64A => array(0x6F), - 0x1D64B => array(0x70), - 0x1D64C => array(0x71), - 0x1D64D => array(0x72), - 0x1D64E => array(0x73), - 0x1D64F => array(0x74), - 0x1D650 => array(0x75), - 0x1D651 => array(0x76), - 0x1D652 => array(0x77), - 0x1D653 => array(0x78), - 0x1D654 => array(0x79), - 0x1D655 => array(0x7A), - 0x1D670 => array(0x61), - 0x1D671 => array(0x62), - 0x1D672 => array(0x63), - 0x1D673 => array(0x64), - 0x1D674 => array(0x65), - 0x1D675 => array(0x66), - 0x1D676 => array(0x67), - 0x1D677 => array(0x68), - 0x1D678 => array(0x69), - 0x1D679 => array(0x6A), - 0x1D67A => array(0x6B), - 0x1D67B => array(0x6C), - 0x1D67C => array(0x6D), - 0x1D67D => array(0x6E), - 0x1D67E => array(0x6F), - 0x1D67F => array(0x70), - 0x1D680 => array(0x71), - 0x1D681 => array(0x72), - 0x1D682 => array(0x73), - 0x1D683 => array(0x74), - 0x1D684 => array(0x75), - 0x1D685 => array(0x76), - 0x1D686 => array(0x77), - 0x1D687 => array(0x78), - 0x1D688 => array(0x79), - 0x1D689 => array(0x7A), - 0x1D6A8 => array(0x3B1), - 0x1D6A9 => array(0x3B2), - 0x1D6AA => array(0x3B3), - 0x1D6AB => array(0x3B4), - 0x1D6AC => array(0x3B5), - 0x1D6AD => array(0x3B6), - 0x1D6AE => array(0x3B7), - 0x1D6AF => array(0x3B8), - 0x1D6B0 => array(0x3B9), - 0x1D6B1 => array(0x3BA), - 0x1D6B2 => array(0x3BB), - 0x1D6B3 => array(0x3BC), - 0x1D6B4 => array(0x3BD), - 0x1D6B5 => array(0x3BE), - 0x1D6B6 => array(0x3BF), - 0x1D6B7 => array(0x3C0), - 0x1D6B8 => array(0x3C1), - 0x1D6B9 => array(0x3B8), - 0x1D6BA => array(0x3C3), - 0x1D6BB => array(0x3C4), - 0x1D6BC => array(0x3C5), - 0x1D6BD => array(0x3C6), - 0x1D6BE => array(0x3C7), - 0x1D6BF => array(0x3C8), - 0x1D6C0 => array(0x3C9), - 0x1D6D3 => array(0x3C3), - 0x1D6E2 => array(0x3B1), - 0x1D6E3 => array(0x3B2), - 0x1D6E4 => array(0x3B3), - 0x1D6E5 => array(0x3B4), - 0x1D6E6 => array(0x3B5), - 0x1D6E7 => array(0x3B6), - 0x1D6E8 => array(0x3B7), - 0x1D6E9 => array(0x3B8), - 0x1D6EA => array(0x3B9), - 0x1D6EB => array(0x3BA), - 0x1D6EC => array(0x3BB), - 0x1D6ED => array(0x3BC), - 0x1D6EE => array(0x3BD), - 0x1D6EF => array(0x3BE), - 0x1D6F0 => array(0x3BF), - 0x1D6F1 => array(0x3C0), - 0x1D6F2 => array(0x3C1), - 0x1D6F3 => array(0x3B8), - 0x1D6F4 => array(0x3C3), - 0x1D6F5 => array(0x3C4), - 0x1D6F6 => array(0x3C5), - 0x1D6F7 => array(0x3C6), - 0x1D6F8 => array(0x3C7), - 0x1D6F9 => array(0x3C8), - 0x1D6FA => array(0x3C9), - 0x1D70D => array(0x3C3), - 0x1D71C => array(0x3B1), - 0x1D71D => array(0x3B2), - 0x1D71E => array(0x3B3), - 0x1D71F => array(0x3B4), - 0x1D720 => array(0x3B5), - 0x1D721 => array(0x3B6), - 0x1D722 => array(0x3B7), - 0x1D723 => array(0x3B8), - 0x1D724 => array(0x3B9), - 0x1D725 => array(0x3BA), - 0x1D726 => array(0x3BB), - 0x1D727 => array(0x3BC), - 0x1D728 => array(0x3BD), - 0x1D729 => array(0x3BE), - 0x1D72A => array(0x3BF), - 0x1D72B => array(0x3C0), - 0x1D72C => array(0x3C1), - 0x1D72D => array(0x3B8), - 0x1D72E => array(0x3C3), - 0x1D72F => array(0x3C4), - 0x1D730 => array(0x3C5), - 0x1D731 => array(0x3C6), - 0x1D732 => array(0x3C7), - 0x1D733 => array(0x3C8), - 0x1D734 => array(0x3C9), - 0x1D747 => array(0x3C3), - 0x1D756 => array(0x3B1), - 0x1D757 => array(0x3B2), - 0x1D758 => array(0x3B3), - 0x1D759 => array(0x3B4), - 0x1D75A => array(0x3B5), - 0x1D75B => array(0x3B6), - 0x1D75C => array(0x3B7), - 0x1D75D => array(0x3B8), - 0x1D75E => array(0x3B9), - 0x1D75F => array(0x3BA), - 0x1D760 => array(0x3BB), - 0x1D761 => array(0x3BC), - 0x1D762 => array(0x3BD), - 0x1D763 => array(0x3BE), - 0x1D764 => array(0x3BF), - 0x1D765 => array(0x3C0), - 0x1D766 => array(0x3C1), - 0x1D767 => array(0x3B8), - 0x1D768 => array(0x3C3), - 0x1D769 => array(0x3C4), - 0x1D76A => array(0x3C5), - 0x1D76B => array(0x3C6), - 0x1D76C => array(0x3C7), - 0x1D76D => array(0x3C8), - 0x1D76E => array(0x3C9), - 0x1D781 => array(0x3C3), - 0x1D790 => array(0x3B1), - 0x1D791 => array(0x3B2), - 0x1D792 => array(0x3B3), - 0x1D793 => array(0x3B4), - 0x1D794 => array(0x3B5), - 0x1D795 => array(0x3B6), - 0x1D796 => array(0x3B7), - 0x1D797 => array(0x3B8), - 0x1D798 => array(0x3B9), - 0x1D799 => array(0x3BA), - 0x1D79A => array(0x3BB), - 0x1D79B => array(0x3BC), - 0x1D79C => array(0x3BD), - 0x1D79D => array(0x3BE), - 0x1D79E => array(0x3BF), - 0x1D79F => array(0x3C0), - 0x1D7A0 => array(0x3C1), - 0x1D7A1 => array(0x3B8), - 0x1D7A2 => array(0x3C3), - 0x1D7A3 => array(0x3C4), - 0x1D7A4 => array(0x3C5), - 0x1D7A5 => array(0x3C6), - 0x1D7A6 => array(0x3C7), - 0x1D7A7 => array(0x3C8), - 0x1D7A8 => array(0x3C9), - 0x1D7BB => array(0x3C3), - 0x3F9 => array(0x3C3), - 0x1D2C => array(0x61), - 0x1D2D => array(0xE6), - 0x1D2E => array(0x62), - 0x1D30 => array(0x64), - 0x1D31 => array(0x65), - 0x1D32 => array(0x1DD), - 0x1D33 => array(0x67), - 0x1D34 => array(0x68), - 0x1D35 => array(0x69), - 0x1D36 => array(0x6A), - 0x1D37 => array(0x6B), - 0x1D38 => array(0x6C), - 0x1D39 => array(0x6D), - 0x1D3A => array(0x6E), - 0x1D3C => array(0x6F), - 0x1D3D => array(0x223), - 0x1D3E => array(0x70), - 0x1D3F => array(0x72), - 0x1D40 => array(0x74), - 0x1D41 => array(0x75), - 0x1D42 => array(0x77), - 0x213B => array(0x66, 0x61, 0x78), - 0x3250 => array(0x70, 0x74, 0x65), - 0x32CC => array(0x68, 0x67), - 0x32CE => array(0x65, 0x76), - 0x32CF => array(0x6C, 0x74, 0x64), - 0x337A => array(0x69, 0x75), - 0x33DE => array(0x76, 0x2215, 0x6D), - 0x33DF => array(0x61, 0x2215, 0x6D) - ); - - /** - * Normalization Combining Classes; Code Points not listed - * got Combining Class 0. - * - * @static - * @var array - * @access private - */ - private static $_np_norm_combcls = array( - 0x334 => 1, - 0x335 => 1, - 0x336 => 1, - 0x337 => 1, - 0x338 => 1, - 0x93C => 7, - 0x9BC => 7, - 0xA3C => 7, - 0xABC => 7, - 0xB3C => 7, - 0xCBC => 7, - 0x1037 => 7, - 0x3099 => 8, - 0x309A => 8, - 0x94D => 9, - 0x9CD => 9, - 0xA4D => 9, - 0xACD => 9, - 0xB4D => 9, - 0xBCD => 9, - 0xC4D => 9, - 0xCCD => 9, - 0xD4D => 9, - 0xDCA => 9, - 0xE3A => 9, - 0xF84 => 9, - 0x1039 => 9, - 0x1714 => 9, - 0x1734 => 9, - 0x17D2 => 9, - 0x5B0 => 10, - 0x5B1 => 11, - 0x5B2 => 12, - 0x5B3 => 13, - 0x5B4 => 14, - 0x5B5 => 15, - 0x5B6 => 16, - 0x5B7 => 17, - 0x5B8 => 18, - 0x5B9 => 19, - 0x5BB => 20, - 0x5Bc => 21, - 0x5BD => 22, - 0x5BF => 23, - 0x5C1 => 24, - 0x5C2 => 25, - 0xFB1E => 26, - 0x64B => 27, - 0x64C => 28, - 0x64D => 29, - 0x64E => 30, - 0x64F => 31, - 0x650 => 32, - 0x651 => 33, - 0x652 => 34, - 0x670 => 35, - 0x711 => 36, - 0xC55 => 84, - 0xC56 => 91, - 0xE38 => 103, - 0xE39 => 103, - 0xE48 => 107, - 0xE49 => 107, - 0xE4A => 107, - 0xE4B => 107, - 0xEB8 => 118, - 0xEB9 => 118, - 0xEC8 => 122, - 0xEC9 => 122, - 0xECA => 122, - 0xECB => 122, - 0xF71 => 129, - 0xF72 => 130, - 0xF7A => 130, - 0xF7B => 130, - 0xF7C => 130, - 0xF7D => 130, - 0xF80 => 130, - 0xF74 => 132, - 0x321 => 202, - 0x322 => 202, - 0x327 => 202, - 0x328 => 202, - 0x31B => 216, - 0xF39 => 216, - 0x1D165 => 216, - 0x1D166 => 216, - 0x1D16E => 216, - 0x1D16F => 216, - 0x1D170 => 216, - 0x1D171 => 216, - 0x1D172 => 216, - 0x302A => 218, - 0x316 => 220, - 0x317 => 220, - 0x318 => 220, - 0x319 => 220, - 0x31C => 220, - 0x31D => 220, - 0x31E => 220, - 0x31F => 220, - 0x320 => 220, - 0x323 => 220, - 0x324 => 220, - 0x325 => 220, - 0x326 => 220, - 0x329 => 220, - 0x32A => 220, - 0x32B => 220, - 0x32C => 220, - 0x32D => 220, - 0x32E => 220, - 0x32F => 220, - 0x330 => 220, - 0x331 => 220, - 0x332 => 220, - 0x333 => 220, - 0x339 => 220, - 0x33A => 220, - 0x33B => 220, - 0x33C => 220, - 0x347 => 220, - 0x348 => 220, - 0x349 => 220, - 0x34D => 220, - 0x34E => 220, - 0x353 => 220, - 0x354 => 220, - 0x355 => 220, - 0x356 => 220, - 0x591 => 220, - 0x596 => 220, - 0x59B => 220, - 0x5A3 => 220, - 0x5A4 => 220, - 0x5A5 => 220, - 0x5A6 => 220, - 0x5A7 => 220, - 0x5AA => 220, - 0x655 => 220, - 0x656 => 220, - 0x6E3 => 220, - 0x6EA => 220, - 0x6ED => 220, - 0x731 => 220, - 0x734 => 220, - 0x737 => 220, - 0x738 => 220, - 0x739 => 220, - 0x73B => 220, - 0x73C => 220, - 0x73E => 220, - 0x742 => 220, - 0x744 => 220, - 0x746 => 220, - 0x748 => 220, - 0x952 => 220, - 0xF18 => 220, - 0xF19 => 220, - 0xF35 => 220, - 0xF37 => 220, - 0xFC6 => 220, - 0x193B => 220, - 0x20E8 => 220, - 0x1D17B => 220, - 0x1D17C => 220, - 0x1D17D => 220, - 0x1D17E => 220, - 0x1D17F => 220, - 0x1D180 => 220, - 0x1D181 => 220, - 0x1D182 => 220, - 0x1D18A => 220, - 0x1D18B => 220, - 0x59A => 222, - 0x5AD => 222, - 0x1929 => 222, - 0x302D => 222, - 0x302E => 224, - 0x302F => 224, - 0x1D16D => 226, - 0x5AE => 228, - 0x18A9 => 228, - 0x302B => 228, - 0x300 => 230, - 0x301 => 230, - 0x302 => 230, - 0x303 => 230, - 0x304 => 230, - 0x305 => 230, - 0x306 => 230, - 0x307 => 230, - 0x308 => 230, - 0x309 => 230, - 0x30A => 230, - 0x30B => 230, - 0x30C => 230, - 0x30D => 230, - 0x30E => 230, - 0x30F => 230, - 0x310 => 230, - 0x311 => 230, - 0x312 => 230, - 0x313 => 230, - 0x314 => 230, - 0x33D => 230, - 0x33E => 230, - 0x33F => 230, - 0x340 => 230, - 0x341 => 230, - 0x342 => 230, - 0x343 => 230, - 0x344 => 230, - 0x346 => 230, - 0x34A => 230, - 0x34B => 230, - 0x34C => 230, - 0x350 => 230, - 0x351 => 230, - 0x352 => 230, - 0x357 => 230, - 0x363 => 230, - 0x364 => 230, - 0x365 => 230, - 0x366 => 230, - 0x367 => 230, - 0x368 => 230, - 0x369 => 230, - 0x36A => 230, - 0x36B => 230, - 0x36C => 230, - 0x36D => 230, - 0x36E => 230, - 0x36F => 230, - 0x483 => 230, - 0x484 => 230, - 0x485 => 230, - 0x486 => 230, - 0x592 => 230, - 0x593 => 230, - 0x594 => 230, - 0x595 => 230, - 0x597 => 230, - 0x598 => 230, - 0x599 => 230, - 0x59C => 230, - 0x59D => 230, - 0x59E => 230, - 0x59F => 230, - 0x5A0 => 230, - 0x5A1 => 230, - 0x5A8 => 230, - 0x5A9 => 230, - 0x5AB => 230, - 0x5AC => 230, - 0x5AF => 230, - 0x5C4 => 230, - 0x610 => 230, - 0x611 => 230, - 0x612 => 230, - 0x613 => 230, - 0x614 => 230, - 0x615 => 230, - 0x653 => 230, - 0x654 => 230, - 0x657 => 230, - 0x658 => 230, - 0x6D6 => 230, - 0x6D7 => 230, - 0x6D8 => 230, - 0x6D9 => 230, - 0x6DA => 230, - 0x6DB => 230, - 0x6DC => 230, - 0x6DF => 230, - 0x6E0 => 230, - 0x6E1 => 230, - 0x6E2 => 230, - 0x6E4 => 230, - 0x6E7 => 230, - 0x6E8 => 230, - 0x6EB => 230, - 0x6EC => 230, - 0x730 => 230, - 0x732 => 230, - 0x733 => 230, - 0x735 => 230, - 0x736 => 230, - 0x73A => 230, - 0x73D => 230, - 0x73F => 230, - 0x740 => 230, - 0x741 => 230, - 0x743 => 230, - 0x745 => 230, - 0x747 => 230, - 0x749 => 230, - 0x74A => 230, - 0x951 => 230, - 0x953 => 230, - 0x954 => 230, - 0xF82 => 230, - 0xF83 => 230, - 0xF86 => 230, - 0xF87 => 230, - 0x170D => 230, - 0x193A => 230, - 0x20D0 => 230, - 0x20D1 => 230, - 0x20D4 => 230, - 0x20D5 => 230, - 0x20D6 => 230, - 0x20D7 => 230, - 0x20DB => 230, - 0x20DC => 230, - 0x20E1 => 230, - 0x20E7 => 230, - 0x20E9 => 230, - 0xFE20 => 230, - 0xFE21 => 230, - 0xFE22 => 230, - 0xFE23 => 230, - 0x1D185 => 230, - 0x1D186 => 230, - 0x1D187 => 230, - 0x1D189 => 230, - 0x1D188 => 230, - 0x1D1AA => 230, - 0x1D1AB => 230, - 0x1D1AC => 230, - 0x1D1AD => 230, - 0x315 => 232, - 0x31A => 232, - 0x302C => 232, - 0x35F => 233, - 0x362 => 233, - 0x35D => 234, - 0x35E => 234, - 0x360 => 234, - 0x361 => 234, - 0x345 => 240 - ); - // }}} - - // {{{ properties - /** - * @var string - * @access private - */ - private $_punycode_prefix = 'xn--'; - - /** - * @access private - */ - private $_invalid_ucs = 0x80000000; - - /** - * @access private - */ - private $_max_ucs = 0x10FFFF; - - /** - * @var int - * @access private - */ - private $_base = 36; - - /** - * @var int - * @access private - */ - private $_tmin = 1; - - /** - * @var int - * @access private - */ - private $_tmax = 26; - - /** - * @var int - * @access private - */ - private $_skew = 38; - - /** - * @var int - * @access private - */ - private $_damp = 700; - - /** - * @var int - * @access private - */ - private $_initial_bias = 72; - - /** - * @var int - * @access private - */ - private $_initial_n = 0x80; - - /** - * @var int - * @access private - */ - private $_slast; - - /** - * @access private - */ - private $_sbase = 0xAC00; - - /** - * @access private - */ - private $_lbase = 0x1100; - - /** - * @access private - */ - private $_vbase = 0x1161; - - /** - * @access private - */ - private $_tbase = 0x11a7; - - /** - * @var int - * @access private - */ - private $_lcount = 19; - - /** - * @var int - * @access private - */ - private $_vcount = 21; - - /** - * @var int - * @access private - */ - private $_tcount = 28; - - /** - * vcount * tcount - * - * @var int - * @access private - */ - private $_ncount = 588; - - /** - * lcount * tcount * vcount - * - * @var int - * @access private - */ - private $_scount = 11172; - - /** - * Default encoding for encode()'s input and decode()'s output is UTF-8; - * Other possible encodings are ucs4_string and ucs4_array - * See {@link setParams()} for how to select these - * - * @var bool - * @access private - */ - private $_api_encoding = 'utf8'; - - /** - * Overlong UTF-8 encodings are forbidden - * - * @var bool - * @access private - */ - private $_allow_overlong = false; - - /** - * Behave strict or not - * - * @var bool - * @access private - */ - private $_strict_mode = false; - - /** - * IDNA-version to use - * - * Values are "2003" and "2008". - * Defaults to "2003", since that was the original version and for - * compatibility with previous versions of this library. - * If you need to encode "new" characters like the German "Eszett", - * please switch to 2008 first before encoding. - * - * @var bool - * @access private - */ - private $_version = '2003'; - - /** - * Cached value indicating whether or not mbstring function overloading is - * on for strlen - * - * This is cached for optimal performance. - * - * @var boolean - * @see Net_IDNA2::_byteLength() - */ - private static $_mb_string_overload = null; - // }}} - - - // {{{ constructor - /** - * Constructor - * - * @param array $options Options to initialise the object with - * - * @access public - * @see setParams() - */ - public function __construct($options = null) - { - $this->_slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount; - - if (is_array($options)) { - $this->setParams($options); - } - - // populate mbstring overloading cache if not set - if (self::$_mb_string_overload === null) { - self::$_mb_string_overload = (extension_loaded('mbstring') - && (ini_get('mbstring.func_overload') & 0x02) === 0x02); - } - } - // }}} - - - /** - * Sets a new option value. Available options and values: - * - * [utf8 - Use either UTF-8 or ISO-8859-1 as input (true for UTF-8, false - * otherwise); The output is always UTF-8] - * [overlong - Unicode does not allow unnecessarily long encodings of chars, - * to allow this, set this parameter to true, else to false; - * default is false.] - * [strict - true: strict mode, good for registration purposes - Causes errors - * on failures; false: loose mode, ideal for "wildlife" applications - * by silently ignoring errors and returning the original input instead] - * - * @param mixed $option Parameter to set (string: single parameter; array of Parameter => Value pairs) - * @param string $value Value to use (if parameter 1 is a string) - * - * @return boolean true on success, false otherwise - * @access public - */ - public function setParams($option, $value = false) - { - if (!is_array($option)) { - $option = array($option => $value); - } - - foreach ($option as $k => $v) { - switch ($k) { - case 'encoding': - switch ($v) { - case 'utf8': - case 'ucs4_string': - case 'ucs4_array': - $this->_api_encoding = $v; - break; - - default: - throw new InvalidArgumentException('Set Parameter: Unknown parameter '.$v.' for option '.$k); - } - - break; - - case 'overlong': - $this->_allow_overlong = ($v) ? true : false; - break; - - case 'strict': - $this->_strict_mode = ($v) ? true : false; - break; - - case 'version': - if (in_array($v, array('2003', '2008'))) { - $this->_version = $v; - } else { - throw new InvalidArgumentException('Set Parameter: Invalid parameter '.$v.' for option '.$k); - } - break; - - default: - return false; - } - } - - return true; - } - - /** - * Encode a given UTF-8 domain name. - * - * @param string $decoded Domain name (UTF-8 or UCS-4) - * @param string $one_time_encoding Desired input encoding, see {@link set_parameter} - * If not given will use default-encoding - * - * @return string Encoded Domain name (ACE string) - * @return mixed processed string - * @throws Exception - * @access public - */ - public function encode($decoded, $one_time_encoding = false) - { - // Forcing conversion of input to UCS4 array - // If one time encoding is given, use this, else the objects property - switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { - case 'utf8': - $decoded = $this->_utf8_to_ucs4($decoded); - break; - case 'ucs4_string': - $decoded = $this->_ucs4_string_to_ucs4($decoded); - case 'ucs4_array': // No break; before this line. Catch case, but do nothing - break; - default: - throw new InvalidArgumentException('Unsupported input format'); - } - - // No input, no output, what else did you expect? - if (empty($decoded)) return ''; - - // Anchors for iteration - $last_begin = 0; - // Output string - $output = ''; - - foreach ($decoded as $k => $v) { - // Make sure to use just the plain dot - switch($v) { - case 0x3002: - case 0xFF0E: - case 0xFF61: - $decoded[$k] = 0x2E; - // It's right, no break here - // The codepoints above have to be converted to dots anyway - - // Stumbling across an anchoring character - case 0x2E: - case 0x2F: - case 0x3A: - case 0x3F: - case 0x40: - // Neither email addresses nor URLs allowed in strict mode - if ($this->_strict_mode) { - throw new InvalidArgumentException('Neither email addresses nor URLs are allowed in strict mode.'); - } - // Skip first char - if ($k) { - $encoded = ''; - $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin))); - if ($encoded) { - $output .= $encoded; - } else { - $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin))); - } - $output .= chr($decoded[$k]); - } - $last_begin = $k + 1; - } - } - // Catch the rest of the string - if ($last_begin) { - $inp_len = sizeof($decoded); - $encoded = ''; - $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); - if ($encoded) { - $output .= $encoded; - } else { - $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); - } - return $output; - } - - if ($output = $this->_encode($decoded)) { - return $output; - } - - return $this->_ucs4_to_utf8($decoded); - } - - /** - * Decode a given ACE domain name. - * - * @param string $input Domain name (ACE string) - * @param string $one_time_encoding Desired output encoding, see {@link set_parameter} - * - * @return string Decoded Domain name (UTF-8 or UCS-4) - * @throws Exception - * @access public - */ - public function decode($input, $one_time_encoding = false) - { - // Optionally set - if ($one_time_encoding) { - switch ($one_time_encoding) { - case 'utf8': - case 'ucs4_string': - case 'ucs4_array': - break; - default: - throw new InvalidArgumentException('Unknown encoding '.$one_time_encoding); - } - } - // Make sure to drop any newline characters around - $input = trim($input); - - // Negotiate input and try to determine, wether it is a plain string, - // an email address or something like a complete URL - if (strpos($input, '@')) { // Maybe it is an email address - // No no in strict mode - if ($this->_strict_mode) { - throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); - } - list($email_pref, $input) = explode('@', $input, 2); - $arr = explode('.', $input); - foreach ($arr as $k => $v) { - $conv = $this->_decode($v); - if ($conv) $arr[$k] = $conv; - } - $return = $email_pref . '@' . join('.', $arr); - } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters) - // No no in strict mode - if ($this->_strict_mode) { - throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); - } - - $parsed = parse_url($input); - if (isset($parsed['host'])) { - $arr = explode('.', $parsed['host']); - foreach ($arr as $k => $v) { - $conv = $this->_decode($v); - if ($conv) $arr[$k] = $conv; - } - $parsed['host'] = join('.', $arr); - if (isset($parsed['scheme'])) { - $parsed['scheme'] .= (strtolower($parsed['scheme']) == 'mailto') ? ':' : '://'; - } - $return = $this->_unparse_url($parsed); - } else { // parse_url seems to have failed, try without it - $arr = explode('.', $input); - foreach ($arr as $k => $v) { - $conv = $this->_decode($v); - if ($conv) $arr[$k] = $conv; - } - $return = join('.', $arr); - } - } else { // Otherwise we consider it being a pure domain name string - $return = $this->_decode($input); - } - // The output is UTF-8 by default, other output formats need conversion here - // If one time encoding is given, use this, else the objects property - switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { - case 'utf8': - return $return; - break; - case 'ucs4_string': - return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return)); - break; - case 'ucs4_array': - return $this->_utf8_to_ucs4($return); - break; - default: - throw new InvalidArgumentException('Unsupported output format'); - } - } - - - // {{{ private - /** - * Opposite function to parse_url() - * - * Inspired by code from comments of php.net-documentation for parse_url() - * - * @param array $parts_arr parts (strings) as returned by parse_url() - * - * @return string - * @access private - */ - private function _unparse_url($parts_arr) - { - if (!empty($parts_arr['scheme'])) { - $ret_url = $parts_arr['scheme']; - } - if (!empty($parts_arr['user'])) { - $ret_url .= $parts_arr['user']; - if (!empty($parts_arr['pass'])) { - $ret_url .= ':' . $parts_arr['pass']; - } - $ret_url .= '@'; - } - $ret_url .= $parts_arr['host']; - if (!empty($parts_arr['port'])) { - $ret_url .= ':' . $parts_arr['port']; - } - $ret_url .= $parts_arr['path']; - if (!empty($parts_arr['query'])) { - $ret_url .= '?' . $parts_arr['query']; - } - if (!empty($parts_arr['fragment'])) { - $ret_url .= '#' . $parts_arr['fragment']; - } - return $ret_url; - } - - /** - * The actual encoding algorithm. - * - * @param string $decoded Decoded string which should be encoded - * - * @return string Encoded string - * @throws Exception - * @access private - */ - private function _encode($decoded) - { - // We cannot encode a domain name containing the Punycode prefix - $extract = self::_byteLength($this->_punycode_prefix); - $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix); - $check_deco = array_slice($decoded, 0, $extract); - - if ($check_pref == $check_deco) { - throw new InvalidArgumentException('This is already a punycode string'); - } - - // We will not try to encode strings consisting of basic code points only - $encodable = false; - foreach ($decoded as $k => $v) { - if ($v > 0x7a) { - $encodable = true; - break; - } - } - if (!$encodable) { - if ($this->_strict_mode) { - throw new InvalidArgumentException('The given string does not contain encodable chars'); - } - - return false; - } - - // Do NAMEPREP - $decoded = $this->_nameprep($decoded); - - $deco_len = count($decoded); - - // Empty array - if (!$deco_len) { - return false; - } - - // How many chars have been consumed - $codecount = 0; - - // Start with the prefix; copy it to output - $encoded = $this->_punycode_prefix; - - $encoded = ''; - // Copy all basic code points to output - for ($i = 0; $i < $deco_len; ++$i) { - $test = $decoded[$i]; - // Will match [0-9a-zA-Z-] - if ((0x2F < $test && $test < 0x40) - || (0x40 < $test && $test < 0x5B) - || (0x60 < $test && $test <= 0x7B) - || (0x2D == $test) - ) { - $encoded .= chr($decoded[$i]); - $codecount++; - } - } - - // All codepoints were basic ones - if ($codecount == $deco_len) { - return $encoded; - } - - // Start with the prefix; copy it to output - $encoded = $this->_punycode_prefix . $encoded; - - // If we have basic code points in output, add an hyphen to the end - if ($codecount) { - $encoded .= '-'; - } - - // Now find and encode all non-basic code points - $is_first = true; - $cur_code = $this->_initial_n; - $bias = $this->_initial_bias; - $delta = 0; - - while ($codecount < $deco_len) { - // Find the smallest code point >= the current code point and - // remember the last ouccrence of it in the input - for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) { - if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) { - $next_code = $decoded[$i]; - } - } - - $delta += ($next_code - $cur_code) * ($codecount + 1); - $cur_code = $next_code; - - // Scan input again and encode all characters whose code point is $cur_code - for ($i = 0; $i < $deco_len; $i++) { - if ($decoded[$i] < $cur_code) { - $delta++; - } else if ($decoded[$i] == $cur_code) { - for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) { - $t = ($k <= $bias)? - $this->_tmin : - (($k >= $bias + $this->_tmax)? $this->_tmax : $k - $bias); - - if ($q < $t) { - break; - } - - $encoded .= $this->_encodeDigit(ceil($t + (($q - $t) % ($this->_base - $t)))); - $q = ($q - $t) / ($this->_base - $t); - } - - $encoded .= $this->_encodeDigit($q); - $bias = $this->_adapt($delta, $codecount + 1, $is_first); - $codecount++; - $delta = 0; - $is_first = false; - } - } - - $delta++; - $cur_code++; - } - - return $encoded; - } - - /** - * The actual decoding algorithm. - * - * @param string $encoded Encoded string which should be decoded - * - * @return string Decoded string - * @throws Exception - * @access private - */ - private function _decode($encoded) - { - // We do need to find the Punycode prefix - if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) { - return false; - } - - $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded); - - // If nothing left after removing the prefix, it is hopeless - if (!$encode_test) { - return false; - } - - // Find last occurence of the delimiter - $delim_pos = strrpos($encoded, '-'); - - if ($delim_pos > self::_byteLength($this->_punycode_prefix)) { - for ($k = self::_byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) { - $decoded[] = ord($encoded{$k}); - } - } else { - $decoded = array(); - } - - $deco_len = count($decoded); - $enco_len = self::_byteLength($encoded); - - // Wandering through the strings; init - $is_first = true; - $bias = $this->_initial_bias; - $idx = 0; - $char = $this->_initial_n; - - for ($enco_idx = ($delim_pos)? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) { - for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) { - $digit = $this->_decodeDigit($encoded{$enco_idx++}); - $idx += $digit * $w; - - $t = ($k <= $bias) ? - $this->_tmin : - (($k >= $bias + $this->_tmax)? $this->_tmax : ($k - $bias)); - - if ($digit < $t) { - break; - } - - $w = (int)($w * ($this->_base - $t)); - } - - $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first); - $is_first = false; - $char += (int) ($idx / ($deco_len + 1)); - $idx %= ($deco_len + 1); - - if ($deco_len > 0) { - // Make room for the decoded char - for ($i = $deco_len; $i > $idx; $i--) { - $decoded[$i] = $decoded[($i - 1)]; - } - } - - $decoded[$idx++] = $char; - } - - return $this->_ucs4_to_utf8($decoded); - } - - /** - * Adapt the bias according to the current code point and position. - * - * @param int $delta ... - * @param int $npoints ... - * @param boolean $is_first ... - * - * @return int - * @access private - */ - private function _adapt($delta, $npoints, $is_first) - { - $delta = (int) ($is_first ? ($delta / $this->_damp) : ($delta / 2)); - $delta += (int) ($delta / $npoints); - - for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) { - $delta = (int) ($delta / ($this->_base - $this->_tmin)); - } - - return (int) ($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew)); - } - - /** - * Encoding a certain digit. - * - * @param int $d One digit to encode - * - * @return char Encoded digit - * @access private - */ - private function _encodeDigit($d) - { - return chr($d + 22 + 75 * ($d < 26)); - } - - /** - * Decode a certain digit. - * - * @param char $cp One digit (character) to decode - * - * @return int Decoded digit - * @access private - */ - private function _decodeDigit($cp) - { - $cp = ord($cp); - return ($cp - 48 < 10)? $cp - 22 : (($cp - 65 < 26)? $cp - 65 : (($cp - 97 < 26)? $cp - 97 : $this->_base)); - } - - /** - * Do Nameprep according to RFC3491 and RFC3454. - * - * @param array $input Unicode Characters - * - * @return string Unicode Characters, Nameprep'd - * @throws Exception - * @access private - */ - private function _nameprep($input) - { - $output = array(); - - // Walking through the input array, performing the required steps on each of - // the input chars and putting the result into the output array - // While mapping required chars we apply the cannonical ordering - - foreach ($input as $v) { - // Map to nothing == skip that code point - if (in_array($v, self::$_np_map_nothing)) { - continue; - } - - // Try to find prohibited input - if (in_array($v, self::$_np_prohibit) || in_array($v, self::$_general_prohibited)) { - throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); - } - - foreach (self::$_np_prohibit_ranges as $range) { - if ($range[0] <= $v && $v <= $range[1]) { - throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); - } - } - - // Hangul syllable decomposition - if (0xAC00 <= $v && $v <= 0xD7AF) { - foreach ($this->_hangulDecompose($v) as $out) { - $output[] = $out; - } - } else if (($this->_version == '2003') && isset(self::$_np_replacemaps[$v])) { - // There's a decomposition mapping for that code point - // Decompositions only in version 2003 (original) of IDNA - foreach ($this->_applyCannonicalOrdering(self::$_np_replacemaps[$v]) as $out) { - $output[] = $out; - } - } else { - $output[] = $v; - } - } - - // Combine code points - - $last_class = 0; - $last_starter = 0; - $out_len = count($output); - - for ($i = 0; $i < $out_len; ++$i) { - $class = $this->_getCombiningClass($output[$i]); - - if ((!$last_class || $last_class != $class) && $class) { - // Try to match - $seq_len = $i - $last_starter; - $out = $this->_combine(array_slice($output, $last_starter, $seq_len)); - - // On match: Replace the last starter with the composed character and remove - // the now redundant non-starter(s) - if ($out) { - $output[$last_starter] = $out; - - if (count($out) != $seq_len) { - for ($j = $i + 1; $j < $out_len; ++$j) { - $output[$j - 1] = $output[$j]; - } - - unset($output[$out_len]); - } - - // Rewind the for loop by one, since there can be more possible compositions - $i--; - $out_len--; - $last_class = ($i == $last_starter)? 0 : $this->_getCombiningClass($output[$i - 1]); - - continue; - } - } - - // The current class is 0 - if (!$class) { - $last_starter = $i; - } - - $last_class = $class; - } - - return $output; - } - - /** - * Decomposes a Hangul syllable - * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). - * - * @param integer $char 32bit UCS4 code point - * - * @return array Either Hangul Syllable decomposed or original 32bit - * value as one value array - * @access private - */ - private function _hangulDecompose($char) - { - $sindex = $char - $this->_sbase; - - if ($sindex < 0 || $sindex >= $this->_scount) { - return array($char); - } - - $result = array(); - $T = $this->_tbase + $sindex % $this->_tcount; - $result[] = (int)($this->_lbase + $sindex / $this->_ncount); - $result[] = (int)($this->_vbase + ($sindex % $this->_ncount) / $this->_tcount); - - if ($T != $this->_tbase) { - $result[] = $T; - } - - return $result; - } - - /** - * Ccomposes a Hangul syllable - * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). - * - * @param array $input Decomposed UCS4 sequence - * - * @return array UCS4 sequence with syllables composed - * @access private - */ - private function _hangulCompose($input) - { - $inp_len = count($input); - - if (!$inp_len) { - return array(); - } - - $result = array(); - $last = $input[0]; - $result[] = $last; // copy first char from input to output - - for ($i = 1; $i < $inp_len; ++$i) { - $char = $input[$i]; - - // Find out, wether two current characters from L and V - $lindex = $last - $this->_lbase; - - if (0 <= $lindex && $lindex < $this->_lcount) { - $vindex = $char - $this->_vbase; - - if (0 <= $vindex && $vindex < $this->_vcount) { - // create syllable of form LV - $last = ($this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount); - $out_off = count($result) - 1; - $result[$out_off] = $last; // reset last - - // discard char - continue; - } - } - - // Find out, wether two current characters are LV and T - $sindex = $last - $this->_sbase; - - if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount) == 0) { - $tindex = $char - $this->_tbase; - - if (0 <= $tindex && $tindex <= $this->_tcount) { - // create syllable of form LVT - $last += $tindex; - $out_off = count($result) - 1; - $result[$out_off] = $last; // reset last - - // discard char - continue; - } - } - - // if neither case was true, just add the character - $last = $char; - $result[] = $char; - } - - return $result; - } - - /** - * Returns the combining class of a certain wide char. - * - * @param integer $char Wide char to check (32bit integer) - * - * @return integer Combining class if found, else 0 - * @access private - */ - private function _getCombiningClass($char) - { - return isset(self::$_np_norm_combcls[$char])? self::$_np_norm_combcls[$char] : 0; - } - - /** - * Apllies the cannonical ordering of a decomposed UCS4 sequence. - * - * @param array $input Decomposed UCS4 sequence - * - * @return array Ordered USC4 sequence - * @access private - */ - private function _applyCannonicalOrdering($input) - { - $swap = true; - $size = count($input); - - while ($swap) { - $swap = false; - $last = $this->_getCombiningClass($input[0]); - - for ($i = 0; $i < $size - 1; ++$i) { - $next = $this->_getCombiningClass($input[$i + 1]); - - if ($next != 0 && $last > $next) { - // Move item leftward until it fits - for ($j = $i + 1; $j > 0; --$j) { - if ($this->_getCombiningClass($input[$j - 1]) <= $next) { - break; - } - - $t = $input[$j]; - $input[$j] = $input[$j - 1]; - $input[$j - 1] = $t; - $swap = 1; - } - - // Reentering the loop looking at the old character again - $next = $last; - } - - $last = $next; - } - } - - return $input; - } - - /** - * Do composition of a sequence of starter and non-starter. - * - * @param array $input UCS4 Decomposed sequence - * - * @return array Ordered USC4 sequence - * @access private - */ - private function _combine($input) - { - $inp_len = count($input); - - // Is it a Hangul syllable? - if (1 != $inp_len) { - $hangul = $this->_hangulCompose($input); - - // This place is probably wrong - if (count($hangul) != $inp_len) { - return $hangul; - } - } - - foreach (self::$_np_replacemaps as $np_src => $np_target) { - if ($np_target[0] != $input[0]) { - continue; - } - - if (count($np_target) != $inp_len) { - continue; - } - - $hit = false; - - foreach ($input as $k2 => $v2) { - if ($v2 == $np_target[$k2]) { - $hit = true; - } else { - $hit = false; - break; - } - } - - if ($hit) { - return $np_src; - } - } - - return false; - } - - /** - * This converts an UTF-8 encoded string to its UCS-4 (array) representation - * By talking about UCS-4 we mean arrays of 32bit integers representing - * each of the "chars". This is due to PHP not being able to handle strings with - * bit depth different from 8. This applies to the reverse method _ucs4_to_utf8(), too. - * The following UTF-8 encodings are supported: - * - * bytes bits representation - * 1 7 0xxxxxxx - * 2 11 110xxxxx 10xxxxxx - * 3 16 1110xxxx 10xxxxxx 10xxxxxx - * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - * - * Each x represents a bit that can be used to store character data. - * - * @param string $input utf8-encoded string - * - * @return array ucs4-encoded array - * @throws Exception - * @access private - */ - private function _utf8_to_ucs4($input) - { - $output = array(); - $out_len = 0; - $inp_len = self::_byteLength($input, '8bit'); - $mode = 'next'; - $test = 'none'; - for ($k = 0; $k < $inp_len; ++$k) { - $v = ord($input{$k}); // Extract byte from input string - - if ($v < 128) { // We found an ASCII char - put into stirng as is - $output[$out_len] = $v; - ++$out_len; - if ('add' == $mode) { - throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); - } - continue; - } - if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char - $start_byte = $v; - $mode = 'add'; - $test = 'range'; - if ($v >> 5 == 6) { // &110xxxxx 10xxxxx - $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left - $v = ($v - 192) << 6; - } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx - $next_byte = 1; - $v = ($v - 224) << 12; - } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - $next_byte = 2; - $v = ($v - 240) << 18; - } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - $next_byte = 3; - $v = ($v - 248) << 24; - } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - $next_byte = 4; - $v = ($v - 252) << 30; - } else { - throw new UnexpectedValueException('This might be UTF-8, but I don\'t understand it at byte '.$k); - } - if ('add' == $mode) { - $output[$out_len] = (int) $v; - ++$out_len; - continue; - } - } - if ('add' == $mode) { - if (!$this->_allow_overlong && $test == 'range') { - $test = 'none'; - if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) { - throw new OutOfRangeException('Bogus UTF-8 character detected (out of legal range) at byte '.$k); - } - } - if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx - $v = ($v - 128) << ($next_byte * 6); - $output[($out_len - 1)] += $v; - --$next_byte; - } else { - throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); - } - if ($next_byte < 0) { - $mode = 'next'; - } - } - } // for - return $output; - } - - /** - * Convert UCS-4 array into UTF-8 string - * - * @param array $input ucs4-encoded array - * - * @return string utf8-encoded string - * @throws Exception - * @access private - */ - private function _ucs4_to_utf8($input) - { - $output = ''; - - foreach ($input as $v) { - // $v = ord($v); - - if ($v < 128) { - // 7bit are transferred literally - $output .= chr($v); - } else if ($v < 1 << 11) { - // 2 bytes - $output .= chr(192 + ($v >> 6)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 16) { - // 3 bytes - $output .= chr(224 + ($v >> 12)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 21) { - // 4 bytes - $output .= chr(240 + ($v >> 18)) - . chr(128 + (($v >> 12) & 63)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 26) { - // 5 bytes - $output .= chr(248 + ($v >> 24)) - . chr(128 + (($v >> 18) & 63)) - . chr(128 + (($v >> 12) & 63)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 31) { - // 6 bytes - $output .= chr(252 + ($v >> 30)) - . chr(128 + (($v >> 24) & 63)) - . chr(128 + (($v >> 18) & 63)) - . chr(128 + (($v >> 12) & 63)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else { - throw new UnexpectedValueException('Conversion from UCS-4 to UTF-8 failed: malformed input'); - } - } - - return $output; - } - - /** - * Convert UCS-4 array into UCS-4 string - * - * @param array $input ucs4-encoded array - * - * @return string ucs4-encoded string - * @throws Exception - * @access private - */ - private function _ucs4_to_ucs4_string($input) - { - $output = ''; - // Take array values and split output to 4 bytes per value - // The bit mask is 255, which reads &11111111 - foreach ($input as $v) { - $output .= ($v & (255 << 24) >> 24) . ($v & (255 << 16) >> 16) . ($v & (255 << 8) >> 8) . ($v & 255); - } - return $output; - } - - /** - * Convert UCS-4 string into UCS-4 array - * - * @param string $input ucs4-encoded string - * - * @return array ucs4-encoded array - * @throws InvalidArgumentException - * @access private - */ - private function _ucs4_string_to_ucs4($input) - { - $output = array(); - - $inp_len = self::_byteLength($input); - // Input length must be dividable by 4 - if ($inp_len % 4) { - throw new InvalidArgumentException('Input UCS4 string is broken'); - } - - // Empty input - return empty output - if (!$inp_len) { - return $output; - } - - for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) { - // Increment output position every 4 input bytes - if (!$i % 4) { - $out_len++; - $output[$out_len] = 0; - } - $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) ); - } - return $output; - } - - /** - * Echo hex representation of UCS4 sequence. - * - * @param array $input UCS4 sequence - * @param boolean $include_bit Include bitmask in output - * - * @return void - * @static - * @access private - */ - private static function _showHex($input, $include_bit = false) - { - foreach ($input as $k => $v) { - echo '[', $k, '] => ', sprintf('%X', $v); - - if ($include_bit) { - echo ' (', Net_IDNA2::_showBitmask($v), ')'; - } - - echo "\n"; - } - } - - /** - * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits) - * Output width is automagically determined - * - * @param int $octet ... - * - * @return string Bitmask-representation - * @static - * @access private - */ - private static function _showBitmask($octet) - { - if ($octet >= (1 << 16)) { - $w = 31; - } else if ($octet >= (1 << 8)) { - $w = 15; - } else { - $w = 7; - } - - $return = ''; - - for ($i = $w; $i > -1; $i--) { - $return .= ($octet & (1 << $i))? '1' : '0'; - } - - return $return; - } - - /** - * Gets the length of a string in bytes even if mbstring function - * overloading is turned on - * - * @param string $string the string for which to get the length. - * - * @return integer the length of the string in bytes. - * - * @see Net_IDNA2::$_mb_string_overload - */ - private static function _byteLength($string) - { - if (self::$_mb_string_overload) { - return mb_strlen($string, '8bit'); - } - return strlen((binary)$string); - } - - // }}}} - - // {{{ factory - /** - * Attempts to return a concrete IDNA instance for either php4 or php5. - * - * @param array $params Set of paramaters - * - * @return Net_IDNA2 - * @access public - */ - function getInstance($params = array()) - { - return new Net_IDNA2($params); - } - // }}} - - // {{{ singleton - /** - * Attempts to return a concrete IDNA instance for either php4 or php5, - * only creating a new instance if no IDNA instance with the same - * parameters currently exists. - * - * @param array $params Set of paramaters - * - * @return object Net_IDNA2 - * @access public - */ - function singleton($params = array()) - { - static $instances; - if (!isset($instances)) { - $instances = array(); - } - - $signature = serialize($params); - if (!isset($instances[$signature])) { - $instances[$signature] = Net_IDNA2::getInstance($params); - } - - return $instances[$signature]; - } - // }}} -} - -?> diff --git a/program/lib/Net/IDNA2/Exception.php b/program/lib/Net/IDNA2/Exception.php deleted file mode 100644 index 72cb1ae75..000000000 --- a/program/lib/Net/IDNA2/Exception.php +++ /dev/null @@ -1,4 +0,0 @@ - | - | Aleksander Machniak | - | Jeroen van Meeuwen | - +-----------------------------------------------------------------------+ -*/ - -require_once __DIR__ . '/LDAP3/Result.php'; - -/** - * Model class to access a LDAP directories - * - * @package Net_LDAP3 - */ -class Net_LDAP3 -{ - public $conn; - public $vlv_active = false; - - private $attribute_level_rights_map = array( - "r" => "read", - "s" => "search", - "w" => "write", - "o" => "delete", - "c" => "compare", - "W" => "write", - "O" => "delete" - ); - - private $entry_level_rights_map = array( - "a" => "add", - "d" => "delete", - "n" => "modrdn", - "v" => "read" - ); - - /* - * Manipulate configuration through the config_set and config_get methods. - * Available options: - * 'debug' => false, - * 'hosts' => array(), - * 'port' => 389, - * 'use_tls' => false, - * 'ldap_version' => 3, // using LDAPv3 - * 'auth_method' => '', // SASL authentication method (for proxy auth), e.g. DIGEST-MD5 - * 'numsub_filter' => '(objectClass=organizationalUnit)', // with VLV, we also use numSubOrdinates to query the total number of records. Set this filter to get all numSubOrdinates attributes for counting - * 'referrals' => false, // Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups - * 'network_timeout' => 10, // The timeout (in seconds) for connect + bind arrempts. This is only supported in PHP >= 5.3.0 with OpenLDAP 2.x - * 'sizelimit' => 0, // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. - * 'timelimit' => 0, // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. - * 'vlv' => false, // force VLV off - * 'config_root_dn' => 'cn=config', // Root DN to read config (e.g. vlv indexes) from - * 'service_bind_dn' => 'uid=kolab-service,ou=Special Users,dc=example,dc=org', - * 'service_bind_pw' => 'Welcome2KolabSystems', - * 'root_dn' => 'dc=example,dc=org', - */ - protected $config = array( - 'sizelimit' => 0, - 'timelimit' => 0, - ); - - protected $debug_level = false; - protected $list_page = 1; - protected $page_size = 10; - protected $cache; - - // Use public method config_set('log_hook', $callback) to have $callback be - // call_user_func'ed instead of the local log functions. - protected $_log_hook; - - // Use public method config_set('config_get_hook', $callback) to have - // $callback be call_user_func'ed instead of the local config_get function. - protected $_config_get_hook; - - // Use public method config_set('config_set_hook', $callback) to have - // $callback be call_user_func'ed instead of the local config_set function. - protected $_config_set_hook; - - // Not Yet Implemented - // Intended to allow hooking in for the purpose of caching. - protected $_result_hook; - - // Runtime. These are not the variables you're looking for. - protected $_current_bind_dn; - protected $_current_bind_pw; - protected $_current_host; - protected $_supported_control = array(); - protected $_vlv_indexes_and_searches; - - /** - * Constructor - * - * @param array $config Configuration parameters that have not already - * been initialized. For configuration parameters - * that have in fact been set, use the config_set() - * method after initialization. - */ - public function __construct($config = array()) - { - if (!empty($config) && is_array($config)) { - foreach ($config as $key => $value) { - if (empty($this->config[$key])) { - $setter = 'config_set_' . $key; - if (method_exists($this, $setter)) { - $this->$setter($value); - } - else if (isset($this->$key)) { - $this->$key = $value; - } - else { - $this->config[$key] = $value; - } - } - } - } - } - - /** - * Add multiple entries to the directory information tree in one go. - */ - public function add_entries($entries, $attributes = array()) - { - // If $entries is an associative array, it's keys are DNs and its - // values are the attributes for that DN. - // - // If $entries is a non-associative array, the attributes are expected - // to be positional in $attributes. - - $result_set = array(); - - if (array_keys($entries) == range(0, count($entries) - 1)) { - // $entries is sequential - if (count($entries) !== count($attributes)) { - $this->_error("Wrong entry/attribute count in " . __FUNCTION__); - return false; - } - - for ($i = 0; $i < count($entries); $i++) { - $result_set[$i] = $this->add_entry($entries[$i], $attributes[$i]); - } - } - else { - // $entries is associative - foreach ($entries as $entry_dn => $entry_attributes) { - if (array_keys($attributes) !== range(0, count($attributes)-1)) { - // $attributes is associative as well, let's merge these - // - // $entry_attributes takes precedence, so is in the second - // position in array_merge() - $entry_attributes = array_merge($attributes, $entry_attributes); - } - - $result_set[$entry_dn] = $this->add_entry($entry_dn, $entry_attributes); - } - } - - return $result_set; - } - - /** - * Add an entry to the directory information tree. - */ - public function add_entry($entry_dn, $attributes) - { - // TODO: - // - Get entry rdn attribute value from entry_dn and see if it exists in - // attributes -> issue warning if so (but not block the operation). - $this->_debug("Entry DN", $entry_dn); - $this->_debug("Attributes", $attributes); - - foreach ($attributes as $attr_name => $attr_value) { - if (empty($attr_value)) { - unset($attributes[$attr_name]); - } - } - - $this->_debug("C: Add $entry_dn: " . json_encode($attributes)); - - if (($add_result = ldap_add($this->conn, $entry_dn, $attributes)) == false) { - $this->_debug("S: " . ldap_error($this->conn)); - $this->_debug("S: Adding entry $entry_dn failed. " . ldap_error($this->conn)); - - return false; - } - - $this->_debug("LDAP: S: OK"); - - return true; - } - - /** - * Add replication agreements and initialize the consumer(s) for - * $domain_root_dn. - * - * Searches the configured replicas for any of the current domain/config - * databases, and uses this information to configure the additional - * replication for the (new) domain database (at $domain_root_dn). - * - * Very specific to Netscape-based directory servers, and currently also - * very specific to multi-master replication. - */ - public function add_replication_agreements($domain_root_dn) - { - $replica_hosts = $this->list_replicas(); - - if (empty($replica_hosts)) { - return; - } - - $result = $this->search($this->config_get('config_root_dn'), "(&(objectclass=nsDS5Replica)(nsDS5ReplicaType=3))", "sub"); - - if (!$result) { - $this->_debug("No replication configuration found."); - return; - } - - // Preserve the number of replicated databases we have, because the replication ID - // can be calculated from the number of databases replicated, and the number of - // servers. - $num_replica_dbs = $result->count(); - $replicas = $result->entries(true); - $max_replica_agreements = 0; - - foreach ($replicas as $replica_dn => $replica_attrs) { - $result = $this->search($replica_dn, "(objectclass=nsDS5ReplicationAgreement)", "sub"); - if ($result) { - if ($max_replica_agreements < $result->count()) { - $max_replica_agreements = $result->count(); - $max_replica_agreements_dn = $replica_dn; - } - } - } - - $max_repl_id = $num_replica_dbs * count($replica_hosts); - - $this->_debug("The current maximum replication ID is $max_repl_id"); - $this->_debug("The current maximum number of replication agreements for any database is $max_replica_agreements (for $max_replica_agreements_dn)"); - $this->_debug("With " . count($replica_hosts) . " replicas, the next is " . ($max_repl_id + 1) . " and the last one is " . ($max_repl_id + count($replica_hosts))); - - // Then add the replication agreements - foreach ($replica_hosts as $num => $replica_host) { - $ldap = new Net_LDAP3($this->config); - $ldap->config_set('hosts', array($replica_host)); - $ldap->connect(); - $ldap->bind($this->_current_bind_dn, $this->_current_bind_pw); - - $replica_attrs = array( - 'cn' => 'replica', - 'objectclass' => array( - 'top', - 'nsds5replica', - 'extensibleobject', - ), - 'nsDS5ReplicaBindDN' => $ldap->get_entry_attribute($replica_dn, "nsDS5ReplicaBindDN"), - 'nsDS5ReplicaId' => ($max_repl_id + $num + 1), - 'nsDS5ReplicaRoot' => $domain_root_dn, - 'nsDS5ReplicaType' => $ldap->get_entry_attribute($replica_dn, "nsDS5ReplicaType"), - 'nsds5ReplicaPurgeDelay' => $ldap->get_entry_attribute($replica_dn, "nsds5ReplicaPurgeDelay"), - 'nsDS5Flags' => $ldap->get_entry_attribute($replica_dn, "nsDS5Flags") - ); - - $new_replica_dn = 'cn=replica,cn="' . $domain_root_dn . '",cn=mapping tree,cn=config'; - - $this->_debug("Adding $new_replica_dn to $replica_host with attributes: " . var_export($replica_attrs, true)); - - $result = $ldap->add_entry($new_replica_dn, $replica_attrs); - - if (!$result) { - $this->_error("Could not add replication configuration to database for $domain_root_dn on $replica_host"); - continue; - } - - $result = $ldap->search($replica_dn, "(objectclass=nsDS5ReplicationAgreement)", "sub"); - - if (!$result) { - $this->_error("Host $replica_host does not have any replication agreements"); - continue; - } - - $entries = $result->entries(true); - $replica_agreement_tpl_dn = key($entries); - - $this->_debug("Using " . var_export($replica_agreement_tpl_dn, true) . " as the template for new replication agreements"); - - foreach ($replica_hosts as $replicate_to_host) { - // Skip the current server - if ($replicate_to_host == $replica_host) { - continue; - } - - $this->_debug("Adding a replication agreement for $domain_root_dn to $replicate_to_host on " . $replica_host); - - $attrs = array( - 'objectclass', - 'nsDS5ReplicaBindDN', - 'nsDS5ReplicaCredentials', - 'nsDS5ReplicaTransportInfo', - 'nsDS5ReplicaBindMethod', - 'nsDS5ReplicaHost', - 'nsDS5ReplicaPort' - ); - - $replica_agreement_attrs = $ldap->get_entry_attributes($replica_agreement_tpl_dn, $attrs); - $replica_agreement_attrs['cn'] = array_shift(explode('.', $replicate_to_host)) . str_replace(array('dc=',','), array('_',''), $domain_root_dn); - $replica_agreement_attrs['nsDS5ReplicaRoot'] = $domain_root_dn; - $replica_agreement_dn = "cn=" . $replica_agreement_attrs['cn'] . "," . $new_replica_dn; - - $this->_debug("Adding $replica_agreement_dn to $replica_host with attributes: " . var_export($replica_agreement_attrs, true)); - - $result = $ldap->add_entry($replica_agreement_dn, $replica_agreement_attrs); - - if (!$result) { - $this->_error("Failed adding $replica_agreement_dn"); - } - } - } - - $server_id = implode('', array_diff($replica_hosts, $this->_server_id_not)); - - $this->_debug("About to trigger consumer initialization for replicas on current 'parent': $server_id"); - - $result = $this->search($this->config_get('config_root_dn'), "(&(objectclass=nsDS5ReplicationAgreement)(nsds5replicaroot=$domain_root_dn))", "sub"); - - if ($result) { - foreach ($result->entries(true) as $agreement_dn => $agreement_attrs) { - $this->modify_entry_attributes( - $agreement_dn, - array( - 'replace' => array( - 'nsds5BeginReplicaRefresh' => 'start', - ), - ) - ); - } - } - } - - public function attribute_details($attributes = array()) - { - $schema = $this->init_schema(); - - if (!$schema) { - return array(); - } - - $attribs = $schema->getAll('attributes'); - - $attributes_details = array(); - - foreach ($attributes as $attribute) { - if (array_key_exists($attribute, $attribs)) { - $attrib_details = $attribs[$attribute]; - - if (!empty($attrib_details['sup'])) { - foreach ($attrib_details['sup'] as $super_attrib) { - $_attrib_details = $attribs[$super_attrib]; - if (is_array($_attrib_details)) { - $attrib_details = array_merge($_attrib_details, $attrib_details); - } - } - } - } - else if (array_key_exists(strtolower($attribute), $attribs)) { - $attrib_details = $attribs[strtolower($attribute)]; - - if (!empty($attrib_details['sup'])) { - foreach ($attrib_details['sup'] as $super_attrib) { - $_attrib_details = $attribs[$super_attrib]; - if (is_array($_attrib_details)) { - $attrib_details = array_merge($_attrib_details, $attrib_details); - } - } - } - } - else { - $this->_warning("LDAP: No schema details exist for attribute $attribute (which is strange)"); - } - - // The relevant parts only, please - $attributes_details[$attribute] = array( - 'type' => !empty($attrib_details['single-value']) ? 'text' : 'list', - 'description' => $attrib_details['desc'], - 'syntax' => $attrib_details['syntax'], - 'max-length' => $attrib_details['max-length'] ?: false, - ); - } - - return $attributes_details; - } - - public function attributes_allowed($objectclasses = array()) - { - $this->_debug("Listing allowed_attributes for objectclasses", $objectclasses); - - if (!is_array($objectclasses) || empty($objectclasses)) { - return false; - } - - $schema = $this->init_schema(); - if (!$schema) { - return false; - } - - $may = array(); - $must = array(); - $superclasses = array(); - - foreach ($objectclasses as $objectclass) { - $superclass = $schema->superclass($objectclass); - if (!empty($superclass)) { - $superclasses = array_merge($superclass, $superclasses); - } - - $_may = $schema->may($objectclass); - $_must = $schema->must($objectclass); - - if (is_array($_may)) { - $may = array_merge($may, $_may); - } - if (is_array($_must)) { - $must = array_merge($must, $_must); - } - } - - $may = array_unique($may); - $must = array_unique($must); - $superclasses = array_unique($superclasses); - - return array('may' => $may, 'must' => $must, 'super' => $superclasses); - } - - public function classes_allowed() - { - $schema = $this->init_schema(); - if (!$schema) { - return false; - } - - $list = $schema->getAll('objectclasses'); - $classes = array(); - - foreach ($list as $class) { - $classes[] = $class['name']; - } - - return $classes; - } - - /** - * Bind connection with DN and password - * - * @param string $dn Bind DN - * @param string $pass Bind password - * - * @return boolean True on success, False on error - */ - public function bind($bind_dn, $bind_pw) - { - if (!$this->conn) { - return false; - } - - if ($bind_dn == $this->_current_bind_dn) { - return true; - } - - $this->_debug("C: Bind [dn: $bind_dn]"); - - if (@ldap_bind($this->conn, $bind_dn, $bind_pw)) { - $this->_debug("S: OK"); - $this->_current_bind_dn = $bind_dn; - $this->_current_bind_pw = $bind_pw; - - return true; - } - - $this->_debug("S: ".ldap_error($this->conn)); - $this->_error("Bind failed for dn=$bind_dn: ".ldap_error($this->conn)); - - return false; - } - - /** - * Close connection to LDAP server - */ - public function close() - { - if ($this->conn) { - $this->_debug("C: Close"); - ldap_unbind($this->conn); - - $this->_current_bind_dn = null; - $this->_current_bind_pw = null; - $this->conn = null; - } - } - - /** - * Get the value of a configuration item. - * - * @param string $key Configuration key - * @param mixed $default Default value to return - */ - public function config_get($key, $default = null) - { - if (!empty($this->_config_get_hook)) { - return call_user_func_array($this->_config_get_hook, array($key, $value)); - } - else if (method_exists($this, "config_get_{$key}")) { - return call_user_func(array($this, "config_get_$key"), $value); - } - else if (!isset($this->config[$key])) { - return $default; - } - else { - return $this->config[$key]; - } - } - - /** - * Set a configuration item to value. - * - * @param string $key Configuration key - * @param mixed $value Configuration value - */ - public function config_set($key, $value = null) - { - if (is_array($key)) { - foreach ($key as $k => $v) { - $this->config_set($k, $v); - } - return; - } - - if (!empty($this->_config_set_hook)) { - call_user_func($this->_config_set_hook, array($key, $value)); - } - else if (method_exists($this, "config_set_{$key}")) { - call_user_func_array(array($this, "config_set_$key"), array($value)); - } - else if (isset($this->$key)) { - $this->$key = $value; - } - else { - // 'host' option is deprecated - if ($key == 'host') { - $this->config['hosts'] = (array) $value; - } - else { - $this->config[$key] = $value; - } - } - } - - /** - * Establish a connection to the LDAP server - */ - public function connect($host = null) - { - if (!function_exists('ldap_connect')) { - $this->_error("No ldap support in this PHP installation"); - return false; - } - - if (is_resource($this->conn)) { - $this->_debug("Connection already exists"); - return true; - } - - $hosts = !empty($host) ? $host : $this->config_get('hosts', array()); - $port = $this->config_get('port', 389); - - foreach ((array) $hosts as $host) { - $this->_debug("C: Connect [$host:$port]"); - - if ($lc = @ldap_connect($host, $port)) { - if ($this->config_get('use_tls', false) === true) { - if (!ldap_start_tls($lc)) { - $this->_debug("S: Could not start TLS. " . ldap_error($lc)); - continue; - } - } - - $this->_debug("S: OK"); - - $ldap_version = $this->config_get('ldap_version', 3); - $timeout = $this->config_get('network_timeout'); - $referrals = $this->config_get('referrals'); - - ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $ldap_version); - - if ($timeout) { - ldap_set_option($lc, LDAP_OPT_NETWORK_TIMEOUT, $timeout); - } - - if ($referrals !== null) { - ldap_set_option($lc, LDAP_OPT_REFERRALS, (bool) $referrals); - } - - $this->_current_host = $host; - $this->conn = $lc; - - break; - } - - $this->_debug("S: NOT OK"); - } - - if (!is_resource($this->conn)) { - $this->_error("Could not connect to LDAP"); - return false; - } - - return true; - } - - /** - * Shortcut to ldap_delete() - */ - public function delete_entry($entry_dn) - { - $this->_debug("LDAP: C: Delete $entry_dn"); - - if (ldap_delete($this->conn, $entry_dn) === false) { - $this->_debug("LDAP: S: " . ldap_error($this->conn)); - return false; - } - - $this->_debug("LDAP: S: OK"); - - return true; - } - - /** - * Deletes specified entry and all entries in the tree - */ - public function delete_entry_recursive($entry_dn) - { - // searching for sub entries, but not scope sub, just one level - $result = $this->search($entry_dn, '(objectclass=*)', 'one'); - - if ($result) { - $entries = $result->entries(true); - - foreach (array_keys($entries) as $sub_dn) { - if (!$this->delete_entry_recursive($sub_dn)) { - return false; - } - } - } - - if (!$this->delete_entry($entry_dn)) { - return false; - } - - return true; - } - - public function effective_rights($subject) - { - $effective_rights_control_oid = "1.3.6.1.4.1.42.2.27.9.5.2"; - - $supported_controls = $this->supported_controls(); - - if (!in_array($effective_rights_control_oid, $supported_controls)) { - $this->_debug("LDAP: No getEffectiveRights control in supportedControls"); - return false; - } - - $attributes = array( - 'attributeLevelRights' => array(), - 'entryLevelRights' => array(), - ); - - $output = array(); - $entry_dn = $this->entry_dn($subject); - - if (!$entry_dn) { - $entry_dn = $this->config_get($subject . "_base_dn"); - } - if (!$entry_dn) { - $entry_dn = $this->config_get("base_dn"); - } - if (!$entry_dn) { - $entry_dn = $this->config_get("root_dn"); - } - - $this->_debug("effective_rights for subject $subject resolves to entry dn $entry_dn"); - - $moz_ldapsearch = "/usr/lib64/mozldap/ldapsearch"; - if (!is_file($moz_ldapsearch)) { - $moz_ldapsearch = "/usr/lib/mozldap/ldapsearch"; - } - if (!is_file($moz_ldapsearch)) { - $moz_ldapsearch = null; - } - - if (empty($moz_ldapsearch)) { - $this->_error("Mozilla LDAP C SDK binary ldapsearch not found, cannot get effective rights on subject $subject"); - return null; - } - - $command = array( - $moz_ldapsearch, - '-x', - '-h', - $this->_ldap_server, - '-p', - $this->_ldap_port, - '-b', - escapeshellarg($entry_dn), - '-D', - escapeshellarg($this->_current_bind_dn), - '-w', - escapeshellarg($this->_current_bind_pw), - '-J', - escapeshellarg(implode(':', array( - $effective_rights_control_oid, // OID - 'true', // Criticality - 'dn:' . $this->_current_bind_dn // User DN - ))), - '-s', - 'base', - '"(objectclass=*)"', - '"*"', - ); - - $command = implode(' ', $command); - - $this->_debug("LDAP: Executing command: $command"); - - exec($command, $output, $return_code); - - $this->_debug("LDAP: Command output:" . var_export($output, true)); - $this->_debug("Return code: " . $return_code); - - if ($return_code) { - $this->_error("Command $moz_ldapsearch returned error code: $return_code"); - return null; - } - - $lines = array(); - foreach ($output as $line_num => $line) { - if (substr($line, 0, 1) == " ") { - $lines[count($lines)-1] .= trim($line); - } - else { - $lines[] = trim($line); - } - } - - foreach ($lines as $line) { - $line_components = explode(':', $line); - $attribute_name = array_shift($line_components); - $attribute_value = trim(implode(':', $line_components)); - - switch ($attribute_name) { - case "attributeLevelRights": - $attributes[$attribute_name] = $this->parse_attribute_level_rights($attribute_value); - break; - case "dn": - $attributes[$attribute_name] = $attribute_value; - break; - case "entryLevelRights": - $attributes[$attribute_name] = $this->parse_entry_level_rights($attribute_value); - break; - - default: - break; - } - } - - return $attributes; - } - - /** - * Resolve entry data to entry DN - * - * @param string $subject Entry string (e.g. entry DN or unique attribute value) - * @param array $attributes Additional attributes - * @param string $base_dn Optional base DN - * - * @return string Entry DN string - */ - public function entry_dn($subject, $attributes = array(), $base_dn = null) - { - $this->_debug("entry_dn on subject $subject"); - $is_dn = ldap_explode_dn($subject, 1); - - if (is_array($is_dn) && array_key_exists("count", $is_dn) && $is_dn["count"] > 0) { - $this->_debug("$subject is a dn"); - return $subject; - } - - $this->_debug("$subject is not a dn"); - - if (strlen($subject) < 32 || preg_match('/[^a-fA-F0-9-]/', $subject)) { - $this->_debug("$subject is not a unique identifier"); - return; - } - - $unique_attr = $this->config_get('unique_attribute', 'nsuniqueid'); - - $this->_debug("Using unique_attribute " . var_export($unique_attr, true) . " at " . __FILE__ . ":" . __LINE__); - - $attributes = array_merge(array($unique_attr => $subject), (array)$attributes); - $subject = $this->entry_find_by_attribute($attributes, $base_dn); - - if (!empty($subject)) { - return key($subject); - } - } - - public function entry_find_by_attribute($attributes, $base_dn = null) - { - $this->_debug("Net_LDAP3::entry_find_by_attribute(\$attributes, \$base_dn) called with base_dn", $base_dn, "and attributes", $attributes); - - if (empty($attributes) || !is_array($attributes)) { - return false; - } - - if (empty($attributes[key($attributes)])) { - return false; - } - - $filter = count($attributes) ? "(&" : ""; - - foreach ($attributes as $key => $value) { - $filter .= "(" . $key . "=" . $value . ")"; - } - - $filter .= count($attributes) ? ")" : ""; - - if (empty($base_dn)) { - $base_dn = $this->config_get('root_dn'); - $this->_debug("Using base_dn from domain " . $this->domain . ": " . $base_dn); - } - - $result = $this->search($base_dn, $filter, 'sub', array_keys($attributes)); - - if ($result && $result->count() > 0) { - $this->_debug("Results found: " . implode(', ', array_keys($result->entries(true)))); - return $result->entries(true); - } - else { - $this->_debug("No result"); - return false; - } - } - - public function find_user_groups($member_dn) - { - $groups = array(); - $root_dn = $this->config_get('root_dn'); - - // TODO: Do not query for both, it's either one or the other - $entries = $this->search($root_dn, "(|" . - "(&(objectclass=groupofnames)(member=$member_dn))" . - "(&(objectclass=groupofuniquenames)(uniquemember=$member_dn))" . - ")" - ); - - if ($entries) { - $groups = array_keys($entries->entries(true)); - } - - return $groups; - } - - public function get_entry_attribute($subject_dn, $attribute) - { - $entry = $this->get_entry_attributes($subject_dn, (array)$attribute); - - return $entry[strtolower($attribute)]; - } - - public function get_entry_attributes($subject_dn, $attributes) - { - // @TODO: use get_entry? - $result = $this->search($subject_dn, '(objectclass=*)', 'base', $attributes); - - if (!$result) { - return array(); - } - - $entries = $result->entries(true); - $entry_dn = key($entries); - $entry = $entries[$entry_dn]; - - return $entry; - } - - /** - * Get a specific LDAP entry, identified by its DN - * - * @param string $dn Record identifier - * @param array $attributes Attributes to return - * - * @return array Hash array - */ - public function get_entry($dn, $attributes = array()) - { - $rec = null; - - if ($this->conn && $dn) { - $this->_debug("C: Read [dn: $dn] [(objectclass=*)]"); - - if ($ldap_result = @ldap_read($this->conn, $dn, '(objectclass=*)', $attributes)) { - $this->_debug("S: OK"); - - if ($entry = ldap_first_entry($this->conn, $ldap_result)) { - $rec = ldap_get_attributes($this->conn, $entry); - } - } - else { - $this->_debug("S: ".ldap_error($this->conn)); - } - - if (!empty($rec)) { - $rec['dn'] = $dn; // Add in the dn for the entry. - } - } - - return $rec; - } - - public function list_replicas() - { - $this->_debug("Finding replicas for this server."); - - // Search any host that is a replica for the current host - $replica_hosts = $this->config_get('replica_hosts', array()); - $root_dn = $this->config_get('config_root_dn'); - - if (!empty($replica_hosts)) { - return $replica_hosts; - } - - $ldap = new Net_LDAP3($this->config); - $ldap->connect(); - $ldap->bind($this->_current_bind_dn, $this->_current_bind_pw); - - $result = $ldap->search($root_dn, '(objectclass=nsds5replicationagreement)', 'sub', array('nsds5replicahost')); - - if (!$result) { - $this->_debug("No replicas configured"); - return $replica_hosts; - } - - $this->_debug("Replication agreements found: " . var_export($result->entries(true), true)); - - foreach ($result->entries(true) as $dn => $attrs) { - if (!in_array($attrs['nsds5replicahost'], $replica_hosts)) { - $replica_hosts[] = $attrs['nsds5replicahost']; - } - } - - // $replica_hosts now holds the IDs of servers we are currently NOT - // connected to. We might need this later in order to set - $this->_server_id_not = $replica_hosts; - - $this->_debug("So far, we have the following replicas: " . var_export($replica_hosts, true)); - - $ldap->close(); - - foreach ($replica_hosts as $replica_host) { - $ldap->config_set('hosts', array($replica_host)); - $ldap->connect(); - $ldap->bind($this->_current_bind_dn, $this->_current_bind_pw); - - $result = $ldap->search($root_dn, '(objectclass=nsds5replicationagreement)', 'sub', array('nsds5replicahost')); - if (!$result) { - $this->_debug("No replicas configured"); - } - - foreach ($result->entries(true) as $dn => $attrs) { - if (!in_array($attrs['nsds5replicahost'], $replica_hosts)) { - $replica_hosts[] = $attrs['nsds5replicahost']; - } - } - - $ldap->close(); - } - - $this->config_set('replica_hosts', $replica_hosts); - - return $replica_hosts; - } - - public function login($username, $password, $domain = null) - { - $this->_debug("Net_LDAP3::login(\$username = '" . $username . "', \$password = '****', \$domain = '" . $domain . "')"); - - $_bind_dn = $this->config_get('service_bind_dn'); - $_bind_pw = $this->config_get('service_bind_pw'); - - if (empty($_bind_dn)) { - $this->_debug("No valid service bind dn found."); - return null; - } - - if (empty($_bind_pw)) { - $this->_debug("No valid service bind password found."); - return null; - } - - $bound = $this->bind($_bind_dn, $_bind_pw); - - if (!$bound) { - $this->_debug("Could not bind with service bind credentials."); - return null; - } - - $entry_dn = $this->entry_dn($username); - - if (!empty($entry_dn)) { - $bound = $this->bind($entry_dn, $password); - - if (!$bound) { - $this->_error("Could not bind with " . $entry_dn); - return null; - } - - return $entry_dn; - } - - $base_dn = $this->config_get('root_dn'); - - if (empty($base_dn)) { - $this->_debug("Could not get a valid base dn to search."); - return null; - } - - $localpart = $username; - - if (empty($domain) ) { - if (count(explode('@', $username)) > 1) { - $_parts = explode('@', $username); - $localpart = $_parts[0]; - $domain = $_parts[1]; - } - else { - $localpart = $username; - $domain = ''; - } - } - - $realm = $domain; - $filter = $this->config_get("login_filter", null); - - if (empty($filter)) { - $filter = $this->config_get("filter", null); - } - if (empty($filter)) { - $filter = "(&(|(mail=%s)(mail=%U@%d)(alias=%s)(alias=%U@%d)(uid=%s))(objectclass=inetorgperson))"; - } - - $this->_debug("Net::LDAP3::login() original filter: " . $filter); - - $replace_patterns = array( - '/%s/' => $username, - '/%d/' => $domain, - '/%U/' => $localpart, - '/%r/' => $realm - ); - - $filter = preg_replace(array_keys($replace_patterns), array_values($replace_patterns), $filter); - - $this->_debug("Net::LDAP3::login() actual filter: " . $filter); - - $result = $this->search($base_dn, $filter, 'sub'); - - if (!$result) { - $this->_debug("Could not search $base_dn with $filter"); - return null; - } - - if ($result->count() > 1) { - $this->_debug("Multiple entries found."); - return null; - } - else if ($result->count() < 1) { - $this->_debug("No entries found."); - return null; - } - - $entries = $result->entries(); - $entry = self::normalize_result($entries); - $entry_dn = key($entry); - - $bound = $this->bind($entry_dn, $password); - - if (!$bound) { - $this->_debug("Could not bind with " . $entry_dn); - return null; - } - - return $entry_dn; - } - - public function list_group_members($dn, $entry = null, $recurse = true) - { - $this->_debug("Called list_group_members(" . $dn . ")"); - - if (is_array($entry) && in_array('objectclass', $entry)) { - if (!in_array(array('groupofnames', 'groupofuniquenames', 'groupofurls'), $entry['objectclass'])) { - $this->_debug("Called list_group_members on a non-group!"); - return array(); - } - } - else { - $entry = $this->get_entry($dn, array('member', 'uniquemember', 'memberurl', 'objectclass')); - - if (!$entry) { - return array(); - } - } - - $group_members = array(); - - foreach ((array)$entry['objectclass'] as $objectclass) { - switch (strtolower($objectclass)) { - case "groupofnames": - case "kolabgroupofnames": - $group_members = array_merge($group_members, $this->list_group_member($dn, $entry['member'], $recurse)); - break; - case "groupofuniquenames": - case "kolabgroupofuniquenames": - $group_members = array_merge($group_members, $this->list_group_uniquemember($dn, $entry['uniquemember'], $recurse)); - break; - case "groupofurls": - $group_members = array_merge($group_members, $this->list_group_memberurl($dn, $entry['memberurl'], $recurse)); - break; - } - } - - return array_values(array_filter($group_members)); - } - - public function modify_entry($subject_dn, $old_attrs, $new_attrs) - { - $this->_debug("OLD ATTRIBUTES", $old_attrs); - $this->_debug("NEW ATTRIBUTES", $new_attrs); - - // TODO: Get $rdn_attr - we have type_id in $new_attrs - $dn_components = ldap_explode_dn($subject_dn, 0); - $rdn_components = explode('=', $dn_components[0]); - $rdn_attr = $rdn_components[0]; - - $this->_debug("Net_LDAP3::modify_entry() using rdn attribute: " . $rdn_attr); - - $mod_array = array( - 'add' => array(), // For use with ldap_mod_add() - 'del' => array(), // For use with ldap_mod_del() - 'replace' => array(), // For use with ldap_mod_replace() - 'rename' => array(), // For use with ldap_rename() - ); - - // This is me cheating. Remove this special attribute. - if (array_key_exists('ou', $old_attrs) || array_key_exists('ou', $new_attrs)) { - $old_ou = $old_attrs['ou']; - $new_ou = $new_attrs['ou']; - unset($old_attrs['ou']); - unset($new_attrs['ou']); - } - else { - $old_ou = null; - $new_ou = null; - } - - // Compare each attribute value of the old attrs with the corresponding value - // in the new attrs, if any. - foreach ($old_attrs as $attr => $old_attr_value) { - if (is_array($old_attr_value)) { - if (count($old_attr_value) == 1) { - $old_attrs[$attr] = $old_attr_value[0]; - $old_attr_value = $old_attrs[$attr]; - } - } - - if (array_key_exists($attr, $new_attrs)) { - if (is_array($new_attrs[$attr])) { - if (count($new_attrs[$attr]) == 1) { - $new_attrs[$attr] = $new_attrs[$attr][0]; - } - } - - if (is_array($old_attrs[$attr]) && is_array($new_attrs[$attr])) { - $_sort1 = $new_attrs[$attr]; - sort($_sort1); - $_sort2 = $old_attr_value; - sort($_sort2); - } - else { - $_sort1 = true; - $_sort2 = false; - } - - if ($new_attrs[$attr] !== $old_attr_value && $_sort1 !== $_sort2) { - $this->_debug("Attribute $attr changed from " . var_export($old_attr_value, true) . " to " . var_export($new_attrs[$attr], true)); - if ($attr === $rdn_attr) { - $this->_debug("This attribute is the RDN attribute. Let's see if it is multi-valued, and if the original still exists in the new value."); - if (is_array($old_attrs[$attr])) { - if (!is_array($new_attrs[$attr])) { - if (in_array($new_attrs[$attr], $old_attrs[$attr])) { - // TODO: Need to remove all $old_attrs[$attr] values not equal to $new_attrs[$attr], and not equal to the current $rdn_attr value [0] - - $this->_debug("old attrs. is array, new attrs. is not array. new attr. exists in old attrs."); - - $rdn_attr_value = array_shift($old_attrs[$attr]); - $_attr_to_remove = array(); - - foreach ($old_attrs[$attr] as $value) { - if (strtolower($value) != strtolower($new_attrs[$attr])) { - $_attr_to_remove[] = $value; - } - } - - $this->_debug("Adding to delete attribute $attr values:" . implode(', ', $_attr_to_remove)); - - $mod_array['del'][$attr] = $_attr_to_remove; - - if (strtolower($new_attrs[$attr]) !== strtolower($rdn_attr_value)) { - $this->_debug("new attrs is not the same as the old rdn value, issuing a rename"); - $mod_array['rename']['dn'] = $subject_dn; - $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr][0]; - } - } - else { - $this->_debug("new attrs is not the same as any of the old rdn value, issuing a full rename"); - $mod_array['rename']['dn'] = $subject_dn; - $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr]; - } - } - else { - // TODO: See if the rdn attr. value is still in $new_attrs[$attr] - if (in_array($old_attrs[$attr][0], $new_attrs[$attr])) { - $this->_debug("Simply replacing attr $attr as rdn attr value is preserved."); - $mod_array['replace'][$attr] = $new_attrs[$attr]; - } - else { - // TODO: This fails. - $mod_array['rename']['dn'] = $subject_dn; - $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr][0]; - $mod_array['del'][$attr] = $old_attrs[$attr][0]; - } - } - } - else { - if (!is_array($new_attrs[$attr])) { - $this->_debug("Renaming " . $old_attrs[$attr] . " to " . $new_attrs[$attr]); - $mod_array['rename']['dn'] = $subject_dn; - $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$attr]; - } - else { - $this->_debug("Adding to replace"); - // An additional attribute value is being supplied. Just replace and continue. - $mod_array['replace'][$attr] = $new_attrs[$attr]; - continue; - } - } - - } - else { - if (!isset($new_attrs[$attr]) || $new_attrs[$attr] === '' || (is_array($new_attrs[$attr]) && empty($new_attrs[$attr]))) { - switch ($attr) { - case "userpassword": - break; - default: - $this->_debug("Adding to del: $attr"); - $mod_array['del'][$attr] = (array)($old_attr_value); - break; - } - } - else { - $this->_debug("Adding to replace: $attr"); - $mod_array['replace'][$attr] = (array)($new_attrs[$attr]); - } - } - } - else { - $this->_debug("Attribute $attr unchanged"); - } - } - else { - // TODO: Since we're not shipping the entire object back and forth, and only post - // part of the data... we don't know what is actually removed (think modifiedtimestamp, etc.) - $this->_debug("Group attribute $attr not mentioned in \$new_attrs..., but not explicitly removed... by assumption"); - } - } - - foreach ($new_attrs as $attr => $value) { - // OU's parent base dn - if ($attr == 'base_dn') { - continue; - } - - if (is_array($value)) { - if (count($value) == 1) { - $new_attrs[$attr] = $value[0]; - $value = $new_attrs[$attr]; - } - } - - if (array_key_exists($attr, $old_attrs)) { - if (is_array($old_attrs[$attr])) { - if (count($old_attrs[$attr]) == 1) { - $old_attrs[$attr] = $old_attrs[$attr][0]; - } - } - - if (is_array($new_attrs[$attr]) && is_array($old_attrs[$attr])) { - $_sort1 = $old_attrs[$attr]; - sort($_sort1); - $_sort2 = $value; - sort($_sort2); - } - else { - $_sort1 = true; - $_sort2 = false; - } - - if ($value === null || $value === '' || (is_array($value) && empty($value))) { - if (!array_key_exists($attr, $mod_array['del'])) { - switch ($attr) { - case 'userpassword': - break; - default: - $this->_debug("Adding to del(2): $attr"); - $mod_array['del'][$attr] = (array)($old_attrs[$attr]); - break; - } - } - } - else { - if (!($old_attrs[$attr] === $value) && !($attr === $rdn_attr) && !($_sort1 === $_sort2)) { - if (!array_key_exists($attr, $mod_array['replace'])) { - $this->_debug("Adding to replace(2): $attr"); - $mod_array['replace'][$attr] = $value; - } - } - } - } - else { - if (!empty($value)) { - $mod_array['add'][$attr] = $value; - } - } - } - - if (empty($old_ou)) { - $subject_dn_components = ldap_explode_dn($subject_dn, 0); - unset($subject_dn_components["count"]); - $subject_rdn = array_shift($subject_dn_components); - $old_ou = implode(',', $subject_dn_components); - } - - // object is an organizational unit - if (strpos($subject_dn, 'ou=' . $old_ou) === 0) { - $root = substr($subject_dn, strlen($old_ou) + 4); // remove ou=*, - - if ((!empty($new_attrs['base_dn']) && strtolower($new_attrs['base_dn']) !== strtolower($root)) - || (strtolower($old_ou) !== strtolower($new_ou)) - ) { - if (!empty($new_attrs['base_dn'])) { - $root = $new_attrs['base_dn']; - } - - $mod_array['rename']['new_parent'] = $root; - $mod_array['rename']['dn'] = $subject_dn; - $mod_array['rename']['new_rdn'] = 'ou=' . $new_ou; - } - } - // not OU object, but changed ou attribute - else if ((!empty($old_ou) && !empty($new_ou)) && strtolower($old_ou) !== strtolower($new_ou)) { - $mod_array['rename']['new_parent'] = $new_ou; - if (empty($mod_array['rename']['dn']) || empty($mod_array['rename']['new_rdn'])) { - $mod_array['rename']['dn'] = $subject_dn; - $mod_array['rename']['new_rdn'] = $rdn_attr . '=' . $new_attrs[$rdn_attr]; - } - } - - $this->_debug($mod_array); - - $result = $this->modify_entry_attributes($subject_dn, $mod_array); - - if ($result) { - return $mod_array; - } - } - - /** - * Bind connection with (SASL-) user and password - * - * @param string $authc Authentication user - * @param string $pass Bind password - * @param string $authz Autorization user - * - * @return boolean True on success, False on error - */ - public function sasl_bind($authc, $pass, $authz=null) - { - if (!$this->conn) { - return false; - } - - if (!function_exists('ldap_sasl_bind')) { - $this->_error("Unable to bind: ldap_sasl_bind() not exists"); - return false; - } - - if (!empty($authz)) { - $authz = 'u:' . $authz; - } - - $method = $this->config_get('auth_method'); - if (empty($method)) { - $method = 'DIGEST-MD5'; - } - - $this->_debug("C: Bind [mech: $method, authc: $authc, authz: $authz]"); - - if (ldap_sasl_bind($this->conn, null, $pass, $method, null, $authc, $authz)) { - $this->_debug("S: OK"); - return true; - } - - $this->_debug("S: ".ldap_error($this->conn)); - $this->_error("Bind failed for authcid=$authc ".ldap_error($this->conn)); - - return false; - } - - /** - * Execute LDAP search - * - * @param string $base_dn Base DN to use for searching - * @param string $filter Filter string to query - * @param string $scope The LDAP scope (list|sub|base) - * @param array $attrs List of entry attributes to read - * @param array $prop Hash array with query configuration properties: - * - sort: array of sort attributes (has to be in sync with the VLV index) - * - search: search string used for VLV controls - * @param bool $count_only Set to true if only entry count is requested - * - * @return mixed Net_LDAP3_Result object or number of entries (if $count_only=true) or False on failure - */ - public function search($base_dn, $filter = '(objectclass=*)', $scope = 'sub', $attrs = array('dn'), $props = array(), $count_only = false) - { - if (!$this->conn) { - $this->_debug("No active connection for " . __CLASS__ . "::" . __FUNCTION__); - return false; - } - - $this->_debug("C: Search base dn: [$base_dn] scope [$scope] with filter [$filter]"); - - // make sure attributes list is not empty - if (empty($attrs)) { - $attrs = array('dn'); - } - - if (!$count_only && ($sort = $this->find_vlv($base_dn, $filter, $scope, $props['sort']))) { - // when using VLV, we get the total count by... - // ...either reading numSubOrdinates attribute - if (($sub_filter = $this->config_get('numsub_filter')) && - ($result_count = @$ns_function($this->conn, $base_dn, $sub_filter, array('numSubOrdinates'), 0, 0, 0)) - ) { - $counts = ldap_get_entries($this->conn, $result_count); - for ($vlv_count = $j = 0; $j < $counts['count']; $j++) { - $vlv_count += $counts[$j]['numsubordinates'][0]; - } - $this->_debug("D: total numsubordinates = " . $vlv_count); - } - // ...or by fetching all records dn and count them - else if (!function_exists('ldap_parse_virtuallist_control')) { - $vlv_count = $this->search($base_dn, $filter, $scope, array('dn'), $props, true); - } - - $this->vlv_active = $this->_vlv_set_controls($sort, $this->list_page, $this->page_size, - $this->_vlv_search($sort, $props['search'])); - } - else { - $this->vlv_active = false; - } - - $function = self::scope_to_function($scope, $ns_function); - $sizelimit = (int) $this->config['sizelimit']; - $timelimit = (int) $this->config['timelimit']; - - $this->_debug("Using function $function on scope $scope (\$ns_function is $ns_function)"); - - if ($this->vlv_active) { - if (!empty($this->additional_filter)) { - $filter = "(&" . $filter . $this->additional_filter . ")"; - $this->_debug("C: (With VLV) Setting a filter (with additional filter) of " . $filter); - } - else { - $this->_debug("C: (With VLV) Setting a filter (without additional filter) of " . $filter); - } - } - else { - if (!empty($this->additional_filter)) { - $filter = "(&" . $filter . $this->additional_filter . ")"; - } - $this->_debug("C: (Without VLV) Setting a filter of " . $filter); - } - - $this->_debug("Executing search with return attributes: " . var_export($attrs, true)); - - $ldap_result = @$function($this->conn, $base_dn, $filter, $attrs, 0, $sizelimit, $timelimit); - - if (!$ldap_result) { - $this->_debug("$function failed for dn=$base_dn: ".ldap_error($this->conn)); - return false; - } - - // when running on a patched PHP we can use the extended functions - // to retrieve the total count from the LDAP search result - if ($this->vlv_active && function_exists('ldap_parse_virtuallist_control')) { - if (ldap_parse_result($this->conn, $ldap_result, $errcode, $matcheddn, $errmsg, $referrals, $serverctrls)) { - ldap_parse_virtuallist_control($this->conn, $serverctrls, $last_offset, $vlv_count, $vresult); - $this->_debug("S: VLV result: last_offset=$last_offset; content_count=$vlv_count"); - } - else { - $this->_debug("S: ".($errmsg ? $errmsg : ldap_error($this->conn))); - } - } - else if ($this->debug) { - $this->_debug("S: ".ldap_count_entries($this->conn, $ldap_result)." record(s) found"); - } - - $result = new Net_LDAP3_Result($this->conn, $base_dn, $filter, $scope, $ldap_result); - $result->set('offset', $last_offset); - $result->set('count', $vlv_count); - $result->set('vlv', true); - - return $count_only ? $result->count() : $result; - } - - /** - * Similar to Net_LDAP3::search() but using a search array with multiple - * keys and values that to continue to use the VLV but with an original - * filter adding the search stuff to an additional filter. - * - * @see Net_LDAP3::search() - */ - public function search_entries($base_dn, $filter = '(objectclass=*)', $scope = 'sub', $attrs = array('dn'), $props = array()) - { - $this->_debug("Net_LDAP3::search_entries with search " . var_export($props, true)); - - if (is_array($props['search']) && array_key_exists('params', $props['search'])) { - $_search = $this->search_filter($props['search']); - $this->_debug("C: Search filter: $_search"); - - if (!empty($_search)) { - $this->additional_filter = $_search; - } - else { - $this->additional_filter = "(|"; - - foreach ($props['search'] as $attr => $value) { - $this->additional_filter .= "(" . $attr . "=" . $this->_fuzzy_search_prefix() . $value . $this->_fuzzy_search_suffix() . ")"; - } - - $this->additional_filter .= ")"; - } - - $this->_debug("C: Setting an additional filter " . $this->additional_filter); - } - - $search = $this->search($base_dn, $filter, $scope, $attrs, $props); - - $this->additional_filter = null; - - if (!$search) { - $this->_debug("Net_LDAP3: Search did not succeed!"); - return false; - } - - return $search; - } - - /** - * Create LDAP search filter string according to defined parameters. - */ - public function search_filter($search) - { - if (empty($search) || !is_array($search) || empty($search['params'])) { - return null; - } - - $operators = array('=', '~=', '>=', '<='); - $filter = ''; - - foreach ((array) $search['params'] as $field => $param) { - switch ((string)$param['type']) { - case 'prefix': - $prefix = ''; - $suffix = '*'; - break; - - case 'suffix': - $prefix = '*'; - $suffix = ''; - break; - - case 'exact': - case '=': - case '~=': - case '>=': - case '<=': - $prefix = ''; - $suffix = ''; - break; - - case 'exists': - $prefix = '*'; - $suffix = ''; - $param['value'] = ''; - break; - - case 'both': - default: - $prefix = '*'; - $suffix = '*'; - break; - } - - $operator = $param['type'] && in_array($param['type'], $operators) ? $param['type'] : '='; - - if (is_array($param['value'])) { - $val_filter = array(); - foreach ($param['value'] as $val) { - $value = self::quote_string($val); - $val_filter[] = "(" . $field . $operator . $prefix . $value . $suffix . ")"; - } - $filter .= "(|" . implode($val_filter, '') . ")"; - } - else { - $value = self::quote_string($param['value']); - $filter .= "(" . $field . $operator . $prefix . $value . $suffix . ")"; - } - } - - // join search parameters with specified operator ('OR' or 'AND') - if (count($search['params']) > 1) { - $filter = '(' . ($search['operator'] == 'AND' ? '&' : '|') . $filter . ')'; - } - - return $filter; - } - - /** - * Set properties for VLV-based paging - * - * @param number $page Page number to list (starting at 1) - * @param number $size Number of entries to display on one page - */ - public function set_vlv_page($page, $size = 10) - { - $this->list_page = $page; - $this->page_size = $size; - } - - /** - * Turn an LDAP entry into a regular PHP array with attributes as keys. - * - * @param array $entry Attributes array as retrieved from ldap_get_attributes() or ldap_get_entries() - * - * @return array Hash array with attributes as keys - */ - public static function normalize_entry($entry) - { - $rec = array(); - for ($i=0; $i < $entry['count']; $i++) { - $attr = $entry[$i]; - for ($j=0; $j < $entry[$attr]['count']; $j++) { - $rec[$attr][$j] = $entry[$attr][$j]; - } - } - - return $rec; - } - - /** - * Normalize a ldap result by converting entry attribute arrays into single values - */ - public static function normalize_result($_result) - { - if (!is_array($_result)) { - return array(); - } - - $result = array(); - - for ($x = 0; $x < $_result['count']; $x++) { - $dn = $_result[$x]['dn']; - $result[$dn] = array(); - for ($y = 0; $y < $_result[$x]['count']; $y++) { - $attr = $_result[$x][$y]; - if ($_result[$x][$attr]['count'] == 1) { - switch ($attr) { - case 'objectclass': - $result[$dn][$attr] = array(strtolower($_result[$x][$attr][0])); - break; - default: - $result[$dn][$attr] = $_result[$x][$attr][0]; - break; - } - } - else { - $result[$dn][$attr] = array(); - for ($z = 0; $z < $_result[$x][$attr]['count']; $z++) { - switch ($attr) { - case 'objectclass': - $result[$dn][$attr][] = strtolower($_result[$x][$attr][$z]); - break; - default: - $result[$dn][$attr][] = $_result[$x][$attr][$z]; - break; - } - } - } - } - } - - return $result; - } - - public static function scopeint2str($scope) - { - switch ($scope) { - case 2: - return 'sub'; - break; - case 1: - return 'one'; - break; - case 0: - return 'base'; - break; - default: - $this->_debug("Scope $scope is not a valid scope integer"); - break; - } - } - - /** - * Choose the right PHP function according to scope property - * - * @param string $scope The LDAP scope (sub|base|list) - * @param string $ns_function Function to be used for numSubOrdinates queries - * @return string PHP function to be used to query directory - */ - public static function scope_to_function($scope, &$ns_function = null) - { - switch ($scope) { - case 'sub': - $function = $ns_function = 'ldap_search'; - break; - case 'base': - $function = $ns_function = 'ldap_read'; - break; - case 'one': - case 'list': - default: - $function = 'ldap_list'; - $ns_function = 'ldap_read'; - break; - } - - return $function; - } - - private function config_set_config_get_hook($callback) - { - $this->_config_get_hook = $callback; - } - - private function config_set_config_set_hook($callback) - { - $this->_config_set_hook = $callback; - } - - /** - * Sets the debug level both for this class and the ldap connection. - */ - private function config_set_debug($value) - { - $this->config['debug'] = (bool) $value; - if ((int)($value) > 0) { - ldap_set_option(null, LDAP_OPT_DEBUG_LEVEL, (int)($value)); - } - } - - /** - * Sets a log hook that is called with every log message in this module. - */ - private function config_set_log_hook($callback) - { - $this->_log_hook = $callback; - } - - /** - * Find a matching VLV - */ - protected function find_vlv($base_dn, $filter, $scope, $sort_attrs = null) - { - if ($scope == 'base') { - return false; - } - - $vlv_indexes = $this->find_vlv_indexes_and_searches(); - - if (empty($vlv_indexes)) { - return false; - } - - $this->_debug("Existing vlv index and search information", $vlv_indexes); - - $filter = strtolower($filter); - - foreach ($vlv_indexes as $vlv_index) { - if (!empty($vlv_index[$base_dn])) { - $this->_debug("Found a VLV for base_dn: " . $base_dn); - if ($vlv_index[$base_dn]['filter'] == $filter) { - if ($vlv_index[$base_dn]['scope'] == $scope) { - $this->_debug("Scope and filter matches"); - - // Not passing any sort attributes means you don't care - if (!empty($sort_attrs)) { - $sort_attrs = (array) $sort_attrs; - foreach ($vlv_index[$base_dn]['sort'] as $sss_config) { - if (count(array_intersect($sort_attrs, $sss_config)) == count($sort_attrs)) { - return $sort_attrs; - } - } - - $this->_error("The requested sorting does not match any server-side sorting configuration"); - - return false; - } - else { - return $vlv_index[$base_dn]['sort'][0]; - } - } - else { - $this->_debug("Scope does not match. VLV: " . var_export($vlv_index[$base_dn]['scope'], true) - . " while looking for " . var_export($scope, true)); - return false; - } - } - else { - $this->_debug("Filter does not match"); - } - } - } - - return false; - } - - /** - * Return VLV indexes and searches including necessary configuration - * details. - */ - protected function find_vlv_indexes_and_searches() - { - if ($this->config['vlv'] === false) { - return false; - } - - if (is_array($this->config['vlv'])) { - return $this->config['vlv']; - } - - if ($this->_vlv_indexes_and_searches !== null) { - return $this->_vlv_indexes_and_searches; - } - - $this->_vlv_indexes_and_searches = array(); - - $config_root_dn = $this->config_get('config_root_dn'); - - if (empty($config_root_dn)) { - return array(); - } - - if ($this->cache && ($cached_config = $this->cache->get('vlvconfig'))) { - $this->_vlv_indexes_and_searches = $cached_config; - return $this->_vlv_indexes_and_searches; - } - - $this->_debug("No VLV information available yet, refreshing"); - - $search_filter = '(objectclass=vlvsearch)'; - $search_result = ldap_search($this->conn, $config_root_dn, $search_filter, array('*'), 0, 0, 0); - - if ($search_result === false) { - $this->_debug("Search for '$search_filter' on '$config_root_dn' failed:".ldap_error($this->conn)); - return; - } - - $vlv_searches = new Net_LDAP3_Result($this->conn, $config_root_dn, $search_filter, 'sub', $search_result); - - if ($vlv_searches->count() < 1) { - $this->_debug("Empty result from search for '(objectclass=vlvsearch)' on '$config_root_dn'"); - return; - } - - $index_filter = '(objectclass=vlvindex)'; - - foreach ($vlv_searches->entries(true) as $vlv_search_dn => $vlv_search_attrs) { - // The attributes we are interested in are as follows: - $_vlv_base_dn = $vlv_search_attrs['vlvbase']; - $_vlv_scope = $vlv_search_attrs['vlvscope']; - $_vlv_filter = $vlv_search_attrs['vlvfilter']; - - // Multiple indexes may exist - $index_result = ldap_search($this->conn, $vlv_search_dn, $index_filter, array('*'), 0, 0, 0); - - if ($index_result === false) { - $this->_debug("Search for '$index_filter' on '$vlv_search_dn' failed:".ldap_error($this->conn)); - continue; - } - - $vlv_indexes = new Net_LDAP3_Result($this->conn, $vlv_search_dn, $index_filter, 'sub', $index_result); - $vlv_indexes = $vlv_indexes->entries(true); - - // Reset this one for each VLV search. - $_vlv_sort = array(); - - foreach ($vlv_indexes as $vlv_index_dn => $vlv_index_attrs) { - $_vlv_sort[] = explode(' ', $vlv_index_attrs['vlvsort']); - } - - $this->_vlv_indexes_and_searches[] = array( - $_vlv_base_dn => array( - 'scope' => self::scopeint2str($_vlv_scope), - 'filter' => strtolower($_vlv_filter), - 'sort' => $_vlv_sort, - ), - ); - } - - // cache this - if ($this->cache) { - $this->cache->set('vlvconfig', $this->_vlv_indexes_and_searches); - } - - return $this->_vlv_indexes_and_searches; - } - - private function init_schema() - { - // use PEAR include if autoloading failed - if (!class_exists('Net_LDAP2')) { - require_once('Net/LDAP2.php'); - } - - $port = $this->config_get('port', 389); - $tls = $this->config_get('use_tls', false); - - foreach ((array) $this->config_get('hosts') as $host) { - $this->_debug("C: Connect [$host:$port]"); - - $_ldap_cfg = array( - 'host' => $host, - 'port' => $port, - 'tls' => $tls, - 'version' => 3, - 'binddn' => $this->config_get('service_bind_dn'), - 'bindpw' => $this->config_get('service_bind_pw') - ); - - $_ldap_schema_cache_cfg = array( - 'path' => "/tmp/" . $host . ":" . ($port ? $port : '389') . "-Net_LDAP2_Schema.cache", - 'max_age' => 86400, - ); - - $_ldap = Net_LDAP2::connect($_ldap_cfg); - - if (!is_a($_ldap, 'Net_LDAP2_Error')) { - $this->_debug("S: OK"); - break; - } - - $this->_debug("S: NOT OK"); - $this->_debug($_ldap->getMessage()); - } - - if (is_a($_ldap, 'Net_LDAP2_Error')) { - return null; - } - - $_ldap_schema_cache = new Net_LDAP2_SimpleFileSchemaCache($_ldap_schema_cache_cfg); - - $_ldap->registerSchemaCache($_ldap_schema_cache); - - // TODO: We should learn what LDAP tech. we're running against. - // Perhaps with a scope base objectclass recognize rootdse entry - $schema_root_dn = $this->config_get('schema_root_dn'); - - if (!$schema_root_dn) { - $_schema = $_ldap->schema(); - } - - return $_schema; - } - - private function list_group_member($dn, $members, $recurse = true) - { - $this->_debug("Called list_group_member(" . $dn . ")"); - - $members = (array) $members; - $group_members = array(); - - // remove possible 'count' item - unset($members['count']); - - // Use the member attributes to return an array of member ldap objects - // NOTE that the member attribute is supposed to contain a DN - foreach ($members as $member) { - $member_entry = $this->get_entry($member, array('member', 'uniquemember', 'memberurl', 'objectclass')); - - if (empty($member_entry)) { - continue; - } - - $group_members[$member] = $member; - - if ($recurse) { - // Nested groups - $group_group_members = $this->list_group_members($member, $member_entry); - if ($group_group_members) { - $group_members = array_merge($group_group_members, $group_members); - } - } - } - - return array_filter($group_members); - } - - private function list_group_uniquemember($dn, $uniquemembers, $recurse = true) - { - $this->_debug("Called list_group_uniquemember(" . $dn . ")", $entry); - - $uniquemembers = (array)($uniquemembers); - $group_members = array(); - - // remove possible 'count' item - unset($uniquemembers['count']); - - foreach ($uniquemembers as $member) { - $member_entry = $this->get_entry($member, array('member', 'uniquemember', 'memberurl', 'objectclass')); - - if (empty($member_entry)) { - continue; - } - - $group_members[$member] = $member; - - if ($recurse) { - // Nested groups - $group_group_members = $this->list_group_members($member, $member_entry); - if ($group_group_members) { - $group_members = array_merge($group_group_members, $group_members); - } - } - } - - return array_filter($group_members); - } - - private function list_group_memberurl($dn, $memberurls, $recurse = true) - { - $this->_debug("Called list_group_memberurl(" . $dn . ")"); - - $group_members = array(); - $memberurls = (array) $memberurls; - $attributes = array('member', 'uniquemember', 'memberurl', 'objectclass'); - - // remove possible 'count' item - unset($memberurls['count']); - - foreach ($memberurls as $url) { - $ldap_uri = $this->parse_memberurl($url); - $result = $this->search($ldap_uri[3], $ldap_uri[6], 'sub', $attributes); - - if (!$result) { - continue; - } - - foreach ($result->entries(true) as $entry_dn => $_entry) { - $group_members[$entry_dn] = $entry_dn; - $this->_debug("Found " . $entry_dn); - - if ($recurse) { - // Nested group - $group_group_members = $this->list_group_members($entry_dn, $_entry); - if ($group_group_members) { - $group_members = array_merge($group_members, $group_group_members); - } - } - } - } - - return array_filter($group_members); - } - - /** - * memberUrl attribute parser - * - * @param string $url URL string - * - * @return array URL elements - */ - private function parse_memberurl($url) - { - preg_match('/(.*):\/\/(.*)\/(.*)\?(.*)\?(.*)\?(.*)/', $url, $matches); - return $matches; - } - - private function modify_entry_attributes($subject_dn, $attributes) - { - // Opportunities to set false include failed ldap commands. - $result = true; - - if (is_array($attributes['rename']) && !empty($attributes['rename'])) { - $olddn = $attributes['rename']['dn']; - $newrdn = $attributes['rename']['new_rdn']; - - if (!empty($attributes['rename']['new_parent'])) { - $new_parent = $attributes['rename']['new_parent']; - } - else { - $new_parent = null; - } - - $this->_debug("LDAP: C: Rename $olddn to $newrdn,$new_parent"); - - $result = ldap_rename($this->conn, $olddn, $newrdn, $new_parent, true); - - if ($result) { - $this->_debug("LDAP: S: OK"); - - if ($new_parent) { - $subject_dn = $newrdn . ',' . $new_parent; - } - else { - $old_parent_dn_components = ldap_explode_dn($olddn, 0); - unset($old_parent_dn_components["count"]); - $old_rdn = array_shift($old_parent_dn_components); - $old_parent_dn = implode(",", $old_parent_dn_components); - $subject_dn = $newrdn . ',' . $old_parent_dn; - } - } - else { - $this->_debug("LDAP: S: " . ldap_error($this->conn)); - $this->_warning("LDAP: Failed to rename $olddn to $newrdn,$new_parent"); - return false; - } - } - - if (is_array($attributes['replace']) && !empty($attributes['replace'])) { - $this->_debug("LDAP: C: Mod-Replace $subject_dn: " . json_encode($attributes['replace'])); - - $result = ldap_mod_replace($this->conn, $subject_dn, $attributes['replace']); - - if ($result) { - $this->_debug("LDAP: S: OK"); - } - else { - $this->_debug("LDAP: S: " . ldap_error($this->conn)); - $this->_warning("LDAP: Failed to replace attributes on $subject_dn: " . json_encode($attributes['replace'])); - return false; - } - } - - if (is_array($attributes['del']) && !empty($attributes['del'])) { - $this->_debug("LDAP: C: Mod-Delete $subject_dn: " . json_encode($attributes['del'])); - - $result = ldap_mod_del($this->conn, $subject_dn, $attributes['del']); - - if ($result) { - $this->_debug("LDAP: S: OK"); - } - else { - $this->_debug("LDAP: S: " . ldap_error($this->conn)); - $this->_warning("LDAP: Failed to delete attributes on $subject_dn: " . json_encode($attributes['del'])); - return false; - } - } - - if (is_array($attributes['add']) && !empty($attributes['add'])) { - $this->_debug("LDAP: C: Mod-Add $subject_dn: " . json_encode($attributes['add'])); - - $result = ldap_mod_add($this->conn, $subject_dn, $attributes['add']); - - if ($result) { - $this->_debug("LDAP: S: OK"); - } - else { - $this->_debug("LDAP: S: " . ldap_error($this->conn)); - $this->_warning("LDAP: Failed to add attributes on $subject_dn: " . json_encode($attributes['add'])); - return false; - } - } - - return true; - } - - private function parse_attribute_level_rights($attribute_value) - { - $attribute_value = str_replace(", ", ",", $attribute_value); - $attribute_values = explode(",", $attribute_value); - $attribute_value = array(); - - foreach ($attribute_values as $access_right) { - $access_right_components = explode(":", $access_right); - $access_attribute = strtolower(array_shift($access_right_components)); - $access_value = array_shift($access_right_components); - - $attribute_value[$access_attribute] = array(); - - for ($i = 0; $i < strlen($access_value); $i++) { - $method = $this->attribute_level_rights_map[substr($access_value, $i, 1)]; - - if (!in_array($method, $attribute_value[$access_attribute])) { - $attribute_value[$access_attribute][] = $method; - } - } - } - - return $attribute_value; - } - - private function parse_entry_level_rights($attribute_value) - { - $_attribute_value = array(); - - for ($i = 0; $i < strlen($attribute_value); $i++) { - $method = $this->entry_level_rights_map[substr($attribute_value, $i, 1)]; - - if (!in_array($method, $_attribute_value)) { - $_attribute_value[] = $method; - } - } - - return $_attribute_value; - } - - private function supported_controls() - { - if (!empty($this->supported_controls)) { - return $this->supported_controls; - } - - $this->_info("Obtaining supported controls"); - - if ($result = $this->search('', '(objectclass=*)', 'base', array('supportedcontrol'))) { - $result = $result->entries(true); - $control = $result['']['supportedcontrol']; - } - else { - $control = array(); - } - - $this->_info("Obtained " . count($control) . " supported controls"); - $this->supported_controls = $control; - - return $control; - } - - protected function _alert() - { - $this->__log(LOG_ALERT, func_get_args()); - } - - protected function _critical() - { - $this->__log(LOG_CRIT, func_get_args()); - } - - protected function _debug() - { - $this->__log(LOG_DEBUG, func_get_args()); - } - - protected function _emergency() - { - $this->__log(LOG_EMERG, func_get_args()); - } - - protected function _error() - { - $this->__log(LOG_ERR, func_get_args()); - } - - protected function _info() - { - $this->__log(LOG_INFO, func_get_args()); - } - - protected function _notice() - { - $this->__log(LOG_NOTICE, func_get_args()); - } - - protected function _warning() - { - $this->__log(LOG_WARNING, func_get_args()); - } - - /** - * Log a message. - */ - private function __log($level, $args) - { - $msg = array(); - - foreach ($args as $arg) { - $msg[] = !is_string($arg) ? var_export($arg, true) : $arg; - } - - if (!empty($this->_log_hook)) { - call_user_func_array($this->_log_hook, array($level, $msg)); - return; - } - - if ($this->debug_level > 0) { - syslog($level, implode("\n", $msg)); - } - } - - /** - * Add BER sequence with correct length and the given identifier - */ - private static function _ber_addseq($str, $identifier) - { - $len = dechex(strlen($str)/2); - if (strlen($len) % 2 != 0) { - $len = '0'.$len; - } - - return $identifier . $len . $str; - } - - /** - * Returns BER encoded integer value in hex format - */ - private static function _ber_encode_int($offset) - { - $val = dechex($offset); - $prefix = ''; - - // check if bit 8 of high byte is 1 - if (preg_match('/^[89abcdef]/', $val)) { - $prefix = '00'; - } - - if (strlen($val)%2 != 0) { - $prefix .= '0'; - } - - return $prefix . $val; - } - - /** - * Quotes attribute value string - * - * @param string $str Attribute value - * @param bool $dn True if the attribute is a DN - * - * @return string Quoted string - */ - public static function quote_string($str, $is_dn = false) - { - // take firt entry if array given - if (is_array($str)) { - $str = reset($str); - } - - if ($is_dn) { - $replace = array( - ',' => '\2c', - '=' => '\3d', - '+' => '\2b', - '<' => '\3c', - '>' => '\3e', - ';' => '\3b', - "\\"=> '\5c', - '"' => '\22', - '#' => '\23' - ); - } - else { - $replace = array( - '*' => '\2a', - '(' => '\28', - ')' => '\29', - "\\" => '\5c', - '/' => '\2f' - ); - } - - return strtr($str, $replace); - } - - /** - * create ber encoding for sort control - * - * @param array List of cols to sort by - * @return string BER encoded option value - */ - private static function _sort_ber_encode($sortcols) - { - $str = ''; - foreach (array_reverse((array)$sortcols) as $col) { - $ber_val = self::_string2hex($col); - - // 30 = ber sequence with a length of octet value - // 04 = octet string with a length of the ascii value - $oct = self::_ber_addseq($ber_val, '04'); - $str = self::_ber_addseq($oct, '30') . $str; - } - - // now tack on sequence identifier and length - $str = self::_ber_addseq($str, '30'); - - return pack('H'.strlen($str), $str); - } - - /** - * Returns ascii string encoded in hex - */ - private static function _string2hex($str) - { - $hex = ''; - for ($i=0; $i < strlen($str); $i++) - $hex .= dechex(ord($str[$i])); - - return $hex; - } - - /** - * Generate BER encoded string for Virtual List View option - * - * @param integer List offset (first record) - * @param integer Records per page - * @return string BER encoded option value - */ - private static function _vlv_ber_encode($offset, $rpp, $search = '') - { - // This string is ber-encoded, php will prefix this value with: - // 04 (octet string) and 10 (length of 16 bytes) - // the code behind this string is broken down as follows: - // 30 = ber sequence with a length of 0e (14) bytes following - // 02 = type integer (in two's complement form) with 2 bytes following (beforeCount): 01 00 (ie 0) - // 02 = type integer (in two's complement form) with 2 bytes following (afterCount): 01 18 (ie 25-1=24) - // a0 = type context-specific/constructed with a length of 06 (6) bytes following - // 02 = type integer with 2 bytes following (offset): 01 01 (ie 1) - // 02 = type integer with 2 bytes following (contentCount): 01 00 - - // whith a search string present: - // 81 = type context-specific/constructed with a length of 04 (4) bytes following (the length will change here) - // 81 indicates a user string is present where as a a0 indicates just a offset search - // 81 = type context-specific/constructed with a length of 06 (6) bytes following - - // the following info was taken from the ISO/IEC 8825-1:2003 x.690 standard re: the - // encoding of integer values (note: these values are in - // two-complement form so since offset will never be negative bit 8 of the - // leftmost octet should never by set to 1): - // 8.3.2: If the contents octets of an integer value encoding consist - // of more than one octet, then the bits of the first octet (rightmost) and bit 8 - // of the second (to the left of first octet) octet: - // a) shall not all be ones; and - // b) shall not all be zero - - if ($search) { - $search = preg_replace('/[^-[:alpha:] ,.()0-9]+/', '', $search); - $ber_val = self::_string2hex($search); - $str = self::_ber_addseq($ber_val, '81'); - } - else { - // construct the string from right to left - $str = "020100"; # contentCount - - // returns encoded integer value in hex format - $ber_val = self::_ber_encode_int($offset); - - // calculate octet length of $ber_val - $str = self::_ber_addseq($ber_val, '02') . $str; - - // now compute length over $str - $str = self::_ber_addseq($str, 'a0'); - } - - // now tack on records per page - $str = "020100" . self::_ber_addseq(self::_ber_encode_int($rpp-1), '02') . $str; - - // now tack on sequence identifier and length - $str = self::_ber_addseq($str, '30'); - - return pack('H'.strlen($str), $str); - } - - private function _fuzzy_search_prefix() - { - switch ($this->config_get("fuzzy_search", 2)) { - case 2: - return "*"; - break; - case 1: - case 0: - default: - return ""; - break; - } - } - - private function _fuzzy_search_suffix() - { - switch ($this->config_get("fuzzy_search", 2)) { - case 2: - return "*"; - break; - case 1: - return "*"; - case 0: - default: - return ""; - break; - } - } - - /** - * Return the search string value to be used in VLV controls - */ - private function _vlv_search($sort, $search) - { - if (!empty($this->additional_filter)) { - $this->_debug("Not setting a VLV search filter because we already have a filter"); - return; - } - - if (empty($search)) { - return; - } - - $search_suffix = $this->_fuzzy_search_suffix(); - - foreach ($search as $attr => $value) { - if (!in_array(strtolower($attr), $sort)) { - $this->_debug("Cannot use VLV search using attribute not indexed: $attr (not in " . var_export($sort, true) . ")"); - return; - } - else { - return $value . $search_suffix; - } - } - } - - /** - * Set server controls for Virtual List View (paginated listing) - */ - private function _vlv_set_controls($sort, $list_page, $page_size, $search = null) - { - $sort_ctrl = array( - 'oid' => "1.2.840.113556.1.4.473", - 'value' => self::_sort_ber_encode($sort) - ); - - if (!empty($search)) { - $this->_debug("_vlv_set_controls to include search: " . var_export($search, true)); - } - - $vlv_ctrl = array( - 'oid' => "2.16.840.1.113730.3.4.9", - 'value' => self::_vlv_ber_encode( - $offset = ($list_page-1) * $page_size + 1, - $page_size, - $search - ), - 'iscritical' => true - ); - - $this->_debug("C: set controls sort=" . join(' ', unpack('H'.(strlen($sort_ctrl['value'])*2), $sort_ctrl['value'])) - . " (" . implode(',', (array) $sort) . ");" - . " vlv=" . join(' ', (unpack('H'.(strlen($vlv_ctrl['value'])*2), $vlv_ctrl['value']))) . " ($offset/$page_size)"); - - if (!ldap_set_option($this->conn, LDAP_OPT_SERVER_CONTROLS, array($sort_ctrl, $vlv_ctrl))) { - $this->_debug("S: ".ldap_error($this->conn)); - $this->set_error(self::ERROR_SEARCH, 'vlvnotsupported'); - - return false; - } - - return true; - } - -} diff --git a/program/lib/Net/LDAP3/Result.php b/program/lib/Net/LDAP3/Result.php deleted file mode 100644 index 0759df087..000000000 --- a/program/lib/Net/LDAP3/Result.php +++ /dev/null @@ -1,152 +0,0 @@ - | - | Jeroen van Meeuwen | - +-----------------------------------------------------------------------+ -*/ - -/** - * Model class representing an LDAP search result - * - * @package LDAP - */ -class Net_LDAP3_Result implements Iterator -{ - protected $conn; - protected $base_dn; - protected $filter; - protected $scope; - - private $count; - private $current; - private $iteratorkey = 0; - - /** - * Default constructor - * - * @param resource $conn LDAP link identifier - * @param string $base_dn Base DN used to get this result - * @param string $filter Filter query used to get this result - * @param string $scope Scope of the result - * @param resource $result LDAP result entry identifier - */ - function __construct($conn, $base_dn, $filter, $scope, $result) - { - $this->conn = $conn; - $this->base_dn = $base_dn; - $this->filter = $filter; - $this->scope = $scope; - $this->result = $result; - } - - public function get($property, $default = null) - { - if (isset($this->$property)) { - return $this->$property; - } else { - return $default; - } - } - - public function set($property, $value) - { - $this->$property = $value; - } - - /** - * Wrapper for ldap_sort() - */ - public function sort($attr) - { - return ldap_sort($this->conn, $this->result, $attr); - } - - /** - * Get entries count - */ - public function count() - { - if (!isset($this->count)) { - $this->count = ldap_count_entries($this->conn, $this->result); - } - - return $this->count; - } - - /** - * Wrapper for ldap_get_entries() - * - * @param bool $normalize Optionally normalize the entries to a list of hash arrays - * - * @return array List of LDAP entries - */ - public function entries($normalize = false) - { - $entries = ldap_get_entries($this->conn, $this->result); - - if ($normalize) { - return Net_LDAP3::normalize_result($entries); - } - - return $entries; - } - - /** - * Wrapper for ldap_get_dn() using the current entry pointer - */ - public function get_dn() - { - return $this->current ? ldap_get_dn($this->conn, $this->current) : null; - } - - - /*** Implement PHP 5 Iterator interface to make foreach work ***/ - - function current() - { - $attrib = ldap_get_attributes($this->conn, $this->current); - $attrib['dn'] = ldap_get_dn($this->conn, $this->current); - - return $attrib; - } - - function key() - { - return $this->iteratorkey; - } - - function rewind() - { - $this->iteratorkey = 0; - $this->current = ldap_first_entry($this->conn, $this->result); - } - - function next() - { - $this->iteratorkey++; - $this->current = ldap_next_entry($this->conn, $this->current); - } - - function valid() - { - return (bool)$this->current; - } - -} diff --git a/program/lib/Net/SMTP.php b/program/lib/Net/SMTP.php deleted file mode 100644 index 2c1ef5c55..000000000 --- a/program/lib/Net/SMTP.php +++ /dev/null @@ -1,1338 +0,0 @@ - | -// | Jon Parise | -// | Damian Alejandro Fernandez Sosa | -// +----------------------------------------------------------------------+ - -require_once 'PEAR.php'; -require_once 'Net/Socket.php'; - -/** - * Provides an implementation of the SMTP protocol using PEAR's - * Net_Socket:: class. - * - * @package Net_SMTP - * @author Chuck Hagenbuch - * @author Jon Parise - * @author Damian Alejandro Fernandez Sosa - * - * @example basic.php A basic implementation of the Net_SMTP package. - */ -class Net_SMTP -{ - /** - * The server to connect to. - * @var string - * @access public - */ - var $host = 'localhost'; - - /** - * The port to connect to. - * @var int - * @access public - */ - var $port = 25; - - /** - * The value to give when sending EHLO or HELO. - * @var string - * @access public - */ - var $localhost = 'localhost'; - - /** - * List of supported authentication methods, in preferential order. - * @var array - * @access public - */ - var $auth_methods = array(); - - /** - * Use SMTP command pipelining (specified in RFC 2920) if the SMTP - * server supports it. - * - * When pipeling is enabled, rcptTo(), mailFrom(), sendFrom(), - * somlFrom() and samlFrom() do not wait for a response from the - * SMTP server but return immediately. - * - * @var bool - * @access public - */ - var $pipelining = false; - - /** - * Number of pipelined commands. - * @var int - * @access private - */ - var $_pipelined_commands = 0; - - /** - * Should debugging output be enabled? - * @var boolean - * @access private - */ - var $_debug = false; - - /** - * Debug output handler. - * @var callback - * @access private - */ - var $_debug_handler = null; - - /** - * The socket resource being used to connect to the SMTP server. - * @var resource - * @access private - */ - var $_socket = null; - - /** - * Array of socket options that will be passed to Net_Socket::connect(). - * @see stream_context_create() - * @var array - * @access private - */ - var $_socket_options = null; - - /** - * The socket I/O timeout value in seconds. - * @var int - * @access private - */ - var $_timeout = 0; - - /** - * The most recent server response code. - * @var int - * @access private - */ - var $_code = -1; - - /** - * The most recent server response arguments. - * @var array - * @access private - */ - var $_arguments = array(); - - /** - * Stores the SMTP server's greeting string. - * @var string - * @access private - */ - var $_greeting = null; - - /** - * Stores detected features of the SMTP server. - * @var array - * @access private - */ - var $_esmtp = array(); - - /** - * Instantiates a new Net_SMTP object, overriding any defaults - * with parameters that are passed in. - * - * If you have SSL support in PHP, you can connect to a server - * over SSL using an 'ssl://' prefix: - * - * // 465 is a common smtps port. - * $smtp = new Net_SMTP('ssl://mail.host.com', 465); - * $smtp->connect(); - * - * @param string $host The server to connect to. - * @param integer $port The port to connect to. - * @param string $localhost The value to give when sending EHLO or HELO. - * @param boolean $pipeling Use SMTP command pipelining - * @param integer $timeout Socket I/O timeout in seconds. - * @param array $socket_options Socket stream_context_create() options. - * - * @access public - * @since 1.0 - */ - function Net_SMTP($host = null, $port = null, $localhost = null, - $pipelining = false, $timeout = 0, $socket_options = null) - { - if (isset($host)) { - $this->host = $host; - } - if (isset($port)) { - $this->port = $port; - } - if (isset($localhost)) { - $this->localhost = $localhost; - } - $this->pipelining = $pipelining; - - $this->_socket = new Net_Socket(); - $this->_socket_options = $socket_options; - $this->_timeout = $timeout; - - /* Include the Auth_SASL package. If the package is available, we - * enable the authentication methods that depend upon it. */ - if (@include_once 'Auth/SASL.php') { - $this->setAuthMethod('CRAM-MD5', array($this, '_authCram_MD5')); - $this->setAuthMethod('DIGEST-MD5', array($this, '_authDigest_MD5')); - } - - /* These standard authentication methods are always available. */ - $this->setAuthMethod('LOGIN', array($this, '_authLogin'), false); - $this->setAuthMethod('PLAIN', array($this, '_authPlain'), false); - } - - /** - * Set the socket I/O timeout value in seconds plus microseconds. - * - * @param integer $seconds Timeout value in seconds. - * @param integer $microseconds Additional value in microseconds. - * - * @access public - * @since 1.5.0 - */ - function setTimeout($seconds, $microseconds = 0) { - return $this->_socket->setTimeout($seconds, $microseconds); - } - - /** - * Set the value of the debugging flag. - * - * @param boolean $debug New value for the debugging flag. - * - * @access public - * @since 1.1.0 - */ - function setDebug($debug, $handler = null) - { - $this->_debug = $debug; - $this->_debug_handler = $handler; - } - - /** - * Write the given debug text to the current debug output handler. - * - * @param string $message Debug mesage text. - * - * @access private - * @since 1.3.3 - */ - function _debug($message) - { - if ($this->_debug) { - if ($this->_debug_handler) { - call_user_func_array($this->_debug_handler, - array(&$this, $message)); - } else { - echo "DEBUG: $message\n"; - } - } - } - - /** - * Send the given string of data to the server. - * - * @param string $data The string of data to send. - * - * @return mixed The number of bytes that were actually written, - * or a PEAR_Error object on failure. - * - * @access private - * @since 1.1.0 - */ - function _send($data) - { - $this->_debug("Send: $data"); - - $result = $this->_socket->write($data); - if (!$result || PEAR::isError($result)) { - $msg = ($result) ? $result->getMessage() : "unknown error"; - return PEAR::raiseError("Failed to write to socket: $msg", - null, PEAR_ERROR_RETURN); - } - - return $result; - } - - /** - * Send a command to the server with an optional string of - * arguments. A carriage return / linefeed (CRLF) sequence will - * be appended to each command string before it is sent to the - * SMTP server - an error will be thrown if the command string - * already contains any newline characters. Use _send() for - * commands that must contain newlines. - * - * @param string $command The SMTP command to send to the server. - * @param string $args A string of optional arguments to append - * to the command. - * - * @return mixed The result of the _send() call. - * - * @access private - * @since 1.1.0 - */ - function _put($command, $args = '') - { - if (!empty($args)) { - $command .= ' ' . $args; - } - - if (strcspn($command, "\r\n") !== strlen($command)) { - return PEAR::raiseError('Commands cannot contain newlines', - null, PEAR_ERROR_RETURN); - } - - return $this->_send($command . "\r\n"); - } - - /** - * Read a reply from the SMTP server. The reply consists of a response - * code and a response message. - * - * @param mixed $valid The set of valid response codes. These - * may be specified as an array of integer - * values or as a single integer value. - * @param bool $later Do not parse the response now, but wait - * until the last command in the pipelined - * command group - * - * @return mixed True if the server returned a valid response code or - * a PEAR_Error object is an error condition is reached. - * - * @access private - * @since 1.1.0 - * - * @see getResponse - */ - function _parseResponse($valid, $later = false) - { - $this->_code = -1; - $this->_arguments = array(); - - if ($later) { - $this->_pipelined_commands++; - return true; - } - - for ($i = 0; $i <= $this->_pipelined_commands; $i++) { - while ($line = $this->_socket->readLine()) { - $this->_debug("Recv: $line"); - - /* If we receive an empty line, the connection was closed. */ - if (empty($line)) { - $this->disconnect(); - return PEAR::raiseError('Connection was closed', - null, PEAR_ERROR_RETURN); - } - - /* Read the code and store the rest in the arguments array. */ - $code = substr($line, 0, 3); - $this->_arguments[] = trim(substr($line, 4)); - - /* Check the syntax of the response code. */ - if (is_numeric($code)) { - $this->_code = (int)$code; - } else { - $this->_code = -1; - break; - } - - /* If this is not a multiline response, we're done. */ - if (substr($line, 3, 1) != '-') { - break; - } - } - } - - $this->_pipelined_commands = 0; - - /* Compare the server's response code with the valid code/codes. */ - if (is_int($valid) && ($this->_code === $valid)) { - return true; - } elseif (is_array($valid) && in_array($this->_code, $valid, true)) { - return true; - } - - return PEAR::raiseError('Invalid response code received from server', - $this->_code, PEAR_ERROR_RETURN); - } - - /** - * Issue an SMTP command and verify its response. - * - * @param string $command The SMTP command string or data. - * @param mixed $valid The set of valid response codes. These - * may be specified as an array of integer - * values or as a single integer value. - * - * @return mixed True on success or a PEAR_Error object on failure. - * - * @access public - * @since 1.6.0 - */ - function command($command, $valid) - { - if (PEAR::isError($error = $this->_put($command))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse($valid))) { - return $error; - } - - return true; - } - - /** - * Return a 2-tuple containing the last response from the SMTP server. - * - * @return array A two-element array: the first element contains the - * response code as an integer and the second element - * contains the response's arguments as a string. - * - * @access public - * @since 1.1.0 - */ - function getResponse() - { - return array($this->_code, join("\n", $this->_arguments)); - } - - /** - * Return the SMTP server's greeting string. - * - * @return string A string containing the greeting string, or null if a - * greeting has not been received. - * - * @access public - * @since 1.3.3 - */ - function getGreeting() - { - return $this->_greeting; - } - - /** - * Attempt to connect to the SMTP server. - * - * @param int $timeout The timeout value (in seconds) for the - * socket connection attempt. - * @param bool $persistent Should a persistent socket connection - * be used? - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function connect($timeout = null, $persistent = false) - { - $this->_greeting = null; - $result = $this->_socket->connect($this->host, $this->port, - $persistent, $timeout, - $this->_socket_options); - if (PEAR::isError($result)) { - return PEAR::raiseError('Failed to connect socket: ' . - $result->getMessage()); - } - - /* - * Now that we're connected, reset the socket's timeout value for - * future I/O operations. This allows us to have different socket - * timeout values for the initial connection (our $timeout parameter) - * and all other socket operations. - */ - if ($this->_timeout > 0) { - if (PEAR::isError($error = $this->setTimeout($this->_timeout))) { - return $error; - } - } - - if (PEAR::isError($error = $this->_parseResponse(220))) { - return $error; - } - - /* Extract and store a copy of the server's greeting string. */ - list(, $this->_greeting) = $this->getResponse(); - - if (PEAR::isError($error = $this->_negotiate())) { - return $error; - } - - return true; - } - - /** - * Attempt to disconnect from the SMTP server. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function disconnect() - { - if (PEAR::isError($error = $this->_put('QUIT'))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(221))) { - return $error; - } - if (PEAR::isError($error = $this->_socket->disconnect())) { - return PEAR::raiseError('Failed to disconnect socket: ' . - $error->getMessage()); - } - - return true; - } - - /** - * Attempt to send the EHLO command and obtain a list of ESMTP - * extensions available, and failing that just send HELO. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * - * @access private - * @since 1.1.0 - */ - function _negotiate() - { - if (PEAR::isError($error = $this->_put('EHLO', $this->localhost))) { - return $error; - } - - if (PEAR::isError($this->_parseResponse(250))) { - /* If we receive a 503 response, we're already authenticated. */ - if ($this->_code === 503) { - return true; - } - - /* If the EHLO failed, try the simpler HELO command. */ - if (PEAR::isError($error = $this->_put('HELO', $this->localhost))) { - return $error; - } - if (PEAR::isError($this->_parseResponse(250))) { - return PEAR::raiseError('HELO was not accepted: ', $this->_code, - PEAR_ERROR_RETURN); - } - - return true; - } - - foreach ($this->_arguments as $argument) { - $verb = strtok($argument, ' '); - $arguments = substr($argument, strlen($verb) + 1, - strlen($argument) - strlen($verb) - 1); - $this->_esmtp[$verb] = $arguments; - } - - if (!isset($this->_esmtp['PIPELINING'])) { - $this->pipelining = false; - } - - return true; - } - - /** - * Returns the name of the best authentication method that the server - * has advertised. - * - * @return mixed Returns a string containing the name of the best - * supported authentication method or a PEAR_Error object - * if a failure condition is encountered. - * @access private - * @since 1.1.0 - */ - function _getBestAuthMethod() - { - $available_methods = explode(' ', $this->_esmtp['AUTH']); - - foreach ($this->auth_methods as $method => $callback) { - if (in_array($method, $available_methods)) { - return $method; - } - } - - return PEAR::raiseError('No supported authentication methods', - null, PEAR_ERROR_RETURN); - } - - /** - * Attempt to do SMTP authentication. - * - * @param string The userid to authenticate as. - * @param string The password to authenticate with. - * @param string The requested authentication method. If none is - * specified, the best supported method will be used. - * @param bool Flag indicating whether or not TLS should be attempted. - * @param string An optional authorization identifier. If specified, this - * identifier will be used as the authorization proxy. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function auth($uid, $pwd , $method = '', $tls = true, $authz = '') - { - /* We can only attempt a TLS connection if one has been requested, - * we're running PHP 5.1.0 or later, have access to the OpenSSL - * extension, are connected to an SMTP server which supports the - * STARTTLS extension, and aren't already connected over a secure - * (SSL) socket connection. */ - if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=') && - extension_loaded('openssl') && isset($this->_esmtp['STARTTLS']) && - strncasecmp($this->host, 'ssl://', 6) !== 0) { - /* Start the TLS connection attempt. */ - if (PEAR::isError($result = $this->_put('STARTTLS'))) { - return $result; - } - if (PEAR::isError($result = $this->_parseResponse(220))) { - return $result; - } - if (PEAR::isError($result = $this->_socket->enableCrypto(true, STREAM_CRYPTO_METHOD_TLS_CLIENT))) { - return $result; - } elseif ($result !== true) { - return PEAR::raiseError('STARTTLS failed'); - } - - /* Send EHLO again to recieve the AUTH string from the - * SMTP server. */ - $this->_negotiate(); - } - - if (empty($this->_esmtp['AUTH'])) { - return PEAR::raiseError('SMTP server does not support authentication'); - } - - /* If no method has been specified, get the name of the best - * supported method advertised by the SMTP server. */ - if (empty($method)) { - if (PEAR::isError($method = $this->_getBestAuthMethod())) { - /* Return the PEAR_Error object from _getBestAuthMethod(). */ - return $method; - } - } else { - $method = strtoupper($method); - if (!array_key_exists($method, $this->auth_methods)) { - return PEAR::raiseError("$method is not a supported authentication method"); - } - } - - if (!isset($this->auth_methods[$method])) { - return PEAR::raiseError("$method is not a supported authentication method"); - } - - if (!is_callable($this->auth_methods[$method], false)) { - return PEAR::raiseError("$method authentication method cannot be called"); - } - - if (is_array($this->auth_methods[$method])) { - list($object, $method) = $this->auth_methods[$method]; - $result = $object->{$method}($uid, $pwd, $authz, $this); - } else { - $func = $this->auth_methods[$method]; - $result = $func($uid, $pwd, $authz, $this); - } - - /* If an error was encountered, return the PEAR_Error object. */ - if (PEAR::isError($result)) { - return $result; - } - - return true; - } - - /** - * Add a new authentication method. - * - * @param string The authentication method name (e.g. 'PLAIN') - * @param mixed The authentication callback (given as the name of a - * function or as an (object, method name) array). - * @param bool Should the new method be prepended to the list of - * available methods? This is the default behavior, - * giving the new method the highest priority. - * - * @return mixed True on success or a PEAR_Error object on failure. - * - * @access public - * @since 1.6.0 - */ - function setAuthMethod($name, $callback, $prepend = true) - { - if (!is_string($name)) { - return PEAR::raiseError('Method name is not a string'); - } - - if (!is_string($callback) && !is_array($callback)) { - return PEAR::raiseError('Method callback must be string or array'); - } - - if (is_array($callback)) { - if (!is_object($callback[0]) || !is_string($callback[1])) - return PEAR::raiseError('Bad mMethod callback array'); - } - - if ($prepend) { - $this->auth_methods = array_merge(array($name => $callback), - $this->auth_methods); - } else { - $this->auth_methods[$name] = $callback; - } - - return true; - } - - /** - * Authenticates the user using the DIGEST-MD5 method. - * - * @param string The userid to authenticate as. - * @param string The password to authenticate with. - * @param string The optional authorization proxy identifier. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access private - * @since 1.1.0 - */ - function _authDigest_MD5($uid, $pwd, $authz = '') - { - if (PEAR::isError($error = $this->_put('AUTH', 'DIGEST-MD5'))) { - return $error; - } - /* 334: Continue authentication request */ - if (PEAR::isError($error = $this->_parseResponse(334))) { - /* 503: Error: already authenticated */ - if ($this->_code === 503) { - return true; - } - return $error; - } - - $challenge = base64_decode($this->_arguments[0]); - $digest = &Auth_SASL::factory('digest-md5'); - $auth_str = base64_encode($digest->getResponse($uid, $pwd, $challenge, - $this->host, "smtp", - $authz)); - - if (PEAR::isError($error = $this->_put($auth_str))) { - return $error; - } - /* 334: Continue authentication request */ - if (PEAR::isError($error = $this->_parseResponse(334))) { - return $error; - } - - /* We don't use the protocol's third step because SMTP doesn't - * allow subsequent authentication, so we just silently ignore - * it. */ - if (PEAR::isError($error = $this->_put(''))) { - return $error; - } - /* 235: Authentication successful */ - if (PEAR::isError($error = $this->_parseResponse(235))) { - return $error; - } - } - - /** - * Authenticates the user using the CRAM-MD5 method. - * - * @param string The userid to authenticate as. - * @param string The password to authenticate with. - * @param string The optional authorization proxy identifier. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access private - * @since 1.1.0 - */ - function _authCRAM_MD5($uid, $pwd, $authz = '') - { - if (PEAR::isError($error = $this->_put('AUTH', 'CRAM-MD5'))) { - return $error; - } - /* 334: Continue authentication request */ - if (PEAR::isError($error = $this->_parseResponse(334))) { - /* 503: Error: already authenticated */ - if ($this->_code === 503) { - return true; - } - return $error; - } - - $challenge = base64_decode($this->_arguments[0]); - $cram = &Auth_SASL::factory('cram-md5'); - $auth_str = base64_encode($cram->getResponse($uid, $pwd, $challenge)); - - if (PEAR::isError($error = $this->_put($auth_str))) { - return $error; - } - - /* 235: Authentication successful */ - if (PEAR::isError($error = $this->_parseResponse(235))) { - return $error; - } - } - - /** - * Authenticates the user using the LOGIN method. - * - * @param string The userid to authenticate as. - * @param string The password to authenticate with. - * @param string The optional authorization proxy identifier. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access private - * @since 1.1.0 - */ - function _authLogin($uid, $pwd, $authz = '') - { - if (PEAR::isError($error = $this->_put('AUTH', 'LOGIN'))) { - return $error; - } - /* 334: Continue authentication request */ - if (PEAR::isError($error = $this->_parseResponse(334))) { - /* 503: Error: already authenticated */ - if ($this->_code === 503) { - return true; - } - return $error; - } - - if (PEAR::isError($error = $this->_put(base64_encode($uid)))) { - return $error; - } - /* 334: Continue authentication request */ - if (PEAR::isError($error = $this->_parseResponse(334))) { - return $error; - } - - if (PEAR::isError($error = $this->_put(base64_encode($pwd)))) { - return $error; - } - - /* 235: Authentication successful */ - if (PEAR::isError($error = $this->_parseResponse(235))) { - return $error; - } - - return true; - } - - /** - * Authenticates the user using the PLAIN method. - * - * @param string The userid to authenticate as. - * @param string The password to authenticate with. - * @param string The optional authorization proxy identifier. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access private - * @since 1.1.0 - */ - function _authPlain($uid, $pwd, $authz = '') - { - if (PEAR::isError($error = $this->_put('AUTH', 'PLAIN'))) { - return $error; - } - /* 334: Continue authentication request */ - if (PEAR::isError($error = $this->_parseResponse(334))) { - /* 503: Error: already authenticated */ - if ($this->_code === 503) { - return true; - } - return $error; - } - - $auth_str = base64_encode($authz . chr(0) . $uid . chr(0) . $pwd); - - if (PEAR::isError($error = $this->_put($auth_str))) { - return $error; - } - - /* 235: Authentication successful */ - if (PEAR::isError($error = $this->_parseResponse(235))) { - return $error; - } - - return true; - } - - /** - * Send the HELO command. - * - * @param string The domain name to say we are. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function helo($domain) - { - if (PEAR::isError($error = $this->_put('HELO', $domain))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250))) { - return $error; - } - - return true; - } - - /** - * Return the list of SMTP service extensions advertised by the server. - * - * @return array The list of SMTP service extensions. - * @access public - * @since 1.3 - */ - function getServiceExtensions() - { - return $this->_esmtp; - } - - /** - * Send the MAIL FROM: command. - * - * @param string $sender The sender (reverse path) to set. - * @param string $params String containing additional MAIL parameters, - * such as the NOTIFY flags defined by RFC 1891 - * or the VERP protocol. - * - * If $params is an array, only the 'verp' option - * is supported. If 'verp' is true, the XVERP - * parameter is appended to the MAIL command. If - * the 'verp' value is a string, the full - * XVERP=value parameter is appended. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function mailFrom($sender, $params = null) - { - $args = "FROM:<$sender>"; - - /* Support the deprecated array form of $params. */ - if (is_array($params) && isset($params['verp'])) { - /* XVERP */ - if ($params['verp'] === true) { - $args .= ' XVERP'; - - /* XVERP=something */ - } elseif (trim($params['verp'])) { - $args .= ' XVERP=' . $params['verp']; - } - } elseif (is_string($params) && !empty($params)) { - $args .= ' ' . $params; - } - - if (PEAR::isError($error = $this->_put('MAIL', $args))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Send the RCPT TO: command. - * - * @param string $recipient The recipient (forward path) to add. - * @param string $params String containing additional RCPT parameters, - * such as the NOTIFY flags defined by RFC 1891. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * - * @access public - * @since 1.0 - */ - function rcptTo($recipient, $params = null) - { - $args = "TO:<$recipient>"; - if (is_string($params)) { - $args .= ' ' . $params; - } - - if (PEAR::isError($error = $this->_put('RCPT', $args))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(array(250, 251), $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Quote the data so that it meets SMTP standards. - * - * This is provided as a separate public function to facilitate - * easier overloading for the cases where it is desirable to - * customize the quoting behavior. - * - * @param string $data The message text to quote. The string must be passed - * by reference, and the text will be modified in place. - * - * @access public - * @since 1.2 - */ - function quotedata(&$data) - { - /* Because a single leading period (.) signifies an end to the - * data, legitimate leading periods need to be "doubled" ('..'). */ - $data = preg_replace('/^\./m', '..', $data); - - /* Change Unix (\n) and Mac (\r) linefeeds into CRLF's (\r\n). */ - $data = preg_replace('/(?:\r\n|\n|\r(?!\n))/', "\r\n", $data); - } - - /** - * Send the DATA command. - * - * @param mixed $data The message data, either as a string or an open - * file resource. - * @param string $headers The message headers. If $headers is provided, - * $data is assumed to contain only body data. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function data($data, $headers = null) - { - /* Verify that $data is a supported type. */ - if (!is_string($data) && !is_resource($data)) { - return PEAR::raiseError('Expected a string or file resource'); - } - - /* Start by considering the size of the optional headers string. We - * also account for the addition 4 character "\r\n\r\n" separator - * sequence. */ - $size = (is_null($headers)) ? 0 : strlen($headers) + 4; - - if (is_resource($data)) { - $stat = fstat($data); - if ($stat === false) { - return PEAR::raiseError('Failed to get file size'); - } - $size += $stat['size']; - } else { - $size += strlen($data); - } - - /* RFC 1870, section 3, subsection 3 states "a value of zero indicates - * that no fixed maximum message size is in force". Furthermore, it - * says that if "the parameter is omitted no information is conveyed - * about the server's fixed maximum message size". */ - $limit = (isset($this->_esmtp['SIZE'])) ? $this->_esmtp['SIZE'] : 0; - if ($limit > 0 && $size >= $limit) { - $this->disconnect(); - return PEAR::raiseError('Message size exceeds server limit'); - } - - /* Initiate the DATA command. */ - if (PEAR::isError($error = $this->_put('DATA'))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(354))) { - return $error; - } - - /* If we have a separate headers string, send it first. */ - if (!is_null($headers)) { - $this->quotedata($headers); - if (PEAR::isError($result = $this->_send($headers . "\r\n\r\n"))) { - return $result; - } - } - - /* Now we can send the message body data. */ - if (is_resource($data)) { - /* Stream the contents of the file resource out over our socket - * connection, line by line. Each line must be run through the - * quoting routine. */ - while (strlen($line = fread($data, 8192)) > 0) { - /* If the last character is an newline, we need to grab the - * next character to check to see if it is a period. */ - while (!feof($data)) { - $char = fread($data, 1); - $line .= $char; - if ($char != "\n") { - break; - } - } - $this->quotedata($line); - if (PEAR::isError($result = $this->_send($line))) { - return $result; - } - } - } else { - /* - * Break up the data by sending one chunk (up to 512k) at a time. - * This approach reduces our peak memory usage. - */ - for ($offset = 0; $offset < $size;) { - $end = $offset + 512000; - - /* - * Ensure we don't read beyond our data size or span multiple - * lines. quotedata() can't properly handle character data - * that's split across two line break boundaries. - */ - if ($end >= $size) { - $end = $size; - } else { - for (; $end < $size; $end++) { - if ($data[$end] != "\n") { - break; - } - } - } - - /* Extract our chunk and run it through the quoting routine. */ - $chunk = substr($data, $offset, $end - $offset); - $this->quotedata($chunk); - - /* If we run into a problem along the way, abort. */ - if (PEAR::isError($result = $this->_send($chunk))) { - return $result; - } - - /* Advance the offset to the end of this chunk. */ - $offset = $end; - } - } - - /* Finally, send the DATA terminator sequence. */ - if (PEAR::isError($result = $this->_send("\r\n.\r\n"))) { - return $result; - } - - /* Verify that the data was successfully received by the server. */ - if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Send the SEND FROM: command. - * - * @param string The reverse path to send. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.2.6 - */ - function sendFrom($path) - { - if (PEAR::isError($error = $this->_put('SEND', "FROM:<$path>"))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Backwards-compatibility wrapper for sendFrom(). - * - * @param string The reverse path to send. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * - * @access public - * @since 1.0 - * @deprecated 1.2.6 - */ - function send_from($path) - { - return sendFrom($path); - } - - /** - * Send the SOML FROM: command. - * - * @param string The reverse path to send. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.2.6 - */ - function somlFrom($path) - { - if (PEAR::isError($error = $this->_put('SOML', "FROM:<$path>"))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Backwards-compatibility wrapper for somlFrom(). - * - * @param string The reverse path to send. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * - * @access public - * @since 1.0 - * @deprecated 1.2.6 - */ - function soml_from($path) - { - return somlFrom($path); - } - - /** - * Send the SAML FROM: command. - * - * @param string The reverse path to send. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.2.6 - */ - function samlFrom($path) - { - if (PEAR::isError($error = $this->_put('SAML', "FROM:<$path>"))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Backwards-compatibility wrapper for samlFrom(). - * - * @param string The reverse path to send. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * - * @access public - * @since 1.0 - * @deprecated 1.2.6 - */ - function saml_from($path) - { - return samlFrom($path); - } - - /** - * Send the RSET command. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function rset() - { - if (PEAR::isError($error = $this->_put('RSET'))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { - return $error; - } - - return true; - } - - /** - * Send the VRFY command. - * - * @param string The string to verify - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function vrfy($string) - { - /* Note: 251 is also a valid response code */ - if (PEAR::isError($error = $this->_put('VRFY', $string))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(array(250, 252)))) { - return $error; - } - - return true; - } - - /** - * Send the NOOP command. - * - * @return mixed Returns a PEAR_Error with an error message on any - * kind of failure, or true on success. - * @access public - * @since 1.0 - */ - function noop() - { - if (PEAR::isError($error = $this->_put('NOOP'))) { - return $error; - } - if (PEAR::isError($error = $this->_parseResponse(250))) { - return $error; - } - - return true; - } - - /** - * Backwards-compatibility method. identifySender()'s functionality is - * now handled internally. - * - * @return boolean This method always return true. - * - * @access public - * @since 1.0 - */ - function identifySender() - { - return true; - } - -} diff --git a/program/lib/Net/Sieve.php b/program/lib/Net/Sieve.php deleted file mode 100644 index 8ebdf0958..000000000 --- a/program/lib/Net/Sieve.php +++ /dev/null @@ -1,1274 +0,0 @@ - - * @author Damian Fernandez Sosa - * @author Anish Mistry - * @author Jan Schneider - * @copyright 2002-2003 Richard Heyes - * @copyright 2006-2008 Anish Mistry - * @license http://www.opensource.org/licenses/bsd-license.php BSD - * @version SVN: $Id$ - * @link http://pear.php.net/package/Net_Sieve - */ - -require_once 'PEAR.php'; -require_once 'Net/Socket.php'; - -/** - * TODO - * - * o supportsAuthMech() - */ - -/** - * Disconnected state - * @const NET_SIEVE_STATE_DISCONNECTED - */ -define('NET_SIEVE_STATE_DISCONNECTED', 1, true); - -/** - * Authorisation state - * @const NET_SIEVE_STATE_AUTHORISATION - */ -define('NET_SIEVE_STATE_AUTHORISATION', 2, true); - -/** - * Transaction state - * @const NET_SIEVE_STATE_TRANSACTION - */ -define('NET_SIEVE_STATE_TRANSACTION', 3, true); - - -/** - * A class for talking to the timsieved server which comes with Cyrus IMAP. - * - * @category Networking - * @package Net_Sieve - * @author Richard Heyes - * @author Damian Fernandez Sosa - * @author Anish Mistry - * @author Jan Schneider - * @copyright 2002-2003 Richard Heyes - * @copyright 2006-2008 Anish Mistry - * @license http://www.opensource.org/licenses/bsd-license.php BSD - * @version Release: 1.3.2 - * @link http://pear.php.net/package/Net_Sieve - * @link http://tools.ietf.org/html/rfc5228 RFC 5228 (Sieve: An Email - * Filtering Language) - * @link http://tools.ietf.org/html/rfc5804 RFC 5804 A Protocol for - * Remotely Managing Sieve Scripts - */ -class Net_Sieve -{ - /** - * The authentication methods this class supports. - * - * Can be overwritten if having problems with certain methods. - * - * @var array - */ - var $supportedAuthMethods = array('DIGEST-MD5', 'CRAM-MD5', 'EXTERNAL', - 'PLAIN' , 'LOGIN'); - - /** - * SASL authentication methods that require Auth_SASL. - * - * @var array - */ - var $supportedSASLAuthMethods = array('DIGEST-MD5', 'CRAM-MD5'); - - /** - * The socket handle. - * - * @var resource - */ - var $_sock; - - /** - * Parameters and connection information. - * - * @var array - */ - var $_data; - - /** - * Current state of the connection. - * - * One of the NET_SIEVE_STATE_* constants. - * - * @var integer - */ - var $_state; - - /** - * Constructor error. - * - * @var PEAR_Error - */ - var $_error; - - /** - * Whether to enable debugging. - * - * @var boolean - */ - var $_debug = false; - - /** - * Debug output handler. - * - * This has to be a valid callback. - * - * @var string|array - */ - var $_debug_handler = null; - - /** - * Whether to pick up an already established connection. - * - * @var boolean - */ - var $_bypassAuth = false; - - /** - * Whether to use TLS if available. - * - * @var boolean - */ - var $_useTLS = true; - - /** - * Additional options for stream_context_create(). - * - * @var array - */ - var $_options = null; - - /** - * Maximum number of referral loops - * - * @var array - */ - var $_maxReferralCount = 15; - - /** - * Constructor. - * - * Sets up the object, connects to the server and logs in. Stores any - * generated error in $this->_error, which can be retrieved using the - * getError() method. - * - * @param string $user Login username. - * @param string $pass Login password. - * @param string $host Hostname of server. - * @param string $port Port of server. - * @param string $logintype Type of login to perform (see - * $supportedAuthMethods). - * @param string $euser Effective user. If authenticating as an - * administrator, login as this user. - * @param boolean $debug Whether to enable debugging (@see setDebug()). - * @param string $bypassAuth Skip the authentication phase. Useful if the - * socket is already open. - * @param boolean $useTLS Use TLS if available. - * @param array $options Additional options for - * stream_context_create(). - * @param mixed $handler A callback handler for the debug output. - */ - function Net_Sieve($user = null, $pass = null, $host = 'localhost', - $port = 2000, $logintype = '', $euser = '', - $debug = false, $bypassAuth = false, $useTLS = true, - $options = null, $handler = null) - { - $this->_state = NET_SIEVE_STATE_DISCONNECTED; - $this->_data['user'] = $user; - $this->_data['pass'] = $pass; - $this->_data['host'] = $host; - $this->_data['port'] = $port; - $this->_data['logintype'] = $logintype; - $this->_data['euser'] = $euser; - $this->_sock = new Net_Socket(); - $this->_bypassAuth = $bypassAuth; - $this->_useTLS = $useTLS; - $this->_options = $options; - $this->setDebug($debug, $handler); - - /* Try to include the Auth_SASL package. If the package is not - * available, we disable the authentication methods that depend upon - * it. */ - if ((@include_once 'Auth/SASL.php') === false) { - $this->_debug('Auth_SASL not present'); - foreach ($this->supportedSASLAuthMethods as $SASLMethod) { - $pos = array_search($SASLMethod, $this->supportedAuthMethods); - $this->_debug('Disabling method ' . $SASLMethod); - unset($this->supportedAuthMethods[$pos]); - } - } - - if (strlen($user) && strlen($pass)) { - $this->_error = $this->_handleConnectAndLogin(); - } - } - - /** - * Returns any error that may have been generated in the constructor. - * - * @return boolean|PEAR_Error False if no error, PEAR_Error otherwise. - */ - function getError() - { - return PEAR::isError($this->_error) ? $this->_error : false; - } - - /** - * Sets the debug state and handler function. - * - * @param boolean $debug Whether to enable debugging. - * @param string $handler A custom debug handler. Must be a valid callback. - * - * @return void - */ - function setDebug($debug = true, $handler = null) - { - $this->_debug = $debug; - $this->_debug_handler = $handler; - } - - /** - * Connects to the server and logs in. - * - * @return boolean True on success, PEAR_Error on failure. - */ - function _handleConnectAndLogin() - { - if (PEAR::isError($res = $this->connect($this->_data['host'], $this->_data['port'], $this->_options, $this->_useTLS))) { - return $res; - } - if ($this->_bypassAuth === false) { - if (PEAR::isError($res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'], $this->_data['euser'], $this->_bypassAuth))) { - return $res; - } - } - return true; - } - - /** - * Handles connecting to the server and checks the response validity. - * - * @param string $host Hostname of server. - * @param string $port Port of server. - * @param array $options List of options to pass to - * stream_context_create(). - * @param boolean $useTLS Use TLS if available. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function connect($host, $port, $options = null, $useTLS = true) - { - $this->_data['host'] = $host; - $this->_data['port'] = $port; - $this->_useTLS = $useTLS; - if (is_array($options)) { - $this->_options = array_merge($this->_options, $options); - } - - if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) { - return PEAR::raiseError('Not currently in DISCONNECTED state', 1); - } - - if (PEAR::isError($res = $this->_sock->connect($host, $port, false, 5, $options))) { - return $res; - } - - if ($this->_bypassAuth) { - $this->_state = NET_SIEVE_STATE_TRANSACTION; - } else { - $this->_state = NET_SIEVE_STATE_AUTHORISATION; - if (PEAR::isError($res = $this->_doCmd())) { - return $res; - } - } - - // Explicitly ask for the capabilities in case the connection is - // picked up from an existing connection. - if (PEAR::isError($res = $this->_cmdCapability())) { - return PEAR::raiseError( - 'Failed to connect, server said: ' . $res->getMessage(), 2 - ); - } - - // Check if we can enable TLS via STARTTLS. - if ($useTLS && !empty($this->_capability['starttls']) - && function_exists('stream_socket_enable_crypto') - ) { - if (PEAR::isError($res = $this->_startTLS())) { - return $res; - } - } - - return true; - } - - /** - * Disconnect from the Sieve server. - * - * @param boolean $sendLogoutCMD Whether to send LOGOUT command before - * disconnecting. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function disconnect($sendLogoutCMD = true) - { - return $this->_cmdLogout($sendLogoutCMD); - } - - /** - * Logs into server. - * - * @param string $user Login username. - * @param string $pass Login password. - * @param string $logintype Type of login method to use. - * @param string $euser Effective UID (perform on behalf of $euser). - * @param boolean $bypassAuth Do not perform authentication. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function login($user, $pass, $logintype = null, $euser = '', $bypassAuth = false) - { - $this->_data['user'] = $user; - $this->_data['pass'] = $pass; - $this->_data['logintype'] = $logintype; - $this->_data['euser'] = $euser; - $this->_bypassAuth = $bypassAuth; - - if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) { - return PEAR::raiseError('Not currently in AUTHORISATION state', 1); - } - - if (!$bypassAuth ) { - if (PEAR::isError($res = $this->_cmdAuthenticate($user, $pass, $logintype, $euser))) { - return $res; - } - } - $this->_state = NET_SIEVE_STATE_TRANSACTION; - - return true; - } - - /** - * Returns an indexed array of scripts currently on the server. - * - * @return array Indexed array of scriptnames. - */ - function listScripts() - { - if (is_array($scripts = $this->_cmdListScripts())) { - $this->_active = $scripts[1]; - return $scripts[0]; - } else { - return $scripts; - } - } - - /** - * Returns the active script. - * - * @return string The active scriptname. - */ - function getActive() - { - if (!empty($this->_active)) { - return $this->_active; - } - if (is_array($scripts = $this->_cmdListScripts())) { - $this->_active = $scripts[1]; - return $scripts[1]; - } - } - - /** - * Sets the active script. - * - * @param string $scriptname The name of the script to be set as active. - * - * @return boolean True on success, PEAR_Error on failure. - */ - function setActive($scriptname) - { - return $this->_cmdSetActive($scriptname); - } - - /** - * Retrieves a script. - * - * @param string $scriptname The name of the script to be retrieved. - * - * @return string The script on success, PEAR_Error on failure. - */ - function getScript($scriptname) - { - return $this->_cmdGetScript($scriptname); - } - - /** - * Adds a script to the server. - * - * @param string $scriptname Name of the script. - * @param string $script The script content. - * @param boolean $makeactive Whether to make this the active script. - * - * @return boolean True on success, PEAR_Error on failure. - */ - function installScript($scriptname, $script, $makeactive = false) - { - if (PEAR::isError($res = $this->_cmdPutScript($scriptname, $script))) { - return $res; - } - if ($makeactive) { - return $this->_cmdSetActive($scriptname); - } - return true; - } - - /** - * Removes a script from the server. - * - * @param string $scriptname Name of the script. - * - * @return boolean True on success, PEAR_Error on failure. - */ - function removeScript($scriptname) - { - return $this->_cmdDeleteScript($scriptname); - } - - /** - * Checks if the server has space to store the script by the server. - * - * @param string $scriptname The name of the script to mark as active. - * @param integer $size The size of the script. - * - * @return boolean|PEAR_Error True if there is space, PEAR_Error otherwise. - * - * @todo Rename to hasSpace() - */ - function haveSpace($scriptname, $size) - { - if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { - return PEAR::raiseError('Not currently in TRANSACTION state', 1); - } - - if (PEAR::isError($res = $this->_doCmd(sprintf('HAVESPACE %s %d', $this->_escape($scriptname), $size)))) { - return $res; - } - return true; - } - - /** - * Returns the list of extensions the server supports. - * - * @return array List of extensions or PEAR_Error on failure. - */ - function getExtensions() - { - if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) { - return PEAR::raiseError('Not currently connected', 7); - } - return $this->_capability['extensions']; - } - - /** - * Returns whether the server supports an extension. - * - * @param string $extension The extension to check. - * - * @return boolean Whether the extension is supported or PEAR_Error on - * failure. - */ - function hasExtension($extension) - { - if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) { - return PEAR::raiseError('Not currently connected', 7); - } - - $extension = trim($this->_toUpper($extension)); - if (is_array($this->_capability['extensions'])) { - foreach ($this->_capability['extensions'] as $ext) { - if ($ext == $extension) { - return true; - } - } - } - - return false; - } - - /** - * Returns the list of authentication methods the server supports. - * - * @return array List of authentication methods or PEAR_Error on failure. - */ - function getAuthMechs() - { - if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) { - return PEAR::raiseError('Not currently connected', 7); - } - return $this->_capability['sasl']; - } - - /** - * Returns whether the server supports an authentication method. - * - * @param string $method The method to check. - * - * @return boolean Whether the method is supported or PEAR_Error on - * failure. - */ - function hasAuthMech($method) - { - if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) { - return PEAR::raiseError('Not currently connected', 7); - } - - $method = trim($this->_toUpper($method)); - if (is_array($this->_capability['sasl'])) { - foreach ($this->_capability['sasl'] as $sasl) { - if ($sasl == $method) { - return true; - } - } - } - - return false; - } - - /** - * Handles the authentication using any known method. - * - * @param string $uid The userid to authenticate as. - * @param string $pwd The password to authenticate with. - * @param string $userMethod The method to use. If empty, the class chooses - * the best (strongest) available method. - * @param string $euser The effective uid to authenticate as. - * - * @return void - */ - function _cmdAuthenticate($uid, $pwd, $userMethod = null, $euser = '') - { - if (PEAR::isError($method = $this->_getBestAuthMethod($userMethod))) { - return $method; - } - switch ($method) { - case 'DIGEST-MD5': - return $this->_authDigestMD5($uid, $pwd, $euser); - case 'CRAM-MD5': - $result = $this->_authCRAMMD5($uid, $pwd, $euser); - break; - case 'LOGIN': - $result = $this->_authLOGIN($uid, $pwd, $euser); - break; - case 'PLAIN': - $result = $this->_authPLAIN($uid, $pwd, $euser); - break; - case 'EXTERNAL': - $result = $this->_authEXTERNAL($uid, $pwd, $euser); - break; - default : - $result = PEAR::raiseError( - $method . ' is not a supported authentication method' - ); - break; - } - - if (PEAR::isError($res = $this->_doCmd())) { - return $res; - } - - // Query the server capabilities again now that we are authenticated. - if (PEAR::isError($res = $this->_cmdCapability())) { - return PEAR::raiseError( - 'Failed to connect, server said: ' . $res->getMessage(), 2 - ); - } - - return $result; - } - - /** - * Authenticates the user using the PLAIN method. - * - * @param string $user The userid to authenticate as. - * @param string $pass The password to authenticate with. - * @param string $euser The effective uid to authenticate as. - * - * @return void - */ - function _authPLAIN($user, $pass, $euser) - { - return $this->_sendCmd( - sprintf( - 'AUTHENTICATE "PLAIN" "%s"', - base64_encode($euser . chr(0) . $user . chr(0) . $pass) - ) - ); - } - - /** - * Authenticates the user using the LOGIN method. - * - * @param string $user The userid to authenticate as. - * @param string $pass The password to authenticate with. - * @param string $euser The effective uid to authenticate as. - * - * @return void - */ - function _authLOGIN($user, $pass, $euser) - { - if (PEAR::isError($result = $this->_sendCmd('AUTHENTICATE "LOGIN"'))) { - return $result; - } - if (PEAR::isError($result = $this->_doCmd('"' . base64_encode($user) . '"', true))) { - return $result; - } - return $this->_doCmd('"' . base64_encode($pass) . '"', true); - } - - /** - * Authenticates the user using the CRAM-MD5 method. - * - * @param string $user The userid to authenticate as. - * @param string $pass The password to authenticate with. - * @param string $euser The effective uid to authenticate as. - * - * @return void - */ - function _authCRAMMD5($user, $pass, $euser) - { - if (PEAR::isError($challenge = $this->_doCmd('AUTHENTICATE "CRAM-MD5"', true))) { - return $challenge; - } - - $challenge = base64_decode(trim($challenge)); - $cram = Auth_SASL::factory('crammd5'); - if (PEAR::isError($response = $cram->getResponse($user, $pass, $challenge))) { - return $response; - } - - return $this->_sendStringResponse(base64_encode($response)); - } - - /** - * Authenticates the user using the DIGEST-MD5 method. - * - * @param string $user The userid to authenticate as. - * @param string $pass The password to authenticate with. - * @param string $euser The effective uid to authenticate as. - * - * @return void - */ - function _authDigestMD5($user, $pass, $euser) - { - if (PEAR::isError($challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"', true))) { - return $challenge; - } - - $challenge = base64_decode(trim($challenge)); - $digest = Auth_SASL::factory('digestmd5'); - // @todo Really 'localhost'? - if (PEAR::isError($response = $digest->getResponse($user, $pass, $challenge, 'localhost', 'sieve', $euser))) { - return $response; - } - - if (PEAR::isError($result = $this->_sendStringResponse(base64_encode($response)))) { - return $result; - } - if (PEAR::isError($result = $this->_doCmd('', true))) { - return $result; - } - if ($this->_toUpper(substr($result, 0, 2)) == 'OK') { - return; - } - - /* We don't use the protocol's third step because SIEVE doesn't allow - * subsequent authentication, so we just silently ignore it. */ - if (PEAR::isError($result = $this->_sendStringResponse(''))) { - return $result; - } - - return $this->_doCmd(); - } - - /** - * Authenticates the user using the EXTERNAL method. - * - * @param string $user The userid to authenticate as. - * @param string $pass The password to authenticate with. - * @param string $euser The effective uid to authenticate as. - * - * @return void - * - * @since 1.1.7 - */ - function _authEXTERNAL($user, $pass, $euser) - { - $cmd = sprintf( - 'AUTHENTICATE "EXTERNAL" "%s"', - base64_encode(strlen($euser) ? $euser : $user) - ); - return $this->_sendCmd($cmd); - } - - /** - * Removes a script from the server. - * - * @param string $scriptname Name of the script to delete. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function _cmdDeleteScript($scriptname) - { - if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { - return PEAR::raiseError('Not currently in AUTHORISATION state', 1); - } - - if (PEAR::isError($res = $this->_doCmd(sprintf('DELETESCRIPT %s', $this->_escape($scriptname))))) { - return $res; - } - return true; - } - - /** - * Retrieves the contents of the named script. - * - * @param string $scriptname Name of the script to retrieve. - * - * @return string The script if successful, PEAR_Error otherwise. - */ - function _cmdGetScript($scriptname) - { - if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { - return PEAR::raiseError('Not currently in AUTHORISATION state', 1); - } - - if (PEAR::isError($res = $this->_doCmd(sprintf('GETSCRIPT %s', $this->_escape($scriptname))))) { - return $res; - } - - return preg_replace('/^{[0-9]+}\r\n/', '', $res); - } - - /** - * Sets the active script, i.e. the one that gets run on new mail by the - * server. - * - * @param string $scriptname The name of the script to mark as active. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function _cmdSetActive($scriptname) - { - if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { - return PEAR::raiseError('Not currently in AUTHORISATION state', 1); - } - - if (PEAR::isError($res = $this->_doCmd(sprintf('SETACTIVE %s', $this->_escape($scriptname))))) { - return $res; - } - - $this->_activeScript = $scriptname; - return true; - } - - /** - * Returns the list of scripts on the server. - * - * @return array An array with the list of scripts in the first element - * and the active script in the second element on success, - * PEAR_Error otherwise. - */ - function _cmdListScripts() - { - if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { - return PEAR::raiseError('Not currently in AUTHORISATION state', 1); - } - - if (PEAR::isError($res = $this->_doCmd('LISTSCRIPTS'))) { - return $res; - } - - $scripts = array(); - $activescript = null; - $res = explode("\r\n", $res); - foreach ($res as $value) { - if (preg_match('/^"(.*)"( ACTIVE)?$/i', $value, $matches)) { - $script_name = stripslashes($matches[1]); - $scripts[] = $script_name; - if (!empty($matches[2])) { - $activescript = $script_name; - } - } - } - - return array($scripts, $activescript); - } - - /** - * Adds a script to the server. - * - * @param string $scriptname Name of the new script. - * @param string $scriptdata The new script. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function _cmdPutScript($scriptname, $scriptdata) - { - if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { - return PEAR::raiseError('Not currently in AUTHORISATION state', 1); - } - - $stringLength = $this->_getLineLength($scriptdata); - $command = sprintf("PUTSCRIPT %s {%d+}\r\n%s", - $this->_escape($scriptname), - $stringLength, - $scriptdata); - if (PEAR::isError($res = $this->_doCmd($command))) { - return $res; - } - - return true; - } - - /** - * Logs out of the server and terminates the connection. - * - * @param boolean $sendLogoutCMD Whether to send LOGOUT command before - * disconnecting. - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function _cmdLogout($sendLogoutCMD = true) - { - if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) { - return PEAR::raiseError('Not currently connected', 1); - } - - if ($sendLogoutCMD) { - if (PEAR::isError($res = $this->_doCmd('LOGOUT'))) { - return $res; - } - } - - $this->_sock->disconnect(); - $this->_state = NET_SIEVE_STATE_DISCONNECTED; - - return true; - } - - /** - * Sends the CAPABILITY command - * - * @return boolean True on success, PEAR_Error otherwise. - */ - function _cmdCapability() - { - if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) { - return PEAR::raiseError('Not currently connected', 1); - } - if (PEAR::isError($res = $this->_doCmd('CAPABILITY'))) { - return $res; - } - $this->_parseCapability($res); - return true; - } - - /** - * Parses the response from the CAPABILITY command and stores the result - * in $_capability. - * - * @param string $data The response from the capability command. - * - * @return void - */ - function _parseCapability($data) - { - // Clear the cached capabilities. - $this->_capability = array('sasl' => array(), - 'extensions' => array()); - - $data = preg_split('/\r?\n/', $this->_toUpper($data), -1, PREG_SPLIT_NO_EMPTY); - - for ($i = 0; $i < count($data); $i++) { - if (!preg_match('/^"([A-Z]+)"( "(.*)")?$/', $data[$i], $matches)) { - continue; - } - switch ($matches[1]) { - case 'IMPLEMENTATION': - $this->_capability['implementation'] = $matches[3]; - break; - - case 'SASL': - $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]); - break; - - case 'SIEVE': - $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]); - break; - - case 'STARTTLS': - $this->_capability['starttls'] = true; - break; - } - } - } - - /** - * Sends a command to the server - * - * @param string $cmd The command to send. - * - * @return void - */ - function _sendCmd($cmd) - { - $status = $this->_sock->getStatus(); - if (PEAR::isError($status) || $status['eof']) { - return PEAR::raiseError('Failed to write to socket: connection lost'); - } - if (PEAR::isError($error = $this->_sock->write($cmd . "\r\n"))) { - return PEAR::raiseError( - 'Failed to write to socket: ' . $error->getMessage() - ); - } - $this->_debug("C: $cmd"); - } - - /** - * Sends a string response to the server. - * - * @param string $str The string to send. - * - * @return void - */ - function _sendStringResponse($str) - { - return $this->_sendCmd('{' . $this->_getLineLength($str) . "+}\r\n" . $str); - } - - /** - * Receives a single line from the server. - * - * @return string The server response line. - */ - function _recvLn() - { - if (PEAR::isError($lastline = $this->_sock->gets(8192))) { - return PEAR::raiseError( - 'Failed to read from socket: ' . $lastline->getMessage() - ); - } - - $lastline = rtrim($lastline); - $this->_debug("S: $lastline"); - - if ($lastline === '') { - return PEAR::raiseError('Failed to read from socket'); - } - - return $lastline; - } - - /** - * Receives a number of bytes from the server. - * - * @param integer $length Number of bytes to read. - * - * @return string The server response. - */ - function _recvBytes($length) - { - $response = ''; - $response_length = 0; - while ($response_length < $length) { - $response .= $this->_sock->read($length - $response_length); - $response_length = $this->_getLineLength($response); - } - $this->_debug('S: ' . rtrim($response)); - return $response; - } - - /** - * Send a command and retrieves a response from the server. - * - * @param string $cmd The command to send. - * @param boolean $auth Whether this is an authentication command. - * - * @return string|PEAR_Error Reponse string if an OK response, PEAR_Error - * if a NO response. - */ - function _doCmd($cmd = '', $auth = false) - { - $referralCount = 0; - while ($referralCount < $this->_maxReferralCount) { - if (strlen($cmd)) { - if (PEAR::isError($error = $this->_sendCmd($cmd))) { - return $error; - } - } - - $response = ''; - while (true) { - if (PEAR::isError($line = $this->_recvLn())) { - return $line; - } - $uc_line = $this->_toUpper($line); - - if ('OK' == substr($uc_line, 0, 2)) { - $response .= $line; - return rtrim($response); - } - - if ('NO' == substr($uc_line, 0, 2)) { - // Check for string literal error message. - if (preg_match('/{([0-9]+)}$/', $line, $matches)) { - $line = substr($line, 0, -(strlen($matches[1])+2)) - . str_replace( - "\r\n", ' ', $this->_recvBytes($matches[1] + 2) - ); - } - return PEAR::raiseError(trim($response . substr($line, 2)), 3); - } - - if ('BYE' == substr($uc_line, 0, 3)) { - if (PEAR::isError($error = $this->disconnect(false))) { - return PEAR::raiseError( - 'Cannot handle BYE, the error was: ' - . $error->getMessage(), - 4 - ); - } - // Check for referral, then follow it. Otherwise, carp an - // error. - if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) { - // Replace the old host with the referral host - // preserving any protocol prefix. - $this->_data['host'] = preg_replace( - '/\w+(?!(\w|\:\/\/)).*/', $matches[2], - $this->_data['host'] - ); - if (PEAR::isError($error = $this->_handleConnectAndLogin())) { - return PEAR::raiseError( - 'Cannot follow referral to ' - . $this->_data['host'] . ', the error was: ' - . $error->getMessage(), - 5 - ); - } - break; - } - return PEAR::raiseError(trim($response . $line), 6); - } - - if (preg_match('/^{([0-9]+)}/', $line, $matches)) { - // Matches literal string responses. - $line = $this->_recvBytes($matches[1] + 2); - if (!$auth) { - // Receive the pending OK only if we aren't - // authenticating since string responses during - // authentication don't need an OK. - $this->_recvLn(); - } - return $line; - } - - if ($auth) { - // String responses during authentication don't need an - // OK. - $response .= $line; - return rtrim($response); - } - - $response .= $line . "\r\n"; - $referralCount++; - } - } - - return PEAR::raiseError('Max referral count (' . $referralCount . ') reached. Cyrus murder loop error?', 7); - } - - /** - * Returns the name of the best authentication method that the server - * has advertised. - * - * @param string $userMethod Only consider this method as available. - * - * @return string The name of the best supported authentication method or - * a PEAR_Error object on failure. - */ - function _getBestAuthMethod($userMethod = null) - { - if (!isset($this->_capability['sasl'])) { - return PEAR::raiseError('This server doesn\'t support any authentication methods. SASL problem?'); - } - if (!$this->_capability['sasl']) { - return PEAR::raiseError('This server doesn\'t support any authentication methods.'); - } - - if ($userMethod) { - if (in_array($userMethod, $this->_capability['sasl'])) { - return $userMethod; - } - return PEAR::raiseError( - sprintf('No supported authentication method found. The server supports these methods: %s, but we want to use: %s', - implode(', ', $this->_capability['sasl']), - $userMethod)); - } - - foreach ($this->supportedAuthMethods as $method) { - if (in_array($method, $this->_capability['sasl'])) { - return $method; - } - } - - return PEAR::raiseError( - sprintf('No supported authentication method found. The server supports these methods: %s, but we only support: %s', - implode(', ', $this->_capability['sasl']), - implode(', ', $this->supportedAuthMethods))); - } - - /** - * Starts a TLS connection. - * - * @return boolean True on success, PEAR_Error on failure. - */ - function _startTLS() - { - if (PEAR::isError($res = $this->_doCmd('STARTTLS'))) { - return $res; - } - - if (!stream_socket_enable_crypto($this->_sock->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { - return PEAR::raiseError('Failed to establish TLS connection', 2); - } - - $this->_debug('STARTTLS negotiation successful'); - - // The server should be sending a CAPABILITY response after - // negotiating TLS. Read it, and ignore if it doesn't. - // Unfortunately old Cyrus versions are broken and don't send a - // CAPABILITY response, thus we would wait here forever. Parse the - // Cyrus version and work around this broken behavior. - if (!preg_match('/^CYRUS TIMSIEVED V([0-9.]+)/', $this->_capability['implementation'], $matches) || - version_compare($matches[1], '2.3.10', '>=')) { - $this->_doCmd(); - } - - // Query the server capabilities again now that we are under - // encryption. - if (PEAR::isError($res = $this->_cmdCapability())) { - return PEAR::raiseError( - 'Failed to connect, server said: ' . $res->getMessage(), 2 - ); - } - - return true; - } - - /** - * Returns the length of a string. - * - * @param string $string A string. - * - * @return integer The length of the string. - */ - function _getLineLength($string) - { - if (extension_loaded('mbstring')) { - return mb_strlen($string, 'latin1'); - } else { - return strlen($string); - } - } - - /** - * Locale independant strtoupper() implementation. - * - * @param string $string The string to convert to lowercase. - * - * @return string The lowercased string, based on ASCII encoding. - */ - function _toUpper($string) - { - $language = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $string = strtoupper($string); - setlocale(LC_CTYPE, $language); - return $string; - } - - /** - * Converts strings into RFC's quoted-string or literal-c2s form. - * - * @param string $string The string to convert. - * - * @return string Result string. - */ - function _escape($string) - { - // Some implementations don't allow UTF-8 characters in quoted-string, - // use literal-c2s. - if (preg_match('/[^\x01-\x09\x0B-\x0C\x0E-\x7F]/', $string)) { - return sprintf("{%d+}\r\n%s", $this->_getLineLength($string), $string); - } - - return '"' . addcslashes($string, '\\"') . '"'; - } - - /** - * Write debug text to the current debug output handler. - * - * @param string $message Debug message text. - * - * @return void - */ - function _debug($message) - { - if ($this->_debug) { - if ($this->_debug_handler) { - call_user_func_array($this->_debug_handler, array(&$this, $message)); - } else { - echo "$message\n"; - } - } - } -} diff --git a/program/lib/Net/Socket.php b/program/lib/Net/Socket.php deleted file mode 100644 index bf1d1bbcd..000000000 --- a/program/lib/Net/Socket.php +++ /dev/null @@ -1,686 +0,0 @@ - - * Chuck Hagenbuch - * - * @category Net - * @package Net_Socket - * @author Stig Bakken - * @author Chuck Hagenbuch - * @copyright 1997-2003 The PHP Group - * @license http://www.php.net/license/2_02.txt PHP 2.02 - * @link http://pear.php.net/packages/Net_Socket - */ - -require_once 'PEAR.php'; - -define('NET_SOCKET_READ', 1); -define('NET_SOCKET_WRITE', 2); -define('NET_SOCKET_ERROR', 4); - -/** - * Generalized Socket class. - * - * @category Net - * @package Net_Socket - * @author Stig Bakken - * @author Chuck Hagenbuch - * @copyright 1997-2003 The PHP Group - * @license http://www.php.net/license/2_02.txt PHP 2.02 - * @link http://pear.php.net/packages/Net_Socket - */ -class Net_Socket extends PEAR -{ - /** - * Socket file pointer. - * @var resource $fp - */ - var $fp = null; - - /** - * Whether the socket is blocking. Defaults to true. - * @var boolean $blocking - */ - var $blocking = true; - - /** - * Whether the socket is persistent. Defaults to false. - * @var boolean $persistent - */ - var $persistent = false; - - /** - * The IP address to connect to. - * @var string $addr - */ - var $addr = ''; - - /** - * The port number to connect to. - * @var integer $port - */ - var $port = 0; - - /** - * Number of seconds to wait on socket operations before assuming - * there's no more data. Defaults to no timeout. - * @var integer|float $timeout - */ - var $timeout = null; - - /** - * Number of bytes to read at a time in readLine() and - * readAll(). Defaults to 2048. - * @var integer $lineLength - */ - var $lineLength = 2048; - - /** - * The string to use as a newline terminator. Usually "\r\n" or "\n". - * @var string $newline - */ - var $newline = "\r\n"; - - /** - * Connect to the specified port. If called when the socket is - * already connected, it disconnects and connects again. - * - * @param string $addr IP address or host name (may be with protocol prefix). - * @param integer $port TCP port number. - * @param boolean $persistent (optional) Whether the connection is - * persistent (kept open between requests - * by the web server). - * @param integer $timeout (optional) Connection socket timeout. - * @param array $options See options for stream_context_create. - * - * @access public - * - * @return boolean|PEAR_Error True on success or a PEAR_Error on failure. - */ - function connect($addr, $port = 0, $persistent = null, - $timeout = null, $options = null) - { - if (is_resource($this->fp)) { - @fclose($this->fp); - $this->fp = null; - } - - if (!$addr) { - return $this->raiseError('$addr cannot be empty'); - } else if (strspn($addr, ':.0123456789') == strlen($addr)) { - $this->addr = strpos($addr, ':') !== false ? '['.$addr.']' : $addr; - } else { - $this->addr = $addr; - } - - $this->port = $port % 65536; - - if ($persistent !== null) { - $this->persistent = $persistent; - } - - $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; - $errno = 0; - $errstr = ''; - - $old_track_errors = @ini_set('track_errors', 1); - - if ($timeout <= 0) { - $timeout = @ini_get('default_socket_timeout'); - } - - if ($options && function_exists('stream_context_create')) { - $context = stream_context_create($options); - - // Since PHP 5 fsockopen doesn't allow context specification - if (function_exists('stream_socket_client')) { - $flags = STREAM_CLIENT_CONNECT; - - if ($this->persistent) { - $flags = STREAM_CLIENT_PERSISTENT; - } - - $addr = $this->addr . ':' . $this->port; - $fp = stream_socket_client($addr, $errno, $errstr, - $timeout, $flags, $context); - } else { - $fp = @$openfunc($this->addr, $this->port, $errno, - $errstr, $timeout, $context); - } - } else { - $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout); - } - - if (!$fp) { - if ($errno == 0 && !strlen($errstr) && isset($php_errormsg)) { - $errstr = $php_errormsg; - } - @ini_set('track_errors', $old_track_errors); - return $this->raiseError($errstr, $errno); - } - - @ini_set('track_errors', $old_track_errors); - $this->fp = $fp; - $this->setTimeout(); - return $this->setBlocking($this->blocking); - } - - /** - * Disconnects from the peer, closes the socket. - * - * @access public - * @return mixed true on success or a PEAR_Error instance otherwise - */ - function disconnect() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - @fclose($this->fp); - $this->fp = null; - return true; - } - - /** - * Set the newline character/sequence to use. - * - * @param string $newline Newline character(s) - * @return boolean True - */ - function setNewline($newline) - { - $this->newline = $newline; - return true; - } - - /** - * Find out if the socket is in blocking mode. - * - * @access public - * @return boolean The current blocking mode. - */ - function isBlocking() - { - return $this->blocking; - } - - /** - * Sets whether the socket connection should be blocking or - * not. A read call to a non-blocking socket will return immediately - * if there is no data available, whereas it will block until there - * is data for blocking sockets. - * - * @param boolean $mode True for blocking sockets, false for nonblocking. - * - * @access public - * @return mixed true on success or a PEAR_Error instance otherwise - */ - function setBlocking($mode) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $this->blocking = $mode; - stream_set_blocking($this->fp, (int)$this->blocking); - return true; - } - - /** - * Sets the timeout value on socket descriptor, - * expressed in the sum of seconds and microseconds - * - * @param integer $seconds Seconds. - * @param integer $microseconds Microseconds, optional. - * - * @access public - * @return mixed True on success or false on failure or - * a PEAR_Error instance when not connected - */ - function setTimeout($seconds = null, $microseconds = null) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - if ($seconds === null && $microseconds === null) { - $seconds = (int) $this->timeout; - $microseconds = (int) (($this->timeout - $seconds) * 1000000); - } else { - $this->timeout = $seconds + $microseconds/1000000; - } - - if ($this->timeout > 0) { - return stream_set_timeout($this->fp, (int) $seconds, (int) $microseconds); - } - else { - return false; - } - } - - /** - * Sets the file buffering size on the stream. - * See php's stream_set_write_buffer for more information. - * - * @param integer $size Write buffer size. - * - * @access public - * @return mixed on success or an PEAR_Error object otherwise - */ - function setWriteBuffer($size) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $returned = stream_set_write_buffer($this->fp, $size); - if ($returned == 0) { - return true; - } - return $this->raiseError('Cannot set write buffer.'); - } - - /** - * Returns information about an existing socket resource. - * Currently returns four entries in the result array: - * - *

    - * timed_out (bool) - The socket timed out waiting for data
    - * blocked (bool) - The socket was blocked
    - * eof (bool) - Indicates EOF event
    - * unread_bytes (int) - Number of bytes left in the socket buffer
    - *

    - * - * @access public - * @return mixed Array containing information about existing socket - * resource or a PEAR_Error instance otherwise - */ - function getStatus() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - return stream_get_meta_data($this->fp); - } - - /** - * Get a specified line of data - * - * @param int $size Reading ends when size - 1 bytes have been read, - * or a newline or an EOF (whichever comes first). - * If no size is specified, it will keep reading from - * the stream until it reaches the end of the line. - * - * @access public - * @return mixed $size bytes of data from the socket, or a PEAR_Error if - * not connected. If an error occurs, FALSE is returned. - */ - function gets($size = null) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - if (is_null($size)) { - return @fgets($this->fp); - } else { - return @fgets($this->fp, $size); - } - } - - /** - * Read a specified amount of data. This is guaranteed to return, - * and has the added benefit of getting everything in one fread() - * chunk; if you know the size of the data you're getting - * beforehand, this is definitely the way to go. - * - * @param integer $size The number of bytes to read from the socket. - * - * @access public - * @return $size bytes of data from the socket, or a PEAR_Error if - * not connected. - */ - function read($size) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - return @fread($this->fp, $size); - } - - /** - * Write a specified amount of data. - * - * @param string $data Data to write. - * @param integer $blocksize Amount of data to write at once. - * NULL means all at once. - * - * @access public - * @return mixed If the socket is not connected, returns an instance of - * PEAR_Error. - * If the write succeeds, returns the number of bytes written. - * If the write fails, returns false. - * If the socket times out, returns an instance of PEAR_Error. - */ - function write($data, $blocksize = null) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - if (is_null($blocksize) && !OS_WINDOWS) { - $written = @fwrite($this->fp, $data); - - // Check for timeout or lost connection - if (!$written) { - $meta_data = $this->getStatus(); - - if (!is_array($meta_data)) { - return $meta_data; // PEAR_Error - } - - if (!empty($meta_data['timed_out'])) { - return $this->raiseError('timed out'); - } - } - - return $written; - } else { - if (is_null($blocksize)) { - $blocksize = 1024; - } - - $pos = 0; - $size = strlen($data); - while ($pos < $size) { - $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); - - // Check for timeout or lost connection - if (!$written) { - $meta_data = $this->getStatus(); - - if (!is_array($meta_data)) { - return $meta_data; // PEAR_Error - } - - if (!empty($meta_data['timed_out'])) { - return $this->raiseError('timed out'); - } - - return $written; - } - - $pos += $written; - } - - return $pos; - } - } - - /** - * Write a line of data to the socket, followed by a trailing newline. - * - * @param string $data Data to write - * - * @access public - * @return mixed fwrite() result, or PEAR_Error when not connected - */ - function writeLine($data) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - return fwrite($this->fp, $data . $this->newline); - } - - /** - * Tests for end-of-file on a socket descriptor. - * - * Also returns true if the socket is disconnected. - * - * @access public - * @return bool - */ - function eof() - { - return (!is_resource($this->fp) || feof($this->fp)); - } - - /** - * Reads a byte of data - * - * @access public - * @return 1 byte of data from the socket, or a PEAR_Error if - * not connected. - */ - function readByte() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - return ord(@fread($this->fp, 1)); - } - - /** - * Reads a word of data - * - * @access public - * @return 1 word of data from the socket, or a PEAR_Error if - * not connected. - */ - function readWord() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $buf = @fread($this->fp, 2); - return (ord($buf[0]) + (ord($buf[1]) << 8)); - } - - /** - * Reads an int of data - * - * @access public - * @return integer 1 int of data from the socket, or a PEAR_Error if - * not connected. - */ - function readInt() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $buf = @fread($this->fp, 4); - return (ord($buf[0]) + (ord($buf[1]) << 8) + - (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); - } - - /** - * Reads a zero-terminated string of data - * - * @access public - * @return string, or a PEAR_Error if - * not connected. - */ - function readString() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $string = ''; - while (($char = @fread($this->fp, 1)) != "\x00") { - $string .= $char; - } - return $string; - } - - /** - * Reads an IP Address and returns it in a dot formatted string - * - * @access public - * @return Dot formatted string, or a PEAR_Error if - * not connected. - */ - function readIPAddress() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $buf = @fread($this->fp, 4); - return sprintf('%d.%d.%d.%d', ord($buf[0]), ord($buf[1]), - ord($buf[2]), ord($buf[3])); - } - - /** - * Read until either the end of the socket or a newline, whichever - * comes first. Strips the trailing newline from the returned data. - * - * @access public - * @return All available data up to a newline, without that - * newline, or until the end of the socket, or a PEAR_Error if - * not connected. - */ - function readLine() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $line = ''; - - $timeout = time() + $this->timeout; - - while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { - $line .= @fgets($this->fp, $this->lineLength); - if (substr($line, -1) == "\n") { - return rtrim($line, $this->newline); - } - } - return $line; - } - - /** - * Read until the socket closes, or until there is no more data in - * the inner PHP buffer. If the inner buffer is empty, in blocking - * mode we wait for at least 1 byte of data. Therefore, in - * blocking mode, if there is no data at all to be read, this - * function will never exit (unless the socket is closed on the - * remote end). - * - * @access public - * - * @return string All data until the socket closes, or a PEAR_Error if - * not connected. - */ - function readAll() - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $data = ''; - while (!feof($this->fp)) { - $data .= @fread($this->fp, $this->lineLength); - } - return $data; - } - - /** - * Runs the equivalent of the select() system call on the socket - * with a timeout specified by tv_sec and tv_usec. - * - * @param integer $state Which of read/write/error to check for. - * @param integer $tv_sec Number of seconds for timeout. - * @param integer $tv_usec Number of microseconds for timeout. - * - * @access public - * @return False if select fails, integer describing which of read/write/error - * are ready, or PEAR_Error if not connected. - */ - function select($state, $tv_sec, $tv_usec = 0) - { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - - $read = null; - $write = null; - $except = null; - if ($state & NET_SOCKET_READ) { - $read[] = $this->fp; - } - if ($state & NET_SOCKET_WRITE) { - $write[] = $this->fp; - } - if ($state & NET_SOCKET_ERROR) { - $except[] = $this->fp; - } - if (false === ($sr = stream_select($read, $write, $except, - $tv_sec, $tv_usec))) { - return false; - } - - $result = 0; - if (count($read)) { - $result |= NET_SOCKET_READ; - } - if (count($write)) { - $result |= NET_SOCKET_WRITE; - } - if (count($except)) { - $result |= NET_SOCKET_ERROR; - } - return $result; - } - - /** - * Turns encryption on/off on a connected socket. - * - * @param bool $enabled Set this parameter to true to enable encryption - * and false to disable encryption. - * @param integer $type Type of encryption. See stream_socket_enable_crypto() - * for values. - * - * @see http://se.php.net/manual/en/function.stream-socket-enable-crypto.php - * @access public - * @return false on error, true on success and 0 if there isn't enough data - * and the user should try again (non-blocking sockets only). - * A PEAR_Error object is returned if the socket is not - * connected - */ - function enableCrypto($enabled, $type) - { - if (version_compare(phpversion(), "5.1.0", ">=")) { - if (!is_resource($this->fp)) { - return $this->raiseError('not connected'); - } - return @stream_socket_enable_crypto($this->fp, $enabled, $type); - } else { - $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0'; - return $this->raiseError($msg); - } - } - -} diff --git a/program/lib/PEAR.php b/program/lib/PEAR.php deleted file mode 100644 index f4dfd968a..000000000 --- a/program/lib/PEAR.php +++ /dev/null @@ -1,1137 +0,0 @@ - - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id$ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/**#@+ - * ERROR constants - */ -define('PEAR_ERROR_RETURN', 1); -define('PEAR_ERROR_PRINT', 2); -define('PEAR_ERROR_TRIGGER', 4); -define('PEAR_ERROR_DIE', 8); -define('PEAR_ERROR_CALLBACK', 16); -/** - * WARNING: obsolete - * @deprecated - */ -define('PEAR_ERROR_EXCEPTION', 32); -/**#@-*/ -define('PEAR_ZE2', (function_exists('version_compare') && - version_compare(zend_version(), "2-dev", "ge"))); - -if (substr(PHP_OS, 0, 3) == 'WIN') { - define('OS_WINDOWS', true); - define('OS_UNIX', false); - define('PEAR_OS', 'Windows'); -} else { - define('OS_WINDOWS', false); - define('OS_UNIX', true); - define('PEAR_OS', 'Unix'); // blatant assumption -} - -$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; -$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; -$GLOBALS['_PEAR_destructor_object_list'] = array(); -$GLOBALS['_PEAR_shutdown_funcs'] = array(); -$GLOBALS['_PEAR_error_handler_stack'] = array(); - -@ini_set('track_errors', true); - -/** - * Base class for other PEAR classes. Provides rudimentary - * emulation of destructors. - * - * If you want a destructor in your class, inherit PEAR and make a - * destructor method called _yourclassname (same name as the - * constructor, but with a "_" prefix). Also, in your constructor you - * have to call the PEAR constructor: $this->PEAR();. - * The destructor method will be called without parameters. Note that - * at in some SAPI implementations (such as Apache), any output during - * the request shutdown (in which destructors are called) seems to be - * discarded. If you need to get any debug information from your - * destructor, use error_log(), syslog() or something similar. - * - * IMPORTANT! To use the emulated destructors you need to create the - * objects by reference: $obj =& new PEAR_child; - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Greg Beaver - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.0 - * @link http://pear.php.net/package/PEAR - * @see PEAR_Error - * @since Class available since PHP 4.0.2 - * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear - */ -class PEAR -{ - // {{{ properties - - /** - * Whether to enable internal debug messages. - * - * @var bool - * @access private - */ - var $_debug = false; - - /** - * Default error mode for this object. - * - * @var int - * @access private - */ - var $_default_error_mode = null; - - /** - * Default error options used for this object when error mode - * is PEAR_ERROR_TRIGGER. - * - * @var int - * @access private - */ - var $_default_error_options = null; - - /** - * Default error handler (callback) for this object, if error mode is - * PEAR_ERROR_CALLBACK. - * - * @var string - * @access private - */ - var $_default_error_handler = ''; - - /** - * Which class to use for error objects. - * - * @var string - * @access private - */ - var $_error_class = 'PEAR_Error'; - - /** - * An array of expected errors. - * - * @var array - * @access private - */ - var $_expected_errors = array(); - - // }}} - - // {{{ constructor - - /** - * Constructor. Registers this object in - * $_PEAR_destructor_object_list for destructor emulation if a - * destructor object exists. - * - * @param string $error_class (optional) which class to use for - * error objects, defaults to PEAR_Error. - * @access public - * @return void - */ - function PEAR($error_class = null) - { - $classname = strtolower(get_class($this)); - if ($this->_debug) { - print "PEAR constructor called, class=$classname\n"; - } - if ($error_class !== null) { - $this->_error_class = $error_class; - } - while ($classname && strcasecmp($classname, "pear")) { - $destructor = "_$classname"; - if (method_exists($this, $destructor)) { - global $_PEAR_destructor_object_list; - $_PEAR_destructor_object_list[] = &$this; - if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { - register_shutdown_function("_PEAR_call_destructors"); - $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; - } - break; - } else { - $classname = get_parent_class($classname); - } - } - } - - // }}} - // {{{ destructor - - /** - * Destructor (the emulated type of...). Does nothing right now, - * but is included for forward compatibility, so subclass - * destructors should always call it. - * - * See the note in the class desciption about output from - * destructors. - * - * @access public - * @return void - */ - function _PEAR() { - if ($this->_debug) { - printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); - } - } - - // }}} - // {{{ getStaticProperty() - - /** - * If you have a class that's mostly/entirely static, and you need static - * properties, you can use this method to simulate them. Eg. in your method(s) - * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); - * You MUST use a reference, or they will not persist! - * - * @access public - * @param string $class The calling classname, to prevent clashes - * @param string $var The variable to retrieve. - * @return mixed A reference to the variable. If not set it will be - * auto initialised to NULL. - */ - function &getStaticProperty($class, $var) - { - static $properties; - if (!isset($properties[$class])) { - $properties[$class] = array(); - } - - if (!array_key_exists($var, $properties[$class])) { - $properties[$class][$var] = null; - } - - return $properties[$class][$var]; - } - - // }}} - // {{{ registerShutdownFunc() - - /** - * Use this function to register a shutdown method for static - * classes. - * - * @access public - * @param mixed $func The function name (or array of class/method) to call - * @param mixed $args The arguments to pass to the function - * @return void - */ - function registerShutdownFunc($func, $args = array()) - { - // if we are called statically, there is a potential - // that no shutdown func is registered. Bug #6445 - if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { - register_shutdown_function("_PEAR_call_destructors"); - $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; - } - $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); - } - - // }}} - // {{{ isError() - - /** - * Tell whether a value is a PEAR error. - * - * @param mixed $data the value to test - * @param int $code if $data is an error object, return true - * only if $code is a string and - * $obj->getMessage() == $code or - * $code is an integer and $obj->getCode() == $code - * @access public - * @return bool true if parameter is an error - */ - static function isError($data, $code = null) - { - if (!is_object($data) || !is_a($data, 'PEAR_Error')) { - return false; - } - - if (is_null($code)) { - return true; - } elseif (is_string($code)) { - return $data->getMessage() == $code; - } - - return $data->getCode() == $code; - } - - // }}} - // {{{ setErrorHandling() - - /** - * Sets how errors generated by this object should be handled. - * Can be invoked both in objects and statically. If called - * statically, setErrorHandling sets the default behaviour for all - * PEAR objects. If called in an object, setErrorHandling sets - * the default behaviour for that object. - * - * @param int $mode - * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. - * - * @param mixed $options - * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one - * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * - * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected - * to be the callback function or method. A callback - * function is a string with the name of the function, a - * callback method is an array of two elements: the element - * at index 0 is the object, and the element at index 1 is - * the name of the method to call in the object. - * - * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is - * a printf format string used when printing the error - * message. - * - * @access public - * @return void - * @see PEAR_ERROR_RETURN - * @see PEAR_ERROR_PRINT - * @see PEAR_ERROR_TRIGGER - * @see PEAR_ERROR_DIE - * @see PEAR_ERROR_CALLBACK - * @see PEAR_ERROR_EXCEPTION - * - * @since PHP 4.0.5 - */ - - function setErrorHandling($mode = null, $options = null) - { - if (isset($this) && is_a($this, 'PEAR')) { - $setmode = &$this->_default_error_mode; - $setoptions = &$this->_default_error_options; - } else { - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - } - - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - } - - // }}} - // {{{ expectError() - - /** - * This method is used to tell which errors you expect to get. - * Expected errors are always returned with error mode - * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, - * and this method pushes a new element onto it. The list of - * expected errors are in effect until they are popped off the - * stack with the popExpect() method. - * - * Note that this method can not be called statically - * - * @param mixed $code a single error code or an array of error codes to expect - * - * @return int the new depth of the "expected errors" stack - * @access public - */ - function expectError($code = '*') - { - if (is_array($code)) { - array_push($this->_expected_errors, $code); - } else { - array_push($this->_expected_errors, array($code)); - } - return sizeof($this->_expected_errors); - } - - // }}} - // {{{ popExpect() - - /** - * This method pops one element off the expected error codes - * stack. - * - * @return array the list of error codes that were popped - */ - function popExpect() - { - return array_pop($this->_expected_errors); - } - - // }}} - // {{{ _checkDelExpect() - - /** - * This method checks unsets an error code if available - * - * @param mixed error code - * @return bool true if the error code was unset, false otherwise - * @access private - * @since PHP 4.3.0 - */ - function _checkDelExpect($error_code) - { - $deleted = false; - - foreach ($this->_expected_errors AS $key => $error_array) { - if (in_array($error_code, $error_array)) { - unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); - $deleted = true; - } - - // clean up empty arrays - if (0 == count($this->_expected_errors[$key])) { - unset($this->_expected_errors[$key]); - } - } - return $deleted; - } - - // }}} - // {{{ delExpect() - - /** - * This method deletes all occurences of the specified element from - * the expected error codes stack. - * - * @param mixed $error_code error code that should be deleted - * @return mixed list of error codes that were deleted or error - * @access public - * @since PHP 4.3.0 - */ - function delExpect($error_code) - { - $deleted = false; - if ((is_array($error_code) && (0 != count($error_code)))) { - // $error_code is a non-empty array here; - // we walk through it trying to unset all - // values - foreach($error_code as $key => $error) { - if ($this->_checkDelExpect($error)) { - $deleted = true; - } else { - $deleted = false; - } - } - return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } elseif (!empty($error_code)) { - // $error_code comes alone, trying to unset it - if ($this->_checkDelExpect($error_code)) { - return true; - } else { - return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } - } - - // $error_code is empty - return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME - } - - // }}} - // {{{ raiseError() - - /** - * This method is a wrapper that returns an instance of the - * configured error class with this object's default error - * handling applied. If the $mode and $options parameters are not - * specified, the object's defaults are used. - * - * @param mixed $message a text error message or a PEAR error object - * - * @param int $code a numeric error code (it is up to your class - * to define these if you want to use codes) - * - * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. - * - * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter - * specifies the PHP-internal error level (one of - * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * If $mode is PEAR_ERROR_CALLBACK, this - * parameter specifies the callback function or - * method. In other error modes this parameter - * is ignored. - * - * @param string $userinfo If you need to pass along for example debug - * information, this parameter is meant for that. - * - * @param string $error_class The returned error object will be - * instantiated from this class, if specified. - * - * @param bool $skipmsg If true, raiseError will only pass error codes, - * the error message parameter will be dropped. - * - * @access public - * @return object a PEAR error object - * @see PEAR::setErrorHandling - * @since PHP 4.0.5 - */ - function &raiseError($message = null, - $code = null, - $mode = null, - $options = null, - $userinfo = null, - $error_class = null, - $skipmsg = false) - { - // The error is yet a PEAR error object - if (is_object($message)) { - $code = $message->getCode(); - $userinfo = $message->getUserInfo(); - $error_class = $message->getType(); - $message->error_message_prefix = ''; - $message = $message->getMessage(); - } - - if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { - if ($exp[0] == "*" || - (is_int(reset($exp)) && in_array($code, $exp)) || - (is_string(reset($exp)) && in_array($message, $exp))) { - $mode = PEAR_ERROR_RETURN; - } - } - - // No mode given, try global ones - if ($mode === null) { - // Class error handler - if (isset($this) && isset($this->_default_error_mode)) { - $mode = $this->_default_error_mode; - $options = $this->_default_error_options; - // Global error handler - } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { - $mode = $GLOBALS['_PEAR_default_error_mode']; - $options = $GLOBALS['_PEAR_default_error_options']; - } - } - - if ($error_class !== null) { - $ec = $error_class; - } elseif (isset($this) && isset($this->_error_class)) { - $ec = $this->_error_class; - } else { - $ec = 'PEAR_Error'; - } - - if (intval(PHP_VERSION) < 5) { - // little non-eval hack to fix bug #12147 - include 'PEAR/FixPHP5PEARWarnings.php'; - return $a; - } - - if ($skipmsg) { - $a = new $ec($code, $mode, $options, $userinfo); - } else { - $a = new $ec($message, $code, $mode, $options, $userinfo); - } - - return $a; - } - - // }}} - // {{{ throwError() - - /** - * Simpler form of raiseError with fewer options. In most cases - * message, code and userinfo are enough. - * - * @param string $message - * - */ - function &throwError($message = null, - $code = null, - $userinfo = null) - { - if (isset($this) && is_a($this, 'PEAR')) { - $a = &$this->raiseError($message, $code, null, null, $userinfo); - return $a; - } - - $a = &PEAR::raiseError($message, $code, null, null, $userinfo); - return $a; - } - - // }}} - function staticPushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - $stack[] = array($def_mode, $def_options); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $def_mode = $mode; - $def_options = $options; - break; - - case PEAR_ERROR_CALLBACK: - $def_mode = $mode; - // class/object method callback - if (is_callable($options)) { - $def_options = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - $stack[] = array($mode, $options); - return true; - } - - function staticPopErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - return true; - } - - // {{{ pushErrorHandling() - - /** - * Push a new error handler on top of the error handler options stack. With this - * you can easily override the actual error handler for some code and restore - * it later with popErrorHandling. - * - * @param mixed $mode (same as setErrorHandling) - * @param mixed $options (same as setErrorHandling) - * - * @return bool Always true - * - * @see PEAR::setErrorHandling - */ - function pushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - if (isset($this) && is_a($this, 'PEAR')) { - $def_mode = &$this->_default_error_mode; - $def_options = &$this->_default_error_options; - } else { - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - } - $stack[] = array($def_mode, $def_options); - - if (isset($this) && is_a($this, 'PEAR')) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - $stack[] = array($mode, $options); - return true; - } - - // }}} - // {{{ popErrorHandling() - - /** - * Pop the last error handler used - * - * @return bool Always true - * - * @see PEAR::pushErrorHandling - */ - function popErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - if (isset($this) && is_a($this, 'PEAR')) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - return true; - } - - // }}} - // {{{ loadExtension() - - /** - * OS independant PHP extension load. Remember to take care - * on the correct extension name for case sensitive OSes. - * - * @param string $ext The extension name - * @return bool Success or not on the dl() call - */ - function loadExtension($ext) - { - if (!extension_loaded($ext)) { - // if either returns true dl() will produce a FATAL error, stop that - if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { - return false; - } - - if (OS_WINDOWS) { - $suffix = '.dll'; - } elseif (PHP_OS == 'HP-UX') { - $suffix = '.sl'; - } elseif (PHP_OS == 'AIX') { - $suffix = '.a'; - } elseif (PHP_OS == 'OSX') { - $suffix = '.bundle'; - } else { - $suffix = '.so'; - } - - return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); - } - - return true; - } - - // }}} -} - -if (PEAR_ZE2) { - include_once 'PEAR5.php'; -} - -// {{{ _PEAR_call_destructors() - -function _PEAR_call_destructors() -{ - global $_PEAR_destructor_object_list; - if (is_array($_PEAR_destructor_object_list) && - sizeof($_PEAR_destructor_object_list)) - { - reset($_PEAR_destructor_object_list); - if (PEAR_ZE2) { - $destructLifoExists = PEAR5::getStaticProperty('PEAR', 'destructlifo'); - } else { - $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo'); - } - - if ($destructLifoExists) { - $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); - } - - while (list($k, $objref) = each($_PEAR_destructor_object_list)) { - $classname = get_class($objref); - while ($classname) { - $destructor = "_$classname"; - if (method_exists($objref, $destructor)) { - $objref->$destructor(); - break; - } else { - $classname = get_parent_class($classname); - } - } - } - // Empty the object list to ensure that destructors are - // not called more than once. - $_PEAR_destructor_object_list = array(); - } - - // Now call the shutdown functions - if (isset($GLOBALS['_PEAR_shutdown_funcs']) AND is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { - foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { - call_user_func_array($value[0], $value[1]); - } - } -} - -// }}} -/** - * Standard PEAR error class for PHP 4 - * - * This class is supserseded by {@link PEAR_Exception} in PHP 5 - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Gregory Beaver - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.0 - * @link http://pear.php.net/manual/en/core.pear.pear-error.php - * @see PEAR::raiseError(), PEAR::throwError() - * @since Class available since PHP 4.0.2 - */ -class PEAR_Error -{ - // {{{ properties - - var $error_message_prefix = ''; - var $mode = PEAR_ERROR_RETURN; - var $level = E_USER_NOTICE; - var $code = -1; - var $message = ''; - var $userinfo = ''; - var $backtrace = null; - - // }}} - // {{{ constructor - - /** - * PEAR_Error constructor - * - * @param string $message message - * - * @param int $code (optional) error code - * - * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, - * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION - * - * @param mixed $options (optional) error level, _OR_ in the case of - * PEAR_ERROR_CALLBACK, the callback function or object/method - * tuple. - * - * @param string $userinfo (optional) additional user/debug info - * - * @access public - * - */ - function PEAR_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - if ($mode === null) { - $mode = PEAR_ERROR_RETURN; - } - $this->message = $message; - $this->code = $code; - $this->mode = $mode; - $this->userinfo = $userinfo; - - if (PEAR_ZE2) { - $skiptrace = PEAR5::getStaticProperty('PEAR_Error', 'skiptrace'); - } else { - $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace'); - } - - if (!$skiptrace) { - $this->backtrace = debug_backtrace(); - if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { - unset($this->backtrace[0]['object']); - } - } - - if ($mode & PEAR_ERROR_CALLBACK) { - $this->level = E_USER_NOTICE; - $this->callback = $options; - } else { - if ($options === null) { - $options = E_USER_NOTICE; - } - - $this->level = $options; - $this->callback = null; - } - - if ($this->mode & PEAR_ERROR_PRINT) { - if (is_null($options) || is_int($options)) { - $format = "%s"; - } else { - $format = $options; - } - - printf($format, $this->getMessage()); - } - - if ($this->mode & PEAR_ERROR_TRIGGER) { - trigger_error($this->getMessage(), $this->level); - } - - if ($this->mode & PEAR_ERROR_DIE) { - $msg = $this->getMessage(); - if (is_null($options) || is_int($options)) { - $format = "%s"; - if (substr($msg, -1) != "\n") { - $msg .= "\n"; - } - } else { - $format = $options; - } - die(sprintf($format, $msg)); - } - - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_callable($this->callback)) { - call_user_func($this->callback, $this); - } - } - - if ($this->mode & PEAR_ERROR_EXCEPTION) { - trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); - eval('$e = new Exception($this->message, $this->code);throw($e);'); - } - } - - // }}} - // {{{ getMode() - - /** - * Get the error mode from an error object. - * - * @return int error mode - * @access public - */ - function getMode() { - return $this->mode; - } - - // }}} - // {{{ getCallback() - - /** - * Get the callback function/method from an error object. - * - * @return mixed callback function or object/method array - * @access public - */ - function getCallback() { - return $this->callback; - } - - // }}} - // {{{ getMessage() - - - /** - * Get the error message from an error object. - * - * @return string full error message - * @access public - */ - function getMessage() - { - return ($this->error_message_prefix . $this->message); - } - - - // }}} - // {{{ getCode() - - /** - * Get error code from an error object - * - * @return int error code - * @access public - */ - function getCode() - { - return $this->code; - } - - // }}} - // {{{ getType() - - /** - * Get the name of this error/exception. - * - * @return string error/exception name (type) - * @access public - */ - function getType() - { - return get_class($this); - } - - // }}} - // {{{ getUserInfo() - - /** - * Get additional user-supplied information. - * - * @return string user-supplied information - * @access public - */ - function getUserInfo() - { - return $this->userinfo; - } - - // }}} - // {{{ getDebugInfo() - - /** - * Get additional debug information supplied by the application. - * - * @return string debug information - * @access public - */ - function getDebugInfo() - { - return $this->getUserInfo(); - } - - // }}} - // {{{ getBacktrace() - - /** - * Get the call backtrace from where the error was generated. - * Supported with PHP 4.3.0 or newer. - * - * @param int $frame (optional) what frame to fetch - * @return array Backtrace, or NULL if not available. - * @access public - */ - function getBacktrace($frame = null) - { - if (defined('PEAR_IGNORE_BACKTRACE')) { - return null; - } - if ($frame === null) { - return $this->backtrace; - } - return $this->backtrace[$frame]; - } - - // }}} - // {{{ addUserInfo() - - function addUserInfo($info) - { - if (empty($this->userinfo)) { - $this->userinfo = $info; - } else { - $this->userinfo .= " ** $info"; - } - } - - // }}} - // {{{ toString() - function __toString() - { - return $this->getMessage(); - } - // }}} - // {{{ toString() - - /** - * Make a string representation of this object. - * - * @return string a string with an object summary - * @access public - */ - function toString() { - $modes = array(); - $levels = array(E_USER_NOTICE => 'notice', - E_USER_WARNING => 'warning', - E_USER_ERROR => 'error'); - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_array($this->callback)) { - $callback = (is_object($this->callback[0]) ? - strtolower(get_class($this->callback[0])) : - $this->callback[0]) . '::' . - $this->callback[1]; - } else { - $callback = $this->callback; - } - return sprintf('[%s: message="%s" code=%d mode=callback '. - 'callback=%s prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - $callback, $this->error_message_prefix, - $this->userinfo); - } - if ($this->mode & PEAR_ERROR_PRINT) { - $modes[] = 'print'; - } - if ($this->mode & PEAR_ERROR_TRIGGER) { - $modes[] = 'trigger'; - } - if ($this->mode & PEAR_ERROR_DIE) { - $modes[] = 'die'; - } - if ($this->mode & PEAR_ERROR_RETURN) { - $modes[] = 'return'; - } - return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. - 'prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - implode("|", $modes), $levels[$this->level], - $this->error_message_prefix, - $this->userinfo); - } - - // }}} -} - -/* - * Local Variables: - * mode: php - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/program/lib/PEAR5.php b/program/lib/PEAR5.php deleted file mode 100644 index 428606780..000000000 --- a/program/lib/PEAR5.php +++ /dev/null @@ -1,33 +0,0 @@ -loadCharset($from); - } - - if ($_str = $conv->strToUtf8($str)) { - return $_str; - } + else { + user_error("No suitable function found for UTF-8 encoding", E_USER_WARNING); } } @@ -298,17 +289,8 @@ class rcube_charset else if ($to == 'ISO-8859-1' && function_exists('utf8_decode')) { return utf8_decode($str); } - else if (class_exists('utf8')) { - if (!$conv) { - $conv = new utf8($to); - } - else { - $conv->loadCharset($from); - } - - if ($_str = $conv->strToUtf8($str)) { - return $_str; - } + else { + user_error("No suitable function found for UTF-8 decoding", E_USER_WARNING); } } diff --git a/program/lib/encoding/CP1250.map b/program/lib/encoding/CP1250.map deleted file mode 100644 index 081d7763b..000000000 --- a/program/lib/encoding/CP1250.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1250 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1250 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1250 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 #UNDEFINED -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 #UNDEFINED -0x89 0x2030 #PER MILLE SIGN -0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C 0x015A #LATIN CAPITAL LETTER S WITH ACUTE -0x8D 0x0164 #LATIN CAPITAL LETTER T WITH CARON -0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON -0x8F 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 #UNDEFINED -0x99 0x2122 #TRADE MARK SIGN -0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C 0x015B #LATIN SMALL LETTER S WITH ACUTE -0x9D 0x0165 #LATIN SMALL LETTER T WITH CARON -0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON -0x9F 0x017A #LATIN SMALL LETTER Z WITH ACUTE -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x02C7 #CARON -0xA2 0x02D8 #BREVE -0xA3 0x0141 #LATIN CAPITAL LETTER L WITH STROKE -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x02DB #OGONEK -0xB3 0x0142 #LATIN SMALL LETTER L WITH STROKE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00B8 #CEDILLA -0xB9 0x0105 #LATIN SMALL LETTER A WITH OGONEK -0xBA 0x015F #LATIN SMALL LETTER S WITH CEDILLA -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x013D #LATIN CAPITAL LETTER L WITH CARON -0xBD 0x02DD #DOUBLE ACUTE ACCENT -0xBE 0x013E #LATIN SMALL LETTER L WITH CARON -0xBF 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE -0xC0 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE -0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE -0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE -0xC6 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE -0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON -0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK -0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x011A #LATIN CAPITAL LETTER E WITH CARON -0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x010E #LATIN CAPITAL LETTER D WITH CARON -0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE -0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE -0xD2 0x0147 #LATIN CAPITAL LETTER N WITH CARON -0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 #MULTIPLICATION SIGN -0xD8 0x0158 #LATIN CAPITAL LETTER R WITH CARON -0xD9 0x016E #LATIN CAPITAL LETTER U WITH RING ABOVE -0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA -0xDF 0x00DF #LATIN SMALL LETTER SHARP S -0xE0 0x0155 #LATIN SMALL LETTER R WITH ACUTE -0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE -0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x013A #LATIN SMALL LETTER L WITH ACUTE -0xE6 0x0107 #LATIN SMALL LETTER C WITH ACUTE -0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x010D #LATIN SMALL LETTER C WITH CARON -0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE -0xEA 0x0119 #LATIN SMALL LETTER E WITH OGONEK -0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x011B #LATIN SMALL LETTER E WITH CARON -0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x010F #LATIN SMALL LETTER D WITH CARON -0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE -0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE -0xF2 0x0148 #LATIN SMALL LETTER N WITH CARON -0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE -0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 #DIVISION SIGN -0xF8 0x0159 #LATIN SMALL LETTER R WITH CARON -0xF9 0x016F #LATIN SMALL LETTER U WITH RING ABOVE -0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE -0xFB 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE -0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x0163 #LATIN SMALL LETTER T WITH CEDILLA -0xFF 0x02D9 #DOT ABOVE diff --git a/program/lib/encoding/CP1251.map b/program/lib/encoding/CP1251.map deleted file mode 100644 index e7d4f2c5b..000000000 --- a/program/lib/encoding/CP1251.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1251 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1251 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1251 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE -0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0453 #CYRILLIC SMALL LETTER GJE -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 0x20AC #EURO SIGN -0x89 0x2030 #PER MILLE SIGN -0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE -0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE -0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE -0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE -0x90 0x0452 #CYRILLIC SMALL LETTER DJE -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 #UNDEFINED -0x99 0x2122 #TRADE MARK SIGN -0x9A 0x0459 #CYRILLIC SMALL LETTER LJE -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C 0x045A #CYRILLIC SMALL LETTER NJE -0x9D 0x045C #CYRILLIC SMALL LETTER KJE -0x9E 0x045B #CYRILLIC SMALL LETTER TSHE -0x9F 0x045F #CYRILLIC SMALL LETTER DZHE -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U -0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U -0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x0451 #CYRILLIC SMALL LETTER IO -0xB9 0x2116 #NUMERO SIGN -0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x0458 #CYRILLIC SMALL LETTER JE -0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE -0xBE 0x0455 #CYRILLIC SMALL LETTER DZE -0xBF 0x0457 #CYRILLIC SMALL LETTER YI -0xC0 0x0410 #CYRILLIC CAPITAL LETTER A -0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE -0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE -0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE -0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE -0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE -0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE -0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE -0xC8 0x0418 #CYRILLIC CAPITAL LETTER I -0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I -0xCA 0x041A #CYRILLIC CAPITAL LETTER KA -0xCB 0x041B #CYRILLIC CAPITAL LETTER EL -0xCC 0x041C #CYRILLIC CAPITAL LETTER EM -0xCD 0x041D #CYRILLIC CAPITAL LETTER EN -0xCE 0x041E #CYRILLIC CAPITAL LETTER O -0xCF 0x041F #CYRILLIC CAPITAL LETTER PE -0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER -0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES -0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE -0xD3 0x0423 #CYRILLIC CAPITAL LETTER U -0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF -0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA -0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE -0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE -0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA -0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA -0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN -0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU -0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN -0xDD 0x042D #CYRILLIC CAPITAL LETTER E -0xDE 0x042E #CYRILLIC CAPITAL LETTER YU -0xDF 0x042F #CYRILLIC CAPITAL LETTER YA -0xE0 0x0430 #CYRILLIC SMALL LETTER A -0xE1 0x0431 #CYRILLIC SMALL LETTER BE -0xE2 0x0432 #CYRILLIC SMALL LETTER VE -0xE3 0x0433 #CYRILLIC SMALL LETTER GHE -0xE4 0x0434 #CYRILLIC SMALL LETTER DE -0xE5 0x0435 #CYRILLIC SMALL LETTER IE -0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE -0xE7 0x0437 #CYRILLIC SMALL LETTER ZE -0xE8 0x0438 #CYRILLIC SMALL LETTER I -0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I -0xEA 0x043A #CYRILLIC SMALL LETTER KA -0xEB 0x043B #CYRILLIC SMALL LETTER EL -0xEC 0x043C #CYRILLIC SMALL LETTER EM -0xED 0x043D #CYRILLIC SMALL LETTER EN -0xEE 0x043E #CYRILLIC SMALL LETTER O -0xEF 0x043F #CYRILLIC SMALL LETTER PE -0xF0 0x0440 #CYRILLIC SMALL LETTER ER -0xF1 0x0441 #CYRILLIC SMALL LETTER ES -0xF2 0x0442 #CYRILLIC SMALL LETTER TE -0xF3 0x0443 #CYRILLIC SMALL LETTER U -0xF4 0x0444 #CYRILLIC SMALL LETTER EF -0xF5 0x0445 #CYRILLIC SMALL LETTER HA -0xF6 0x0446 #CYRILLIC SMALL LETTER TSE -0xF7 0x0447 #CYRILLIC SMALL LETTER CHE -0xF8 0x0448 #CYRILLIC SMALL LETTER SHA -0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA -0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN -0xFB 0x044B #CYRILLIC SMALL LETTER YERU -0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN -0xFD 0x044D #CYRILLIC SMALL LETTER E -0xFE 0x044E #CYRILLIC SMALL LETTER YU -0xFF 0x044F #CYRILLIC SMALL LETTER YA diff --git a/program/lib/encoding/CP1252.map b/program/lib/encoding/CP1252.map deleted file mode 100644 index 2ca4486eb..000000000 --- a/program/lib/encoding/CP1252.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1252 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1252 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1252 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT -0x89 0x2030 #PER MILLE SIGN -0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C 0x0152 #LATIN CAPITAL LIGATURE OE -0x8D #UNDEFINED -0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON -0x8F #UNDEFINED -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 0x02DC #SMALL TILDE -0x99 0x2122 #TRADE MARK SIGN -0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C 0x0153 #LATIN SMALL LIGATURE OE -0x9D #UNDEFINED -0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON -0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x00A1 #INVERTED EXCLAMATION MARK -0xA2 0x00A2 #CENT SIGN -0xA3 0x00A3 #POUND SIGN -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x00A5 #YEN SIGN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x00AA #FEMININE ORDINAL INDICATOR -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x00AF #MACRON -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00B8 #CEDILLA -0xB9 0x00B9 #SUPERSCRIPT ONE -0xBA 0x00BA #MASCULINE ORDINAL INDICATOR -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC #VULGAR FRACTION ONE QUARTER -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS -0xBF 0x00BF #INVERTED QUESTION MARK -0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 #LATIN CAPITAL LETTER AE -0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x00D0 #LATIN CAPITAL LETTER ETH -0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 #MULTIPLICATION SIGN -0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x00DE #LATIN CAPITAL LETTER THORN -0xDF 0x00DF #LATIN SMALL LETTER SHARP S -0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 #LATIN SMALL LETTER AE -0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x00F0 #LATIN SMALL LETTER ETH -0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 #DIVISION SIGN -0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x00FE #LATIN SMALL LETTER THORN -0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/program/lib/encoding/CP1253.map b/program/lib/encoding/CP1253.map deleted file mode 100644 index 2ba51a0c8..000000000 --- a/program/lib/encoding/CP1253.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1253 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1253 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1253 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 #UNDEFINED -0x89 0x2030 #PER MILLE SIGN -0x8A #UNDEFINED -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C #UNDEFINED -0x8D #UNDEFINED -0x8E #UNDEFINED -0x8F #UNDEFINED -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 #UNDEFINED -0x99 0x2122 #TRADE MARK SIGN -0x9A #UNDEFINED -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C #UNDEFINED -0x9D #UNDEFINED -0x9E #UNDEFINED -0x9F #UNDEFINED -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x0385 #GREEK DIALYTIKA TONOS -0xA2 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS -0xA3 0x00A3 #POUND SIGN -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x00A5 #YEN SIGN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA #UNDEFINED -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x2015 #HORIZONTAL BAR -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x0384 #GREEK TONOS -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS -0xB9 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS -0xBA 0x038A #GREEK CAPITAL LETTER IOTA WITH TONOS -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x038C #GREEK CAPITAL LETTER OMICRON WITH TONOS -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x038E #GREEK CAPITAL LETTER UPSILON WITH TONOS -0xBF 0x038F #GREEK CAPITAL LETTER OMEGA WITH TONOS -0xC0 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -0xC1 0x0391 #GREEK CAPITAL LETTER ALPHA -0xC2 0x0392 #GREEK CAPITAL LETTER BETA -0xC3 0x0393 #GREEK CAPITAL LETTER GAMMA -0xC4 0x0394 #GREEK CAPITAL LETTER DELTA -0xC5 0x0395 #GREEK CAPITAL LETTER EPSILON -0xC6 0x0396 #GREEK CAPITAL LETTER ZETA -0xC7 0x0397 #GREEK CAPITAL LETTER ETA -0xC8 0x0398 #GREEK CAPITAL LETTER THETA -0xC9 0x0399 #GREEK CAPITAL LETTER IOTA -0xCA 0x039A #GREEK CAPITAL LETTER KAPPA -0xCB 0x039B #GREEK CAPITAL LETTER LAMDA -0xCC 0x039C #GREEK CAPITAL LETTER MU -0xCD 0x039D #GREEK CAPITAL LETTER NU -0xCE 0x039E #GREEK CAPITAL LETTER XI -0xCF 0x039F #GREEK CAPITAL LETTER OMICRON -0xD0 0x03A0 #GREEK CAPITAL LETTER PI -0xD1 0x03A1 #GREEK CAPITAL LETTER RHO -0xD2 #UNDEFINED -0xD3 0x03A3 #GREEK CAPITAL LETTER SIGMA -0xD4 0x03A4 #GREEK CAPITAL LETTER TAU -0xD5 0x03A5 #GREEK CAPITAL LETTER UPSILON -0xD6 0x03A6 #GREEK CAPITAL LETTER PHI -0xD7 0x03A7 #GREEK CAPITAL LETTER CHI -0xD8 0x03A8 #GREEK CAPITAL LETTER PSI -0xD9 0x03A9 #GREEK CAPITAL LETTER OMEGA -0xDA 0x03AA #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -0xDB 0x03AB #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -0xDC 0x03AC #GREEK SMALL LETTER ALPHA WITH TONOS -0xDD 0x03AD #GREEK SMALL LETTER EPSILON WITH TONOS -0xDE 0x03AE #GREEK SMALL LETTER ETA WITH TONOS -0xDF 0x03AF #GREEK SMALL LETTER IOTA WITH TONOS -0xE0 0x03B0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -0xE1 0x03B1 #GREEK SMALL LETTER ALPHA -0xE2 0x03B2 #GREEK SMALL LETTER BETA -0xE3 0x03B3 #GREEK SMALL LETTER GAMMA -0xE4 0x03B4 #GREEK SMALL LETTER DELTA -0xE5 0x03B5 #GREEK SMALL LETTER EPSILON -0xE6 0x03B6 #GREEK SMALL LETTER ZETA -0xE7 0x03B7 #GREEK SMALL LETTER ETA -0xE8 0x03B8 #GREEK SMALL LETTER THETA -0xE9 0x03B9 #GREEK SMALL LETTER IOTA -0xEA 0x03BA #GREEK SMALL LETTER KAPPA -0xEB 0x03BB #GREEK SMALL LETTER LAMDA -0xEC 0x03BC #GREEK SMALL LETTER MU -0xED 0x03BD #GREEK SMALL LETTER NU -0xEE 0x03BE #GREEK SMALL LETTER XI -0xEF 0x03BF #GREEK SMALL LETTER OMICRON -0xF0 0x03C0 #GREEK SMALL LETTER PI -0xF1 0x03C1 #GREEK SMALL LETTER RHO -0xF2 0x03C2 #GREEK SMALL LETTER FINAL SIGMA -0xF3 0x03C3 #GREEK SMALL LETTER SIGMA -0xF4 0x03C4 #GREEK SMALL LETTER TAU -0xF5 0x03C5 #GREEK SMALL LETTER UPSILON -0xF6 0x03C6 #GREEK SMALL LETTER PHI -0xF7 0x03C7 #GREEK SMALL LETTER CHI -0xF8 0x03C8 #GREEK SMALL LETTER PSI -0xF9 0x03C9 #GREEK SMALL LETTER OMEGA -0xFA 0x03CA #GREEK SMALL LETTER IOTA WITH DIALYTIKA -0xFB 0x03CB #GREEK SMALL LETTER UPSILON WITH DIALYTIKA -0xFC 0x03CC #GREEK SMALL LETTER OMICRON WITH TONOS -0xFD 0x03CD #GREEK SMALL LETTER UPSILON WITH TONOS -0xFE 0x03CE #GREEK SMALL LETTER OMEGA WITH TONOS -0xFF #UNDEFINED diff --git a/program/lib/encoding/CP1254.map b/program/lib/encoding/CP1254.map deleted file mode 100644 index ca1a1ebdb..000000000 --- a/program/lib/encoding/CP1254.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1254 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1254 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1254 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT -0x89 0x2030 #PER MILLE SIGN -0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C 0x0152 #LATIN CAPITAL LIGATURE OE -0x8D #UNDEFINED -0x8E #UNDEFINED -0x8F #UNDEFINED -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 0x02DC #SMALL TILDE -0x99 0x2122 #TRADE MARK SIGN -0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C 0x0153 #LATIN SMALL LIGATURE OE -0x9D #UNDEFINED -0x9E #UNDEFINED -0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x00A1 #INVERTED EXCLAMATION MARK -0xA2 0x00A2 #CENT SIGN -0xA3 0x00A3 #POUND SIGN -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x00A5 #YEN SIGN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x00AA #FEMININE ORDINAL INDICATOR -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x00AF #MACRON -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00B8 #CEDILLA -0xB9 0x00B9 #SUPERSCRIPT ONE -0xBA 0x00BA #MASCULINE ORDINAL INDICATOR -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC #VULGAR FRACTION ONE QUARTER -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS -0xBF 0x00BF #INVERTED QUESTION MARK -0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 #LATIN CAPITAL LETTER AE -0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x011E #LATIN CAPITAL LETTER G WITH BREVE -0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 #MULTIPLICATION SIGN -0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE -0xDE 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA -0xDF 0x00DF #LATIN SMALL LETTER SHARP S -0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 #LATIN SMALL LETTER AE -0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x011F #LATIN SMALL LETTER G WITH BREVE -0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 #DIVISION SIGN -0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x0131 #LATIN SMALL LETTER DOTLESS I -0xFE 0x015F #LATIN SMALL LETTER S WITH CEDILLA -0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/program/lib/encoding/CP1255.map b/program/lib/encoding/CP1255.map deleted file mode 100644 index 341517f11..000000000 --- a/program/lib/encoding/CP1255.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1255 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 1/7/2000 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1255 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1255 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT -0x89 0x2030 #PER MILLE SIGN -0x8A #UNDEFINED -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C #UNDEFINED -0x8D #UNDEFINED -0x8E #UNDEFINED -0x8F #UNDEFINED -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 0x02DC #SMALL TILDE -0x99 0x2122 #TRADE MARK SIGN -0x9A #UNDEFINED -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C #UNDEFINED -0x9D #UNDEFINED -0x9E #UNDEFINED -0x9F #UNDEFINED -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x00A1 #INVERTED EXCLAMATION MARK -0xA2 0x00A2 #CENT SIGN -0xA3 0x00A3 #POUND SIGN -0xA4 0x20AA #NEW SHEQEL SIGN -0xA5 0x00A5 #YEN SIGN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x00D7 #MULTIPLICATION SIGN -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x00AF #MACRON -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00B8 #CEDILLA -0xB9 0x00B9 #SUPERSCRIPT ONE -0xBA 0x00F7 #DIVISION SIGN -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC #VULGAR FRACTION ONE QUARTER -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS -0xBF 0x00BF #INVERTED QUESTION MARK -0xC0 0x05B0 #HEBREW POINT SHEVA -0xC1 0x05B1 #HEBREW POINT HATAF SEGOL -0xC2 0x05B2 #HEBREW POINT HATAF PATAH -0xC3 0x05B3 #HEBREW POINT HATAF QAMATS -0xC4 0x05B4 #HEBREW POINT HIRIQ -0xC5 0x05B5 #HEBREW POINT TSERE -0xC6 0x05B6 #HEBREW POINT SEGOL -0xC7 0x05B7 #HEBREW POINT PATAH -0xC8 0x05B8 #HEBREW POINT QAMATS -0xC9 0x05B9 #HEBREW POINT HOLAM -0xCA #UNDEFINED -0xCB 0x05BB #HEBREW POINT QUBUTS -0xCC 0x05BC #HEBREW POINT DAGESH OR MAPIQ -0xCD 0x05BD #HEBREW POINT METEG -0xCE 0x05BE #HEBREW PUNCTUATION MAQAF -0xCF 0x05BF #HEBREW POINT RAFE -0xD0 0x05C0 #HEBREW PUNCTUATION PASEQ -0xD1 0x05C1 #HEBREW POINT SHIN DOT -0xD2 0x05C2 #HEBREW POINT SIN DOT -0xD3 0x05C3 #HEBREW PUNCTUATION SOF PASUQ -0xD4 0x05F0 #HEBREW LIGATURE YIDDISH DOUBLE VAV -0xD5 0x05F1 #HEBREW LIGATURE YIDDISH VAV YOD -0xD6 0x05F2 #HEBREW LIGATURE YIDDISH DOUBLE YOD -0xD7 0x05F3 #HEBREW PUNCTUATION GERESH -0xD8 0x05F4 #HEBREW PUNCTUATION GERSHAYIM -0xD9 #UNDEFINED -0xDA #UNDEFINED -0xDB #UNDEFINED -0xDC #UNDEFINED -0xDD #UNDEFINED -0xDE #UNDEFINED -0xDF #UNDEFINED -0xE0 0x05D0 #HEBREW LETTER ALEF -0xE1 0x05D1 #HEBREW LETTER BET -0xE2 0x05D2 #HEBREW LETTER GIMEL -0xE3 0x05D3 #HEBREW LETTER DALET -0xE4 0x05D4 #HEBREW LETTER HE -0xE5 0x05D5 #HEBREW LETTER VAV -0xE6 0x05D6 #HEBREW LETTER ZAYIN -0xE7 0x05D7 #HEBREW LETTER HET -0xE8 0x05D8 #HEBREW LETTER TET -0xE9 0x05D9 #HEBREW LETTER YOD -0xEA 0x05DA #HEBREW LETTER FINAL KAF -0xEB 0x05DB #HEBREW LETTER KAF -0xEC 0x05DC #HEBREW LETTER LAMED -0xED 0x05DD #HEBREW LETTER FINAL MEM -0xEE 0x05DE #HEBREW LETTER MEM -0xEF 0x05DF #HEBREW LETTER FINAL NUN -0xF0 0x05E0 #HEBREW LETTER NUN -0xF1 0x05E1 #HEBREW LETTER SAMEKH -0xF2 0x05E2 #HEBREW LETTER AYIN -0xF3 0x05E3 #HEBREW LETTER FINAL PE -0xF4 0x05E4 #HEBREW LETTER PE -0xF5 0x05E5 #HEBREW LETTER FINAL TSADI -0xF6 0x05E6 #HEBREW LETTER TSADI -0xF7 0x05E7 #HEBREW LETTER QOF -0xF8 0x05E8 #HEBREW LETTER RESH -0xF9 0x05E9 #HEBREW LETTER SHIN -0xFA 0x05EA #HEBREW LETTER TAV -0xFB #UNDEFINED -0xFC #UNDEFINED -0xFD 0x200E #LEFT-TO-RIGHT MARK -0xFE 0x200F #RIGHT-TO-LEFT MARK -0xFF #UNDEFINED diff --git a/program/lib/encoding/CP1256.map b/program/lib/encoding/CP1256.map deleted file mode 100644 index 0edd081b9..000000000 --- a/program/lib/encoding/CP1256.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1256 to Unicode table -# Unicode version: 2.1 -# Table version: 2.01 -# Table format: Format A -# Date: 01/5/99 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1256 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1256 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 0x067E #ARABIC LETTER PEH -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT -0x89 0x2030 #PER MILLE SIGN -0x8A 0x0679 #ARABIC LETTER TTEH -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C 0x0152 #LATIN CAPITAL LIGATURE OE -0x8D 0x0686 #ARABIC LETTER TCHEH -0x8E 0x0698 #ARABIC LETTER JEH -0x8F 0x0688 #ARABIC LETTER DDAL -0x90 0x06AF #ARABIC LETTER GAF -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 0x06A9 #ARABIC LETTER KEHEH -0x99 0x2122 #TRADE MARK SIGN -0x9A 0x0691 #ARABIC LETTER RREH -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C 0x0153 #LATIN SMALL LIGATURE OE -0x9D 0x200C #ZERO WIDTH NON-JOINER -0x9E 0x200D #ZERO WIDTH JOINER -0x9F 0x06BA #ARABIC LETTER NOON GHUNNA -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x060C #ARABIC COMMA -0xA2 0x00A2 #CENT SIGN -0xA3 0x00A3 #POUND SIGN -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x00A5 #YEN SIGN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x06BE #ARABIC LETTER HEH DOACHASHMEE -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x00AF #MACRON -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00B8 #CEDILLA -0xB9 0x00B9 #SUPERSCRIPT ONE -0xBA 0x061B #ARABIC SEMICOLON -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC #VULGAR FRACTION ONE QUARTER -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS -0xBF 0x061F #ARABIC QUESTION MARK -0xC0 0x06C1 #ARABIC LETTER HEH GOAL -0xC1 0x0621 #ARABIC LETTER HAMZA -0xC2 0x0622 #ARABIC LETTER ALEF WITH MADDA ABOVE -0xC3 0x0623 #ARABIC LETTER ALEF WITH HAMZA ABOVE -0xC4 0x0624 #ARABIC LETTER WAW WITH HAMZA ABOVE -0xC5 0x0625 #ARABIC LETTER ALEF WITH HAMZA BELOW -0xC6 0x0626 #ARABIC LETTER YEH WITH HAMZA ABOVE -0xC7 0x0627 #ARABIC LETTER ALEF -0xC8 0x0628 #ARABIC LETTER BEH -0xC9 0x0629 #ARABIC LETTER TEH MARBUTA -0xCA 0x062A #ARABIC LETTER TEH -0xCB 0x062B #ARABIC LETTER THEH -0xCC 0x062C #ARABIC LETTER JEEM -0xCD 0x062D #ARABIC LETTER HAH -0xCE 0x062E #ARABIC LETTER KHAH -0xCF 0x062F #ARABIC LETTER DAL -0xD0 0x0630 #ARABIC LETTER THAL -0xD1 0x0631 #ARABIC LETTER REH -0xD2 0x0632 #ARABIC LETTER ZAIN -0xD3 0x0633 #ARABIC LETTER SEEN -0xD4 0x0634 #ARABIC LETTER SHEEN -0xD5 0x0635 #ARABIC LETTER SAD -0xD6 0x0636 #ARABIC LETTER DAD -0xD7 0x00D7 #MULTIPLICATION SIGN -0xD8 0x0637 #ARABIC LETTER TAH -0xD9 0x0638 #ARABIC LETTER ZAH -0xDA 0x0639 #ARABIC LETTER AIN -0xDB 0x063A #ARABIC LETTER GHAIN -0xDC 0x0640 #ARABIC TATWEEL -0xDD 0x0641 #ARABIC LETTER FEH -0xDE 0x0642 #ARABIC LETTER QAF -0xDF 0x0643 #ARABIC LETTER KAF -0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE -0xE1 0x0644 #ARABIC LETTER LAM -0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x0645 #ARABIC LETTER MEEM -0xE4 0x0646 #ARABIC LETTER NOON -0xE5 0x0647 #ARABIC LETTER HEH -0xE6 0x0648 #ARABIC LETTER WAW -0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x0649 #ARABIC LETTER ALEF MAKSURA -0xED 0x064A #ARABIC LETTER YEH -0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x064B #ARABIC FATHATAN -0xF1 0x064C #ARABIC DAMMATAN -0xF2 0x064D #ARABIC KASRATAN -0xF3 0x064E #ARABIC FATHA -0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x064F #ARABIC DAMMA -0xF6 0x0650 #ARABIC KASRA -0xF7 0x00F7 #DIVISION SIGN -0xF8 0x0651 #ARABIC SHADDA -0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE -0xFA 0x0652 #ARABIC SUKUN -0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x200E #LEFT-TO-RIGHT MARK -0xFE 0x200F #RIGHT-TO-LEFT MARK -0xFF 0x06D2 #ARABIC LETTER YEH BARREE diff --git a/program/lib/encoding/CP1257.map b/program/lib/encoding/CP1257.map deleted file mode 100644 index 97979d931..000000000 --- a/program/lib/encoding/CP1257.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1257 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1257 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1257 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 #UNDEFINED -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 #UNDEFINED -0x89 0x2030 #PER MILLE SIGN -0x8A #UNDEFINED -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C #UNDEFINED -0x8D 0x00A8 #DIAERESIS -0x8E 0x02C7 #CARON -0x8F 0x00B8 #CEDILLA -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 #UNDEFINED -0x99 0x2122 #TRADE MARK SIGN -0x9A #UNDEFINED -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C #UNDEFINED -0x9D 0x00AF #MACRON -0x9E 0x02DB #OGONEK -0x9F #UNDEFINED -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 #UNDEFINED -0xA2 0x00A2 #CENT SIGN -0xA3 0x00A3 #POUND SIGN -0xA4 0x00A4 #CURRENCY SIGN -0xA5 #UNDEFINED -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x0156 #LATIN CAPITAL LETTER R WITH CEDILLA -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x00C6 #LATIN CAPITAL LETTER AE -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00F8 #LATIN SMALL LETTER O WITH STROKE -0xB9 0x00B9 #SUPERSCRIPT ONE -0xBA 0x0157 #LATIN SMALL LETTER R WITH CEDILLA -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC #VULGAR FRACTION ONE QUARTER -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS -0xBF 0x00E6 #LATIN SMALL LETTER AE -0xC0 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK -0xC1 0x012E #LATIN CAPITAL LETTER I WITH OGONEK -0xC2 0x0100 #LATIN CAPITAL LETTER A WITH MACRON -0xC3 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE -0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK -0xC7 0x0112 #LATIN CAPITAL LETTER E WITH MACRON -0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON -0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE -0xCB 0x0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE -0xCC 0x0122 #LATIN CAPITAL LETTER G WITH CEDILLA -0xCD 0x0136 #LATIN CAPITAL LETTER K WITH CEDILLA -0xCE 0x012A #LATIN CAPITAL LETTER I WITH MACRON -0xCF 0x013B #LATIN CAPITAL LETTER L WITH CEDILLA -0xD0 0x0160 #LATIN CAPITAL LETTER S WITH CARON -0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE -0xD2 0x0145 #LATIN CAPITAL LETTER N WITH CEDILLA -0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x014C #LATIN CAPITAL LETTER O WITH MACRON -0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 #MULTIPLICATION SIGN -0xD8 0x0172 #LATIN CAPITAL LETTER U WITH OGONEK -0xD9 0x0141 #LATIN CAPITAL LETTER L WITH STROKE -0xDA 0x015A #LATIN CAPITAL LETTER S WITH ACUTE -0xDB 0x016A #LATIN CAPITAL LETTER U WITH MACRON -0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE -0xDE 0x017D #LATIN CAPITAL LETTER Z WITH CARON -0xDF 0x00DF #LATIN SMALL LETTER SHARP S -0xE0 0x0105 #LATIN SMALL LETTER A WITH OGONEK -0xE1 0x012F #LATIN SMALL LETTER I WITH OGONEK -0xE2 0x0101 #LATIN SMALL LETTER A WITH MACRON -0xE3 0x0107 #LATIN SMALL LETTER C WITH ACUTE -0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x0119 #LATIN SMALL LETTER E WITH OGONEK -0xE7 0x0113 #LATIN SMALL LETTER E WITH MACRON -0xE8 0x010D #LATIN SMALL LETTER C WITH CARON -0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE -0xEA 0x017A #LATIN SMALL LETTER Z WITH ACUTE -0xEB 0x0117 #LATIN SMALL LETTER E WITH DOT ABOVE -0xEC 0x0123 #LATIN SMALL LETTER G WITH CEDILLA -0xED 0x0137 #LATIN SMALL LETTER K WITH CEDILLA -0xEE 0x012B #LATIN SMALL LETTER I WITH MACRON -0xEF 0x013C #LATIN SMALL LETTER L WITH CEDILLA -0xF0 0x0161 #LATIN SMALL LETTER S WITH CARON -0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE -0xF2 0x0146 #LATIN SMALL LETTER N WITH CEDILLA -0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE -0xF4 0x014D #LATIN SMALL LETTER O WITH MACRON -0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 #DIVISION SIGN -0xF8 0x0173 #LATIN SMALL LETTER U WITH OGONEK -0xF9 0x0142 #LATIN SMALL LETTER L WITH STROKE -0xFA 0x015B #LATIN SMALL LETTER S WITH ACUTE -0xFB 0x016B #LATIN SMALL LETTER U WITH MACRON -0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE -0xFE 0x017E #LATIN SMALL LETTER Z WITH CARON -0xFF 0x02D9 #DOT ABOVE diff --git a/program/lib/encoding/CP1258.map b/program/lib/encoding/CP1258.map deleted file mode 100644 index 392310a8c..000000000 --- a/program/lib/encoding/CP1258.map +++ /dev/null @@ -1,274 +0,0 @@ -# -# Name: cp1258 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: cpxlate@microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp1258 code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in cp1258 order -# -0x00 0x0000 #NULL -0x01 0x0001 #START OF HEADING -0x02 0x0002 #START OF TEXT -0x03 0x0003 #END OF TEXT -0x04 0x0004 #END OF TRANSMISSION -0x05 0x0005 #ENQUIRY -0x06 0x0006 #ACKNOWLEDGE -0x07 0x0007 #BELL -0x08 0x0008 #BACKSPACE -0x09 0x0009 #HORIZONTAL TABULATION -0x0A 0x000A #LINE FEED -0x0B 0x000B #VERTICAL TABULATION -0x0C 0x000C #FORM FEED -0x0D 0x000D #CARRIAGE RETURN -0x0E 0x000E #SHIFT OUT -0x0F 0x000F #SHIFT IN -0x10 0x0010 #DATA LINK ESCAPE -0x11 0x0011 #DEVICE CONTROL ONE -0x12 0x0012 #DEVICE CONTROL TWO -0x13 0x0013 #DEVICE CONTROL THREE -0x14 0x0014 #DEVICE CONTROL FOUR -0x15 0x0015 #NEGATIVE ACKNOWLEDGE -0x16 0x0016 #SYNCHRONOUS IDLE -0x17 0x0017 #END OF TRANSMISSION BLOCK -0x18 0x0018 #CANCEL -0x19 0x0019 #END OF MEDIUM -0x1A 0x001A #SUBSTITUTE -0x1B 0x001B #ESCAPE -0x1C 0x001C #FILE SEPARATOR -0x1D 0x001D #GROUP SEPARATOR -0x1E 0x001E #RECORD SEPARATOR -0x1F 0x001F #UNIT SEPARATOR -0x20 0x0020 #SPACE -0x21 0x0021 #EXCLAMATION MARK -0x22 0x0022 #QUOTATION MARK -0x23 0x0023 #NUMBER SIGN -0x24 0x0024 #DOLLAR SIGN -0x25 0x0025 #PERCENT SIGN -0x26 0x0026 #AMPERSAND -0x27 0x0027 #APOSTROPHE -0x28 0x0028 #LEFT PARENTHESIS -0x29 0x0029 #RIGHT PARENTHESIS -0x2A 0x002A #ASTERISK -0x2B 0x002B #PLUS SIGN -0x2C 0x002C #COMMA -0x2D 0x002D #HYPHEN-MINUS -0x2E 0x002E #FULL STOP -0x2F 0x002F #SOLIDUS -0x30 0x0030 #DIGIT ZERO -0x31 0x0031 #DIGIT ONE -0x32 0x0032 #DIGIT TWO -0x33 0x0033 #DIGIT THREE -0x34 0x0034 #DIGIT FOUR -0x35 0x0035 #DIGIT FIVE -0x36 0x0036 #DIGIT SIX -0x37 0x0037 #DIGIT SEVEN -0x38 0x0038 #DIGIT EIGHT -0x39 0x0039 #DIGIT NINE -0x3A 0x003A #COLON -0x3B 0x003B #SEMICOLON -0x3C 0x003C #LESS-THAN SIGN -0x3D 0x003D #EQUALS SIGN -0x3E 0x003E #GREATER-THAN SIGN -0x3F 0x003F #QUESTION MARK -0x40 0x0040 #COMMERCIAL AT -0x41 0x0041 #LATIN CAPITAL LETTER A -0x42 0x0042 #LATIN CAPITAL LETTER B -0x43 0x0043 #LATIN CAPITAL LETTER C -0x44 0x0044 #LATIN CAPITAL LETTER D -0x45 0x0045 #LATIN CAPITAL LETTER E -0x46 0x0046 #LATIN CAPITAL LETTER F -0x47 0x0047 #LATIN CAPITAL LETTER G -0x48 0x0048 #LATIN CAPITAL LETTER H -0x49 0x0049 #LATIN CAPITAL LETTER I -0x4A 0x004A #LATIN CAPITAL LETTER J -0x4B 0x004B #LATIN CAPITAL LETTER K -0x4C 0x004C #LATIN CAPITAL LETTER L -0x4D 0x004D #LATIN CAPITAL LETTER M -0x4E 0x004E #LATIN CAPITAL LETTER N -0x4F 0x004F #LATIN CAPITAL LETTER O -0x50 0x0050 #LATIN CAPITAL LETTER P -0x51 0x0051 #LATIN CAPITAL LETTER Q -0x52 0x0052 #LATIN CAPITAL LETTER R -0x53 0x0053 #LATIN CAPITAL LETTER S -0x54 0x0054 #LATIN CAPITAL LETTER T -0x55 0x0055 #LATIN CAPITAL LETTER U -0x56 0x0056 #LATIN CAPITAL LETTER V -0x57 0x0057 #LATIN CAPITAL LETTER W -0x58 0x0058 #LATIN CAPITAL LETTER X -0x59 0x0059 #LATIN CAPITAL LETTER Y -0x5A 0x005A #LATIN CAPITAL LETTER Z -0x5B 0x005B #LEFT SQUARE BRACKET -0x5C 0x005C #REVERSE SOLIDUS -0x5D 0x005D #RIGHT SQUARE BRACKET -0x5E 0x005E #CIRCUMFLEX ACCENT -0x5F 0x005F #LOW LINE -0x60 0x0060 #GRAVE ACCENT -0x61 0x0061 #LATIN SMALL LETTER A -0x62 0x0062 #LATIN SMALL LETTER B -0x63 0x0063 #LATIN SMALL LETTER C -0x64 0x0064 #LATIN SMALL LETTER D -0x65 0x0065 #LATIN SMALL LETTER E -0x66 0x0066 #LATIN SMALL LETTER F -0x67 0x0067 #LATIN SMALL LETTER G -0x68 0x0068 #LATIN SMALL LETTER H -0x69 0x0069 #LATIN SMALL LETTER I -0x6A 0x006A #LATIN SMALL LETTER J -0x6B 0x006B #LATIN SMALL LETTER K -0x6C 0x006C #LATIN SMALL LETTER L -0x6D 0x006D #LATIN SMALL LETTER M -0x6E 0x006E #LATIN SMALL LETTER N -0x6F 0x006F #LATIN SMALL LETTER O -0x70 0x0070 #LATIN SMALL LETTER P -0x71 0x0071 #LATIN SMALL LETTER Q -0x72 0x0072 #LATIN SMALL LETTER R -0x73 0x0073 #LATIN SMALL LETTER S -0x74 0x0074 #LATIN SMALL LETTER T -0x75 0x0075 #LATIN SMALL LETTER U -0x76 0x0076 #LATIN SMALL LETTER V -0x77 0x0077 #LATIN SMALL LETTER W -0x78 0x0078 #LATIN SMALL LETTER X -0x79 0x0079 #LATIN SMALL LETTER Y -0x7A 0x007A #LATIN SMALL LETTER Z -0x7B 0x007B #LEFT CURLY BRACKET -0x7C 0x007C #VERTICAL LINE -0x7D 0x007D #RIGHT CURLY BRACKET -0x7E 0x007E #TILDE -0x7F 0x007F #DELETE -0x80 0x20AC #EURO SIGN -0x81 #UNDEFINED -0x82 0x201A #SINGLE LOW-9 QUOTATION MARK -0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK -0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK -0x85 0x2026 #HORIZONTAL ELLIPSIS -0x86 0x2020 #DAGGER -0x87 0x2021 #DOUBLE DAGGER -0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT -0x89 0x2030 #PER MILLE SIGN -0x8A #UNDEFINED -0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK -0x8C 0x0152 #LATIN CAPITAL LIGATURE OE -0x8D #UNDEFINED -0x8E #UNDEFINED -0x8F #UNDEFINED -0x90 #UNDEFINED -0x91 0x2018 #LEFT SINGLE QUOTATION MARK -0x92 0x2019 #RIGHT SINGLE QUOTATION MARK -0x93 0x201C #LEFT DOUBLE QUOTATION MARK -0x94 0x201D #RIGHT DOUBLE QUOTATION MARK -0x95 0x2022 #BULLET -0x96 0x2013 #EN DASH -0x97 0x2014 #EM DASH -0x98 0x02DC #SMALL TILDE -0x99 0x2122 #TRADE MARK SIGN -0x9A #UNDEFINED -0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0x9C 0x0153 #LATIN SMALL LIGATURE OE -0x9D #UNDEFINED -0x9E #UNDEFINED -0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS -0xA0 0x00A0 #NO-BREAK SPACE -0xA1 0x00A1 #INVERTED EXCLAMATION MARK -0xA2 0x00A2 #CENT SIGN -0xA3 0x00A3 #POUND SIGN -0xA4 0x00A4 #CURRENCY SIGN -0xA5 0x00A5 #YEN SIGN -0xA6 0x00A6 #BROKEN BAR -0xA7 0x00A7 #SECTION SIGN -0xA8 0x00A8 #DIAERESIS -0xA9 0x00A9 #COPYRIGHT SIGN -0xAA 0x00AA #FEMININE ORDINAL INDICATOR -0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC #NOT SIGN -0xAD 0x00AD #SOFT HYPHEN -0xAE 0x00AE #REGISTERED SIGN -0xAF 0x00AF #MACRON -0xB0 0x00B0 #DEGREE SIGN -0xB1 0x00B1 #PLUS-MINUS SIGN -0xB2 0x00B2 #SUPERSCRIPT TWO -0xB3 0x00B3 #SUPERSCRIPT THREE -0xB4 0x00B4 #ACUTE ACCENT -0xB5 0x00B5 #MICRO SIGN -0xB6 0x00B6 #PILCROW SIGN -0xB7 0x00B7 #MIDDLE DOT -0xB8 0x00B8 #CEDILLA -0xB9 0x00B9 #SUPERSCRIPT ONE -0xBA 0x00BA #MASCULINE ORDINAL INDICATOR -0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC #VULGAR FRACTION ONE QUARTER -0xBD 0x00BD #VULGAR FRACTION ONE HALF -0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS -0xBF 0x00BF #INVERTED QUESTION MARK -0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE -0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 #LATIN CAPITAL LETTER AE -0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x0300 #COMBINING GRAVE ACCENT -0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE -0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x0309 #COMBINING HOOK ABOVE -0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x01A0 #LATIN CAPITAL LETTER O WITH HORN -0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 #MULTIPLICATION SIGN -0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x01AF #LATIN CAPITAL LETTER U WITH HORN -0xDE 0x0303 #COMBINING TILDE -0xDF 0x00DF #LATIN SMALL LETTER SHARP S -0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE -0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 #LATIN SMALL LETTER AE -0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x0301 #COMBINING ACUTE ACCENT -0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE -0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE -0xF2 0x0323 #COMBINING DOT BELOW -0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x01A1 #LATIN SMALL LETTER O WITH HORN -0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 #DIVISION SIGN -0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x01B0 #LATIN SMALL LETTER U WITH HORN -0xFE 0x20AB #DONG SIGN -0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/program/lib/encoding/ISO-8859-1.map b/program/lib/encoding/ISO-8859-1.map deleted file mode 100644 index 473ecabc1..000000000 --- a/program/lib/encoding/ISO-8859-1.map +++ /dev/null @@ -1,303 +0,0 @@ -# -# Name: ISO/IEC 8859-1:1998 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-1:1998 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-1 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x00A1 # INVERTED EXCLAMATION MARK -0xA2 0x00A2 # CENT SIGN -0xA3 0x00A3 # POUND SIGN -0xA4 0x00A4 # CURRENCY SIGN -0xA5 0x00A5 # YEN SIGN -0xA6 0x00A6 # BROKEN BAR -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x00AA # FEMININE ORDINAL INDICATOR -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC # NOT SIGN -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x00AE # REGISTERED SIGN -0xAF 0x00AF # MACRON -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x00B4 # ACUTE ACCENT -0xB5 0x00B5 # MICRO SIGN -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x00B8 # CEDILLA -0xB9 0x00B9 # SUPERSCRIPT ONE -0xBA 0x00BA # MASCULINE ORDINAL INDICATOR -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC # VULGAR FRACTION ONE QUARTER -0xBD 0x00BD # VULGAR FRACTION ONE HALF -0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS -0xBF 0x00BF # INVERTED QUESTION MARK -0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) -0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) -0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) -0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) -0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) -0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/program/lib/encoding/ISO-8859-10.map b/program/lib/encoding/ISO-8859-10.map deleted file mode 100644 index 374a42b1a..000000000 --- a/program/lib/encoding/ISO-8859-10.map +++ /dev/null @@ -1,303 +0,0 @@ -# -# Name: ISO/IEC 8859-10:1998 to Unicode -# Unicode version: 3.0 -# Table version: 1.1 -# Table format: Format A -# Date: 1999 October 11 -# Authors: Ken Whistler -# -# Copyright (c) 1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-10:1998 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-10 order. -# -# Version history -# 1.0 version new. -# 1.1 corrected mistake in mapping of 0xA4 -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK -0xA2 0x0112 # LATIN CAPITAL LETTER E WITH MACRON -0xA3 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA -0xA4 0x012A # LATIN CAPITAL LETTER I WITH MACRON -0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE -0xA6 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA -0xA7 0x00A7 # SECTION SIGN -0xA8 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA -0xA9 0x0110 # LATIN CAPITAL LETTER D WITH STROKE -0xAA 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0xAB 0x0166 # LATIN CAPITAL LETTER T WITH STROKE -0xAC 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x016A # LATIN CAPITAL LETTER U WITH MACRON -0xAF 0x014A # LATIN CAPITAL LETTER ENG -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK -0xB2 0x0113 # LATIN SMALL LETTER E WITH MACRON -0xB3 0x0123 # LATIN SMALL LETTER G WITH CEDILLA -0xB4 0x012B # LATIN SMALL LETTER I WITH MACRON -0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE -0xB6 0x0137 # LATIN SMALL LETTER K WITH CEDILLA -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x013C # LATIN SMALL LETTER L WITH CEDILLA -0xB9 0x0111 # LATIN SMALL LETTER D WITH STROKE -0xBA 0x0161 # LATIN SMALL LETTER S WITH CARON -0xBB 0x0167 # LATIN SMALL LETTER T WITH STROKE -0xBC 0x017E # LATIN SMALL LETTER Z WITH CARON -0xBD 0x2015 # HORIZONTAL BAR -0xBE 0x016B # LATIN SMALL LETTER U WITH MACRON -0xBF 0x014B # LATIN SMALL LETTER ENG -0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK -0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) -0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA -0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x0168 # LATIN CAPITAL LETTER U WITH TILDE -0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) -0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) -0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK -0xE8 0x010D # LATIN SMALL LETTER C WITH CARON -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) -0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA -0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x0169 # LATIN SMALL LETTER U WITH TILDE -0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) -0xFF 0x0138 # LATIN SMALL LETTER KRA diff --git a/program/lib/encoding/ISO-8859-11.map b/program/lib/encoding/ISO-8859-11.map deleted file mode 100644 index 192bd9d7c..000000000 --- a/program/lib/encoding/ISO-8859-11.map +++ /dev/null @@ -1,297 +0,0 @@ -# -# Name: ISO/IEC 8859-11:2001 to Unicode -# Unicode version: 3.2 -# Table version: 1.0 -# Table format: Format A -# Date: 2002 October 7 -# Authors: Ken Whistler -# -# Copyright (c) 2002 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-11:2001 characters map into Unicode. -# -# ISO/IEC 8859-11:2001 is equivalent to TIS 620-2533 (1990) with -# the addition of 0xA0 NO-BREAK SPACE. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-11 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-11 order. -# -# Version history: -# 2002 October 7 Created -# -# Updated versions of this file may be found in: -# -# -# For any comments or problems, please use the Unicode -# web contact form at: -# http://www.unicode.org/unicode/reporting.html -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0E01 # THAI CHARACTER KO KAI -0xA2 0x0E02 # THAI CHARACTER KHO KHAI -0xA3 0x0E03 # THAI CHARACTER KHO KHUAT -0xA4 0x0E04 # THAI CHARACTER KHO KHWAI -0xA5 0x0E05 # THAI CHARACTER KHO KHON -0xA6 0x0E06 # THAI CHARACTER KHO RAKHANG -0xA7 0x0E07 # THAI CHARACTER NGO NGU -0xA8 0x0E08 # THAI CHARACTER CHO CHAN -0xA9 0x0E09 # THAI CHARACTER CHO CHING -0xAA 0x0E0A # THAI CHARACTER CHO CHANG -0xAB 0x0E0B # THAI CHARACTER SO SO -0xAC 0x0E0C # THAI CHARACTER CHO CHOE -0xAD 0x0E0D # THAI CHARACTER YO YING -0xAE 0x0E0E # THAI CHARACTER DO CHADA -0xAF 0x0E0F # THAI CHARACTER TO PATAK -0xB0 0x0E10 # THAI CHARACTER THO THAN -0xB1 0x0E11 # THAI CHARACTER THO NANGMONTHO -0xB2 0x0E12 # THAI CHARACTER THO PHUTHAO -0xB3 0x0E13 # THAI CHARACTER NO NEN -0xB4 0x0E14 # THAI CHARACTER DO DEK -0xB5 0x0E15 # THAI CHARACTER TO TAO -0xB6 0x0E16 # THAI CHARACTER THO THUNG -0xB7 0x0E17 # THAI CHARACTER THO THAHAN -0xB8 0x0E18 # THAI CHARACTER THO THONG -0xB9 0x0E19 # THAI CHARACTER NO NU -0xBA 0x0E1A # THAI CHARACTER BO BAIMAI -0xBB 0x0E1B # THAI CHARACTER PO PLA -0xBC 0x0E1C # THAI CHARACTER PHO PHUNG -0xBD 0x0E1D # THAI CHARACTER FO FA -0xBE 0x0E1E # THAI CHARACTER PHO PHAN -0xBF 0x0E1F # THAI CHARACTER FO FAN -0xC0 0x0E20 # THAI CHARACTER PHO SAMPHAO -0xC1 0x0E21 # THAI CHARACTER MO MA -0xC2 0x0E22 # THAI CHARACTER YO YAK -0xC3 0x0E23 # THAI CHARACTER RO RUA -0xC4 0x0E24 # THAI CHARACTER RU -0xC5 0x0E25 # THAI CHARACTER LO LING -0xC6 0x0E26 # THAI CHARACTER LU -0xC7 0x0E27 # THAI CHARACTER WO WAEN -0xC8 0x0E28 # THAI CHARACTER SO SALA -0xC9 0x0E29 # THAI CHARACTER SO RUSI -0xCA 0x0E2A # THAI CHARACTER SO SUA -0xCB 0x0E2B # THAI CHARACTER HO HIP -0xCC 0x0E2C # THAI CHARACTER LO CHULA -0xCD 0x0E2D # THAI CHARACTER O ANG -0xCE 0x0E2E # THAI CHARACTER HO NOKHUK -0xCF 0x0E2F # THAI CHARACTER PAIYANNOI -0xD0 0x0E30 # THAI CHARACTER SARA A -0xD1 0x0E31 # THAI CHARACTER MAI HAN-AKAT -0xD2 0x0E32 # THAI CHARACTER SARA AA -0xD3 0x0E33 # THAI CHARACTER SARA AM -0xD4 0x0E34 # THAI CHARACTER SARA I -0xD5 0x0E35 # THAI CHARACTER SARA II -0xD6 0x0E36 # THAI CHARACTER SARA UE -0xD7 0x0E37 # THAI CHARACTER SARA UEE -0xD8 0x0E38 # THAI CHARACTER SARA U -0xD9 0x0E39 # THAI CHARACTER SARA UU -0xDA 0x0E3A # THAI CHARACTER PHINTHU -0xDF 0x0E3F # THAI CURRENCY SYMBOL BAHT -0xE0 0x0E40 # THAI CHARACTER SARA E -0xE1 0x0E41 # THAI CHARACTER SARA AE -0xE2 0x0E42 # THAI CHARACTER SARA O -0xE3 0x0E43 # THAI CHARACTER SARA AI MAIMUAN -0xE4 0x0E44 # THAI CHARACTER SARA AI MAIMALAI -0xE5 0x0E45 # THAI CHARACTER LAKKHANGYAO -0xE6 0x0E46 # THAI CHARACTER MAIYAMOK -0xE7 0x0E47 # THAI CHARACTER MAITAIKHU -0xE8 0x0E48 # THAI CHARACTER MAI EK -0xE9 0x0E49 # THAI CHARACTER MAI THO -0xEA 0x0E4A # THAI CHARACTER MAI TRI -0xEB 0x0E4B # THAI CHARACTER MAI CHATTAWA -0xEC 0x0E4C # THAI CHARACTER THANTHAKHAT -0xED 0x0E4D # THAI CHARACTER NIKHAHIT -0xEE 0x0E4E # THAI CHARACTER YAMAKKAN -0xEF 0x0E4F # THAI CHARACTER FONGMAN -0xF0 0x0E50 # THAI DIGIT ZERO -0xF1 0x0E51 # THAI DIGIT ONE -0xF2 0x0E52 # THAI DIGIT TWO -0xF3 0x0E53 # THAI DIGIT THREE -0xF4 0x0E54 # THAI DIGIT FOUR -0xF5 0x0E55 # THAI DIGIT FIVE -0xF6 0x0E56 # THAI DIGIT SIX -0xF7 0x0E57 # THAI DIGIT SEVEN -0xF8 0x0E58 # THAI DIGIT EIGHT -0xF9 0x0E59 # THAI DIGIT NINE -0xFA 0x0E5A # THAI CHARACTER ANGKHANKHU -0xFB 0x0E5B # THAI CHARACTER KHOMUT diff --git a/program/lib/encoding/ISO-8859-13.map b/program/lib/encoding/ISO-8859-13.map deleted file mode 100644 index cd11b53fd..000000000 --- a/program/lib/encoding/ISO-8859-13.map +++ /dev/null @@ -1,299 +0,0 @@ -# -# Name: ISO/IEC 8859-13:1998 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-13:1998 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-13 order. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x201D # RIGHT DOUBLE QUOTATION MARK -0xA2 0x00A2 # CENT SIGN -0xA3 0x00A3 # POUND SIGN -0xA4 0x00A4 # CURRENCY SIGN -0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK -0xA6 0x00A6 # BROKEN BAR -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC # NOT SIGN -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x00AE # REGISTERED SIGN -0xAF 0x00C6 # LATIN CAPITAL LETTER AE -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x201C # LEFT DOUBLE QUOTATION MARK -0xB5 0x00B5 # MICRO SIGN -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xB9 0x00B9 # SUPERSCRIPT ONE -0xBA 0x0157 # LATIN SMALL LETTER R WITH CEDILLA -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC # VULGAR FRACTION ONE QUARTER -0xBD 0x00BD # VULGAR FRACTION ONE HALF -0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS -0xBF 0x00E6 # LATIN SMALL LETTER AE -0xC0 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK -0xC1 0x012E # LATIN CAPITAL LETTER I WITH OGONEK -0xC2 0x0100 # LATIN CAPITAL LETTER A WITH MACRON -0xC3 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK -0xC7 0x0112 # LATIN CAPITAL LETTER E WITH MACRON -0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE -0xCB 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE -0xCC 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA -0xCD 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA -0xCE 0x012A # LATIN CAPITAL LETTER I WITH MACRON -0xCF 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA -0xD0 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE -0xD2 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x014C # LATIN CAPITAL LETTER O WITH MACRON -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK -0xD9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE -0xDA 0x015A # LATIN CAPITAL LETTER S WITH ACUTE -0xDB 0x016A # LATIN CAPITAL LETTER U WITH MACRON -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE -0xDE 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) -0xE0 0x0105 # LATIN SMALL LETTER A WITH OGONEK -0xE1 0x012F # LATIN SMALL LETTER I WITH OGONEK -0xE2 0x0101 # LATIN SMALL LETTER A WITH MACRON -0xE3 0x0107 # LATIN SMALL LETTER C WITH ACUTE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x0119 # LATIN SMALL LETTER E WITH OGONEK -0xE7 0x0113 # LATIN SMALL LETTER E WITH MACRON -0xE8 0x010D # LATIN SMALL LETTER C WITH CARON -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x017A # LATIN SMALL LETTER Z WITH ACUTE -0xEB 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE -0xEC 0x0123 # LATIN SMALL LETTER G WITH CEDILLA -0xED 0x0137 # LATIN SMALL LETTER K WITH CEDILLA -0xEE 0x012B # LATIN SMALL LETTER I WITH MACRON -0xEF 0x013C # LATIN SMALL LETTER L WITH CEDILLA -0xF0 0x0161 # LATIN SMALL LETTER S WITH CARON -0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE -0xF2 0x0146 # LATIN SMALL LETTER N WITH CEDILLA -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x014D # LATIN SMALL LETTER O WITH MACRON -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x0173 # LATIN SMALL LETTER U WITH OGONEK -0xF9 0x0142 # LATIN SMALL LETTER L WITH STROKE -0xFA 0x015B # LATIN SMALL LETTER S WITH ACUTE -0xFB 0x016B # LATIN SMALL LETTER U WITH MACRON -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE -0xFE 0x017E # LATIN SMALL LETTER Z WITH CARON -0xFF 0x2019 # RIGHT SINGLE QUOTATION MARK diff --git a/program/lib/encoding/ISO-8859-14.map b/program/lib/encoding/ISO-8859-14.map deleted file mode 100644 index 73e98555e..000000000 --- a/program/lib/encoding/ISO-8859-14.map +++ /dev/null @@ -1,301 +0,0 @@ -# -# Name: ISO/IEC 8859-14:1998 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Markus Kuhn -# Ken Whistler -# -# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-14:1998 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-14 order. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE -0xA2 0x1E03 # LATIN SMALL LETTER B WITH DOT ABOVE -0xA3 0x00A3 # POUND SIGN -0xA4 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE -0xA5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE -0xA6 0x1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE -0xA7 0x00A7 # SECTION SIGN -0xA8 0x1E80 # LATIN CAPITAL LETTER W WITH GRAVE -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x1E82 # LATIN CAPITAL LETTER W WITH ACUTE -0xAB 0x1E0B # LATIN SMALL LETTER D WITH DOT ABOVE -0xAC 0x1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x00AE # REGISTERED SIGN -0xAF 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS -0xB0 0x1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE -0xB1 0x1E1F # LATIN SMALL LETTER F WITH DOT ABOVE -0xB2 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE -0xB3 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE -0xB4 0x1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE -0xB5 0x1E41 # LATIN SMALL LETTER M WITH DOT ABOVE -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE -0xB8 0x1E81 # LATIN SMALL LETTER W WITH GRAVE -0xB9 0x1E57 # LATIN SMALL LETTER P WITH DOT ABOVE -0xBA 0x1E83 # LATIN SMALL LETTER W WITH ACUTE -0xBB 0x1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE -0xBC 0x1EF3 # LATIN SMALL LETTER Y WITH GRAVE -0xBD 0x1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS -0xBE 0x1E85 # LATIN SMALL LETTER W WITH DIAERESIS -0xBF 0x1E61 # LATIN SMALL LETTER S WITH DOT ABOVE -0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX -0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE -0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX -0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x1E6B # LATIN SMALL LETTER T WITH DOT ABOVE -0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX -0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS - diff --git a/program/lib/encoding/ISO-8859-15.map b/program/lib/encoding/ISO-8859-15.map deleted file mode 100644 index ab2f32fce..000000000 --- a/program/lib/encoding/ISO-8859-15.map +++ /dev/null @@ -1,303 +0,0 @@ -# -# Name: ISO/IEC 8859-15:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Markus Kuhn -# Ken Whistler -# -# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-15:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-15 order. -# -# Version history -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x00A1 # INVERTED EXCLAMATION MARK -0xA2 0x00A2 # CENT SIGN -0xA3 0x00A3 # POUND SIGN -0xA4 0x20AC # EURO SIGN -0xA5 0x00A5 # YEN SIGN -0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0xA7 0x00A7 # SECTION SIGN -0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x00AA # FEMININE ORDINAL INDICATOR -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC # NOT SIGN -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x00AE # REGISTERED SIGN -0xAF 0x00AF # MACRON -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0xB5 0x00B5 # MICRO SIGN -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON -0xB9 0x00B9 # SUPERSCRIPT ONE -0xBA 0x00BA # MASCULINE ORDINAL INDICATOR -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x0152 # LATIN CAPITAL LIGATURE OE -0xBD 0x0153 # LATIN SMALL LIGATURE OE -0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS -0xBF 0x00BF # INVERTED QUESTION MARK -0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x00D0 # LATIN CAPITAL LETTER ETH -0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x00DE # LATIN CAPITAL LETTER THORN -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x00F0 # LATIN SMALL LETTER ETH -0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x00FE # LATIN SMALL LETTER THORN -0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS - diff --git a/program/lib/encoding/ISO-8859-16.map b/program/lib/encoding/ISO-8859-16.map deleted file mode 100644 index c0dcf0dac..000000000 --- a/program/lib/encoding/ISO-8859-16.map +++ /dev/null @@ -1,299 +0,0 @@ -# -# Name: ISO/IEC 8859-16:2001 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 2001 July 26 -# Authors: Markus Kuhn -# -# Copyright (c) 1999-2001 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-16:2001 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-16 order. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK -0xA2 0x0105 # LATIN SMALL LETTER A WITH OGONEK -0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE -0xA4 0x20AC # EURO SIGN -0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK -0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0xA7 0x00A7 # SECTION SIGN -0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x017A # LATIN SMALL LETTER Z WITH ACUTE -0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x010C # LATIN CAPITAL LETTER C WITH CARON -0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE -0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0xB5 0x201D # RIGHT DOUBLE QUOTATION MARK -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON -0xB9 0x010D # LATIN SMALL LETTER C WITH CARON -0xBA 0x0219 # LATIN SMALL LETTER S WITH COMMA BELOW -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x0152 # LATIN CAPITAL LIGATURE OE -0xBD 0x0153 # LATIN SMALL LIGATURE OE -0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS -0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE -0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE -0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE -0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x015A # LATIN CAPITAL LETTER S WITH ACUTE -0xD8 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK -0xDE 0x021A # LATIN CAPITAL LETTER T WITH COMMA BELOW -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x0107 # LATIN SMALL LETTER C WITH ACUTE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE -0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE -0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x015B # LATIN SMALL LETTER S WITH ACUTE -0xF8 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE -0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x0119 # LATIN SMALL LETTER E WITH OGONEK -0xFE 0x021B # LATIN SMALL LETTER T WITH COMMA BELOW -0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/program/lib/encoding/ISO-8859-2.map b/program/lib/encoding/ISO-8859-2.map deleted file mode 100644 index e45df25eb..000000000 --- a/program/lib/encoding/ISO-8859-2.map +++ /dev/null @@ -1,303 +0,0 @@ -# -# Name: ISO 8859-2:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-2:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-2 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK -0xA2 0x02D8 # BREVE -0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE -0xA4 0x00A4 # CURRENCY SIGN -0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON -0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA -0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON -0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK -0xB2 0x02DB # OGONEK -0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE -0xB4 0x00B4 # ACUTE ACCENT -0xB5 0x013E # LATIN SMALL LETTER L WITH CARON -0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE -0xB7 0x02C7 # CARON -0xB8 0x00B8 # CEDILLA -0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON -0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA -0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON -0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE -0xBD 0x02DD # DOUBLE ACUTE ACCENT -0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON -0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE -0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE -0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON -0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE -0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE -0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON -0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE -0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE -0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x010D # LATIN SMALL LETTER C WITH CARON -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x011B # LATIN SMALL LETTER E WITH CARON -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x010F # LATIN SMALL LETTER D WITH CARON -0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE -0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE -0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON -0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE -0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA -0xFF 0x02D9 # DOT ABOVE diff --git a/program/lib/encoding/ISO-8859-3.map b/program/lib/encoding/ISO-8859-3.map deleted file mode 100644 index 9b6ac69dd..000000000 --- a/program/lib/encoding/ISO-8859-3.map +++ /dev/null @@ -1,296 +0,0 @@ -# -# Name: ISO/IEC 8859-3:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-3:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-3 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0126 # LATIN CAPITAL LETTER H WITH STROKE -0xA2 0x02D8 # BREVE -0xA3 0x00A3 # POUND SIGN -0xA4 0x00A4 # CURRENCY SIGN -0xA6 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE -0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA -0xAB 0x011E # LATIN CAPITAL LETTER G WITH BREVE -0xAC 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX -0xAD 0x00AD # SOFT HYPHEN -0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x0127 # LATIN SMALL LETTER H WITH STROKE -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x00B4 # ACUTE ACCENT -0xB5 0x00B5 # MICRO SIGN -0xB6 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x00B8 # CEDILLA -0xB9 0x0131 # LATIN SMALL LETTER DOTLESS I -0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA -0xBB 0x011F # LATIN SMALL LETTER G WITH BREVE -0xBC 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX -0xBD 0x00BD # VULGAR FRACTION ONE HALF -0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE -0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE -0xC6 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX -0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x016C # LATIN CAPITAL LETTER U WITH BREVE -0xDE 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE -0xE6 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX -0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x016D # LATIN SMALL LETTER U WITH BREVE -0xFE 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX -0xFF 0x02D9 # DOT ABOVE diff --git a/program/lib/encoding/ISO-8859-4.map b/program/lib/encoding/ISO-8859-4.map deleted file mode 100644 index 662e698ab..000000000 --- a/program/lib/encoding/ISO-8859-4.map +++ /dev/null @@ -1,303 +0,0 @@ -# -# Name: ISO/IEC 8859-4:1998 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-4:1998 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-4 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK -0xA2 0x0138 # LATIN SMALL LETTER KRA -0xA3 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA -0xA4 0x00A4 # CURRENCY SIGN -0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE -0xA6 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0xAA 0x0112 # LATIN CAPITAL LETTER E WITH MACRON -0xAB 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA -0xAC 0x0166 # LATIN CAPITAL LETTER T WITH STROKE -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0xAF 0x00AF # MACRON -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK -0xB2 0x02DB # OGONEK -0xB3 0x0157 # LATIN SMALL LETTER R WITH CEDILLA -0xB4 0x00B4 # ACUTE ACCENT -0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE -0xB6 0x013C # LATIN SMALL LETTER L WITH CEDILLA -0xB7 0x02C7 # CARON -0xB8 0x00B8 # CEDILLA -0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON -0xBA 0x0113 # LATIN SMALL LETTER E WITH MACRON -0xBB 0x0123 # LATIN SMALL LETTER G WITH CEDILLA -0xBC 0x0167 # LATIN SMALL LETTER T WITH STROKE -0xBD 0x014A # LATIN CAPITAL LETTER ENG -0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON -0xBF 0x014B # LATIN SMALL LETTER ENG -0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK -0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x012A # LATIN CAPITAL LETTER I WITH MACRON -0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE -0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA -0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON -0xD3 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x0168 # LATIN CAPITAL LETTER U WITH TILDE -0xDE 0x016A # LATIN CAPITAL LETTER U WITH MACRON -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK -0xE8 0x010D # LATIN SMALL LETTER C WITH CARON -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x012B # LATIN SMALL LETTER I WITH MACRON -0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE -0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA -0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON -0xF3 0x0137 # LATIN SMALL LETTER K WITH CEDILLA -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x0169 # LATIN SMALL LETTER U WITH TILDE -0xFE 0x016B # LATIN SMALL LETTER U WITH MACRON -0xFF 0x02D9 # DOT ABOVE diff --git a/program/lib/encoding/ISO-8859-5.map b/program/lib/encoding/ISO-8859-5.map deleted file mode 100644 index a7ed1ce2a..000000000 --- a/program/lib/encoding/ISO-8859-5.map +++ /dev/null @@ -1,303 +0,0 @@ -# -# Name: ISO 8859-5:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-5:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-5 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO -0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE -0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE -0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE -0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE -0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI -0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE -0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE -0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE -0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE -0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U -0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE -0xB0 0x0410 # CYRILLIC CAPITAL LETTER A -0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE -0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE -0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE -0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE -0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE -0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE -0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE -0xB8 0x0418 # CYRILLIC CAPITAL LETTER I -0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I -0xBA 0x041A # CYRILLIC CAPITAL LETTER KA -0xBB 0x041B # CYRILLIC CAPITAL LETTER EL -0xBC 0x041C # CYRILLIC CAPITAL LETTER EM -0xBD 0x041D # CYRILLIC CAPITAL LETTER EN -0xBE 0x041E # CYRILLIC CAPITAL LETTER O -0xBF 0x041F # CYRILLIC CAPITAL LETTER PE -0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER -0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES -0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE -0xC3 0x0423 # CYRILLIC CAPITAL LETTER U -0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF -0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA -0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE -0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE -0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA -0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA -0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN -0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU -0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN -0xCD 0x042D # CYRILLIC CAPITAL LETTER E -0xCE 0x042E # CYRILLIC CAPITAL LETTER YU -0xCF 0x042F # CYRILLIC CAPITAL LETTER YA -0xD0 0x0430 # CYRILLIC SMALL LETTER A -0xD1 0x0431 # CYRILLIC SMALL LETTER BE -0xD2 0x0432 # CYRILLIC SMALL LETTER VE -0xD3 0x0433 # CYRILLIC SMALL LETTER GHE -0xD4 0x0434 # CYRILLIC SMALL LETTER DE -0xD5 0x0435 # CYRILLIC SMALL LETTER IE -0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE -0xD7 0x0437 # CYRILLIC SMALL LETTER ZE -0xD8 0x0438 # CYRILLIC SMALL LETTER I -0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I -0xDA 0x043A # CYRILLIC SMALL LETTER KA -0xDB 0x043B # CYRILLIC SMALL LETTER EL -0xDC 0x043C # CYRILLIC SMALL LETTER EM -0xDD 0x043D # CYRILLIC SMALL LETTER EN -0xDE 0x043E # CYRILLIC SMALL LETTER O -0xDF 0x043F # CYRILLIC SMALL LETTER PE -0xE0 0x0440 # CYRILLIC SMALL LETTER ER -0xE1 0x0441 # CYRILLIC SMALL LETTER ES -0xE2 0x0442 # CYRILLIC SMALL LETTER TE -0xE3 0x0443 # CYRILLIC SMALL LETTER U -0xE4 0x0444 # CYRILLIC SMALL LETTER EF -0xE5 0x0445 # CYRILLIC SMALL LETTER HA -0xE6 0x0446 # CYRILLIC SMALL LETTER TSE -0xE7 0x0447 # CYRILLIC SMALL LETTER CHE -0xE8 0x0448 # CYRILLIC SMALL LETTER SHA -0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA -0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN -0xEB 0x044B # CYRILLIC SMALL LETTER YERU -0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN -0xED 0x044D # CYRILLIC SMALL LETTER E -0xEE 0x044E # CYRILLIC SMALL LETTER YU -0xEF 0x044F # CYRILLIC SMALL LETTER YA -0xF0 0x2116 # NUMERO SIGN -0xF1 0x0451 # CYRILLIC SMALL LETTER IO -0xF2 0x0452 # CYRILLIC SMALL LETTER DJE -0xF3 0x0453 # CYRILLIC SMALL LETTER GJE -0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE -0xF5 0x0455 # CYRILLIC SMALL LETTER DZE -0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -0xF7 0x0457 # CYRILLIC SMALL LETTER YI -0xF8 0x0458 # CYRILLIC SMALL LETTER JE -0xF9 0x0459 # CYRILLIC SMALL LETTER LJE -0xFA 0x045A # CYRILLIC SMALL LETTER NJE -0xFB 0x045B # CYRILLIC SMALL LETTER TSHE -0xFC 0x045C # CYRILLIC SMALL LETTER KJE -0xFD 0x00A7 # SECTION SIGN -0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U -0xFF 0x045F # CYRILLIC SMALL LETTER DZHE diff --git a/program/lib/encoding/ISO-8859-6.map b/program/lib/encoding/ISO-8859-6.map deleted file mode 100644 index 69ac7f589..000000000 --- a/program/lib/encoding/ISO-8859-6.map +++ /dev/null @@ -1,260 +0,0 @@ -# -# Name: ISO 8859-6:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-6:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-6 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# 0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead -# of the Arabic digits (U+0660..U+0669). -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA4 0x00A4 # CURRENCY SIGN -0xAC 0x060C # ARABIC COMMA -0xAD 0x00AD # SOFT HYPHEN -0xBB 0x061B # ARABIC SEMICOLON -0xBF 0x061F # ARABIC QUESTION MARK -0xC1 0x0621 # ARABIC LETTER HAMZA -0xC2 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE -0xC3 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE -0xC4 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE -0xC5 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW -0xC6 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE -0xC7 0x0627 # ARABIC LETTER ALEF -0xC8 0x0628 # ARABIC LETTER BEH -0xC9 0x0629 # ARABIC LETTER TEH MARBUTA -0xCA 0x062A # ARABIC LETTER TEH -0xCB 0x062B # ARABIC LETTER THEH -0xCC 0x062C # ARABIC LETTER JEEM -0xCD 0x062D # ARABIC LETTER HAH -0xCE 0x062E # ARABIC LETTER KHAH -0xCF 0x062F # ARABIC LETTER DAL -0xD0 0x0630 # ARABIC LETTER THAL -0xD1 0x0631 # ARABIC LETTER REH -0xD2 0x0632 # ARABIC LETTER ZAIN -0xD3 0x0633 # ARABIC LETTER SEEN -0xD4 0x0634 # ARABIC LETTER SHEEN -0xD5 0x0635 # ARABIC LETTER SAD -0xD6 0x0636 # ARABIC LETTER DAD -0xD7 0x0637 # ARABIC LETTER TAH -0xD8 0x0638 # ARABIC LETTER ZAH -0xD9 0x0639 # ARABIC LETTER AIN -0xDA 0x063A # ARABIC LETTER GHAIN -0xE0 0x0640 # ARABIC TATWEEL -0xE1 0x0641 # ARABIC LETTER FEH -0xE2 0x0642 # ARABIC LETTER QAF -0xE3 0x0643 # ARABIC LETTER KAF -0xE4 0x0644 # ARABIC LETTER LAM -0xE5 0x0645 # ARABIC LETTER MEEM -0xE6 0x0646 # ARABIC LETTER NOON -0xE7 0x0647 # ARABIC LETTER HEH -0xE8 0x0648 # ARABIC LETTER WAW -0xE9 0x0649 # ARABIC LETTER ALEF MAKSURA -0xEA 0x064A # ARABIC LETTER YEH -0xEB 0x064B # ARABIC FATHATAN -0xEC 0x064C # ARABIC DAMMATAN -0xED 0x064D # ARABIC KASRATAN -0xEE 0x064E # ARABIC FATHA -0xEF 0x064F # ARABIC DAMMA -0xF0 0x0650 # ARABIC KASRA -0xF1 0x0651 # ARABIC SHADDA -0xF2 0x0652 # ARABIC SUKUN diff --git a/program/lib/encoding/ISO-8859-7.map b/program/lib/encoding/ISO-8859-7.map deleted file mode 100644 index bc46b7471..000000000 --- a/program/lib/encoding/ISO-8859-7.map +++ /dev/null @@ -1,308 +0,0 @@ -# -# Name: ISO 8859-7:2003 to Unicode -# Unicode version: 4.0 -# Table version: 2.0 -# Table format: Format A -# Date: 2003-Nov-12 -# Authors: Ken Whistler -# -# Copyright (c) 1991-2003 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO 8859-7:2003 characters map into Unicode. -# -# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928, -# and ECMA 118. ISO 8859-7:2003 adds two currency signs -# and one other character not in the earlier standard. -# -# Format: Three tab-separated columns -# Column #1 is the ISO 8859-7 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO 8859-7 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7 -# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7 -# -# 2.0 version updates 1.0 version by adding mappings for the -# three newly added characters 0xA4, 0xA5, 0xAA. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact the Unicode Consortium at: -# -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x2018 # LEFT SINGLE QUOTATION MARK -0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK -0xA3 0x00A3 # POUND SIGN -0xA4 0x20AC # EURO SIGN -0xA5 0x20AF # DRACHMA SIGN -0xA6 0x00A6 # BROKEN BAR -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x037A # GREEK YPOGEGRAMMENI -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC # NOT SIGN -0xAD 0x00AD # SOFT HYPHEN -0xAF 0x2015 # HORIZONTAL BAR -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x0384 # GREEK TONOS -0xB5 0x0385 # GREEK DIALYTIKA TONOS -0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS -0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS -0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS -0xBD 0x00BD # VULGAR FRACTION ONE HALF -0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS -0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS -0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA -0xC2 0x0392 # GREEK CAPITAL LETTER BETA -0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA -0xC4 0x0394 # GREEK CAPITAL LETTER DELTA -0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON -0xC6 0x0396 # GREEK CAPITAL LETTER ZETA -0xC7 0x0397 # GREEK CAPITAL LETTER ETA -0xC8 0x0398 # GREEK CAPITAL LETTER THETA -0xC9 0x0399 # GREEK CAPITAL LETTER IOTA -0xCA 0x039A # GREEK CAPITAL LETTER KAPPA -0xCB 0x039B # GREEK CAPITAL LETTER LAMDA -0xCC 0x039C # GREEK CAPITAL LETTER MU -0xCD 0x039D # GREEK CAPITAL LETTER NU -0xCE 0x039E # GREEK CAPITAL LETTER XI -0xCF 0x039F # GREEK CAPITAL LETTER OMICRON -0xD0 0x03A0 # GREEK CAPITAL LETTER PI -0xD1 0x03A1 # GREEK CAPITAL LETTER RHO -0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA -0xD4 0x03A4 # GREEK CAPITAL LETTER TAU -0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON -0xD6 0x03A6 # GREEK CAPITAL LETTER PHI -0xD7 0x03A7 # GREEK CAPITAL LETTER CHI -0xD8 0x03A8 # GREEK CAPITAL LETTER PSI -0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA -0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS -0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS -0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS -0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS -0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -0xE1 0x03B1 # GREEK SMALL LETTER ALPHA -0xE2 0x03B2 # GREEK SMALL LETTER BETA -0xE3 0x03B3 # GREEK SMALL LETTER GAMMA -0xE4 0x03B4 # GREEK SMALL LETTER DELTA -0xE5 0x03B5 # GREEK SMALL LETTER EPSILON -0xE6 0x03B6 # GREEK SMALL LETTER ZETA -0xE7 0x03B7 # GREEK SMALL LETTER ETA -0xE8 0x03B8 # GREEK SMALL LETTER THETA -0xE9 0x03B9 # GREEK SMALL LETTER IOTA -0xEA 0x03BA # GREEK SMALL LETTER KAPPA -0xEB 0x03BB # GREEK SMALL LETTER LAMDA -0xEC 0x03BC # GREEK SMALL LETTER MU -0xED 0x03BD # GREEK SMALL LETTER NU -0xEE 0x03BE # GREEK SMALL LETTER XI -0xEF 0x03BF # GREEK SMALL LETTER OMICRON -0xF0 0x03C0 # GREEK SMALL LETTER PI -0xF1 0x03C1 # GREEK SMALL LETTER RHO -0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA -0xF3 0x03C3 # GREEK SMALL LETTER SIGMA -0xF4 0x03C4 # GREEK SMALL LETTER TAU -0xF5 0x03C5 # GREEK SMALL LETTER UPSILON -0xF6 0x03C6 # GREEK SMALL LETTER PHI -0xF7 0x03C7 # GREEK SMALL LETTER CHI -0xF8 0x03C8 # GREEK SMALL LETTER PSI -0xF9 0x03C9 # GREEK SMALL LETTER OMEGA -0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA -0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA -0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS -0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS -0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS diff --git a/program/lib/encoding/ISO-8859-8.map b/program/lib/encoding/ISO-8859-8.map deleted file mode 100644 index bc8da4c7f..000000000 --- a/program/lib/encoding/ISO-8859-8.map +++ /dev/null @@ -1,270 +0,0 @@ -# -# Name: ISO/IEC 8859-8:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.1 -# Table format: Format A -# Date: 2000-Jan-03 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-8:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-8 order. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# 1.1 version updates to the published 8859-8:1999, correcting -# the mapping of 0xAF and adding mappings for LRM and RLM. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA2 0x00A2 # CENT SIGN -0xA3 0x00A3 # POUND SIGN -0xA4 0x00A4 # CURRENCY SIGN -0xA5 0x00A5 # YEN SIGN -0xA6 0x00A6 # BROKEN BAR -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x00D7 # MULTIPLICATION SIGN -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC # NOT SIGN -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x00AE # REGISTERED SIGN -0xAF 0x00AF # MACRON -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x00B4 # ACUTE ACCENT -0xB5 0x00B5 # MICRO SIGN -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x00B8 # CEDILLA -0xB9 0x00B9 # SUPERSCRIPT ONE -0xBA 0x00F7 # DIVISION SIGN -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC # VULGAR FRACTION ONE QUARTER -0xBD 0x00BD # VULGAR FRACTION ONE HALF -0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS -0xDF 0x2017 # DOUBLE LOW LINE -0xE0 0x05D0 # HEBREW LETTER ALEF -0xE1 0x05D1 # HEBREW LETTER BET -0xE2 0x05D2 # HEBREW LETTER GIMEL -0xE3 0x05D3 # HEBREW LETTER DALET -0xE4 0x05D4 # HEBREW LETTER HE -0xE5 0x05D5 # HEBREW LETTER VAV -0xE6 0x05D6 # HEBREW LETTER ZAYIN -0xE7 0x05D7 # HEBREW LETTER HET -0xE8 0x05D8 # HEBREW LETTER TET -0xE9 0x05D9 # HEBREW LETTER YOD -0xEA 0x05DA # HEBREW LETTER FINAL KAF -0xEB 0x05DB # HEBREW LETTER KAF -0xEC 0x05DC # HEBREW LETTER LAMED -0xED 0x05DD # HEBREW LETTER FINAL MEM -0xEE 0x05DE # HEBREW LETTER MEM -0xEF 0x05DF # HEBREW LETTER FINAL NUN -0xF0 0x05E0 # HEBREW LETTER NUN -0xF1 0x05E1 # HEBREW LETTER SAMEKH -0xF2 0x05E2 # HEBREW LETTER AYIN -0xF3 0x05E3 # HEBREW LETTER FINAL PE -0xF4 0x05E4 # HEBREW LETTER PE -0xF5 0x05E5 # HEBREW LETTER FINAL TSADI -0xF6 0x05E6 # HEBREW LETTER TSADI -0xF7 0x05E7 # HEBREW LETTER QOF -0xF8 0x05E8 # HEBREW LETTER RESH -0xF9 0x05E9 # HEBREW LETTER SHIN -0xFA 0x05EA # HEBREW LETTER TAV -0xFD 0x200E # LEFT-TO-RIGHT MARK -0xFE 0x200F # RIGHT-TO-LEFT MARK - diff --git a/program/lib/encoding/ISO-8859-9.map b/program/lib/encoding/ISO-8859-9.map deleted file mode 100644 index 22901f107..000000000 --- a/program/lib/encoding/ISO-8859-9.map +++ /dev/null @@ -1,307 +0,0 @@ -# -# Name: ISO/IEC 8859-9:1999 to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 1999 July 27 -# Authors: Ken Whistler -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on magnetic media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# ISO/IEC 8859-9:1999 characters map into Unicode. -# -# Format: Three tab-separated columns -# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in ISO/IEC 8859-9 order. -# -# ISO/IEC 8859-9 is also equivalent to ISO-IR-148. -# -# Version history -# 1.0 version updates 0.1 version by adding mappings for all -# control characters. -# -# Updated versions of this file may be found in: -# -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x0080 # -0x81 0x0081 # -0x82 0x0082 # -0x83 0x0083 # -0x84 0x0084 # -0x85 0x0085 # -0x86 0x0086 # -0x87 0x0087 # -0x88 0x0088 # -0x89 0x0089 # -0x8A 0x008A # -0x8B 0x008B # -0x8C 0x008C # -0x8D 0x008D # -0x8E 0x008E # -0x8F 0x008F # -0x90 0x0090 # -0x91 0x0091 # -0x92 0x0092 # -0x93 0x0093 # -0x94 0x0094 # -0x95 0x0095 # -0x96 0x0096 # -0x97 0x0097 # -0x98 0x0098 # -0x99 0x0099 # -0x9A 0x009A # -0x9B 0x009B # -0x9C 0x009C # -0x9D 0x009D # -0x9E 0x009E # -0x9F 0x009F # -0xA0 0x00A0 # NO-BREAK SPACE -0xA1 0x00A1 # INVERTED EXCLAMATION MARK -0xA2 0x00A2 # CENT SIGN -0xA3 0x00A3 # POUND SIGN -0xA4 0x00A4 # CURRENCY SIGN -0xA5 0x00A5 # YEN SIGN -0xA6 0x00A6 # BROKEN BAR -0xA7 0x00A7 # SECTION SIGN -0xA8 0x00A8 # DIAERESIS -0xA9 0x00A9 # COPYRIGHT SIGN -0xAA 0x00AA # FEMININE ORDINAL INDICATOR -0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -0xAC 0x00AC # NOT SIGN -0xAD 0x00AD # SOFT HYPHEN -0xAE 0x00AE # REGISTERED SIGN -0xAF 0x00AF # MACRON -0xB0 0x00B0 # DEGREE SIGN -0xB1 0x00B1 # PLUS-MINUS SIGN -0xB2 0x00B2 # SUPERSCRIPT TWO -0xB3 0x00B3 # SUPERSCRIPT THREE -0xB4 0x00B4 # ACUTE ACCENT -0xB5 0x00B5 # MICRO SIGN -0xB6 0x00B6 # PILCROW SIGN -0xB7 0x00B7 # MIDDLE DOT -0xB8 0x00B8 # CEDILLA -0xB9 0x00B9 # SUPERSCRIPT ONE -0xBA 0x00BA # MASCULINE ORDINAL INDICATOR -0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0xBC 0x00BC # VULGAR FRACTION ONE QUARTER -0xBD 0x00BD # VULGAR FRACTION ONE HALF -0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS -0xBF 0x00BF # INVERTED QUESTION MARK -0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0xC6 0x00C6 # LATIN CAPITAL LETTER AE -0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0xD0 0x011E # LATIN CAPITAL LETTER G WITH BREVE -0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE -0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0xD7 0x00D7 # MULTIPLICATION SIGN -0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0xDD 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE -0xDE 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA -0xDF 0x00DF # LATIN SMALL LETTER SHARP S -0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0xE6 0x00E6 # LATIN SMALL LETTER AE -0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0xF0 0x011F # LATIN SMALL LETTER G WITH BREVE -0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE -0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0xF7 0x00F7 # DIVISION SIGN -0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0xFD 0x0131 # LATIN SMALL LETTER DOTLESS I -0xFE 0x015F # LATIN SMALL LETTER S WITH CEDILLA -0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS - - diff --git a/program/lib/encoding/KOI8R.map b/program/lib/encoding/KOI8R.map deleted file mode 100644 index 4a17d18e5..000000000 --- a/program/lib/encoding/KOI8R.map +++ /dev/null @@ -1,302 +0,0 @@ -# -# Name: KOI8-R (RFC1489) to Unicode -# Unicode version: 3.0 -# Table version: 1.0 -# Table format: Format A -# Date: 18 August 1999 -# Authors: Helmut Richter -# -# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. -# -# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). -# No claims are made as to fitness for any particular purpose. No -# warranties of any kind are expressed or implied. The recipient -# agrees to determine applicability of information provided. If this -# file has been provided on optical media by Unicode, Inc., the sole -# remedy for any claim will be exchange of defective media within 90 -# days of receipt. -# -# Unicode, Inc. hereby grants the right to freely use the information -# supplied in this file in the creation of products supporting the -# Unicode Standard, and to make copies of this file in any form for -# internal or external distribution as long as this notice remains -# attached. -# -# General notes: -# -# This table contains the data the Unicode Consortium has on how -# KOI8-R characters map into Unicode. The underlying document is the -# mapping described in RFC 1489. No statements are made as to whether -# this mapping is the same as the mapping defined as "Code Page 878" -# with some vendors. -# -# Format: Three tab-separated columns -# Column #1 is the KOI8-R code (in hex as 0xXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# -# The entries are in KOI8-R order. -# -# Version history -# 1.0 version: created. -# -# Any comments or problems, contact -# Please note that is an archival address; -# notices will be checked, but do not expect an immediate response. -# -0x00 0x0000 # NULL -0x01 0x0001 # START OF HEADING -0x02 0x0002 # START OF TEXT -0x03 0x0003 # END OF TEXT -0x04 0x0004 # END OF TRANSMISSION -0x05 0x0005 # ENQUIRY -0x06 0x0006 # ACKNOWLEDGE -0x07 0x0007 # BELL -0x08 0x0008 # BACKSPACE -0x09 0x0009 # HORIZONTAL TABULATION -0x0A 0x000A # LINE FEED -0x0B 0x000B # VERTICAL TABULATION -0x0C 0x000C # FORM FEED -0x0D 0x000D # CARRIAGE RETURN -0x0E 0x000E # SHIFT OUT -0x0F 0x000F # SHIFT IN -0x10 0x0010 # DATA LINK ESCAPE -0x11 0x0011 # DEVICE CONTROL ONE -0x12 0x0012 # DEVICE CONTROL TWO -0x13 0x0013 # DEVICE CONTROL THREE -0x14 0x0014 # DEVICE CONTROL FOUR -0x15 0x0015 # NEGATIVE ACKNOWLEDGE -0x16 0x0016 # SYNCHRONOUS IDLE -0x17 0x0017 # END OF TRANSMISSION BLOCK -0x18 0x0018 # CANCEL -0x19 0x0019 # END OF MEDIUM -0x1A 0x001A # SUBSTITUTE -0x1B 0x001B # ESCAPE -0x1C 0x001C # FILE SEPARATOR -0x1D 0x001D # GROUP SEPARATOR -0x1E 0x001E # RECORD SEPARATOR -0x1F 0x001F # UNIT SEPARATOR -0x20 0x0020 # SPACE -0x21 0x0021 # EXCLAMATION MARK -0x22 0x0022 # QUOTATION MARK -0x23 0x0023 # NUMBER SIGN -0x24 0x0024 # DOLLAR SIGN -0x25 0x0025 # PERCENT SIGN -0x26 0x0026 # AMPERSAND -0x27 0x0027 # APOSTROPHE -0x28 0x0028 # LEFT PARENTHESIS -0x29 0x0029 # RIGHT PARENTHESIS -0x2A 0x002A # ASTERISK -0x2B 0x002B # PLUS SIGN -0x2C 0x002C # COMMA -0x2D 0x002D # HYPHEN-MINUS -0x2E 0x002E # FULL STOP -0x2F 0x002F # SOLIDUS -0x30 0x0030 # DIGIT ZERO -0x31 0x0031 # DIGIT ONE -0x32 0x0032 # DIGIT TWO -0x33 0x0033 # DIGIT THREE -0x34 0x0034 # DIGIT FOUR -0x35 0x0035 # DIGIT FIVE -0x36 0x0036 # DIGIT SIX -0x37 0x0037 # DIGIT SEVEN -0x38 0x0038 # DIGIT EIGHT -0x39 0x0039 # DIGIT NINE -0x3A 0x003A # COLON -0x3B 0x003B # SEMICOLON -0x3C 0x003C # LESS-THAN SIGN -0x3D 0x003D # EQUALS SIGN -0x3E 0x003E # GREATER-THAN SIGN -0x3F 0x003F # QUESTION MARK -0x40 0x0040 # COMMERCIAL AT -0x41 0x0041 # LATIN CAPITAL LETTER A -0x42 0x0042 # LATIN CAPITAL LETTER B -0x43 0x0043 # LATIN CAPITAL LETTER C -0x44 0x0044 # LATIN CAPITAL LETTER D -0x45 0x0045 # LATIN CAPITAL LETTER E -0x46 0x0046 # LATIN CAPITAL LETTER F -0x47 0x0047 # LATIN CAPITAL LETTER G -0x48 0x0048 # LATIN CAPITAL LETTER H -0x49 0x0049 # LATIN CAPITAL LETTER I -0x4A 0x004A # LATIN CAPITAL LETTER J -0x4B 0x004B # LATIN CAPITAL LETTER K -0x4C 0x004C # LATIN CAPITAL LETTER L -0x4D 0x004D # LATIN CAPITAL LETTER M -0x4E 0x004E # LATIN CAPITAL LETTER N -0x4F 0x004F # LATIN CAPITAL LETTER O -0x50 0x0050 # LATIN CAPITAL LETTER P -0x51 0x0051 # LATIN CAPITAL LETTER Q -0x52 0x0052 # LATIN CAPITAL LETTER R -0x53 0x0053 # LATIN CAPITAL LETTER S -0x54 0x0054 # LATIN CAPITAL LETTER T -0x55 0x0055 # LATIN CAPITAL LETTER U -0x56 0x0056 # LATIN CAPITAL LETTER V -0x57 0x0057 # LATIN CAPITAL LETTER W -0x58 0x0058 # LATIN CAPITAL LETTER X -0x59 0x0059 # LATIN CAPITAL LETTER Y -0x5A 0x005A # LATIN CAPITAL LETTER Z -0x5B 0x005B # LEFT SQUARE BRACKET -0x5C 0x005C # REVERSE SOLIDUS -0x5D 0x005D # RIGHT SQUARE BRACKET -0x5E 0x005E # CIRCUMFLEX ACCENT -0x5F 0x005F # LOW LINE -0x60 0x0060 # GRAVE ACCENT -0x61 0x0061 # LATIN SMALL LETTER A -0x62 0x0062 # LATIN SMALL LETTER B -0x63 0x0063 # LATIN SMALL LETTER C -0x64 0x0064 # LATIN SMALL LETTER D -0x65 0x0065 # LATIN SMALL LETTER E -0x66 0x0066 # LATIN SMALL LETTER F -0x67 0x0067 # LATIN SMALL LETTER G -0x68 0x0068 # LATIN SMALL LETTER H -0x69 0x0069 # LATIN SMALL LETTER I -0x6A 0x006A # LATIN SMALL LETTER J -0x6B 0x006B # LATIN SMALL LETTER K -0x6C 0x006C # LATIN SMALL LETTER L -0x6D 0x006D # LATIN SMALL LETTER M -0x6E 0x006E # LATIN SMALL LETTER N -0x6F 0x006F # LATIN SMALL LETTER O -0x70 0x0070 # LATIN SMALL LETTER P -0x71 0x0071 # LATIN SMALL LETTER Q -0x72 0x0072 # LATIN SMALL LETTER R -0x73 0x0073 # LATIN SMALL LETTER S -0x74 0x0074 # LATIN SMALL LETTER T -0x75 0x0075 # LATIN SMALL LETTER U -0x76 0x0076 # LATIN SMALL LETTER V -0x77 0x0077 # LATIN SMALL LETTER W -0x78 0x0078 # LATIN SMALL LETTER X -0x79 0x0079 # LATIN SMALL LETTER Y -0x7A 0x007A # LATIN SMALL LETTER Z -0x7B 0x007B # LEFT CURLY BRACKET -0x7C 0x007C # VERTICAL LINE -0x7D 0x007D # RIGHT CURLY BRACKET -0x7E 0x007E # TILDE -0x7F 0x007F # DELETE -0x80 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL -0x81 0x2502 # BOX DRAWINGS LIGHT VERTICAL -0x82 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT -0x83 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT -0x84 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT -0x85 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT -0x86 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT -0x87 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT -0x88 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -0x89 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL -0x8A 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -0x8B 0x2580 # UPPER HALF BLOCK -0x8C 0x2584 # LOWER HALF BLOCK -0x8D 0x2588 # FULL BLOCK -0x8E 0x258C # LEFT HALF BLOCK -0x8F 0x2590 # RIGHT HALF BLOCK -0x90 0x2591 # LIGHT SHADE -0x91 0x2592 # MEDIUM SHADE -0x92 0x2593 # DARK SHADE -0x93 0x2320 # TOP HALF INTEGRAL -0x94 0x25A0 # BLACK SQUARE -0x95 0x2219 # BULLET OPERATOR -0x96 0x221A # SQUARE ROOT -0x97 0x2248 # ALMOST EQUAL TO -0x98 0x2264 # LESS-THAN OR EQUAL TO -0x99 0x2265 # GREATER-THAN OR EQUAL TO -0x9A 0x00A0 # NO-BREAK SPACE -0x9B 0x2321 # BOTTOM HALF INTEGRAL -0x9C 0x00B0 # DEGREE SIGN -0x9D 0x00B2 # SUPERSCRIPT TWO -0x9E 0x00B7 # MIDDLE DOT -0x9F 0x00F7 # DIVISION SIGN -0xA0 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL -0xA1 0x2551 # BOX DRAWINGS DOUBLE VERTICAL -0xA2 0x2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE -0xA3 0x0451 # CYRILLIC SMALL LETTER IO -0xA4 0x2553 # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE -0xA5 0x2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT -0xA6 0x2555 # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE -0xA7 0x2556 # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE -0xA8 0x2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT -0xA9 0x2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE -0xAA 0x2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE -0xAB 0x255A # BOX DRAWINGS DOUBLE UP AND RIGHT -0xAC 0x255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE -0xAD 0x255C # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE -0xAE 0x255D # BOX DRAWINGS DOUBLE UP AND LEFT -0xAF 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE -0xB0 0x255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE -0xB1 0x2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT -0xB2 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE -0xB3 0x0401 # CYRILLIC CAPITAL LETTER IO -0xB4 0x2562 # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE -0xB5 0x2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT -0xB6 0x2564 # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE -0xB7 0x2565 # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE -0xB8 0x2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL -0xB9 0x2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE -0xBA 0x2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE -0xBB 0x2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL -0xBC 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE -0xBD 0x256B # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE -0xBE 0x256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL -0xBF 0x00A9 # COPYRIGHT SIGN -0xC0 0x044E # CYRILLIC SMALL LETTER YU -0xC1 0x0430 # CYRILLIC SMALL LETTER A -0xC2 0x0431 # CYRILLIC SMALL LETTER BE -0xC3 0x0446 # CYRILLIC SMALL LETTER TSE -0xC4 0x0434 # CYRILLIC SMALL LETTER DE -0xC5 0x0435 # CYRILLIC SMALL LETTER IE -0xC6 0x0444 # CYRILLIC SMALL LETTER EF -0xC7 0x0433 # CYRILLIC SMALL LETTER GHE -0xC8 0x0445 # CYRILLIC SMALL LETTER HA -0xC9 0x0438 # CYRILLIC SMALL LETTER I -0xCA 0x0439 # CYRILLIC SMALL LETTER SHORT I -0xCB 0x043A # CYRILLIC SMALL LETTER KA -0xCC 0x043B # CYRILLIC SMALL LETTER EL -0xCD 0x043C # CYRILLIC SMALL LETTER EM -0xCE 0x043D # CYRILLIC SMALL LETTER EN -0xCF 0x043E # CYRILLIC SMALL LETTER O -0xD0 0x043F # CYRILLIC SMALL LETTER PE -0xD1 0x044F # CYRILLIC SMALL LETTER YA -0xD2 0x0440 # CYRILLIC SMALL LETTER ER -0xD3 0x0441 # CYRILLIC SMALL LETTER ES -0xD4 0x0442 # CYRILLIC SMALL LETTER TE -0xD5 0x0443 # CYRILLIC SMALL LETTER U -0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE -0xD7 0x0432 # CYRILLIC SMALL LETTER VE -0xD8 0x044C # CYRILLIC SMALL LETTER SOFT SIGN -0xD9 0x044B # CYRILLIC SMALL LETTER YERU -0xDA 0x0437 # CYRILLIC SMALL LETTER ZE -0xDB 0x0448 # CYRILLIC SMALL LETTER SHA -0xDC 0x044D # CYRILLIC SMALL LETTER E -0xDD 0x0449 # CYRILLIC SMALL LETTER SHCHA -0xDE 0x0447 # CYRILLIC SMALL LETTER CHE -0xDF 0x044A # CYRILLIC SMALL LETTER HARD SIGN -0xE0 0x042E # CYRILLIC CAPITAL LETTER YU -0xE1 0x0410 # CYRILLIC CAPITAL LETTER A -0xE2 0x0411 # CYRILLIC CAPITAL LETTER BE -0xE3 0x0426 # CYRILLIC CAPITAL LETTER TSE -0xE4 0x0414 # CYRILLIC CAPITAL LETTER DE -0xE5 0x0415 # CYRILLIC CAPITAL LETTER IE -0xE6 0x0424 # CYRILLIC CAPITAL LETTER EF -0xE7 0x0413 # CYRILLIC CAPITAL LETTER GHE -0xE8 0x0425 # CYRILLIC CAPITAL LETTER HA -0xE9 0x0418 # CYRILLIC CAPITAL LETTER I -0xEA 0x0419 # CYRILLIC CAPITAL LETTER SHORT I -0xEB 0x041A # CYRILLIC CAPITAL LETTER KA -0xEC 0x041B # CYRILLIC CAPITAL LETTER EL -0xED 0x041C # CYRILLIC CAPITAL LETTER EM -0xEE 0x041D # CYRILLIC CAPITAL LETTER EN -0xEF 0x041E # CYRILLIC CAPITAL LETTER O -0xF0 0x041F # CYRILLIC CAPITAL LETTER PE -0xF1 0x042F # CYRILLIC CAPITAL LETTER YA -0xF2 0x0420 # CYRILLIC CAPITAL LETTER ER -0xF3 0x0421 # CYRILLIC CAPITAL LETTER ES -0xF4 0x0422 # CYRILLIC CAPITAL LETTER TE -0xF5 0x0423 # CYRILLIC CAPITAL LETTER U -0xF6 0x0416 # CYRILLIC CAPITAL LETTER ZHE -0xF7 0x0412 # CYRILLIC CAPITAL LETTER VE -0xF8 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN -0xF9 0x042B # CYRILLIC CAPITAL LETTER YERU -0xFA 0x0417 # CYRILLIC CAPITAL LETTER ZE -0xFB 0x0428 # CYRILLIC CAPITAL LETTER SHA -0xFC 0x042D # CYRILLIC CAPITAL LETTER E -0xFD 0x0429 # CYRILLIC CAPITAL LETTER SHCHA -0xFE 0x0427 # CYRILLIC CAPITAL LETTER CHE -0xFF 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN \ No newline at end of file diff --git a/program/lib/encoding/KSC5601.map b/program/lib/encoding/KSC5601.map deleted file mode 100644 index 83a5ce77b..000000000 --- a/program/lib/encoding/KSC5601.map +++ /dev/null @@ -1,17078 +0,0 @@ -# -# Name: Unified Hangeul(KSC5601-1992) to Unicode table -# Unicode version: 2.0 -# Table version: 1.0 -# Table format: Format A -# Date: 07/24/95 -# -# This table contains one set of mappings from KSC5601-1992 into Unicode. -# Note that these data are *possible* mappings only and may not be the -# same as those used by actual products, nor may they be the best suited -# for all uses. For more information on the mappings between various code -# pages incorporating the repertoire of KSC5601-1992 and Unicode, consult the -# VENDORS mapping data. Normative information on the mapping between -# KSC5601-1992 and Unicode may be found in the Unihan.txt file in the -# latest Unicode Character Database. -# -# If you have carefully considered the fact that the mappings in -# this table are only one possible set of mappings between KSC5601-1992 and -# Unicode and have no normative status, but still feel that you -# have located an error in the table that requires fixing, you may -# report any such error to errata@unicode.org. -# -# -# Format: Three tab-separated columns -# Column #1 is the Unified Hangeul code (in hex) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 is the Unicode name (follows a comment sign, '#') -# -# The entries are in Unified Hangeul order -# -0x8141 0xAC02 # HANGUL SYLLABLE KIYEOK-A-SSANGKIYEOK -0x8142 0xAC03 # HANGUL SYLLABLE KIYEOK-A-KIYEOKSIOS -0x8143 0xAC05 # HANGUL SYLLABLE KIYEOK-A-NIEUNCIEUC -0x8144 0xAC06 # HANGUL SYLLABLE KIYEOK-A-NIEUNHIEUH -0x8145 0xAC0B # HANGUL SYLLABLE KIYEOK-A-RIEULPIEUP -0x8146 0xAC0C # HANGUL SYLLABLE KIYEOK-A-RIEULSIOS -0x8147 0xAC0D # HANGUL SYLLABLE KIYEOK-A-RIEULTHIEUTH -0x8148 0xAC0E # HANGUL SYLLABLE KIYEOK-A-RIEULPHIEUPH -0x8149 0xAC0F # HANGUL SYLLABLE KIYEOK-A-RIEULHIEUH -0x814A 0xAC18 # HANGUL SYLLABLE KIYEOK-A-KHIEUKH -0x814B 0xAC1E # HANGUL SYLLABLE KIYEOK-AE-SSANGKIYEOK -0x814C 0xAC1F # HANGUL SYLLABLE KIYEOK-AE-KIYEOKSIOS -0x814D 0xAC21 # HANGUL SYLLABLE KIYEOK-AE-NIEUNCIEUC -0x814E 0xAC22 # HANGUL SYLLABLE KIYEOK-AE-NIEUNHIEUH -0x814F 0xAC23 # HANGUL SYLLABLE KIYEOK-AE-TIKEUT -0x8150 0xAC25 # HANGUL SYLLABLE KIYEOK-AE-RIEULKIYEOK -0x8151 0xAC26 # HANGUL SYLLABLE KIYEOK-AE-RIEULMIEUM -0x8152 0xAC27 # HANGUL SYLLABLE KIYEOK-AE-RIEULPIEUP -0x8153 0xAC28 # HANGUL SYLLABLE KIYEOK-AE-RIEULSIOS -0x8154 0xAC29 # HANGUL SYLLABLE KIYEOK-AE-RIEULTHIEUTH -0x8155 0xAC2A # HANGUL SYLLABLE KIYEOK-AE-RIEULPHIEUPH -0x8156 0xAC2B # HANGUL SYLLABLE KIYEOK-AE-RIEULHIEUH -0x8157 0xAC2E # HANGUL SYLLABLE KIYEOK-AE-PIEUPSIOS -0x8158 0xAC32 # HANGUL SYLLABLE KIYEOK-AE-CIEUC -0x8159 0xAC33 # HANGUL SYLLABLE KIYEOK-AE-CHIEUCH -0x815A 0xAC34 # HANGUL SYLLABLE KIYEOK-AE-KHIEUKH -0x8161 0xAC35 # HANGUL SYLLABLE KIYEOK-AE-THIEUTH -0x8162 0xAC36 # HANGUL SYLLABLE KIYEOK-AE-PHIEUPH -0x8163 0xAC37 # HANGUL SYLLABLE KIYEOK-AE-HIEUH -0x8164 0xAC3A # HANGUL SYLLABLE KIYEOK-YA-SSANGKIYEOK -0x8165 0xAC3B # HANGUL SYLLABLE KIYEOK-YA-KIYEOKSIOS -0x8166 0xAC3D # HANGUL SYLLABLE KIYEOK-YA-NIEUNCIEUC -0x8167 0xAC3E # HANGUL SYLLABLE KIYEOK-YA-NIEUNHIEUH -0x8168 0xAC3F # HANGUL SYLLABLE KIYEOK-YA-TIKEUT -0x8169 0xAC41 # HANGUL SYLLABLE KIYEOK-YA-RIEULKIYEOK -0x816A 0xAC42 # HANGUL SYLLABLE KIYEOK-YA-RIEULMIEUM -0x816B 0xAC43 # HANGUL SYLLABLE KIYEOK-YA-RIEULPIEUP -0x816C 0xAC44 # HANGUL SYLLABLE KIYEOK-YA-RIEULSIOS -0x816D 0xAC45 # HANGUL SYLLABLE KIYEOK-YA-RIEULTHIEUTH -0x816E 0xAC46 # HANGUL SYLLABLE KIYEOK-YA-RIEULPHIEUPH -0x816F 0xAC47 # HANGUL SYLLABLE KIYEOK-YA-RIEULHIEUH -0x8170 0xAC48 # HANGUL SYLLABLE KIYEOK-YA-MIEUM -0x8171 0xAC49 # HANGUL SYLLABLE KIYEOK-YA-PIEUP -0x8172 0xAC4A # HANGUL SYLLABLE KIYEOK-YA-PIEUPSIOS -0x8173 0xAC4C # HANGUL SYLLABLE KIYEOK-YA-SSANGSIOS -0x8174 0xAC4E # HANGUL SYLLABLE KIYEOK-YA-CIEUC -0x8175 0xAC4F # HANGUL SYLLABLE KIYEOK-YA-CHIEUCH -0x8176 0xAC50 # HANGUL SYLLABLE KIYEOK-YA-KHIEUKH -0x8177 0xAC51 # HANGUL SYLLABLE KIYEOK-YA-THIEUTH -0x8178 0xAC52 # HANGUL SYLLABLE KIYEOK-YA-PHIEUPH -0x8179 0xAC53 # HANGUL SYLLABLE KIYEOK-YA-HIEUH -0x817A 0xAC55 # HANGUL SYLLABLE KIYEOK-YAE-KIYEOK -0x8181 0xAC56 # HANGUL SYLLABLE KIYEOK-YAE-SSANGKIYEOK -0x8182 0xAC57 # HANGUL SYLLABLE KIYEOK-YAE-KIYEOKSIOS -0x8183 0xAC59 # HANGUL SYLLABLE KIYEOK-YAE-NIEUNCIEUC -0x8184 0xAC5A # HANGUL SYLLABLE KIYEOK-YAE-NIEUNHIEUH -0x8185 0xAC5B # HANGUL SYLLABLE KIYEOK-YAE-TIKEUT -0x8186 0xAC5D # HANGUL SYLLABLE KIYEOK-YAE-RIEULKIYEOK -0x8187 0xAC5E # HANGUL SYLLABLE KIYEOK-YAE-RIEULMIEUM -0x8188 0xAC5F # HANGUL SYLLABLE KIYEOK-YAE-RIEULPIEUP -0x8189 0xAC60 # HANGUL SYLLABLE KIYEOK-YAE-RIEULSIOS -0x818A 0xAC61 # HANGUL SYLLABLE KIYEOK-YAE-RIEULTHIEUTH -0x818B 0xAC62 # HANGUL SYLLABLE KIYEOK-YAE-RIEULPHIEUPH -0x818C 0xAC63 # HANGUL SYLLABLE KIYEOK-YAE-RIEULHIEUH -0x818D 0xAC64 # HANGUL SYLLABLE KIYEOK-YAE-MIEUM -0x818E 0xAC65 # HANGUL SYLLABLE KIYEOK-YAE-PIEUP -0x818F 0xAC66 # HANGUL SYLLABLE KIYEOK-YAE-PIEUPSIOS -0x8190 0xAC67 # HANGUL SYLLABLE KIYEOK-YAE-SIOS -0x8191 0xAC68 # HANGUL SYLLABLE KIYEOK-YAE-SSANGSIOS -0x8192 0xAC69 # HANGUL SYLLABLE KIYEOK-YAE-IEUNG -0x8193 0xAC6A # HANGUL SYLLABLE KIYEOK-YAE-CIEUC -0x8194 0xAC6B # HANGUL SYLLABLE KIYEOK-YAE-CHIEUCH -0x8195 0xAC6C # HANGUL SYLLABLE KIYEOK-YAE-KHIEUKH -0x8196 0xAC6D # HANGUL SYLLABLE KIYEOK-YAE-THIEUTH -0x8197 0xAC6E # HANGUL SYLLABLE KIYEOK-YAE-PHIEUPH -0x8198 0xAC6F # HANGUL SYLLABLE KIYEOK-YAE-HIEUH -0x8199 0xAC72 # HANGUL SYLLABLE KIYEOK-EO-SSANGKIYEOK -0x819A 0xAC73 # HANGUL SYLLABLE KIYEOK-EO-KIYEOKSIOS -0x819B 0xAC75 # HANGUL SYLLABLE KIYEOK-EO-NIEUNCIEUC -0x819C 0xAC76 # HANGUL SYLLABLE KIYEOK-EO-NIEUNHIEUH -0x819D 0xAC79 # HANGUL SYLLABLE KIYEOK-EO-RIEULKIYEOK -0x819E 0xAC7B # HANGUL SYLLABLE KIYEOK-EO-RIEULPIEUP -0x819F 0xAC7C # HANGUL SYLLABLE KIYEOK-EO-RIEULSIOS -0x81A0 0xAC7D # HANGUL SYLLABLE KIYEOK-EO-RIEULTHIEUTH -0x81A1 0xAC7E # HANGUL SYLLABLE KIYEOK-EO-RIEULPHIEUPH -0x81A2 0xAC7F # HANGUL SYLLABLE KIYEOK-EO-RIEULHIEUH -0x81A3 0xAC82 # HANGUL SYLLABLE KIYEOK-EO-PIEUPSIOS -0x81A4 0xAC87 # HANGUL SYLLABLE KIYEOK-EO-CHIEUCH -0x81A5 0xAC88 # HANGUL SYLLABLE KIYEOK-EO-KHIEUKH -0x81A6 0xAC8D # HANGUL SYLLABLE KIYEOK-E-KIYEOK -0x81A7 0xAC8E # HANGUL SYLLABLE KIYEOK-E-SSANGKIYEOK -0x81A8 0xAC8F # HANGUL SYLLABLE KIYEOK-E-KIYEOKSIOS -0x81A9 0xAC91 # HANGUL SYLLABLE KIYEOK-E-NIEUNCIEUC -0x81AA 0xAC92 # HANGUL SYLLABLE KIYEOK-E-NIEUNHIEUH -0x81AB 0xAC93 # HANGUL SYLLABLE KIYEOK-E-TIKEUT -0x81AC 0xAC95 # HANGUL SYLLABLE KIYEOK-E-RIEULKIYEOK -0x81AD 0xAC96 # HANGUL SYLLABLE KIYEOK-E-RIEULMIEUM -0x81AE 0xAC97 # HANGUL SYLLABLE KIYEOK-E-RIEULPIEUP -0x81AF 0xAC98 # HANGUL SYLLABLE KIYEOK-E-RIEULSIOS -0x81B0 0xAC99 # HANGUL SYLLABLE KIYEOK-E-RIEULTHIEUTH -0x81B1 0xAC9A # HANGUL SYLLABLE KIYEOK-E-RIEULPHIEUPH -0x81B2 0xAC9B # HANGUL SYLLABLE KIYEOK-E-RIEULHIEUH -0x81B3 0xAC9E # HANGUL SYLLABLE KIYEOK-E-PIEUPSIOS -0x81B4 0xACA2 # HANGUL SYLLABLE KIYEOK-E-CIEUC -0x81B5 0xACA3 # HANGUL SYLLABLE KIYEOK-E-CHIEUCH -0x81B6 0xACA4 # HANGUL SYLLABLE KIYEOK-E-KHIEUKH -0x81B7 0xACA5 # HANGUL SYLLABLE KIYEOK-E-THIEUTH -0x81B8 0xACA6 # HANGUL SYLLABLE KIYEOK-E-PHIEUPH -0x81B9 0xACA7 # HANGUL SYLLABLE KIYEOK-E-HIEUH -0x81BA 0xACAB # HANGUL SYLLABLE KIYEOK-YEO-KIYEOKSIOS -0x81BB 0xACAD # HANGUL SYLLABLE KIYEOK-YEO-NIEUNCIEUC -0x81BC 0xACAE # HANGUL SYLLABLE KIYEOK-YEO-NIEUNHIEUH -0x81BD 0xACB1 # HANGUL SYLLABLE KIYEOK-YEO-RIEULKIYEOK -0x81BE 0xACB2 # HANGUL SYLLABLE KIYEOK-YEO-RIEULMIEUM -0x81BF 0xACB3 # HANGUL SYLLABLE KIYEOK-YEO-RIEULPIEUP -0x81C0 0xACB4 # HANGUL SYLLABLE KIYEOK-YEO-RIEULSIOS -0x81C1 0xACB5 # HANGUL SYLLABLE KIYEOK-YEO-RIEULTHIEUTH -0x81C2 0xACB6 # HANGUL SYLLABLE KIYEOK-YEO-RIEULPHIEUPH -0x81C3 0xACB7 # HANGUL SYLLABLE KIYEOK-YEO-RIEULHIEUH -0x81C4 0xACBA # HANGUL SYLLABLE KIYEOK-YEO-PIEUPSIOS -0x81C5 0xACBE # HANGUL SYLLABLE KIYEOK-YEO-CIEUC -0x81C6 0xACBF # HANGUL SYLLABLE KIYEOK-YEO-CHIEUCH -0x81C7 0xACC0 # HANGUL SYLLABLE KIYEOK-YEO-KHIEUKH -0x81C8 0xACC2 # HANGUL SYLLABLE KIYEOK-YEO-PHIEUPH -0x81C9 0xACC3 # HANGUL SYLLABLE KIYEOK-YEO-HIEUH -0x81CA 0xACC5 # HANGUL SYLLABLE KIYEOK-YE-KIYEOK -0x81CB 0xACC6 # HANGUL SYLLABLE KIYEOK-YE-SSANGKIYEOK -0x81CC 0xACC7 # HANGUL SYLLABLE KIYEOK-YE-KIYEOKSIOS -0x81CD 0xACC9 # HANGUL SYLLABLE KIYEOK-YE-NIEUNCIEUC -0x81CE 0xACCA # HANGUL SYLLABLE KIYEOK-YE-NIEUNHIEUH -0x81CF 0xACCB # HANGUL SYLLABLE KIYEOK-YE-TIKEUT -0x81D0 0xACCD # HANGUL SYLLABLE KIYEOK-YE-RIEULKIYEOK -0x81D1 0xACCE # HANGUL SYLLABLE KIYEOK-YE-RIEULMIEUM -0x81D2 0xACCF # HANGUL SYLLABLE KIYEOK-YE-RIEULPIEUP -0x81D3 0xACD0 # HANGUL SYLLABLE KIYEOK-YE-RIEULSIOS -0x81D4 0xACD1 # HANGUL SYLLABLE KIYEOK-YE-RIEULTHIEUTH -0x81D5 0xACD2 # HANGUL SYLLABLE KIYEOK-YE-RIEULPHIEUPH -0x81D6 0xACD3 # HANGUL SYLLABLE KIYEOK-YE-RIEULHIEUH -0x81D7 0xACD4 # HANGUL SYLLABLE KIYEOK-YE-MIEUM -0x81D8 0xACD6 # HANGUL SYLLABLE KIYEOK-YE-PIEUPSIOS -0x81D9 0xACD8 # HANGUL SYLLABLE KIYEOK-YE-SSANGSIOS -0x81DA 0xACD9 # HANGUL SYLLABLE KIYEOK-YE-IEUNG -0x81DB 0xACDA # HANGUL SYLLABLE KIYEOK-YE-CIEUC -0x81DC 0xACDB # HANGUL SYLLABLE KIYEOK-YE-CHIEUCH -0x81DD 0xACDC # HANGUL SYLLABLE KIYEOK-YE-KHIEUKH -0x81DE 0xACDD # HANGUL SYLLABLE KIYEOK-YE-THIEUTH -0x81DF 0xACDE # HANGUL SYLLABLE KIYEOK-YE-PHIEUPH -0x81E0 0xACDF # HANGUL SYLLABLE KIYEOK-YE-HIEUH -0x81E1 0xACE2 # HANGUL SYLLABLE KIYEOK-O-SSANGKIYEOK -0x81E2 0xACE3 # HANGUL SYLLABLE KIYEOK-O-KIYEOKSIOS -0x81E3 0xACE5 # HANGUL SYLLABLE KIYEOK-O-NIEUNCIEUC -0x81E4 0xACE6 # HANGUL SYLLABLE KIYEOK-O-NIEUNHIEUH -0x81E5 0xACE9 # HANGUL SYLLABLE KIYEOK-O-RIEULKIYEOK -0x81E6 0xACEB # HANGUL SYLLABLE KIYEOK-O-RIEULPIEUP -0x81E7 0xACED # HANGUL SYLLABLE KIYEOK-O-RIEULTHIEUTH -0x81E8 0xACEE # HANGUL SYLLABLE KIYEOK-O-RIEULPHIEUPH -0x81E9 0xACF2 # HANGUL SYLLABLE KIYEOK-O-PIEUPSIOS -0x81EA 0xACF4 # HANGUL SYLLABLE KIYEOK-O-SSANGSIOS -0x81EB 0xACF7 # HANGUL SYLLABLE KIYEOK-O-CHIEUCH -0x81EC 0xACF8 # HANGUL SYLLABLE KIYEOK-O-KHIEUKH -0x81ED 0xACF9 # HANGUL SYLLABLE KIYEOK-O-THIEUTH -0x81EE 0xACFA # HANGUL SYLLABLE KIYEOK-O-PHIEUPH -0x81EF 0xACFB # HANGUL SYLLABLE KIYEOK-O-HIEUH -0x81F0 0xACFE # HANGUL SYLLABLE KIYEOK-WA-SSANGKIYEOK -0x81F1 0xACFF # HANGUL SYLLABLE KIYEOK-WA-KIYEOKSIOS -0x81F2 0xAD01 # HANGUL SYLLABLE KIYEOK-WA-NIEUNCIEUC -0x81F3 0xAD02 # HANGUL SYLLABLE KIYEOK-WA-NIEUNHIEUH -0x81F4 0xAD03 # HANGUL SYLLABLE KIYEOK-WA-TIKEUT -0x81F5 0xAD05 # HANGUL SYLLABLE KIYEOK-WA-RIEULKIYEOK -0x81F6 0xAD07 # HANGUL SYLLABLE KIYEOK-WA-RIEULPIEUP -0x81F7 0xAD08 # HANGUL SYLLABLE KIYEOK-WA-RIEULSIOS -0x81F8 0xAD09 # HANGUL SYLLABLE KIYEOK-WA-RIEULTHIEUTH -0x81F9 0xAD0A # HANGUL SYLLABLE KIYEOK-WA-RIEULPHIEUPH -0x81FA 0xAD0B # HANGUL SYLLABLE KIYEOK-WA-RIEULHIEUH -0x81FB 0xAD0E # HANGUL SYLLABLE KIYEOK-WA-PIEUPSIOS -0x81FC 0xAD10 # HANGUL SYLLABLE KIYEOK-WA-SSANGSIOS -0x81FD 0xAD12 # HANGUL SYLLABLE KIYEOK-WA-CIEUC -0x81FE 0xAD13 # HANGUL SYLLABLE KIYEOK-WA-CHIEUCH -0x8241 0xAD14 # HANGUL SYLLABLE KIYEOK-WA-KHIEUKH -0x8242 0xAD15 # HANGUL SYLLABLE KIYEOK-WA-THIEUTH -0x8243 0xAD16 # HANGUL SYLLABLE KIYEOK-WA-PHIEUPH -0x8244 0xAD17 # HANGUL SYLLABLE KIYEOK-WA-HIEUH -0x8245 0xAD19 # HANGUL SYLLABLE KIYEOK-WAE-KIYEOK -0x8246 0xAD1A # HANGUL SYLLABLE KIYEOK-WAE-SSANGKIYEOK -0x8247 0xAD1B # HANGUL SYLLABLE KIYEOK-WAE-KIYEOKSIOS -0x8248 0xAD1D # HANGUL SYLLABLE KIYEOK-WAE-NIEUNCIEUC -0x8249 0xAD1E # HANGUL SYLLABLE KIYEOK-WAE-NIEUNHIEUH -0x824A 0xAD1F # HANGUL SYLLABLE KIYEOK-WAE-TIKEUT -0x824B 0xAD21 # HANGUL SYLLABLE KIYEOK-WAE-RIEULKIYEOK -0x824C 0xAD22 # HANGUL SYLLABLE KIYEOK-WAE-RIEULMIEUM -0x824D 0xAD23 # HANGUL SYLLABLE KIYEOK-WAE-RIEULPIEUP -0x824E 0xAD24 # HANGUL SYLLABLE KIYEOK-WAE-RIEULSIOS -0x824F 0xAD25 # HANGUL SYLLABLE KIYEOK-WAE-RIEULTHIEUTH -0x8250 0xAD26 # HANGUL SYLLABLE KIYEOK-WAE-RIEULPHIEUPH -0x8251 0xAD27 # HANGUL SYLLABLE KIYEOK-WAE-RIEULHIEUH -0x8252 0xAD28 # HANGUL SYLLABLE KIYEOK-WAE-MIEUM -0x8253 0xAD2A # HANGUL SYLLABLE KIYEOK-WAE-PIEUPSIOS -0x8254 0xAD2B # HANGUL SYLLABLE KIYEOK-WAE-SIOS -0x8255 0xAD2E # HANGUL SYLLABLE KIYEOK-WAE-CIEUC -0x8256 0xAD2F # HANGUL SYLLABLE KIYEOK-WAE-CHIEUCH -0x8257 0xAD30 # HANGUL SYLLABLE KIYEOK-WAE-KHIEUKH -0x8258 0xAD31 # HANGUL SYLLABLE KIYEOK-WAE-THIEUTH -0x8259 0xAD32 # HANGUL SYLLABLE KIYEOK-WAE-PHIEUPH -0x825A 0xAD33 # HANGUL SYLLABLE KIYEOK-WAE-HIEUH -0x8261 0xAD36 # HANGUL SYLLABLE KIYEOK-OE-SSANGKIYEOK -0x8262 0xAD37 # HANGUL SYLLABLE KIYEOK-OE-KIYEOKSIOS -0x8263 0xAD39 # HANGUL SYLLABLE KIYEOK-OE-NIEUNCIEUC -0x8264 0xAD3A # HANGUL SYLLABLE KIYEOK-OE-NIEUNHIEUH -0x8265 0xAD3B # HANGUL SYLLABLE KIYEOK-OE-TIKEUT -0x8266 0xAD3D # HANGUL SYLLABLE KIYEOK-OE-RIEULKIYEOK -0x8267 0xAD3E # HANGUL SYLLABLE KIYEOK-OE-RIEULMIEUM -0x8268 0xAD3F # HANGUL SYLLABLE KIYEOK-OE-RIEULPIEUP -0x8269 0xAD40 # HANGUL SYLLABLE KIYEOK-OE-RIEULSIOS -0x826A 0xAD41 # HANGUL SYLLABLE KIYEOK-OE-RIEULTHIEUTH -0x826B 0xAD42 # HANGUL SYLLABLE KIYEOK-OE-RIEULPHIEUPH -0x826C 0xAD43 # HANGUL SYLLABLE KIYEOK-OE-RIEULHIEUH -0x826D 0xAD46 # HANGUL SYLLABLE KIYEOK-OE-PIEUPSIOS -0x826E 0xAD48 # HANGUL SYLLABLE KIYEOK-OE-SSANGSIOS -0x826F 0xAD4A # HANGUL SYLLABLE KIYEOK-OE-CIEUC -0x8270 0xAD4B # HANGUL SYLLABLE KIYEOK-OE-CHIEUCH -0x8271 0xAD4C # HANGUL SYLLABLE KIYEOK-OE-KHIEUKH -0x8272 0xAD4D # HANGUL SYLLABLE KIYEOK-OE-THIEUTH -0x8273 0xAD4E # HANGUL SYLLABLE KIYEOK-OE-PHIEUPH -0x8274 0xAD4F # HANGUL SYLLABLE KIYEOK-OE-HIEUH -0x8275 0xAD51 # HANGUL SYLLABLE KIYEOK-YO-KIYEOK -0x8276 0xAD52 # HANGUL SYLLABLE KIYEOK-YO-SSANGKIYEOK -0x8277 0xAD53 # HANGUL SYLLABLE KIYEOK-YO-KIYEOKSIOS -0x8278 0xAD55 # HANGUL SYLLABLE KIYEOK-YO-NIEUNCIEUC -0x8279 0xAD56 # HANGUL SYLLABLE KIYEOK-YO-NIEUNHIEUH -0x827A 0xAD57 # HANGUL SYLLABLE KIYEOK-YO-TIKEUT -0x8281 0xAD59 # HANGUL SYLLABLE KIYEOK-YO-RIEULKIYEOK -0x8282 0xAD5A # HANGUL SYLLABLE KIYEOK-YO-RIEULMIEUM -0x8283 0xAD5B # HANGUL SYLLABLE KIYEOK-YO-RIEULPIEUP -0x8284 0xAD5C # HANGUL SYLLABLE KIYEOK-YO-RIEULSIOS -0x8285 0xAD5D # HANGUL SYLLABLE KIYEOK-YO-RIEULTHIEUTH -0x8286 0xAD5E # HANGUL SYLLABLE KIYEOK-YO-RIEULPHIEUPH -0x8287 0xAD5F # HANGUL SYLLABLE KIYEOK-YO-RIEULHIEUH -0x8288 0xAD60 # HANGUL SYLLABLE KIYEOK-YO-MIEUM -0x8289 0xAD62 # HANGUL SYLLABLE KIYEOK-YO-PIEUPSIOS -0x828A 0xAD64 # HANGUL SYLLABLE KIYEOK-YO-SSANGSIOS -0x828B 0xAD65 # HANGUL SYLLABLE KIYEOK-YO-IEUNG -0x828C 0xAD66 # HANGUL SYLLABLE KIYEOK-YO-CIEUC -0x828D 0xAD67 # HANGUL SYLLABLE KIYEOK-YO-CHIEUCH -0x828E 0xAD68 # HANGUL SYLLABLE KIYEOK-YO-KHIEUKH -0x828F 0xAD69 # HANGUL SYLLABLE KIYEOK-YO-THIEUTH -0x8290 0xAD6A # HANGUL SYLLABLE KIYEOK-YO-PHIEUPH -0x8291 0xAD6B # HANGUL SYLLABLE KIYEOK-YO-HIEUH -0x8292 0xAD6E # HANGUL SYLLABLE KIYEOK-U-SSANGKIYEOK -0x8293 0xAD6F # HANGUL SYLLABLE KIYEOK-U-KIYEOKSIOS -0x8294 0xAD71 # HANGUL SYLLABLE KIYEOK-U-NIEUNCIEUC -0x8295 0xAD72 # HANGUL SYLLABLE KIYEOK-U-NIEUNHIEUH -0x8296 0xAD77 # HANGUL SYLLABLE KIYEOK-U-RIEULPIEUP -0x8297 0xAD78 # HANGUL SYLLABLE KIYEOK-U-RIEULSIOS -0x8298 0xAD79 # HANGUL SYLLABLE KIYEOK-U-RIEULTHIEUTH -0x8299 0xAD7A # HANGUL SYLLABLE KIYEOK-U-RIEULPHIEUPH -0x829A 0xAD7E # HANGUL SYLLABLE KIYEOK-U-PIEUPSIOS -0x829B 0xAD80 # HANGUL SYLLABLE KIYEOK-U-SSANGSIOS -0x829C 0xAD83 # HANGUL SYLLABLE KIYEOK-U-CHIEUCH -0x829D 0xAD84 # HANGUL SYLLABLE KIYEOK-U-KHIEUKH -0x829E 0xAD85 # HANGUL SYLLABLE KIYEOK-U-THIEUTH -0x829F 0xAD86 # HANGUL SYLLABLE KIYEOK-U-PHIEUPH -0x82A0 0xAD87 # HANGUL SYLLABLE KIYEOK-U-HIEUH -0x82A1 0xAD8A # HANGUL SYLLABLE KIYEOK-WEO-SSANGKIYEOK -0x82A2 0xAD8B # HANGUL SYLLABLE KIYEOK-WEO-KIYEOKSIOS -0x82A3 0xAD8D # HANGUL SYLLABLE KIYEOK-WEO-NIEUNCIEUC -0x82A4 0xAD8E # HANGUL SYLLABLE KIYEOK-WEO-NIEUNHIEUH -0x82A5 0xAD8F # HANGUL SYLLABLE KIYEOK-WEO-TIKEUT -0x82A6 0xAD91 # HANGUL SYLLABLE KIYEOK-WEO-RIEULKIYEOK -0x82A7 0xAD92 # HANGUL SYLLABLE KIYEOK-WEO-RIEULMIEUM -0x82A8 0xAD93 # HANGUL SYLLABLE KIYEOK-WEO-RIEULPIEUP -0x82A9 0xAD94 # HANGUL SYLLABLE KIYEOK-WEO-RIEULSIOS -0x82AA 0xAD95 # HANGUL SYLLABLE KIYEOK-WEO-RIEULTHIEUTH -0x82AB 0xAD96 # HANGUL SYLLABLE KIYEOK-WEO-RIEULPHIEUPH -0x82AC 0xAD97 # HANGUL SYLLABLE KIYEOK-WEO-RIEULHIEUH -0x82AD 0xAD98 # HANGUL SYLLABLE KIYEOK-WEO-MIEUM -0x82AE 0xAD99 # HANGUL SYLLABLE KIYEOK-WEO-PIEUP -0x82AF 0xAD9A # HANGUL SYLLABLE KIYEOK-WEO-PIEUPSIOS -0x82B0 0xAD9B # HANGUL SYLLABLE KIYEOK-WEO-SIOS -0x82B1 0xAD9E # HANGUL SYLLABLE KIYEOK-WEO-CIEUC -0x82B2 0xAD9F # HANGUL SYLLABLE KIYEOK-WEO-CHIEUCH -0x82B3 0xADA0 # HANGUL SYLLABLE KIYEOK-WEO-KHIEUKH -0x82B4 0xADA1 # HANGUL SYLLABLE KIYEOK-WEO-THIEUTH -0x82B5 0xADA2 # HANGUL SYLLABLE KIYEOK-WEO-PHIEUPH -0x82B6 0xADA3 # HANGUL SYLLABLE KIYEOK-WEO-HIEUH -0x82B7 0xADA5 # HANGUL SYLLABLE KIYEOK-WE-KIYEOK -0x82B8 0xADA6 # HANGUL SYLLABLE KIYEOK-WE-SSANGKIYEOK -0x82B9 0xADA7 # HANGUL SYLLABLE KIYEOK-WE-KIYEOKSIOS -0x82BA 0xADA8 # HANGUL SYLLABLE KIYEOK-WE-NIEUN -0x82BB 0xADA9 # HANGUL SYLLABLE KIYEOK-WE-NIEUNCIEUC -0x82BC 0xADAA # HANGUL SYLLABLE KIYEOK-WE-NIEUNHIEUH -0x82BD 0xADAB # HANGUL SYLLABLE KIYEOK-WE-TIKEUT -0x82BE 0xADAC # HANGUL SYLLABLE KIYEOK-WE-RIEUL -0x82BF 0xADAD # HANGUL SYLLABLE KIYEOK-WE-RIEULKIYEOK -0x82C0 0xADAE # HANGUL SYLLABLE KIYEOK-WE-RIEULMIEUM -0x82C1 0xADAF # HANGUL SYLLABLE KIYEOK-WE-RIEULPIEUP -0x82C2 0xADB0 # HANGUL SYLLABLE KIYEOK-WE-RIEULSIOS -0x82C3 0xADB1 # HANGUL SYLLABLE KIYEOK-WE-RIEULTHIEUTH -0x82C4 0xADB2 # HANGUL SYLLABLE KIYEOK-WE-RIEULPHIEUPH -0x82C5 0xADB3 # HANGUL SYLLABLE KIYEOK-WE-RIEULHIEUH -0x82C6 0xADB4 # HANGUL SYLLABLE KIYEOK-WE-MIEUM -0x82C7 0xADB5 # HANGUL SYLLABLE KIYEOK-WE-PIEUP -0x82C8 0xADB6 # HANGUL SYLLABLE KIYEOK-WE-PIEUPSIOS -0x82C9 0xADB8 # HANGUL SYLLABLE KIYEOK-WE-SSANGSIOS -0x82CA 0xADB9 # HANGUL SYLLABLE KIYEOK-WE-IEUNG -0x82CB 0xADBA # HANGUL SYLLABLE KIYEOK-WE-CIEUC -0x82CC 0xADBB # HANGUL SYLLABLE KIYEOK-WE-CHIEUCH -0x82CD 0xADBC # HANGUL SYLLABLE KIYEOK-WE-KHIEUKH -0x82CE 0xADBD # HANGUL SYLLABLE KIYEOK-WE-THIEUTH -0x82CF 0xADBE # HANGUL SYLLABLE KIYEOK-WE-PHIEUPH -0x82D0 0xADBF # HANGUL SYLLABLE KIYEOK-WE-HIEUH -0x82D1 0xADC2 # HANGUL SYLLABLE KIYEOK-WI-SSANGKIYEOK -0x82D2 0xADC3 # HANGUL SYLLABLE KIYEOK-WI-KIYEOKSIOS -0x82D3 0xADC5 # HANGUL SYLLABLE KIYEOK-WI-NIEUNCIEUC -0x82D4 0xADC6 # HANGUL SYLLABLE KIYEOK-WI-NIEUNHIEUH -0x82D5 0xADC7 # HANGUL SYLLABLE KIYEOK-WI-TIKEUT -0x82D6 0xADC9 # HANGUL SYLLABLE KIYEOK-WI-RIEULKIYEOK -0x82D7 0xADCA # HANGUL SYLLABLE KIYEOK-WI-RIEULMIEUM -0x82D8 0xADCB # HANGUL SYLLABLE KIYEOK-WI-RIEULPIEUP -0x82D9 0xADCC # HANGUL SYLLABLE KIYEOK-WI-RIEULSIOS -0x82DA 0xADCD # HANGUL SYLLABLE KIYEOK-WI-RIEULTHIEUTH -0x82DB 0xADCE # HANGUL SYLLABLE KIYEOK-WI-RIEULPHIEUPH -0x82DC 0xADCF # HANGUL SYLLABLE KIYEOK-WI-RIEULHIEUH -0x82DD 0xADD2 # HANGUL SYLLABLE KIYEOK-WI-PIEUPSIOS -0x82DE 0xADD4 # HANGUL SYLLABLE KIYEOK-WI-SSANGSIOS -0x82DF 0xADD5 # HANGUL SYLLABLE KIYEOK-WI-IEUNG -0x82E0 0xADD6 # HANGUL SYLLABLE KIYEOK-WI-CIEUC -0x82E1 0xADD7 # HANGUL SYLLABLE KIYEOK-WI-CHIEUCH -0x82E2 0xADD8 # HANGUL SYLLABLE KIYEOK-WI-KHIEUKH -0x82E3 0xADD9 # HANGUL SYLLABLE KIYEOK-WI-THIEUTH -0x82E4 0xADDA # HANGUL SYLLABLE KIYEOK-WI-PHIEUPH -0x82E5 0xADDB # HANGUL SYLLABLE KIYEOK-WI-HIEUH -0x82E6 0xADDD # HANGUL SYLLABLE KIYEOK-YU-KIYEOK -0x82E7 0xADDE # HANGUL SYLLABLE KIYEOK-YU-SSANGKIYEOK -0x82E8 0xADDF # HANGUL SYLLABLE KIYEOK-YU-KIYEOKSIOS -0x82E9 0xADE1 # HANGUL SYLLABLE KIYEOK-YU-NIEUNCIEUC -0x82EA 0xADE2 # HANGUL SYLLABLE KIYEOK-YU-NIEUNHIEUH -0x82EB 0xADE3 # HANGUL SYLLABLE KIYEOK-YU-TIKEUT -0x82EC 0xADE5 # HANGUL SYLLABLE KIYEOK-YU-RIEULKIYEOK -0x82ED 0xADE6 # HANGUL SYLLABLE KIYEOK-YU-RIEULMIEUM -0x82EE 0xADE7 # HANGUL SYLLABLE KIYEOK-YU-RIEULPIEUP -0x82EF 0xADE8 # HANGUL SYLLABLE KIYEOK-YU-RIEULSIOS -0x82F0 0xADE9 # HANGUL SYLLABLE KIYEOK-YU-RIEULTHIEUTH -0x82F1 0xADEA # HANGUL SYLLABLE KIYEOK-YU-RIEULPHIEUPH -0x82F2 0xADEB # HANGUL SYLLABLE KIYEOK-YU-RIEULHIEUH -0x82F3 0xADEC # HANGUL SYLLABLE KIYEOK-YU-MIEUM -0x82F4 0xADED # HANGUL SYLLABLE KIYEOK-YU-PIEUP -0x82F5 0xADEE # HANGUL SYLLABLE KIYEOK-YU-PIEUPSIOS -0x82F6 0xADEF # HANGUL SYLLABLE KIYEOK-YU-SIOS -0x82F7 0xADF0 # HANGUL SYLLABLE KIYEOK-YU-SSANGSIOS -0x82F8 0xADF1 # HANGUL SYLLABLE KIYEOK-YU-IEUNG -0x82F9 0xADF2 # HANGUL SYLLABLE KIYEOK-YU-CIEUC -0x82FA 0xADF3 # HANGUL SYLLABLE KIYEOK-YU-CHIEUCH -0x82FB 0xADF4 # HANGUL SYLLABLE KIYEOK-YU-KHIEUKH -0x82FC 0xADF5 # HANGUL SYLLABLE KIYEOK-YU-THIEUTH -0x82FD 0xADF6 # HANGUL SYLLABLE KIYEOK-YU-PHIEUPH -0x82FE 0xADF7 # HANGUL SYLLABLE KIYEOK-YU-HIEUH -0x8341 0xADFA # HANGUL SYLLABLE KIYEOK-EU-SSANGKIYEOK -0x8342 0xADFB # HANGUL SYLLABLE KIYEOK-EU-KIYEOKSIOS -0x8343 0xADFD # HANGUL SYLLABLE KIYEOK-EU-NIEUNCIEUC -0x8344 0xADFE # HANGUL SYLLABLE KIYEOK-EU-NIEUNHIEUH -0x8345 0xAE02 # HANGUL SYLLABLE KIYEOK-EU-RIEULMIEUM -0x8346 0xAE03 # HANGUL SYLLABLE KIYEOK-EU-RIEULPIEUP -0x8347 0xAE04 # HANGUL SYLLABLE KIYEOK-EU-RIEULSIOS -0x8348 0xAE05 # HANGUL SYLLABLE KIYEOK-EU-RIEULTHIEUTH -0x8349 0xAE06 # HANGUL SYLLABLE KIYEOK-EU-RIEULPHIEUPH -0x834A 0xAE07 # HANGUL SYLLABLE KIYEOK-EU-RIEULHIEUH -0x834B 0xAE0A # HANGUL SYLLABLE KIYEOK-EU-PIEUPSIOS -0x834C 0xAE0C # HANGUL SYLLABLE KIYEOK-EU-SSANGSIOS -0x834D 0xAE0E # HANGUL SYLLABLE KIYEOK-EU-CIEUC -0x834E 0xAE0F # HANGUL SYLLABLE KIYEOK-EU-CHIEUCH -0x834F 0xAE10 # HANGUL SYLLABLE KIYEOK-EU-KHIEUKH -0x8350 0xAE11 # HANGUL SYLLABLE KIYEOK-EU-THIEUTH -0x8351 0xAE12 # HANGUL SYLLABLE KIYEOK-EU-PHIEUPH -0x8352 0xAE13 # HANGUL SYLLABLE KIYEOK-EU-HIEUH -0x8353 0xAE15 # HANGUL SYLLABLE KIYEOK-YI-KIYEOK -0x8354 0xAE16 # HANGUL SYLLABLE KIYEOK-YI-SSANGKIYEOK -0x8355 0xAE17 # HANGUL SYLLABLE KIYEOK-YI-KIYEOKSIOS -0x8356 0xAE18 # HANGUL SYLLABLE KIYEOK-YI-NIEUN -0x8357 0xAE19 # HANGUL SYLLABLE KIYEOK-YI-NIEUNCIEUC -0x8358 0xAE1A # HANGUL SYLLABLE KIYEOK-YI-NIEUNHIEUH -0x8359 0xAE1B # HANGUL SYLLABLE KIYEOK-YI-TIKEUT -0x835A 0xAE1C # HANGUL SYLLABLE KIYEOK-YI-RIEUL -0x8361 0xAE1D # HANGUL SYLLABLE KIYEOK-YI-RIEULKIYEOK -0x8362 0xAE1E # HANGUL SYLLABLE KIYEOK-YI-RIEULMIEUM -0x8363 0xAE1F # HANGUL SYLLABLE KIYEOK-YI-RIEULPIEUP -0x8364 0xAE20 # HANGUL SYLLABLE KIYEOK-YI-RIEULSIOS -0x8365 0xAE21 # HANGUL SYLLABLE KIYEOK-YI-RIEULTHIEUTH -0x8366 0xAE22 # HANGUL SYLLABLE KIYEOK-YI-RIEULPHIEUPH -0x8367 0xAE23 # HANGUL SYLLABLE KIYEOK-YI-RIEULHIEUH -0x8368 0xAE24 # HANGUL SYLLABLE KIYEOK-YI-MIEUM -0x8369 0xAE25 # HANGUL SYLLABLE KIYEOK-YI-PIEUP -0x836A 0xAE26 # HANGUL SYLLABLE KIYEOK-YI-PIEUPSIOS -0x836B 0xAE27 # HANGUL SYLLABLE KIYEOK-YI-SIOS -0x836C 0xAE28 # HANGUL SYLLABLE KIYEOK-YI-SSANGSIOS -0x836D 0xAE29 # HANGUL SYLLABLE KIYEOK-YI-IEUNG -0x836E 0xAE2A # HANGUL SYLLABLE KIYEOK-YI-CIEUC -0x836F 0xAE2B # HANGUL SYLLABLE KIYEOK-YI-CHIEUCH -0x8370 0xAE2C # HANGUL SYLLABLE KIYEOK-YI-KHIEUKH -0x8371 0xAE2D # HANGUL SYLLABLE KIYEOK-YI-THIEUTH -0x8372 0xAE2E # HANGUL SYLLABLE KIYEOK-YI-PHIEUPH -0x8373 0xAE2F # HANGUL SYLLABLE KIYEOK-YI-HIEUH -0x8374 0xAE32 # HANGUL SYLLABLE KIYEOK-I-SSANGKIYEOK -0x8375 0xAE33 # HANGUL SYLLABLE KIYEOK-I-KIYEOKSIOS -0x8376 0xAE35 # HANGUL SYLLABLE KIYEOK-I-NIEUNCIEUC -0x8377 0xAE36 # HANGUL SYLLABLE KIYEOK-I-NIEUNHIEUH -0x8378 0xAE39 # HANGUL SYLLABLE KIYEOK-I-RIEULKIYEOK -0x8379 0xAE3B # HANGUL SYLLABLE KIYEOK-I-RIEULPIEUP -0x837A 0xAE3C # HANGUL SYLLABLE KIYEOK-I-RIEULSIOS -0x8381 0xAE3D # HANGUL SYLLABLE KIYEOK-I-RIEULTHIEUTH -0x8382 0xAE3E # HANGUL SYLLABLE KIYEOK-I-RIEULPHIEUPH -0x8383 0xAE3F # HANGUL SYLLABLE KIYEOK-I-RIEULHIEUH -0x8384 0xAE42 # HANGUL SYLLABLE KIYEOK-I-PIEUPSIOS -0x8385 0xAE44 # HANGUL SYLLABLE KIYEOK-I-SSANGSIOS -0x8386 0xAE47 # HANGUL SYLLABLE KIYEOK-I-CHIEUCH -0x8387 0xAE48 # HANGUL SYLLABLE KIYEOK-I-KHIEUKH -0x8388 0xAE49 # HANGUL SYLLABLE KIYEOK-I-THIEUTH -0x8389 0xAE4B # HANGUL SYLLABLE KIYEOK-I-HIEUH -0x838A 0xAE4F # HANGUL SYLLABLE SSANGKIYEOK-A-KIYEOKSIOS -0x838B 0xAE51 # HANGUL SYLLABLE SSANGKIYEOK-A-NIEUNCIEUC -0x838C 0xAE52 # HANGUL SYLLABLE SSANGKIYEOK-A-NIEUNHIEUH -0x838D 0xAE53 # HANGUL SYLLABLE SSANGKIYEOK-A-TIKEUT -0x838E 0xAE55 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULKIYEOK -0x838F 0xAE57 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULPIEUP -0x8390 0xAE58 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULSIOS -0x8391 0xAE59 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULTHIEUTH -0x8392 0xAE5A # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULPHIEUPH -0x8393 0xAE5B # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULHIEUH -0x8394 0xAE5E # HANGUL SYLLABLE SSANGKIYEOK-A-PIEUPSIOS -0x8395 0xAE62 # HANGUL SYLLABLE SSANGKIYEOK-A-CIEUC -0x8396 0xAE63 # HANGUL SYLLABLE SSANGKIYEOK-A-CHIEUCH -0x8397 0xAE64 # HANGUL SYLLABLE SSANGKIYEOK-A-KHIEUKH -0x8398 0xAE66 # HANGUL SYLLABLE SSANGKIYEOK-A-PHIEUPH -0x8399 0xAE67 # HANGUL SYLLABLE SSANGKIYEOK-A-HIEUH -0x839A 0xAE6A # HANGUL SYLLABLE SSANGKIYEOK-AE-SSANGKIYEOK -0x839B 0xAE6B # HANGUL SYLLABLE SSANGKIYEOK-AE-KIYEOKSIOS -0x839C 0xAE6D # HANGUL SYLLABLE SSANGKIYEOK-AE-NIEUNCIEUC -0x839D 0xAE6E # HANGUL SYLLABLE SSANGKIYEOK-AE-NIEUNHIEUH -0x839E 0xAE6F # HANGUL SYLLABLE SSANGKIYEOK-AE-TIKEUT -0x839F 0xAE71 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULKIYEOK -0x83A0 0xAE72 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULMIEUM -0x83A1 0xAE73 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULPIEUP -0x83A2 0xAE74 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULSIOS -0x83A3 0xAE75 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULTHIEUTH -0x83A4 0xAE76 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULPHIEUPH -0x83A5 0xAE77 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEULHIEUH -0x83A6 0xAE7A # HANGUL SYLLABLE SSANGKIYEOK-AE-PIEUPSIOS -0x83A7 0xAE7E # HANGUL SYLLABLE SSANGKIYEOK-AE-CIEUC -0x83A8 0xAE7F # HANGUL SYLLABLE SSANGKIYEOK-AE-CHIEUCH -0x83A9 0xAE80 # HANGUL SYLLABLE SSANGKIYEOK-AE-KHIEUKH -0x83AA 0xAE81 # HANGUL SYLLABLE SSANGKIYEOK-AE-THIEUTH -0x83AB 0xAE82 # HANGUL SYLLABLE SSANGKIYEOK-AE-PHIEUPH -0x83AC 0xAE83 # HANGUL SYLLABLE SSANGKIYEOK-AE-HIEUH -0x83AD 0xAE86 # HANGUL SYLLABLE SSANGKIYEOK-YA-SSANGKIYEOK -0x83AE 0xAE87 # HANGUL SYLLABLE SSANGKIYEOK-YA-KIYEOKSIOS -0x83AF 0xAE88 # HANGUL SYLLABLE SSANGKIYEOK-YA-NIEUN -0x83B0 0xAE89 # HANGUL SYLLABLE SSANGKIYEOK-YA-NIEUNCIEUC -0x83B1 0xAE8A # HANGUL SYLLABLE SSANGKIYEOK-YA-NIEUNHIEUH -0x83B2 0xAE8B # HANGUL SYLLABLE SSANGKIYEOK-YA-TIKEUT -0x83B3 0xAE8D # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULKIYEOK -0x83B4 0xAE8E # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULMIEUM -0x83B5 0xAE8F # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULPIEUP -0x83B6 0xAE90 # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULSIOS -0x83B7 0xAE91 # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULTHIEUTH -0x83B8 0xAE92 # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULPHIEUPH -0x83B9 0xAE93 # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEULHIEUH -0x83BA 0xAE94 # HANGUL SYLLABLE SSANGKIYEOK-YA-MIEUM -0x83BB 0xAE95 # HANGUL SYLLABLE SSANGKIYEOK-YA-PIEUP -0x83BC 0xAE96 # HANGUL SYLLABLE SSANGKIYEOK-YA-PIEUPSIOS -0x83BD 0xAE97 # HANGUL SYLLABLE SSANGKIYEOK-YA-SIOS -0x83BE 0xAE98 # HANGUL SYLLABLE SSANGKIYEOK-YA-SSANGSIOS -0x83BF 0xAE99 # HANGUL SYLLABLE SSANGKIYEOK-YA-IEUNG -0x83C0 0xAE9A # HANGUL SYLLABLE SSANGKIYEOK-YA-CIEUC -0x83C1 0xAE9B # HANGUL SYLLABLE SSANGKIYEOK-YA-CHIEUCH -0x83C2 0xAE9C # HANGUL SYLLABLE SSANGKIYEOK-YA-KHIEUKH -0x83C3 0xAE9D # HANGUL SYLLABLE SSANGKIYEOK-YA-THIEUTH -0x83C4 0xAE9E # HANGUL SYLLABLE SSANGKIYEOK-YA-PHIEUPH -0x83C5 0xAE9F # HANGUL SYLLABLE SSANGKIYEOK-YA-HIEUH -0x83C6 0xAEA0 # HANGUL SYLLABLE SSANGKIYEOK-YAE -0x83C7 0xAEA1 # HANGUL SYLLABLE SSANGKIYEOK-YAE-KIYEOK -0x83C8 0xAEA2 # HANGUL SYLLABLE SSANGKIYEOK-YAE-SSANGKIYEOK -0x83C9 0xAEA3 # HANGUL SYLLABLE SSANGKIYEOK-YAE-KIYEOKSIOS -0x83CA 0xAEA4 # HANGUL SYLLABLE SSANGKIYEOK-YAE-NIEUN -0x83CB 0xAEA5 # HANGUL SYLLABLE SSANGKIYEOK-YAE-NIEUNCIEUC -0x83CC 0xAEA6 # HANGUL SYLLABLE SSANGKIYEOK-YAE-NIEUNHIEUH -0x83CD 0xAEA7 # HANGUL SYLLABLE SSANGKIYEOK-YAE-TIKEUT -0x83CE 0xAEA8 # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEUL -0x83CF 0xAEA9 # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULKIYEOK -0x83D0 0xAEAA # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULMIEUM -0x83D1 0xAEAB # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULPIEUP -0x83D2 0xAEAC # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULSIOS -0x83D3 0xAEAD # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULTHIEUTH -0x83D4 0xAEAE # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULPHIEUPH -0x83D5 0xAEAF # HANGUL SYLLABLE SSANGKIYEOK-YAE-RIEULHIEUH -0x83D6 0xAEB0 # HANGUL SYLLABLE SSANGKIYEOK-YAE-MIEUM -0x83D7 0xAEB1 # HANGUL SYLLABLE SSANGKIYEOK-YAE-PIEUP -0x83D8 0xAEB2 # HANGUL SYLLABLE SSANGKIYEOK-YAE-PIEUPSIOS -0x83D9 0xAEB3 # HANGUL SYLLABLE SSANGKIYEOK-YAE-SIOS -0x83DA 0xAEB4 # HANGUL SYLLABLE SSANGKIYEOK-YAE-SSANGSIOS -0x83DB 0xAEB5 # HANGUL SYLLABLE SSANGKIYEOK-YAE-IEUNG -0x83DC 0xAEB6 # HANGUL SYLLABLE SSANGKIYEOK-YAE-CIEUC -0x83DD 0xAEB7 # HANGUL SYLLABLE SSANGKIYEOK-YAE-CHIEUCH -0x83DE 0xAEB8 # HANGUL SYLLABLE SSANGKIYEOK-YAE-KHIEUKH -0x83DF 0xAEB9 # HANGUL SYLLABLE SSANGKIYEOK-YAE-THIEUTH -0x83E0 0xAEBA # HANGUL SYLLABLE SSANGKIYEOK-YAE-PHIEUPH -0x83E1 0xAEBB # HANGUL SYLLABLE SSANGKIYEOK-YAE-HIEUH -0x83E2 0xAEBF # HANGUL SYLLABLE SSANGKIYEOK-EO-KIYEOKSIOS -0x83E3 0xAEC1 # HANGUL SYLLABLE SSANGKIYEOK-EO-NIEUNCIEUC -0x83E4 0xAEC2 # HANGUL SYLLABLE SSANGKIYEOK-EO-NIEUNHIEUH -0x83E5 0xAEC3 # HANGUL SYLLABLE SSANGKIYEOK-EO-TIKEUT -0x83E6 0xAEC5 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULKIYEOK -0x83E7 0xAEC6 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULMIEUM -0x83E8 0xAEC7 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULPIEUP -0x83E9 0xAEC8 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULSIOS -0x83EA 0xAEC9 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULTHIEUTH -0x83EB 0xAECA # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULPHIEUPH -0x83EC 0xAECB # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEULHIEUH -0x83ED 0xAECE # HANGUL SYLLABLE SSANGKIYEOK-EO-PIEUPSIOS -0x83EE 0xAED2 # HANGUL SYLLABLE SSANGKIYEOK-EO-CIEUC -0x83EF 0xAED3 # HANGUL SYLLABLE SSANGKIYEOK-EO-CHIEUCH -0x83F0 0xAED4 # HANGUL SYLLABLE SSANGKIYEOK-EO-KHIEUKH -0x83F1 0xAED5 # HANGUL SYLLABLE SSANGKIYEOK-EO-THIEUTH -0x83F2 0xAED6 # HANGUL SYLLABLE SSANGKIYEOK-EO-PHIEUPH -0x83F3 0xAED7 # HANGUL SYLLABLE SSANGKIYEOK-EO-HIEUH -0x83F4 0xAEDA # HANGUL SYLLABLE SSANGKIYEOK-E-SSANGKIYEOK -0x83F5 0xAEDB # HANGUL SYLLABLE SSANGKIYEOK-E-KIYEOKSIOS -0x83F6 0xAEDD # HANGUL SYLLABLE SSANGKIYEOK-E-NIEUNCIEUC -0x83F7 0xAEDE # HANGUL SYLLABLE SSANGKIYEOK-E-NIEUNHIEUH -0x83F8 0xAEDF # HANGUL SYLLABLE SSANGKIYEOK-E-TIKEUT -0x83F9 0xAEE0 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEUL -0x83FA 0xAEE1 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULKIYEOK -0x83FB 0xAEE2 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULMIEUM -0x83FC 0xAEE3 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULPIEUP -0x83FD 0xAEE4 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULSIOS -0x83FE 0xAEE5 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULTHIEUTH -0x8441 0xAEE6 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULPHIEUPH -0x8442 0xAEE7 # HANGUL SYLLABLE SSANGKIYEOK-E-RIEULHIEUH -0x8443 0xAEE9 # HANGUL SYLLABLE SSANGKIYEOK-E-PIEUP -0x8444 0xAEEA # HANGUL SYLLABLE SSANGKIYEOK-E-PIEUPSIOS -0x8445 0xAEEC # HANGUL SYLLABLE SSANGKIYEOK-E-SSANGSIOS -0x8446 0xAEEE # HANGUL SYLLABLE SSANGKIYEOK-E-CIEUC -0x8447 0xAEEF # HANGUL SYLLABLE SSANGKIYEOK-E-CHIEUCH -0x8448 0xAEF0 # HANGUL SYLLABLE SSANGKIYEOK-E-KHIEUKH -0x8449 0xAEF1 # HANGUL SYLLABLE SSANGKIYEOK-E-THIEUTH -0x844A 0xAEF2 # HANGUL SYLLABLE SSANGKIYEOK-E-PHIEUPH -0x844B 0xAEF3 # HANGUL SYLLABLE SSANGKIYEOK-E-HIEUH -0x844C 0xAEF5 # HANGUL SYLLABLE SSANGKIYEOK-YEO-KIYEOK -0x844D 0xAEF6 # HANGUL SYLLABLE SSANGKIYEOK-YEO-SSANGKIYEOK -0x844E 0xAEF7 # HANGUL SYLLABLE SSANGKIYEOK-YEO-KIYEOKSIOS -0x844F 0xAEF9 # HANGUL SYLLABLE SSANGKIYEOK-YEO-NIEUNCIEUC -0x8450 0xAEFA # HANGUL SYLLABLE SSANGKIYEOK-YEO-NIEUNHIEUH -0x8451 0xAEFB # HANGUL SYLLABLE SSANGKIYEOK-YEO-TIKEUT -0x8452 0xAEFD # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULKIYEOK -0x8453 0xAEFE # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULMIEUM -0x8454 0xAEFF # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULPIEUP -0x8455 0xAF00 # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULSIOS -0x8456 0xAF01 # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULTHIEUTH -0x8457 0xAF02 # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULPHIEUPH -0x8458 0xAF03 # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEULHIEUH -0x8459 0xAF04 # HANGUL SYLLABLE SSANGKIYEOK-YEO-MIEUM -0x845A 0xAF05 # HANGUL SYLLABLE SSANGKIYEOK-YEO-PIEUP -0x8461 0xAF06 # HANGUL SYLLABLE SSANGKIYEOK-YEO-PIEUPSIOS -0x8462 0xAF09 # HANGUL SYLLABLE SSANGKIYEOK-YEO-IEUNG -0x8463 0xAF0A # HANGUL SYLLABLE SSANGKIYEOK-YEO-CIEUC -0x8464 0xAF0B # HANGUL SYLLABLE SSANGKIYEOK-YEO-CHIEUCH -0x8465 0xAF0C # HANGUL SYLLABLE SSANGKIYEOK-YEO-KHIEUKH -0x8466 0xAF0E # HANGUL SYLLABLE SSANGKIYEOK-YEO-PHIEUPH -0x8467 0xAF0F # HANGUL SYLLABLE SSANGKIYEOK-YEO-HIEUH -0x8468 0xAF11 # HANGUL SYLLABLE SSANGKIYEOK-YE-KIYEOK -0x8469 0xAF12 # HANGUL SYLLABLE SSANGKIYEOK-YE-SSANGKIYEOK -0x846A 0xAF13 # HANGUL SYLLABLE SSANGKIYEOK-YE-KIYEOKSIOS -0x846B 0xAF14 # HANGUL SYLLABLE SSANGKIYEOK-YE-NIEUN -0x846C 0xAF15 # HANGUL SYLLABLE SSANGKIYEOK-YE-NIEUNCIEUC -0x846D 0xAF16 # HANGUL SYLLABLE SSANGKIYEOK-YE-NIEUNHIEUH -0x846E 0xAF17 # HANGUL SYLLABLE SSANGKIYEOK-YE-TIKEUT -0x846F 0xAF18 # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEUL -0x8470 0xAF19 # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULKIYEOK -0x8471 0xAF1A # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULMIEUM -0x8472 0xAF1B # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULPIEUP -0x8473 0xAF1C # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULSIOS -0x8474 0xAF1D # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULTHIEUTH -0x8475 0xAF1E # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULPHIEUPH -0x8476 0xAF1F # HANGUL SYLLABLE SSANGKIYEOK-YE-RIEULHIEUH -0x8477 0xAF20 # HANGUL SYLLABLE SSANGKIYEOK-YE-MIEUM -0x8478 0xAF21 # HANGUL SYLLABLE SSANGKIYEOK-YE-PIEUP -0x8479 0xAF22 # HANGUL SYLLABLE SSANGKIYEOK-YE-PIEUPSIOS -0x847A 0xAF23 # HANGUL SYLLABLE SSANGKIYEOK-YE-SIOS -0x8481 0xAF24 # HANGUL SYLLABLE SSANGKIYEOK-YE-SSANGSIOS -0x8482 0xAF25 # HANGUL SYLLABLE SSANGKIYEOK-YE-IEUNG -0x8483 0xAF26 # HANGUL SYLLABLE SSANGKIYEOK-YE-CIEUC -0x8484 0xAF27 # HANGUL SYLLABLE SSANGKIYEOK-YE-CHIEUCH -0x8485 0xAF28 # HANGUL SYLLABLE SSANGKIYEOK-YE-KHIEUKH -0x8486 0xAF29 # HANGUL SYLLABLE SSANGKIYEOK-YE-THIEUTH -0x8487 0xAF2A # HANGUL SYLLABLE SSANGKIYEOK-YE-PHIEUPH -0x8488 0xAF2B # HANGUL SYLLABLE SSANGKIYEOK-YE-HIEUH -0x8489 0xAF2E # HANGUL SYLLABLE SSANGKIYEOK-O-SSANGKIYEOK -0x848A 0xAF2F # HANGUL SYLLABLE SSANGKIYEOK-O-KIYEOKSIOS -0x848B 0xAF31 # HANGUL SYLLABLE SSANGKIYEOK-O-NIEUNCIEUC -0x848C 0xAF33 # HANGUL SYLLABLE SSANGKIYEOK-O-TIKEUT -0x848D 0xAF35 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULKIYEOK -0x848E 0xAF36 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULMIEUM -0x848F 0xAF37 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULPIEUP -0x8490 0xAF38 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULSIOS -0x8491 0xAF39 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULTHIEUTH -0x8492 0xAF3A # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULPHIEUPH -0x8493 0xAF3B # HANGUL SYLLABLE SSANGKIYEOK-O-RIEULHIEUH -0x8494 0xAF3E # HANGUL SYLLABLE SSANGKIYEOK-O-PIEUPSIOS -0x8495 0xAF40 # HANGUL SYLLABLE SSANGKIYEOK-O-SSANGSIOS -0x8496 0xAF44 # HANGUL SYLLABLE SSANGKIYEOK-O-KHIEUKH -0x8497 0xAF45 # HANGUL SYLLABLE SSANGKIYEOK-O-THIEUTH -0x8498 0xAF46 # HANGUL SYLLABLE SSANGKIYEOK-O-PHIEUPH -0x8499 0xAF47 # HANGUL SYLLABLE SSANGKIYEOK-O-HIEUH -0x849A 0xAF4A # HANGUL SYLLABLE SSANGKIYEOK-WA-SSANGKIYEOK -0x849B 0xAF4B # HANGUL SYLLABLE SSANGKIYEOK-WA-KIYEOKSIOS -0x849C 0xAF4C # HANGUL SYLLABLE SSANGKIYEOK-WA-NIEUN -0x849D 0xAF4D # HANGUL SYLLABLE SSANGKIYEOK-WA-NIEUNCIEUC -0x849E 0xAF4E # HANGUL SYLLABLE SSANGKIYEOK-WA-NIEUNHIEUH -0x849F 0xAF4F # HANGUL SYLLABLE SSANGKIYEOK-WA-TIKEUT -0x84A0 0xAF51 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULKIYEOK -0x84A1 0xAF52 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULMIEUM -0x84A2 0xAF53 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULPIEUP -0x84A3 0xAF54 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULSIOS -0x84A4 0xAF55 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULTHIEUTH -0x84A5 0xAF56 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULPHIEUPH -0x84A6 0xAF57 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEULHIEUH -0x84A7 0xAF58 # HANGUL SYLLABLE SSANGKIYEOK-WA-MIEUM -0x84A8 0xAF59 # HANGUL SYLLABLE SSANGKIYEOK-WA-PIEUP -0x84A9 0xAF5A # HANGUL SYLLABLE SSANGKIYEOK-WA-PIEUPSIOS -0x84AA 0xAF5B # HANGUL SYLLABLE SSANGKIYEOK-WA-SIOS -0x84AB 0xAF5E # HANGUL SYLLABLE SSANGKIYEOK-WA-CIEUC -0x84AC 0xAF5F # HANGUL SYLLABLE SSANGKIYEOK-WA-CHIEUCH -0x84AD 0xAF60 # HANGUL SYLLABLE SSANGKIYEOK-WA-KHIEUKH -0x84AE 0xAF61 # HANGUL SYLLABLE SSANGKIYEOK-WA-THIEUTH -0x84AF 0xAF62 # HANGUL SYLLABLE SSANGKIYEOK-WA-PHIEUPH -0x84B0 0xAF63 # HANGUL SYLLABLE SSANGKIYEOK-WA-HIEUH -0x84B1 0xAF66 # HANGUL SYLLABLE SSANGKIYEOK-WAE-SSANGKIYEOK -0x84B2 0xAF67 # HANGUL SYLLABLE SSANGKIYEOK-WAE-KIYEOKSIOS -0x84B3 0xAF68 # HANGUL SYLLABLE SSANGKIYEOK-WAE-NIEUN -0x84B4 0xAF69 # HANGUL SYLLABLE SSANGKIYEOK-WAE-NIEUNCIEUC -0x84B5 0xAF6A # HANGUL SYLLABLE SSANGKIYEOK-WAE-NIEUNHIEUH -0x84B6 0xAF6B # HANGUL SYLLABLE SSANGKIYEOK-WAE-TIKEUT -0x84B7 0xAF6C # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEUL -0x84B8 0xAF6D # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULKIYEOK -0x84B9 0xAF6E # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULMIEUM -0x84BA 0xAF6F # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULPIEUP -0x84BB 0xAF70 # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULSIOS -0x84BC 0xAF71 # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULTHIEUTH -0x84BD 0xAF72 # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULPHIEUPH -0x84BE 0xAF73 # HANGUL SYLLABLE SSANGKIYEOK-WAE-RIEULHIEUH -0x84BF 0xAF74 # HANGUL SYLLABLE SSANGKIYEOK-WAE-MIEUM -0x84C0 0xAF75 # HANGUL SYLLABLE SSANGKIYEOK-WAE-PIEUP -0x84C1 0xAF76 # HANGUL SYLLABLE SSANGKIYEOK-WAE-PIEUPSIOS -0x84C2 0xAF77 # HANGUL SYLLABLE SSANGKIYEOK-WAE-SIOS -0x84C3 0xAF78 # HANGUL SYLLABLE SSANGKIYEOK-WAE-SSANGSIOS -0x84C4 0xAF7A # HANGUL SYLLABLE SSANGKIYEOK-WAE-CIEUC -0x84C5 0xAF7B # HANGUL SYLLABLE SSANGKIYEOK-WAE-CHIEUCH -0x84C6 0xAF7C # HANGUL SYLLABLE SSANGKIYEOK-WAE-KHIEUKH -0x84C7 0xAF7D # HANGUL SYLLABLE SSANGKIYEOK-WAE-THIEUTH -0x84C8 0xAF7E # HANGUL SYLLABLE SSANGKIYEOK-WAE-PHIEUPH -0x84C9 0xAF7F # HANGUL SYLLABLE SSANGKIYEOK-WAE-HIEUH -0x84CA 0xAF81 # HANGUL SYLLABLE SSANGKIYEOK-OE-KIYEOK -0x84CB 0xAF82 # HANGUL SYLLABLE SSANGKIYEOK-OE-SSANGKIYEOK -0x84CC 0xAF83 # HANGUL SYLLABLE SSANGKIYEOK-OE-KIYEOKSIOS -0x84CD 0xAF85 # HANGUL SYLLABLE SSANGKIYEOK-OE-NIEUNCIEUC -0x84CE 0xAF86 # HANGUL SYLLABLE SSANGKIYEOK-OE-NIEUNHIEUH -0x84CF 0xAF87 # HANGUL SYLLABLE SSANGKIYEOK-OE-TIKEUT -0x84D0 0xAF89 # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULKIYEOK -0x84D1 0xAF8A # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULMIEUM -0x84D2 0xAF8B # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULPIEUP -0x84D3 0xAF8C # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULSIOS -0x84D4 0xAF8D # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULTHIEUTH -0x84D5 0xAF8E # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULPHIEUPH -0x84D6 0xAF8F # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEULHIEUH -0x84D7 0xAF92 # HANGUL SYLLABLE SSANGKIYEOK-OE-PIEUPSIOS -0x84D8 0xAF93 # HANGUL SYLLABLE SSANGKIYEOK-OE-SIOS -0x84D9 0xAF94 # HANGUL SYLLABLE SSANGKIYEOK-OE-SSANGSIOS -0x84DA 0xAF96 # HANGUL SYLLABLE SSANGKIYEOK-OE-CIEUC -0x84DB 0xAF97 # HANGUL SYLLABLE SSANGKIYEOK-OE-CHIEUCH -0x84DC 0xAF98 # HANGUL SYLLABLE SSANGKIYEOK-OE-KHIEUKH -0x84DD 0xAF99 # HANGUL SYLLABLE SSANGKIYEOK-OE-THIEUTH -0x84DE 0xAF9A # HANGUL SYLLABLE SSANGKIYEOK-OE-PHIEUPH -0x84DF 0xAF9B # HANGUL SYLLABLE SSANGKIYEOK-OE-HIEUH -0x84E0 0xAF9D # HANGUL SYLLABLE SSANGKIYEOK-YO-KIYEOK -0x84E1 0xAF9E # HANGUL SYLLABLE SSANGKIYEOK-YO-SSANGKIYEOK -0x84E2 0xAF9F # HANGUL SYLLABLE SSANGKIYEOK-YO-KIYEOKSIOS -0x84E3 0xAFA0 # HANGUL SYLLABLE SSANGKIYEOK-YO-NIEUN -0x84E4 0xAFA1 # HANGUL SYLLABLE SSANGKIYEOK-YO-NIEUNCIEUC -0x84E5 0xAFA2 # HANGUL SYLLABLE SSANGKIYEOK-YO-NIEUNHIEUH -0x84E6 0xAFA3 # HANGUL SYLLABLE SSANGKIYEOK-YO-TIKEUT -0x84E7 0xAFA4 # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEUL -0x84E8 0xAFA5 # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULKIYEOK -0x84E9 0xAFA6 # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULMIEUM -0x84EA 0xAFA7 # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULPIEUP -0x84EB 0xAFA8 # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULSIOS -0x84EC 0xAFA9 # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULTHIEUTH -0x84ED 0xAFAA # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULPHIEUPH -0x84EE 0xAFAB # HANGUL SYLLABLE SSANGKIYEOK-YO-RIEULHIEUH -0x84EF 0xAFAC # HANGUL SYLLABLE SSANGKIYEOK-YO-MIEUM -0x84F0 0xAFAD # HANGUL SYLLABLE SSANGKIYEOK-YO-PIEUP -0x84F1 0xAFAE # HANGUL SYLLABLE SSANGKIYEOK-YO-PIEUPSIOS -0x84F2 0xAFAF # HANGUL SYLLABLE SSANGKIYEOK-YO-SIOS -0x84F3 0xAFB0 # HANGUL SYLLABLE SSANGKIYEOK-YO-SSANGSIOS -0x84F4 0xAFB1 # HANGUL SYLLABLE SSANGKIYEOK-YO-IEUNG -0x84F5 0xAFB2 # HANGUL SYLLABLE SSANGKIYEOK-YO-CIEUC -0x84F6 0xAFB3 # HANGUL SYLLABLE SSANGKIYEOK-YO-CHIEUCH -0x84F7 0xAFB4 # HANGUL SYLLABLE SSANGKIYEOK-YO-KHIEUKH -0x84F8 0xAFB5 # HANGUL SYLLABLE SSANGKIYEOK-YO-THIEUTH -0x84F9 0xAFB6 # HANGUL SYLLABLE SSANGKIYEOK-YO-PHIEUPH -0x84FA 0xAFB7 # HANGUL SYLLABLE SSANGKIYEOK-YO-HIEUH -0x84FB 0xAFBA # HANGUL SYLLABLE SSANGKIYEOK-U-SSANGKIYEOK -0x84FC 0xAFBB # HANGUL SYLLABLE SSANGKIYEOK-U-KIYEOKSIOS -0x84FD 0xAFBD # HANGUL SYLLABLE SSANGKIYEOK-U-NIEUNCIEUC -0x84FE 0xAFBE # HANGUL SYLLABLE SSANGKIYEOK-U-NIEUNHIEUH -0x8541 0xAFBF # HANGUL SYLLABLE SSANGKIYEOK-U-TIKEUT -0x8542 0xAFC1 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULKIYEOK -0x8543 0xAFC2 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULMIEUM -0x8544 0xAFC3 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULPIEUP -0x8545 0xAFC4 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULSIOS -0x8546 0xAFC5 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULTHIEUTH -0x8547 0xAFC6 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULPHIEUPH -0x8548 0xAFCA # HANGUL SYLLABLE SSANGKIYEOK-U-PIEUPSIOS -0x8549 0xAFCC # HANGUL SYLLABLE SSANGKIYEOK-U-SSANGSIOS -0x854A 0xAFCF # HANGUL SYLLABLE SSANGKIYEOK-U-CHIEUCH -0x854B 0xAFD0 # HANGUL SYLLABLE SSANGKIYEOK-U-KHIEUKH -0x854C 0xAFD1 # HANGUL SYLLABLE SSANGKIYEOK-U-THIEUTH -0x854D 0xAFD2 # HANGUL SYLLABLE SSANGKIYEOK-U-PHIEUPH -0x854E 0xAFD3 # HANGUL SYLLABLE SSANGKIYEOK-U-HIEUH -0x854F 0xAFD5 # HANGUL SYLLABLE SSANGKIYEOK-WEO-KIYEOK -0x8550 0xAFD6 # HANGUL SYLLABLE SSANGKIYEOK-WEO-SSANGKIYEOK -0x8551 0xAFD7 # HANGUL SYLLABLE SSANGKIYEOK-WEO-KIYEOKSIOS -0x8552 0xAFD8 # HANGUL SYLLABLE SSANGKIYEOK-WEO-NIEUN -0x8553 0xAFD9 # HANGUL SYLLABLE SSANGKIYEOK-WEO-NIEUNCIEUC -0x8554 0xAFDA # HANGUL SYLLABLE SSANGKIYEOK-WEO-NIEUNHIEUH -0x8555 0xAFDB # HANGUL SYLLABLE SSANGKIYEOK-WEO-TIKEUT -0x8556 0xAFDD # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULKIYEOK -0x8557 0xAFDE # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULMIEUM -0x8558 0xAFDF # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULPIEUP -0x8559 0xAFE0 # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULSIOS -0x855A 0xAFE1 # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULTHIEUTH -0x8561 0xAFE2 # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULPHIEUPH -0x8562 0xAFE3 # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEULHIEUH -0x8563 0xAFE4 # HANGUL SYLLABLE SSANGKIYEOK-WEO-MIEUM -0x8564 0xAFE5 # HANGUL SYLLABLE SSANGKIYEOK-WEO-PIEUP -0x8565 0xAFE6 # HANGUL SYLLABLE SSANGKIYEOK-WEO-PIEUPSIOS -0x8566 0xAFE7 # HANGUL SYLLABLE SSANGKIYEOK-WEO-SIOS -0x8567 0xAFEA # HANGUL SYLLABLE SSANGKIYEOK-WEO-CIEUC -0x8568 0xAFEB # HANGUL SYLLABLE SSANGKIYEOK-WEO-CHIEUCH -0x8569 0xAFEC # HANGUL SYLLABLE SSANGKIYEOK-WEO-KHIEUKH -0x856A 0xAFED # HANGUL SYLLABLE SSANGKIYEOK-WEO-THIEUTH -0x856B 0xAFEE # HANGUL SYLLABLE SSANGKIYEOK-WEO-PHIEUPH -0x856C 0xAFEF # HANGUL SYLLABLE SSANGKIYEOK-WEO-HIEUH -0x856D 0xAFF2 # HANGUL SYLLABLE SSANGKIYEOK-WE-SSANGKIYEOK -0x856E 0xAFF3 # HANGUL SYLLABLE SSANGKIYEOK-WE-KIYEOKSIOS -0x856F 0xAFF5 # HANGUL SYLLABLE SSANGKIYEOK-WE-NIEUNCIEUC -0x8570 0xAFF6 # HANGUL SYLLABLE SSANGKIYEOK-WE-NIEUNHIEUH -0x8571 0xAFF7 # HANGUL SYLLABLE SSANGKIYEOK-WE-TIKEUT -0x8572 0xAFF9 # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULKIYEOK -0x8573 0xAFFA # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULMIEUM -0x8574 0xAFFB # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULPIEUP -0x8575 0xAFFC # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULSIOS -0x8576 0xAFFD # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULTHIEUTH -0x8577 0xAFFE # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULPHIEUPH -0x8578 0xAFFF # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEULHIEUH -0x8579 0xB002 # HANGUL SYLLABLE SSANGKIYEOK-WE-PIEUPSIOS -0x857A 0xB003 # HANGUL SYLLABLE SSANGKIYEOK-WE-SIOS -0x8581 0xB005 # HANGUL SYLLABLE SSANGKIYEOK-WE-IEUNG -0x8582 0xB006 # HANGUL SYLLABLE SSANGKIYEOK-WE-CIEUC -0x8583 0xB007 # HANGUL SYLLABLE SSANGKIYEOK-WE-CHIEUCH -0x8584 0xB008 # HANGUL SYLLABLE SSANGKIYEOK-WE-KHIEUKH -0x8585 0xB009 # HANGUL SYLLABLE SSANGKIYEOK-WE-THIEUTH -0x8586 0xB00A # HANGUL SYLLABLE SSANGKIYEOK-WE-PHIEUPH -0x8587 0xB00B # HANGUL SYLLABLE SSANGKIYEOK-WE-HIEUH -0x8588 0xB00D # HANGUL SYLLABLE SSANGKIYEOK-WI-KIYEOK -0x8589 0xB00E # HANGUL SYLLABLE SSANGKIYEOK-WI-SSANGKIYEOK -0x858A 0xB00F # HANGUL SYLLABLE SSANGKIYEOK-WI-KIYEOKSIOS -0x858B 0xB011 # HANGUL SYLLABLE SSANGKIYEOK-WI-NIEUNCIEUC -0x858C 0xB012 # HANGUL SYLLABLE SSANGKIYEOK-WI-NIEUNHIEUH -0x858D 0xB013 # HANGUL SYLLABLE SSANGKIYEOK-WI-TIKEUT -0x858E 0xB015 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULKIYEOK -0x858F 0xB016 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULMIEUM -0x8590 0xB017 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULPIEUP -0x8591 0xB018 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULSIOS -0x8592 0xB019 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULTHIEUTH -0x8593 0xB01A # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULPHIEUPH -0x8594 0xB01B # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEULHIEUH -0x8595 0xB01E # HANGUL SYLLABLE SSANGKIYEOK-WI-PIEUPSIOS -0x8596 0xB01F # HANGUL SYLLABLE SSANGKIYEOK-WI-SIOS -0x8597 0xB020 # HANGUL SYLLABLE SSANGKIYEOK-WI-SSANGSIOS -0x8598 0xB021 # HANGUL SYLLABLE SSANGKIYEOK-WI-IEUNG -0x8599 0xB022 # HANGUL SYLLABLE SSANGKIYEOK-WI-CIEUC -0x859A 0xB023 # HANGUL SYLLABLE SSANGKIYEOK-WI-CHIEUCH -0x859B 0xB024 # HANGUL SYLLABLE SSANGKIYEOK-WI-KHIEUKH -0x859C 0xB025 # HANGUL SYLLABLE SSANGKIYEOK-WI-THIEUTH -0x859D 0xB026 # HANGUL SYLLABLE SSANGKIYEOK-WI-PHIEUPH -0x859E 0xB027 # HANGUL SYLLABLE SSANGKIYEOK-WI-HIEUH -0x859F 0xB029 # HANGUL SYLLABLE SSANGKIYEOK-YU-KIYEOK -0x85A0 0xB02A # HANGUL SYLLABLE SSANGKIYEOK-YU-SSANGKIYEOK -0x85A1 0xB02B # HANGUL SYLLABLE SSANGKIYEOK-YU-KIYEOKSIOS -0x85A2 0xB02C # HANGUL SYLLABLE SSANGKIYEOK-YU-NIEUN -0x85A3 0xB02D # HANGUL SYLLABLE SSANGKIYEOK-YU-NIEUNCIEUC -0x85A4 0xB02E # HANGUL SYLLABLE SSANGKIYEOK-YU-NIEUNHIEUH -0x85A5 0xB02F # HANGUL SYLLABLE SSANGKIYEOK-YU-TIKEUT -0x85A6 0xB030 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEUL -0x85A7 0xB031 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULKIYEOK -0x85A8 0xB032 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULMIEUM -0x85A9 0xB033 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULPIEUP -0x85AA 0xB034 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULSIOS -0x85AB 0xB035 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULTHIEUTH -0x85AC 0xB036 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULPHIEUPH -0x85AD 0xB037 # HANGUL SYLLABLE SSANGKIYEOK-YU-RIEULHIEUH -0x85AE 0xB038 # HANGUL SYLLABLE SSANGKIYEOK-YU-MIEUM -0x85AF 0xB039 # HANGUL SYLLABLE SSANGKIYEOK-YU-PIEUP -0x85B0 0xB03A # HANGUL SYLLABLE SSANGKIYEOK-YU-PIEUPSIOS -0x85B1 0xB03B # HANGUL SYLLABLE SSANGKIYEOK-YU-SIOS -0x85B2 0xB03C # HANGUL SYLLABLE SSANGKIYEOK-YU-SSANGSIOS -0x85B3 0xB03D # HANGUL SYLLABLE SSANGKIYEOK-YU-IEUNG -0x85B4 0xB03E # HANGUL SYLLABLE SSANGKIYEOK-YU-CIEUC -0x85B5 0xB03F # HANGUL SYLLABLE SSANGKIYEOK-YU-CHIEUCH -0x85B6 0xB040 # HANGUL SYLLABLE SSANGKIYEOK-YU-KHIEUKH -0x85B7 0xB041 # HANGUL SYLLABLE SSANGKIYEOK-YU-THIEUTH -0x85B8 0xB042 # HANGUL SYLLABLE SSANGKIYEOK-YU-PHIEUPH -0x85B9 0xB043 # HANGUL SYLLABLE SSANGKIYEOK-YU-HIEUH -0x85BA 0xB046 # HANGUL SYLLABLE SSANGKIYEOK-EU-SSANGKIYEOK -0x85BB 0xB047 # HANGUL SYLLABLE SSANGKIYEOK-EU-KIYEOKSIOS -0x85BC 0xB049 # HANGUL SYLLABLE SSANGKIYEOK-EU-NIEUNCIEUC -0x85BD 0xB04B # HANGUL SYLLABLE SSANGKIYEOK-EU-TIKEUT -0x85BE 0xB04D # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULKIYEOK -0x85BF 0xB04F # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULPIEUP -0x85C0 0xB050 # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULSIOS -0x85C1 0xB051 # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULTHIEUTH -0x85C2 0xB052 # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULPHIEUPH -0x85C3 0xB056 # HANGUL SYLLABLE SSANGKIYEOK-EU-PIEUPSIOS -0x85C4 0xB058 # HANGUL SYLLABLE SSANGKIYEOK-EU-SSANGSIOS -0x85C5 0xB05A # HANGUL SYLLABLE SSANGKIYEOK-EU-CIEUC -0x85C6 0xB05B # HANGUL SYLLABLE SSANGKIYEOK-EU-CHIEUCH -0x85C7 0xB05C # HANGUL SYLLABLE SSANGKIYEOK-EU-KHIEUKH -0x85C8 0xB05E # HANGUL SYLLABLE SSANGKIYEOK-EU-PHIEUPH -0x85C9 0xB05F # HANGUL SYLLABLE SSANGKIYEOK-EU-HIEUH -0x85CA 0xB060 # HANGUL SYLLABLE SSANGKIYEOK-YI -0x85CB 0xB061 # HANGUL SYLLABLE SSANGKIYEOK-YI-KIYEOK -0x85CC 0xB062 # HANGUL SYLLABLE SSANGKIYEOK-YI-SSANGKIYEOK -0x85CD 0xB063 # HANGUL SYLLABLE SSANGKIYEOK-YI-KIYEOKSIOS -0x85CE 0xB064 # HANGUL SYLLABLE SSANGKIYEOK-YI-NIEUN -0x85CF 0xB065 # HANGUL SYLLABLE SSANGKIYEOK-YI-NIEUNCIEUC -0x85D0 0xB066 # HANGUL SYLLABLE SSANGKIYEOK-YI-NIEUNHIEUH -0x85D1 0xB067 # HANGUL SYLLABLE SSANGKIYEOK-YI-TIKEUT -0x85D2 0xB068 # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEUL -0x85D3 0xB069 # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULKIYEOK -0x85D4 0xB06A # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULMIEUM -0x85D5 0xB06B # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULPIEUP -0x85D6 0xB06C # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULSIOS -0x85D7 0xB06D # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULTHIEUTH -0x85D8 0xB06E # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULPHIEUPH -0x85D9 0xB06F # HANGUL SYLLABLE SSANGKIYEOK-YI-RIEULHIEUH -0x85DA 0xB070 # HANGUL SYLLABLE SSANGKIYEOK-YI-MIEUM -0x85DB 0xB071 # HANGUL SYLLABLE SSANGKIYEOK-YI-PIEUP -0x85DC 0xB072 # HANGUL SYLLABLE SSANGKIYEOK-YI-PIEUPSIOS -0x85DD 0xB073 # HANGUL SYLLABLE SSANGKIYEOK-YI-SIOS -0x85DE 0xB074 # HANGUL SYLLABLE SSANGKIYEOK-YI-SSANGSIOS -0x85DF 0xB075 # HANGUL SYLLABLE SSANGKIYEOK-YI-IEUNG -0x85E0 0xB076 # HANGUL SYLLABLE SSANGKIYEOK-YI-CIEUC -0x85E1 0xB077 # HANGUL SYLLABLE SSANGKIYEOK-YI-CHIEUCH -0x85E2 0xB078 # HANGUL SYLLABLE SSANGKIYEOK-YI-KHIEUKH -0x85E3 0xB079 # HANGUL SYLLABLE SSANGKIYEOK-YI-THIEUTH -0x85E4 0xB07A # HANGUL SYLLABLE SSANGKIYEOK-YI-PHIEUPH -0x85E5 0xB07B # HANGUL SYLLABLE SSANGKIYEOK-YI-HIEUH -0x85E6 0xB07E # HANGUL SYLLABLE SSANGKIYEOK-I-SSANGKIYEOK -0x85E7 0xB07F # HANGUL SYLLABLE SSANGKIYEOK-I-KIYEOKSIOS -0x85E8 0xB081 # HANGUL SYLLABLE SSANGKIYEOK-I-NIEUNCIEUC -0x85E9 0xB082 # HANGUL SYLLABLE SSANGKIYEOK-I-NIEUNHIEUH -0x85EA 0xB083 # HANGUL SYLLABLE SSANGKIYEOK-I-TIKEUT -0x85EB 0xB085 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULKIYEOK -0x85EC 0xB086 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULMIEUM -0x85ED 0xB087 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULPIEUP -0x85EE 0xB088 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULSIOS -0x85EF 0xB089 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULTHIEUTH -0x85F0 0xB08A # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULPHIEUPH -0x85F1 0xB08B # HANGUL SYLLABLE SSANGKIYEOK-I-RIEULHIEUH -0x85F2 0xB08E # HANGUL SYLLABLE SSANGKIYEOK-I-PIEUPSIOS -0x85F3 0xB090 # HANGUL SYLLABLE SSANGKIYEOK-I-SSANGSIOS -0x85F4 0xB092 # HANGUL SYLLABLE SSANGKIYEOK-I-CIEUC -0x85F5 0xB093 # HANGUL SYLLABLE SSANGKIYEOK-I-CHIEUCH -0x85F6 0xB094 # HANGUL SYLLABLE SSANGKIYEOK-I-KHIEUKH -0x85F7 0xB095 # HANGUL SYLLABLE SSANGKIYEOK-I-THIEUTH -0x85F8 0xB096 # HANGUL SYLLABLE SSANGKIYEOK-I-PHIEUPH -0x85F9 0xB097 # HANGUL SYLLABLE SSANGKIYEOK-I-HIEUH -0x85FA 0xB09B # HANGUL SYLLABLE NIEUN-A-KIYEOKSIOS -0x85FB 0xB09D # HANGUL SYLLABLE NIEUN-A-NIEUNCIEUC -0x85FC 0xB09E # HANGUL SYLLABLE NIEUN-A-NIEUNHIEUH -0x85FD 0xB0A3 # HANGUL SYLLABLE NIEUN-A-RIEULPIEUP -0x85FE 0xB0A4 # HANGUL SYLLABLE NIEUN-A-RIEULSIOS -0x8641 0xB0A5 # HANGUL SYLLABLE NIEUN-A-RIEULTHIEUTH -0x8642 0xB0A6 # HANGUL SYLLABLE NIEUN-A-RIEULPHIEUPH -0x8643 0xB0A7 # HANGUL SYLLABLE NIEUN-A-RIEULHIEUH -0x8644 0xB0AA # HANGUL SYLLABLE NIEUN-A-PIEUPSIOS -0x8645 0xB0B0 # HANGUL SYLLABLE NIEUN-A-KHIEUKH -0x8646 0xB0B2 # HANGUL SYLLABLE NIEUN-A-PHIEUPH -0x8647 0xB0B6 # HANGUL SYLLABLE NIEUN-AE-SSANGKIYEOK -0x8648 0xB0B7 # HANGUL SYLLABLE NIEUN-AE-KIYEOKSIOS -0x8649 0xB0B9 # HANGUL SYLLABLE NIEUN-AE-NIEUNCIEUC -0x864A 0xB0BA # HANGUL SYLLABLE NIEUN-AE-NIEUNHIEUH -0x864B 0xB0BB # HANGUL SYLLABLE NIEUN-AE-TIKEUT -0x864C 0xB0BD # HANGUL SYLLABLE NIEUN-AE-RIEULKIYEOK -0x864D 0xB0BE # HANGUL SYLLABLE NIEUN-AE-RIEULMIEUM -0x864E 0xB0BF # HANGUL SYLLABLE NIEUN-AE-RIEULPIEUP -0x864F 0xB0C0 # HANGUL SYLLABLE NIEUN-AE-RIEULSIOS -0x8650 0xB0C1 # HANGUL SYLLABLE NIEUN-AE-RIEULTHIEUTH -0x8651 0xB0C2 # HANGUL SYLLABLE NIEUN-AE-RIEULPHIEUPH -0x8652 0xB0C3 # HANGUL SYLLABLE NIEUN-AE-RIEULHIEUH -0x8653 0xB0C6 # HANGUL SYLLABLE NIEUN-AE-PIEUPSIOS -0x8654 0xB0CA # HANGUL SYLLABLE NIEUN-AE-CIEUC -0x8655 0xB0CB # HANGUL SYLLABLE NIEUN-AE-CHIEUCH -0x8656 0xB0CC # HANGUL SYLLABLE NIEUN-AE-KHIEUKH -0x8657 0xB0CD # HANGUL SYLLABLE NIEUN-AE-THIEUTH -0x8658 0xB0CE # HANGUL SYLLABLE NIEUN-AE-PHIEUPH -0x8659 0xB0CF # HANGUL SYLLABLE NIEUN-AE-HIEUH -0x865A 0xB0D2 # HANGUL SYLLABLE NIEUN-YA-SSANGKIYEOK -0x8661 0xB0D3 # HANGUL SYLLABLE NIEUN-YA-KIYEOKSIOS -0x8662 0xB0D5 # HANGUL SYLLABLE NIEUN-YA-NIEUNCIEUC -0x8663 0xB0D6 # HANGUL SYLLABLE NIEUN-YA-NIEUNHIEUH -0x8664 0xB0D7 # HANGUL SYLLABLE NIEUN-YA-TIKEUT -0x8665 0xB0D9 # HANGUL SYLLABLE NIEUN-YA-RIEULKIYEOK -0x8666 0xB0DA # HANGUL SYLLABLE NIEUN-YA-RIEULMIEUM -0x8667 0xB0DB # HANGUL SYLLABLE NIEUN-YA-RIEULPIEUP -0x8668 0xB0DC # HANGUL SYLLABLE NIEUN-YA-RIEULSIOS -0x8669 0xB0DD # HANGUL SYLLABLE NIEUN-YA-RIEULTHIEUTH -0x866A 0xB0DE # HANGUL SYLLABLE NIEUN-YA-RIEULPHIEUPH -0x866B 0xB0DF # HANGUL SYLLABLE NIEUN-YA-RIEULHIEUH -0x866C 0xB0E1 # HANGUL SYLLABLE NIEUN-YA-PIEUP -0x866D 0xB0E2 # HANGUL SYLLABLE NIEUN-YA-PIEUPSIOS -0x866E 0xB0E3 # HANGUL SYLLABLE NIEUN-YA-SIOS -0x866F 0xB0E4 # HANGUL SYLLABLE NIEUN-YA-SSANGSIOS -0x8670 0xB0E6 # HANGUL SYLLABLE NIEUN-YA-CIEUC -0x8671 0xB0E7 # HANGUL SYLLABLE NIEUN-YA-CHIEUCH -0x8672 0xB0E8 # HANGUL SYLLABLE NIEUN-YA-KHIEUKH -0x8673 0xB0E9 # HANGUL SYLLABLE NIEUN-YA-THIEUTH -0x8674 0xB0EA # HANGUL SYLLABLE NIEUN-YA-PHIEUPH -0x8675 0xB0EB # HANGUL SYLLABLE NIEUN-YA-HIEUH -0x8676 0xB0EC # HANGUL SYLLABLE NIEUN-YAE -0x8677 0xB0ED # HANGUL SYLLABLE NIEUN-YAE-KIYEOK -0x8678 0xB0EE # HANGUL SYLLABLE NIEUN-YAE-SSANGKIYEOK -0x8679 0xB0EF # HANGUL SYLLABLE NIEUN-YAE-KIYEOKSIOS -0x867A 0xB0F0 # HANGUL SYLLABLE NIEUN-YAE-NIEUN -0x8681 0xB0F1 # HANGUL SYLLABLE NIEUN-YAE-NIEUNCIEUC -0x8682 0xB0F2 # HANGUL SYLLABLE NIEUN-YAE-NIEUNHIEUH -0x8683 0xB0F3 # HANGUL SYLLABLE NIEUN-YAE-TIKEUT -0x8684 0xB0F4 # HANGUL SYLLABLE NIEUN-YAE-RIEUL -0x8685 0xB0F5 # HANGUL SYLLABLE NIEUN-YAE-RIEULKIYEOK -0x8686 0xB0F6 # HANGUL SYLLABLE NIEUN-YAE-RIEULMIEUM -0x8687 0xB0F7 # HANGUL SYLLABLE NIEUN-YAE-RIEULPIEUP -0x8688 0xB0F8 # HANGUL SYLLABLE NIEUN-YAE-RIEULSIOS -0x8689 0xB0F9 # HANGUL SYLLABLE NIEUN-YAE-RIEULTHIEUTH -0x868A 0xB0FA # HANGUL SYLLABLE NIEUN-YAE-RIEULPHIEUPH -0x868B 0xB0FB # HANGUL SYLLABLE NIEUN-YAE-RIEULHIEUH -0x868C 0xB0FC # HANGUL SYLLABLE NIEUN-YAE-MIEUM -0x868D 0xB0FD # HANGUL SYLLABLE NIEUN-YAE-PIEUP -0x868E 0xB0FE # HANGUL SYLLABLE NIEUN-YAE-PIEUPSIOS -0x868F 0xB0FF # HANGUL SYLLABLE NIEUN-YAE-SIOS -0x8690 0xB100 # HANGUL SYLLABLE NIEUN-YAE-SSANGSIOS -0x8691 0xB101 # HANGUL SYLLABLE NIEUN-YAE-IEUNG -0x8692 0xB102 # HANGUL SYLLABLE NIEUN-YAE-CIEUC -0x8693 0xB103 # HANGUL SYLLABLE NIEUN-YAE-CHIEUCH -0x8694 0xB104 # HANGUL SYLLABLE NIEUN-YAE-KHIEUKH -0x8695 0xB105 # HANGUL SYLLABLE NIEUN-YAE-THIEUTH -0x8696 0xB106 # HANGUL SYLLABLE NIEUN-YAE-PHIEUPH -0x8697 0xB107 # HANGUL SYLLABLE NIEUN-YAE-HIEUH -0x8698 0xB10A # HANGUL SYLLABLE NIEUN-EO-SSANGKIYEOK -0x8699 0xB10D # HANGUL SYLLABLE NIEUN-EO-NIEUNCIEUC -0x869A 0xB10E # HANGUL SYLLABLE NIEUN-EO-NIEUNHIEUH -0x869B 0xB10F # HANGUL SYLLABLE NIEUN-EO-TIKEUT -0x869C 0xB111 # HANGUL SYLLABLE NIEUN-EO-RIEULKIYEOK -0x869D 0xB114 # HANGUL SYLLABLE NIEUN-EO-RIEULSIOS -0x869E 0xB115 # HANGUL SYLLABLE NIEUN-EO-RIEULTHIEUTH -0x869F 0xB116 # HANGUL SYLLABLE NIEUN-EO-RIEULPHIEUPH -0x86A0 0xB117 # HANGUL SYLLABLE NIEUN-EO-RIEULHIEUH -0x86A1 0xB11A # HANGUL SYLLABLE NIEUN-EO-PIEUPSIOS -0x86A2 0xB11E # HANGUL SYLLABLE NIEUN-EO-CIEUC -0x86A3 0xB11F # HANGUL SYLLABLE NIEUN-EO-CHIEUCH -0x86A4 0xB120 # HANGUL SYLLABLE NIEUN-EO-KHIEUKH -0x86A5 0xB121 # HANGUL SYLLABLE NIEUN-EO-THIEUTH -0x86A6 0xB122 # HANGUL SYLLABLE NIEUN-EO-PHIEUPH -0x86A7 0xB126 # HANGUL SYLLABLE NIEUN-E-SSANGKIYEOK -0x86A8 0xB127 # HANGUL SYLLABLE NIEUN-E-KIYEOKSIOS -0x86A9 0xB129 # HANGUL SYLLABLE NIEUN-E-NIEUNCIEUC -0x86AA 0xB12A # HANGUL SYLLABLE NIEUN-E-NIEUNHIEUH -0x86AB 0xB12B # HANGUL SYLLABLE NIEUN-E-TIKEUT -0x86AC 0xB12D # HANGUL SYLLABLE NIEUN-E-RIEULKIYEOK -0x86AD 0xB12E # HANGUL SYLLABLE NIEUN-E-RIEULMIEUM -0x86AE 0xB12F # HANGUL SYLLABLE NIEUN-E-RIEULPIEUP -0x86AF 0xB130 # HANGUL SYLLABLE NIEUN-E-RIEULSIOS -0x86B0 0xB131 # HANGUL SYLLABLE NIEUN-E-RIEULTHIEUTH -0x86B1 0xB132 # HANGUL SYLLABLE NIEUN-E-RIEULPHIEUPH -0x86B2 0xB133 # HANGUL SYLLABLE NIEUN-E-RIEULHIEUH -0x86B3 0xB136 # HANGUL SYLLABLE NIEUN-E-PIEUPSIOS -0x86B4 0xB13A # HANGUL SYLLABLE NIEUN-E-CIEUC -0x86B5 0xB13B # HANGUL SYLLABLE NIEUN-E-CHIEUCH -0x86B6 0xB13C # HANGUL SYLLABLE NIEUN-E-KHIEUKH -0x86B7 0xB13D # HANGUL SYLLABLE NIEUN-E-THIEUTH -0x86B8 0xB13E # HANGUL SYLLABLE NIEUN-E-PHIEUPH -0x86B9 0xB13F # HANGUL SYLLABLE NIEUN-E-HIEUH -0x86BA 0xB142 # HANGUL SYLLABLE NIEUN-YEO-SSANGKIYEOK -0x86BB 0xB143 # HANGUL SYLLABLE NIEUN-YEO-KIYEOKSIOS -0x86BC 0xB145 # HANGUL SYLLABLE NIEUN-YEO-NIEUNCIEUC -0x86BD 0xB146 # HANGUL SYLLABLE NIEUN-YEO-NIEUNHIEUH -0x86BE 0xB147 # HANGUL SYLLABLE NIEUN-YEO-TIKEUT -0x86BF 0xB149 # HANGUL SYLLABLE NIEUN-YEO-RIEULKIYEOK -0x86C0 0xB14A # HANGUL SYLLABLE NIEUN-YEO-RIEULMIEUM -0x86C1 0xB14B # HANGUL SYLLABLE NIEUN-YEO-RIEULPIEUP -0x86C2 0xB14C # HANGUL SYLLABLE NIEUN-YEO-RIEULSIOS -0x86C3 0xB14D # HANGUL SYLLABLE NIEUN-YEO-RIEULTHIEUTH -0x86C4 0xB14E # HANGUL SYLLABLE NIEUN-YEO-RIEULPHIEUPH -0x86C5 0xB14F # HANGUL SYLLABLE NIEUN-YEO-RIEULHIEUH -0x86C6 0xB152 # HANGUL SYLLABLE NIEUN-YEO-PIEUPSIOS -0x86C7 0xB153 # HANGUL SYLLABLE NIEUN-YEO-SIOS -0x86C8 0xB156 # HANGUL SYLLABLE NIEUN-YEO-CIEUC -0x86C9 0xB157 # HANGUL SYLLABLE NIEUN-YEO-CHIEUCH -0x86CA 0xB159 # HANGUL SYLLABLE NIEUN-YEO-THIEUTH -0x86CB 0xB15A # HANGUL SYLLABLE NIEUN-YEO-PHIEUPH -0x86CC 0xB15B # HANGUL SYLLABLE NIEUN-YEO-HIEUH -0x86CD 0xB15D # HANGUL SYLLABLE NIEUN-YE-KIYEOK -0x86CE 0xB15E # HANGUL SYLLABLE NIEUN-YE-SSANGKIYEOK -0x86CF 0xB15F # HANGUL SYLLABLE NIEUN-YE-KIYEOKSIOS -0x86D0 0xB161 # HANGUL SYLLABLE NIEUN-YE-NIEUNCIEUC -0x86D1 0xB162 # HANGUL SYLLABLE NIEUN-YE-NIEUNHIEUH -0x86D2 0xB163 # HANGUL SYLLABLE NIEUN-YE-TIKEUT -0x86D3 0xB164 # HANGUL SYLLABLE NIEUN-YE-RIEUL -0x86D4 0xB165 # HANGUL SYLLABLE NIEUN-YE-RIEULKIYEOK -0x86D5 0xB166 # HANGUL SYLLABLE NIEUN-YE-RIEULMIEUM -0x86D6 0xB167 # HANGUL SYLLABLE NIEUN-YE-RIEULPIEUP -0x86D7 0xB168 # HANGUL SYLLABLE NIEUN-YE-RIEULSIOS -0x86D8 0xB169 # HANGUL SYLLABLE NIEUN-YE-RIEULTHIEUTH -0x86D9 0xB16A # HANGUL SYLLABLE NIEUN-YE-RIEULPHIEUPH -0x86DA 0xB16B # HANGUL SYLLABLE NIEUN-YE-RIEULHIEUH -0x86DB 0xB16C # HANGUL SYLLABLE NIEUN-YE-MIEUM -0x86DC 0xB16D # HANGUL SYLLABLE NIEUN-YE-PIEUP -0x86DD 0xB16E # HANGUL SYLLABLE NIEUN-YE-PIEUPSIOS -0x86DE 0xB16F # HANGUL SYLLABLE NIEUN-YE-SIOS -0x86DF 0xB170 # HANGUL SYLLABLE NIEUN-YE-SSANGSIOS -0x86E0 0xB171 # HANGUL SYLLABLE NIEUN-YE-IEUNG -0x86E1 0xB172 # HANGUL SYLLABLE NIEUN-YE-CIEUC -0x86E2 0xB173 # HANGUL SYLLABLE NIEUN-YE-CHIEUCH -0x86E3 0xB174 # HANGUL SYLLABLE NIEUN-YE-KHIEUKH -0x86E4 0xB175 # HANGUL SYLLABLE NIEUN-YE-THIEUTH -0x86E5 0xB176 # HANGUL SYLLABLE NIEUN-YE-PHIEUPH -0x86E6 0xB177 # HANGUL SYLLABLE NIEUN-YE-HIEUH -0x86E7 0xB17A # HANGUL SYLLABLE NIEUN-O-SSANGKIYEOK -0x86E8 0xB17B # HANGUL SYLLABLE NIEUN-O-KIYEOKSIOS -0x86E9 0xB17D # HANGUL SYLLABLE NIEUN-O-NIEUNCIEUC -0x86EA 0xB17E # HANGUL SYLLABLE NIEUN-O-NIEUNHIEUH -0x86EB 0xB17F # HANGUL SYLLABLE NIEUN-O-TIKEUT -0x86EC 0xB181 # HANGUL SYLLABLE NIEUN-O-RIEULKIYEOK -0x86ED 0xB183 # HANGUL SYLLABLE NIEUN-O-RIEULPIEUP -0x86EE 0xB184 # HANGUL SYLLABLE NIEUN-O-RIEULSIOS -0x86EF 0xB185 # HANGUL SYLLABLE NIEUN-O-RIEULTHIEUTH -0x86F0 0xB186 # HANGUL SYLLABLE NIEUN-O-RIEULPHIEUPH -0x86F1 0xB187 # HANGUL SYLLABLE NIEUN-O-RIEULHIEUH -0x86F2 0xB18A # HANGUL SYLLABLE NIEUN-O-PIEUPSIOS -0x86F3 0xB18C # HANGUL SYLLABLE NIEUN-O-SSANGSIOS -0x86F4 0xB18E # HANGUL SYLLABLE NIEUN-O-CIEUC -0x86F5 0xB18F # HANGUL SYLLABLE NIEUN-O-CHIEUCH -0x86F6 0xB190 # HANGUL SYLLABLE NIEUN-O-KHIEUKH -0x86F7 0xB191 # HANGUL SYLLABLE NIEUN-O-THIEUTH -0x86F8 0xB195 # HANGUL SYLLABLE NIEUN-WA-KIYEOK -0x86F9 0xB196 # HANGUL SYLLABLE NIEUN-WA-SSANGKIYEOK -0x86FA 0xB197 # HANGUL SYLLABLE NIEUN-WA-KIYEOKSIOS -0x86FB 0xB199 # HANGUL SYLLABLE NIEUN-WA-NIEUNCIEUC -0x86FC 0xB19A # HANGUL SYLLABLE NIEUN-WA-NIEUNHIEUH -0x86FD 0xB19B # HANGUL SYLLABLE NIEUN-WA-TIKEUT -0x86FE 0xB19D # HANGUL SYLLABLE NIEUN-WA-RIEULKIYEOK -0x8741 0xB19E # HANGUL SYLLABLE NIEUN-WA-RIEULMIEUM -0x8742 0xB19F # HANGUL SYLLABLE NIEUN-WA-RIEULPIEUP -0x8743 0xB1A0 # HANGUL SYLLABLE NIEUN-WA-RIEULSIOS -0x8744 0xB1A1 # HANGUL SYLLABLE NIEUN-WA-RIEULTHIEUTH -0x8745 0xB1A2 # HANGUL SYLLABLE NIEUN-WA-RIEULPHIEUPH -0x8746 0xB1A3 # HANGUL SYLLABLE NIEUN-WA-RIEULHIEUH -0x8747 0xB1A4 # HANGUL SYLLABLE NIEUN-WA-MIEUM -0x8748 0xB1A5 # HANGUL SYLLABLE NIEUN-WA-PIEUP -0x8749 0xB1A6 # HANGUL SYLLABLE NIEUN-WA-PIEUPSIOS -0x874A 0xB1A7 # HANGUL SYLLABLE NIEUN-WA-SIOS -0x874B 0xB1A9 # HANGUL SYLLABLE NIEUN-WA-IEUNG -0x874C 0xB1AA # HANGUL SYLLABLE NIEUN-WA-CIEUC -0x874D 0xB1AB # HANGUL SYLLABLE NIEUN-WA-CHIEUCH -0x874E 0xB1AC # HANGUL SYLLABLE NIEUN-WA-KHIEUKH -0x874F 0xB1AD # HANGUL SYLLABLE NIEUN-WA-THIEUTH -0x8750 0xB1AE # HANGUL SYLLABLE NIEUN-WA-PHIEUPH -0x8751 0xB1AF # HANGUL SYLLABLE NIEUN-WA-HIEUH -0x8752 0xB1B0 # HANGUL SYLLABLE NIEUN-WAE -0x8753 0xB1B1 # HANGUL SYLLABLE NIEUN-WAE-KIYEOK -0x8754 0xB1B2 # HANGUL SYLLABLE NIEUN-WAE-SSANGKIYEOK -0x8755 0xB1B3 # HANGUL SYLLABLE NIEUN-WAE-KIYEOKSIOS -0x8756 0xB1B4 # HANGUL SYLLABLE NIEUN-WAE-NIEUN -0x8757 0xB1B5 # HANGUL SYLLABLE NIEUN-WAE-NIEUNCIEUC -0x8758 0xB1B6 # HANGUL SYLLABLE NIEUN-WAE-NIEUNHIEUH -0x8759 0xB1B7 # HANGUL SYLLABLE NIEUN-WAE-TIKEUT -0x875A 0xB1B8 # HANGUL SYLLABLE NIEUN-WAE-RIEUL -0x8761 0xB1B9 # HANGUL SYLLABLE NIEUN-WAE-RIEULKIYEOK -0x8762 0xB1BA # HANGUL SYLLABLE NIEUN-WAE-RIEULMIEUM -0x8763 0xB1BB # HANGUL SYLLABLE NIEUN-WAE-RIEULPIEUP -0x8764 0xB1BC # HANGUL SYLLABLE NIEUN-WAE-RIEULSIOS -0x8765 0xB1BD # HANGUL SYLLABLE NIEUN-WAE-RIEULTHIEUTH -0x8766 0xB1BE # HANGUL SYLLABLE NIEUN-WAE-RIEULPHIEUPH -0x8767 0xB1BF # HANGUL SYLLABLE NIEUN-WAE-RIEULHIEUH -0x8768 0xB1C0 # HANGUL SYLLABLE NIEUN-WAE-MIEUM -0x8769 0xB1C1 # HANGUL SYLLABLE NIEUN-WAE-PIEUP -0x876A 0xB1C2 # HANGUL SYLLABLE NIEUN-WAE-PIEUPSIOS -0x876B 0xB1C3 # HANGUL SYLLABLE NIEUN-WAE-SIOS -0x876C 0xB1C4 # HANGUL SYLLABLE NIEUN-WAE-SSANGSIOS -0x876D 0xB1C5 # HANGUL SYLLABLE NIEUN-WAE-IEUNG -0x876E 0xB1C6 # HANGUL SYLLABLE NIEUN-WAE-CIEUC -0x876F 0xB1C7 # HANGUL SYLLABLE NIEUN-WAE-CHIEUCH -0x8770 0xB1C8 # HANGUL SYLLABLE NIEUN-WAE-KHIEUKH -0x8771 0xB1C9 # HANGUL SYLLABLE NIEUN-WAE-THIEUTH -0x8772 0xB1CA # HANGUL SYLLABLE NIEUN-WAE-PHIEUPH -0x8773 0xB1CB # HANGUL SYLLABLE NIEUN-WAE-HIEUH -0x8774 0xB1CD # HANGUL SYLLABLE NIEUN-OE-KIYEOK -0x8775 0xB1CE # HANGUL SYLLABLE NIEUN-OE-SSANGKIYEOK -0x8776 0xB1CF # HANGUL SYLLABLE NIEUN-OE-KIYEOKSIOS -0x8777 0xB1D1 # HANGUL SYLLABLE NIEUN-OE-NIEUNCIEUC -0x8778 0xB1D2 # HANGUL SYLLABLE NIEUN-OE-NIEUNHIEUH -0x8779 0xB1D3 # HANGUL SYLLABLE NIEUN-OE-TIKEUT -0x877A 0xB1D5 # HANGUL SYLLABLE NIEUN-OE-RIEULKIYEOK -0x8781 0xB1D6 # HANGUL SYLLABLE NIEUN-OE-RIEULMIEUM -0x8782 0xB1D7 # HANGUL SYLLABLE NIEUN-OE-RIEULPIEUP -0x8783 0xB1D8 # HANGUL SYLLABLE NIEUN-OE-RIEULSIOS -0x8784 0xB1D9 # HANGUL SYLLABLE NIEUN-OE-RIEULTHIEUTH -0x8785 0xB1DA # HANGUL SYLLABLE NIEUN-OE-RIEULPHIEUPH -0x8786 0xB1DB # HANGUL SYLLABLE NIEUN-OE-RIEULHIEUH -0x8787 0xB1DE # HANGUL SYLLABLE NIEUN-OE-PIEUPSIOS -0x8788 0xB1E0 # HANGUL SYLLABLE NIEUN-OE-SSANGSIOS -0x8789 0xB1E1 # HANGUL SYLLABLE NIEUN-OE-IEUNG -0x878A 0xB1E2 # HANGUL SYLLABLE NIEUN-OE-CIEUC -0x878B 0xB1E3 # HANGUL SYLLABLE NIEUN-OE-CHIEUCH -0x878C 0xB1E4 # HANGUL SYLLABLE NIEUN-OE-KHIEUKH -0x878D 0xB1E5 # HANGUL SYLLABLE NIEUN-OE-THIEUTH -0x878E 0xB1E6 # HANGUL SYLLABLE NIEUN-OE-PHIEUPH -0x878F 0xB1E7 # HANGUL SYLLABLE NIEUN-OE-HIEUH -0x8790 0xB1EA # HANGUL SYLLABLE NIEUN-YO-SSANGKIYEOK -0x8791 0xB1EB # HANGUL SYLLABLE NIEUN-YO-KIYEOKSIOS -0x8792 0xB1ED # HANGUL SYLLABLE NIEUN-YO-NIEUNCIEUC -0x8793 0xB1EE # HANGUL SYLLABLE NIEUN-YO-NIEUNHIEUH -0x8794 0xB1EF # HANGUL SYLLABLE NIEUN-YO-TIKEUT -0x8795 0xB1F1 # HANGUL SYLLABLE NIEUN-YO-RIEULKIYEOK -0x8796 0xB1F2 # HANGUL SYLLABLE NIEUN-YO-RIEULMIEUM -0x8797 0xB1F3 # HANGUL SYLLABLE NIEUN-YO-RIEULPIEUP -0x8798 0xB1F4 # HANGUL SYLLABLE NIEUN-YO-RIEULSIOS -0x8799 0xB1F5 # HANGUL SYLLABLE NIEUN-YO-RIEULTHIEUTH -0x879A 0xB1F6 # HANGUL SYLLABLE NIEUN-YO-RIEULPHIEUPH -0x879B 0xB1F7 # HANGUL SYLLABLE NIEUN-YO-RIEULHIEUH -0x879C 0xB1F8 # HANGUL SYLLABLE NIEUN-YO-MIEUM -0x879D 0xB1FA # HANGUL SYLLABLE NIEUN-YO-PIEUPSIOS -0x879E 0xB1FC # HANGUL SYLLABLE NIEUN-YO-SSANGSIOS -0x879F 0xB1FE # HANGUL SYLLABLE NIEUN-YO-CIEUC -0x87A0 0xB1FF # HANGUL SYLLABLE NIEUN-YO-CHIEUCH -0x87A1 0xB200 # HANGUL SYLLABLE NIEUN-YO-KHIEUKH -0x87A2 0xB201 # HANGUL SYLLABLE NIEUN-YO-THIEUTH -0x87A3 0xB202 # HANGUL SYLLABLE NIEUN-YO-PHIEUPH -0x87A4 0xB203 # HANGUL SYLLABLE NIEUN-YO-HIEUH -0x87A5 0xB206 # HANGUL SYLLABLE NIEUN-U-SSANGKIYEOK -0x87A6 0xB207 # HANGUL SYLLABLE NIEUN-U-KIYEOKSIOS -0x87A7 0xB209 # HANGUL SYLLABLE NIEUN-U-NIEUNCIEUC -0x87A8 0xB20A # HANGUL SYLLABLE NIEUN-U-NIEUNHIEUH -0x87A9 0xB20D # HANGUL SYLLABLE NIEUN-U-RIEULKIYEOK -0x87AA 0xB20E # HANGUL SYLLABLE NIEUN-U-RIEULMIEUM -0x87AB 0xB20F # HANGUL SYLLABLE NIEUN-U-RIEULPIEUP -0x87AC 0xB210 # HANGUL SYLLABLE NIEUN-U-RIEULSIOS -0x87AD 0xB211 # HANGUL SYLLABLE NIEUN-U-RIEULTHIEUTH -0x87AE 0xB212 # HANGUL SYLLABLE NIEUN-U-RIEULPHIEUPH -0x87AF 0xB213 # HANGUL SYLLABLE NIEUN-U-RIEULHIEUH -0x87B0 0xB216 # HANGUL SYLLABLE NIEUN-U-PIEUPSIOS -0x87B1 0xB218 # HANGUL SYLLABLE NIEUN-U-SSANGSIOS -0x87B2 0xB21A # HANGUL SYLLABLE NIEUN-U-CIEUC -0x87B3 0xB21B # HANGUL SYLLABLE NIEUN-U-CHIEUCH -0x87B4 0xB21C # HANGUL SYLLABLE NIEUN-U-KHIEUKH -0x87B5 0xB21D # HANGUL SYLLABLE NIEUN-U-THIEUTH -0x87B6 0xB21E # HANGUL SYLLABLE NIEUN-U-PHIEUPH -0x87B7 0xB21F # HANGUL SYLLABLE NIEUN-U-HIEUH -0x87B8 0xB221 # HANGUL SYLLABLE NIEUN-WEO-KIYEOK -0x87B9 0xB222 # HANGUL SYLLABLE NIEUN-WEO-SSANGKIYEOK -0x87BA 0xB223 # HANGUL SYLLABLE NIEUN-WEO-KIYEOKSIOS -0x87BB 0xB224 # HANGUL SYLLABLE NIEUN-WEO-NIEUN -0x87BC 0xB225 # HANGUL SYLLABLE NIEUN-WEO-NIEUNCIEUC -0x87BD 0xB226 # HANGUL SYLLABLE NIEUN-WEO-NIEUNHIEUH -0x87BE 0xB227 # HANGUL SYLLABLE NIEUN-WEO-TIKEUT -0x87BF 0xB228 # HANGUL SYLLABLE NIEUN-WEO-RIEUL -0x87C0 0xB229 # HANGUL SYLLABLE NIEUN-WEO-RIEULKIYEOK -0x87C1 0xB22A # HANGUL SYLLABLE NIEUN-WEO-RIEULMIEUM -0x87C2 0xB22B # HANGUL SYLLABLE NIEUN-WEO-RIEULPIEUP -0x87C3 0xB22C # HANGUL SYLLABLE NIEUN-WEO-RIEULSIOS -0x87C4 0xB22D # HANGUL SYLLABLE NIEUN-WEO-RIEULTHIEUTH -0x87C5 0xB22E # HANGUL SYLLABLE NIEUN-WEO-RIEULPHIEUPH -0x87C6 0xB22F # HANGUL SYLLABLE NIEUN-WEO-RIEULHIEUH -0x87C7 0xB230 # HANGUL SYLLABLE NIEUN-WEO-MIEUM -0x87C8 0xB231 # HANGUL SYLLABLE NIEUN-WEO-PIEUP -0x87C9 0xB232 # HANGUL SYLLABLE NIEUN-WEO-PIEUPSIOS -0x87CA 0xB233 # HANGUL SYLLABLE NIEUN-WEO-SIOS -0x87CB 0xB235 # HANGUL SYLLABLE NIEUN-WEO-IEUNG -0x87CC 0xB236 # HANGUL SYLLABLE NIEUN-WEO-CIEUC -0x87CD 0xB237 # HANGUL SYLLABLE NIEUN-WEO-CHIEUCH -0x87CE 0xB238 # HANGUL SYLLABLE NIEUN-WEO-KHIEUKH -0x87CF 0xB239 # HANGUL SYLLABLE NIEUN-WEO-THIEUTH -0x87D0 0xB23A # HANGUL SYLLABLE NIEUN-WEO-PHIEUPH -0x87D1 0xB23B # HANGUL SYLLABLE NIEUN-WEO-HIEUH -0x87D2 0xB23D # HANGUL SYLLABLE NIEUN-WE-KIYEOK -0x87D3 0xB23E # HANGUL SYLLABLE NIEUN-WE-SSANGKIYEOK -0x87D4 0xB23F # HANGUL SYLLABLE NIEUN-WE-KIYEOKSIOS -0x87D5 0xB240 # HANGUL SYLLABLE NIEUN-WE-NIEUN -0x87D6 0xB241 # HANGUL SYLLABLE NIEUN-WE-NIEUNCIEUC -0x87D7 0xB242 # HANGUL SYLLABLE NIEUN-WE-NIEUNHIEUH -0x87D8 0xB243 # HANGUL SYLLABLE NIEUN-WE-TIKEUT -0x87D9 0xB244 # HANGUL SYLLABLE NIEUN-WE-RIEUL -0x87DA 0xB245 # HANGUL SYLLABLE NIEUN-WE-RIEULKIYEOK -0x87DB 0xB246 # HANGUL SYLLABLE NIEUN-WE-RIEULMIEUM -0x87DC 0xB247 # HANGUL SYLLABLE NIEUN-WE-RIEULPIEUP -0x87DD 0xB248 # HANGUL SYLLABLE NIEUN-WE-RIEULSIOS -0x87DE 0xB249 # HANGUL SYLLABLE NIEUN-WE-RIEULTHIEUTH -0x87DF 0xB24A # HANGUL SYLLABLE NIEUN-WE-RIEULPHIEUPH -0x87E0 0xB24B # HANGUL SYLLABLE NIEUN-WE-RIEULHIEUH -0x87E1 0xB24C # HANGUL SYLLABLE NIEUN-WE-MIEUM -0x87E2 0xB24D # HANGUL SYLLABLE NIEUN-WE-PIEUP -0x87E3 0xB24E # HANGUL SYLLABLE NIEUN-WE-PIEUPSIOS -0x87E4 0xB24F # HANGUL SYLLABLE NIEUN-WE-SIOS -0x87E5 0xB250 # HANGUL SYLLABLE NIEUN-WE-SSANGSIOS -0x87E6 0xB251 # HANGUL SYLLABLE NIEUN-WE-IEUNG -0x87E7 0xB252 # HANGUL SYLLABLE NIEUN-WE-CIEUC -0x87E8 0xB253 # HANGUL SYLLABLE NIEUN-WE-CHIEUCH -0x87E9 0xB254 # HANGUL SYLLABLE NIEUN-WE-KHIEUKH -0x87EA 0xB255 # HANGUL SYLLABLE NIEUN-WE-THIEUTH -0x87EB 0xB256 # HANGUL SYLLABLE NIEUN-WE-PHIEUPH -0x87EC 0xB257 # HANGUL SYLLABLE NIEUN-WE-HIEUH -0x87ED 0xB259 # HANGUL SYLLABLE NIEUN-WI-KIYEOK -0x87EE 0xB25A # HANGUL SYLLABLE NIEUN-WI-SSANGKIYEOK -0x87EF 0xB25B # HANGUL SYLLABLE NIEUN-WI-KIYEOKSIOS -0x87F0 0xB25D # HANGUL SYLLABLE NIEUN-WI-NIEUNCIEUC -0x87F1 0xB25E # HANGUL SYLLABLE NIEUN-WI-NIEUNHIEUH -0x87F2 0xB25F # HANGUL SYLLABLE NIEUN-WI-TIKEUT -0x87F3 0xB261 # HANGUL SYLLABLE NIEUN-WI-RIEULKIYEOK -0x87F4 0xB262 # HANGUL SYLLABLE NIEUN-WI-RIEULMIEUM -0x87F5 0xB263 # HANGUL SYLLABLE NIEUN-WI-RIEULPIEUP -0x87F6 0xB264 # HANGUL SYLLABLE NIEUN-WI-RIEULSIOS -0x87F7 0xB265 # HANGUL SYLLABLE NIEUN-WI-RIEULTHIEUTH -0x87F8 0xB266 # HANGUL SYLLABLE NIEUN-WI-RIEULPHIEUPH -0x87F9 0xB267 # HANGUL SYLLABLE NIEUN-WI-RIEULHIEUH -0x87FA 0xB26A # HANGUL SYLLABLE NIEUN-WI-PIEUPSIOS -0x87FB 0xB26B # HANGUL SYLLABLE NIEUN-WI-SIOS -0x87FC 0xB26C # HANGUL SYLLABLE NIEUN-WI-SSANGSIOS -0x87FD 0xB26D # HANGUL SYLLABLE NIEUN-WI-IEUNG -0x87FE 0xB26E # HANGUL SYLLABLE NIEUN-WI-CIEUC -0x8841 0xB26F # HANGUL SYLLABLE NIEUN-WI-CHIEUCH -0x8842 0xB270 # HANGUL SYLLABLE NIEUN-WI-KHIEUKH -0x8843 0xB271 # HANGUL SYLLABLE NIEUN-WI-THIEUTH -0x8844 0xB272 # HANGUL SYLLABLE NIEUN-WI-PHIEUPH -0x8845 0xB273 # HANGUL SYLLABLE NIEUN-WI-HIEUH -0x8846 0xB276 # HANGUL SYLLABLE NIEUN-YU-SSANGKIYEOK -0x8847 0xB277 # HANGUL SYLLABLE NIEUN-YU-KIYEOKSIOS -0x8848 0xB278 # HANGUL SYLLABLE NIEUN-YU-NIEUN -0x8849 0xB279 # HANGUL SYLLABLE NIEUN-YU-NIEUNCIEUC -0x884A 0xB27A # HANGUL SYLLABLE NIEUN-YU-NIEUNHIEUH -0x884B 0xB27B # HANGUL SYLLABLE NIEUN-YU-TIKEUT -0x884C 0xB27D # HANGUL SYLLABLE NIEUN-YU-RIEULKIYEOK -0x884D 0xB27E # HANGUL SYLLABLE NIEUN-YU-RIEULMIEUM -0x884E 0xB27F # HANGUL SYLLABLE NIEUN-YU-RIEULPIEUP -0x884F 0xB280 # HANGUL SYLLABLE NIEUN-YU-RIEULSIOS -0x8850 0xB281 # HANGUL SYLLABLE NIEUN-YU-RIEULTHIEUTH -0x8851 0xB282 # HANGUL SYLLABLE NIEUN-YU-RIEULPHIEUPH -0x8852 0xB283 # HANGUL SYLLABLE NIEUN-YU-RIEULHIEUH -0x8853 0xB286 # HANGUL SYLLABLE NIEUN-YU-PIEUPSIOS -0x8854 0xB287 # HANGUL SYLLABLE NIEUN-YU-SIOS -0x8855 0xB288 # HANGUL SYLLABLE NIEUN-YU-SSANGSIOS -0x8856 0xB28A # HANGUL SYLLABLE NIEUN-YU-CIEUC -0x8857 0xB28B # HANGUL SYLLABLE NIEUN-YU-CHIEUCH -0x8858 0xB28C # HANGUL SYLLABLE NIEUN-YU-KHIEUKH -0x8859 0xB28D # HANGUL SYLLABLE NIEUN-YU-THIEUTH -0x885A 0xB28E # HANGUL SYLLABLE NIEUN-YU-PHIEUPH -0x8861 0xB28F # HANGUL SYLLABLE NIEUN-YU-HIEUH -0x8862 0xB292 # HANGUL SYLLABLE NIEUN-EU-SSANGKIYEOK -0x8863 0xB293 # HANGUL SYLLABLE NIEUN-EU-KIYEOKSIOS -0x8864 0xB295 # HANGUL SYLLABLE NIEUN-EU-NIEUNCIEUC -0x8865 0xB296 # HANGUL SYLLABLE NIEUN-EU-NIEUNHIEUH -0x8866 0xB297 # HANGUL SYLLABLE NIEUN-EU-TIKEUT -0x8867 0xB29B # HANGUL SYLLABLE NIEUN-EU-RIEULPIEUP -0x8868 0xB29C # HANGUL SYLLABLE NIEUN-EU-RIEULSIOS -0x8869 0xB29D # HANGUL SYLLABLE NIEUN-EU-RIEULTHIEUTH -0x886A 0xB29E # HANGUL SYLLABLE NIEUN-EU-RIEULPHIEUPH -0x886B 0xB29F # HANGUL SYLLABLE NIEUN-EU-RIEULHIEUH -0x886C 0xB2A2 # HANGUL SYLLABLE NIEUN-EU-PIEUPSIOS -0x886D 0xB2A4 # HANGUL SYLLABLE NIEUN-EU-SSANGSIOS -0x886E 0xB2A7 # HANGUL SYLLABLE NIEUN-EU-CHIEUCH -0x886F 0xB2A8 # HANGUL SYLLABLE NIEUN-EU-KHIEUKH -0x8870 0xB2A9 # HANGUL SYLLABLE NIEUN-EU-THIEUTH -0x8871 0xB2AB # HANGUL SYLLABLE NIEUN-EU-HIEUH -0x8872 0xB2AD # HANGUL SYLLABLE NIEUN-YI-KIYEOK -0x8873 0xB2AE # HANGUL SYLLABLE NIEUN-YI-SSANGKIYEOK -0x8874 0xB2AF # HANGUL SYLLABLE NIEUN-YI-KIYEOKSIOS -0x8875 0xB2B1 # HANGUL SYLLABLE NIEUN-YI-NIEUNCIEUC -0x8876 0xB2B2 # HANGUL SYLLABLE NIEUN-YI-NIEUNHIEUH -0x8877 0xB2B3 # HANGUL SYLLABLE NIEUN-YI-TIKEUT -0x8878 0xB2B5 # HANGUL SYLLABLE NIEUN-YI-RIEULKIYEOK -0x8879 0xB2B6 # HANGUL SYLLABLE NIEUN-YI-RIEULMIEUM -0x887A 0xB2B7 # HANGUL SYLLABLE NIEUN-YI-RIEULPIEUP -0x8881 0xB2B8 # HANGUL SYLLABLE NIEUN-YI-RIEULSIOS -0x8882 0xB2B9 # HANGUL SYLLABLE NIEUN-YI-RIEULTHIEUTH -0x8883 0xB2BA # HANGUL SYLLABLE NIEUN-YI-RIEULPHIEUPH -0x8884 0xB2BB # HANGUL SYLLABLE NIEUN-YI-RIEULHIEUH -0x8885 0xB2BC # HANGUL SYLLABLE NIEUN-YI-MIEUM -0x8886 0xB2BD # HANGUL SYLLABLE NIEUN-YI-PIEUP -0x8887 0xB2BE # HANGUL SYLLABLE NIEUN-YI-PIEUPSIOS -0x8888 0xB2BF # HANGUL SYLLABLE NIEUN-YI-SIOS -0x8889 0xB2C0 # HANGUL SYLLABLE NIEUN-YI-SSANGSIOS -0x888A 0xB2C1 # HANGUL SYLLABLE NIEUN-YI-IEUNG -0x888B 0xB2C2 # HANGUL SYLLABLE NIEUN-YI-CIEUC -0x888C 0xB2C3 # HANGUL SYLLABLE NIEUN-YI-CHIEUCH -0x888D 0xB2C4 # HANGUL SYLLABLE NIEUN-YI-KHIEUKH -0x888E 0xB2C5 # HANGUL SYLLABLE NIEUN-YI-THIEUTH -0x888F 0xB2C6 # HANGUL SYLLABLE NIEUN-YI-PHIEUPH -0x8890 0xB2C7 # HANGUL SYLLABLE NIEUN-YI-HIEUH -0x8891 0xB2CA # HANGUL SYLLABLE NIEUN-I-SSANGKIYEOK -0x8892 0xB2CB # HANGUL SYLLABLE NIEUN-I-KIYEOKSIOS -0x8893 0xB2CD # HANGUL SYLLABLE NIEUN-I-NIEUNCIEUC -0x8894 0xB2CE # HANGUL SYLLABLE NIEUN-I-NIEUNHIEUH -0x8895 0xB2CF # HANGUL SYLLABLE NIEUN-I-TIKEUT -0x8896 0xB2D1 # HANGUL SYLLABLE NIEUN-I-RIEULKIYEOK -0x8897 0xB2D3 # HANGUL SYLLABLE NIEUN-I-RIEULPIEUP--<3/22/95> -0x8898 0xB2D4 # HANGUL SYLLABLE NIEUN-I-RIEULSIOS---<3/22/95> -0x8899 0xB2D5 # HANGUL SYLLABLE NIEUN-I-RIEULTHIEUTH<3/22/95> -0x889A 0xB2D6 # HANGUL SYLLABLE NIEUN-I-RIEULPHIEUPH<3/22/95> -0x889B 0xB2D7 # HANGUL SYLLABLE NIEUN-I-RIEULHIEUH -0x889C 0xB2DA # HANGUL SYLLABLE NIEUN-I-PIEUPSIOS -0x889D 0xB2DC # HANGUL SYLLABLE NIEUN-I-SSANGSIOS -0x889E 0xB2DE # HANGUL SYLLABLE NIEUN-I-CIEUC -0x889F 0xB2DF # HANGUL SYLLABLE NIEUN-I-CHIEUCH -0x88A0 0xB2E0 # HANGUL SYLLABLE NIEUN-I-KHIEUKH -0x88A1 0xB2E1 # HANGUL SYLLABLE NIEUN-I-THIEUTH -0x88A2 0xB2E3 # HANGUL SYLLABLE NIEUN-I-HIEUH -0x88A3 0xB2E7 # HANGUL SYLLABLE TIKEUT-A-KIYEOKSIOS -0x88A4 0xB2E9 # HANGUL SYLLABLE TIKEUT-A-NIEUNCIEUC -0x88A5 0xB2EA # HANGUL SYLLABLE TIKEUT-A-NIEUNHIEUH -0x88A6 0xB2F0 # HANGUL SYLLABLE TIKEUT-A-RIEULSIOS -0x88A7 0xB2F1 # HANGUL SYLLABLE TIKEUT-A-RIEULTHIEUTH -0x88A8 0xB2F2 # HANGUL SYLLABLE TIKEUT-A-RIEULPHIEUPH -0x88A9 0xB2F6 # HANGUL SYLLABLE TIKEUT-A-PIEUPSIOS -0x88AA 0xB2FC # HANGUL SYLLABLE TIKEUT-A-KHIEUKH -0x88AB 0xB2FD # HANGUL SYLLABLE TIKEUT-A-THIEUTH -0x88AC 0xB2FE # HANGUL SYLLABLE TIKEUT-A-PHIEUPH -0x88AD 0xB302 # HANGUL SYLLABLE TIKEUT-AE-SSANGKIYEOK -0x88AE 0xB303 # HANGUL SYLLABLE TIKEUT-AE-KIYEOKSIOS -0x88AF 0xB305 # HANGUL SYLLABLE TIKEUT-AE-NIEUNCIEUC -0x88B0 0xB306 # HANGUL SYLLABLE TIKEUT-AE-NIEUNHIEUH -0x88B1 0xB307 # HANGUL SYLLABLE TIKEUT-AE-TIKEUT -0x88B2 0xB309 # HANGUL SYLLABLE TIKEUT-AE-RIEULKIYEOK -0x88B3 0xB30A # HANGUL SYLLABLE TIKEUT-AE-RIEULMIEUM -0x88B4 0xB30B # HANGUL SYLLABLE TIKEUT-AE-RIEULPIEUP -0x88B5 0xB30C # HANGUL SYLLABLE TIKEUT-AE-RIEULSIOS -0x88B6 0xB30D # HANGUL SYLLABLE TIKEUT-AE-RIEULTHIEUTH -0x88B7 0xB30E # HANGUL SYLLABLE TIKEUT-AE-RIEULPHIEUPH -0x88B8 0xB30F # HANGUL SYLLABLE TIKEUT-AE-RIEULHIEUH -0x88B9 0xB312 # HANGUL SYLLABLE TIKEUT-AE-PIEUPSIOS -0x88BA 0xB316 # HANGUL SYLLABLE TIKEUT-AE-CIEUC -0x88BB 0xB317 # HANGUL SYLLABLE TIKEUT-AE-CHIEUCH -0x88BC 0xB318 # HANGUL SYLLABLE TIKEUT-AE-KHIEUKH -0x88BD 0xB319 # HANGUL SYLLABLE TIKEUT-AE-THIEUTH -0x88BE 0xB31A # HANGUL SYLLABLE TIKEUT-AE-PHIEUPH -0x88BF 0xB31B # HANGUL SYLLABLE TIKEUT-AE-HIEUH -0x88C0 0xB31D # HANGUL SYLLABLE TIKEUT-YA-KIYEOK -0x88C1 0xB31E # HANGUL SYLLABLE TIKEUT-YA-SSANGKIYEOK -0x88C2 0xB31F # HANGUL SYLLABLE TIKEUT-YA-KIYEOKSIOS -0x88C3 0xB320 # HANGUL SYLLABLE TIKEUT-YA-NIEUN -0x88C4 0xB321 # HANGUL SYLLABLE TIKEUT-YA-NIEUNCIEUC -0x88C5 0xB322 # HANGUL SYLLABLE TIKEUT-YA-NIEUNHIEUH -0x88C6 0xB323 # HANGUL SYLLABLE TIKEUT-YA-TIKEUT -0x88C7 0xB324 # HANGUL SYLLABLE TIKEUT-YA-RIEUL -0x88C8 0xB325 # HANGUL SYLLABLE TIKEUT-YA-RIEULKIYEOK -0x88C9 0xB326 # HANGUL SYLLABLE TIKEUT-YA-RIEULMIEUM -0x88CA 0xB327 # HANGUL SYLLABLE TIKEUT-YA-RIEULPIEUP -0x88CB 0xB328 # HANGUL SYLLABLE TIKEUT-YA-RIEULSIOS -0x88CC 0xB329 # HANGUL SYLLABLE TIKEUT-YA-RIEULTHIEUTH -0x88CD 0xB32A # HANGUL SYLLABLE TIKEUT-YA-RIEULPHIEUPH -0x88CE 0xB32B # HANGUL SYLLABLE TIKEUT-YA-RIEULHIEUH -0x88CF 0xB32C # HANGUL SYLLABLE TIKEUT-YA-MIEUM -0x88D0 0xB32D # HANGUL SYLLABLE TIKEUT-YA-PIEUP -0x88D1 0xB32E # HANGUL SYLLABLE TIKEUT-YA-PIEUPSIOS -0x88D2 0xB32F # HANGUL SYLLABLE TIKEUT-YA-SIOS -0x88D3 0xB330 # HANGUL SYLLABLE TIKEUT-YA-SSANGSIOS -0x88D4 0xB331 # HANGUL SYLLABLE TIKEUT-YA-IEUNG -0x88D5 0xB332 # HANGUL SYLLABLE TIKEUT-YA-CIEUC -0x88D6 0xB333 # HANGUL SYLLABLE TIKEUT-YA-CHIEUCH -0x88D7 0xB334 # HANGUL SYLLABLE TIKEUT-YA-KHIEUKH -0x88D8 0xB335 # HANGUL SYLLABLE TIKEUT-YA-THIEUTH -0x88D9 0xB336 # HANGUL SYLLABLE TIKEUT-YA-PHIEUPH -0x88DA 0xB337 # HANGUL SYLLABLE TIKEUT-YA-HIEUH -0x88DB 0xB338 # HANGUL SYLLABLE TIKEUT-YAE -0x88DC 0xB339 # HANGUL SYLLABLE TIKEUT-YAE-KIYEOK -0x88DD 0xB33A # HANGUL SYLLABLE TIKEUT-YAE-SSANGKIYEOK -0x88DE 0xB33B # HANGUL SYLLABLE TIKEUT-YAE-KIYEOKSIOS -0x88DF 0xB33C # HANGUL SYLLABLE TIKEUT-YAE-NIEUN -0x88E0 0xB33D # HANGUL SYLLABLE TIKEUT-YAE-NIEUNCIEUC -0x88E1 0xB33E # HANGUL SYLLABLE TIKEUT-YAE-NIEUNHIEUH -0x88E2 0xB33F # HANGUL SYLLABLE TIKEUT-YAE-TIKEUT -0x88E3 0xB340 # HANGUL SYLLABLE TIKEUT-YAE-RIEUL -0x88E4 0xB341 # HANGUL SYLLABLE TIKEUT-YAE-RIEULKIYEOK -0x88E5 0xB342 # HANGUL SYLLABLE TIKEUT-YAE-RIEULMIEUM -0x88E6 0xB343 # HANGUL SYLLABLE TIKEUT-YAE-RIEULPIEUP -0x88E7 0xB344 # HANGUL SYLLABLE TIKEUT-YAE-RIEULSIOS -0x88E8 0xB345 # HANGUL SYLLABLE TIKEUT-YAE-RIEULTHIEUTH -0x88E9 0xB346 # HANGUL SYLLABLE TIKEUT-YAE-RIEULPHIEUPH -0x88EA 0xB347 # HANGUL SYLLABLE TIKEUT-YAE-RIEULHIEUH -0x88EB 0xB348 # HANGUL SYLLABLE TIKEUT-YAE-MIEUM -0x88EC 0xB349 # HANGUL SYLLABLE TIKEUT-YAE-PIEUP -0x88ED 0xB34A # HANGUL SYLLABLE TIKEUT-YAE-PIEUPSIOS -0x88EE 0xB34B # HANGUL SYLLABLE TIKEUT-YAE-SIOS -0x88EF 0xB34C # HANGUL SYLLABLE TIKEUT-YAE-SSANGSIOS -0x88F0 0xB34D # HANGUL SYLLABLE TIKEUT-YAE-IEUNG -0x88F1 0xB34E # HANGUL SYLLABLE TIKEUT-YAE-CIEUC -0x88F2 0xB34F # HANGUL SYLLABLE TIKEUT-YAE-CHIEUCH -0x88F3 0xB350 # HANGUL SYLLABLE TIKEUT-YAE-KHIEUKH -0x88F4 0xB351 # HANGUL SYLLABLE TIKEUT-YAE-THIEUTH -0x88F5 0xB352 # HANGUL SYLLABLE TIKEUT-YAE-PHIEUPH -0x88F6 0xB353 # HANGUL SYLLABLE TIKEUT-YAE-HIEUH -0x88F7 0xB357 # HANGUL SYLLABLE TIKEUT-EO-KIYEOKSIOS -0x88F8 0xB359 # HANGUL SYLLABLE TIKEUT-EO-NIEUNCIEUC -0x88F9 0xB35A # HANGUL SYLLABLE TIKEUT-EO-NIEUNHIEUH -0x88FA 0xB35D # HANGUL SYLLABLE TIKEUT-EO-RIEULKIYEOK -0x88FB 0xB360 # HANGUL SYLLABLE TIKEUT-EO-RIEULSIOS -0x88FC 0xB361 # HANGUL SYLLABLE TIKEUT-EO-RIEULTHIEUTH -0x88FD 0xB362 # HANGUL SYLLABLE TIKEUT-EO-RIEULPHIEUPH -0x88FE 0xB363 # HANGUL SYLLABLE TIKEUT-EO-RIEULHIEUH -0x8941 0xB366 # HANGUL SYLLABLE TIKEUT-EO-PIEUPSIOS -0x8942 0xB368 # HANGUL SYLLABLE TIKEUT-EO-SSANGSIOS -0x8943 0xB36A # HANGUL SYLLABLE TIKEUT-EO-CIEUC -0x8944 0xB36C # HANGUL SYLLABLE TIKEUT-EO-KHIEUKH -0x8945 0xB36D # HANGUL SYLLABLE TIKEUT-EO-THIEUTH -0x8946 0xB36F # HANGUL SYLLABLE TIKEUT-EO-HIEUH -0x8947 0xB372 # HANGUL SYLLABLE TIKEUT-E-SSANGKIYEOK -0x8948 0xB373 # HANGUL SYLLABLE TIKEUT-E-KIYEOKSIOS -0x8949 0xB375 # HANGUL SYLLABLE TIKEUT-E-NIEUNCIEUC -0x894A 0xB376 # HANGUL SYLLABLE TIKEUT-E-NIEUNHIEUH -0x894B 0xB377 # HANGUL SYLLABLE TIKEUT-E-TIKEUT -0x894C 0xB379 # HANGUL SYLLABLE TIKEUT-E-RIEULKIYEOK -0x894D 0xB37A # HANGUL SYLLABLE TIKEUT-E-RIEULMIEUM -0x894E 0xB37B # HANGUL SYLLABLE TIKEUT-E-RIEULPIEUP -0x894F 0xB37C # HANGUL SYLLABLE TIKEUT-E-RIEULSIOS -0x8950 0xB37D # HANGUL SYLLABLE TIKEUT-E-RIEULTHIEUTH -0x8951 0xB37E # HANGUL SYLLABLE TIKEUT-E-RIEULPHIEUPH -0x8952 0xB37F # HANGUL SYLLABLE TIKEUT-E-RIEULHIEUH -0x8953 0xB382 # HANGUL SYLLABLE TIKEUT-E-PIEUPSIOS -0x8954 0xB386 # HANGUL SYLLABLE TIKEUT-E-CIEUC -0x8955 0xB387 # HANGUL SYLLABLE TIKEUT-E-CHIEUCH -0x8956 0xB388 # HANGUL SYLLABLE TIKEUT-E-KHIEUKH -0x8957 0xB389 # HANGUL SYLLABLE TIKEUT-E-THIEUTH -0x8958 0xB38A # HANGUL SYLLABLE TIKEUT-E-PHIEUPH -0x8959 0xB38B # HANGUL SYLLABLE TIKEUT-E-HIEUH -0x895A 0xB38D # HANGUL SYLLABLE TIKEUT-YEO-KIYEOK -0x8961 0xB38E # HANGUL SYLLABLE TIKEUT-YEO-SSANGKIYEOK -0x8962 0xB38F # HANGUL SYLLABLE TIKEUT-YEO-KIYEOKSIOS -0x8963 0xB391 # HANGUL SYLLABLE TIKEUT-YEO-NIEUNCIEUC -0x8964 0xB392 # HANGUL SYLLABLE TIKEUT-YEO-NIEUNHIEUH -0x8965 0xB393 # HANGUL SYLLABLE TIKEUT-YEO-TIKEUT -0x8966 0xB395 # HANGUL SYLLABLE TIKEUT-YEO-RIEULKIYEOK -0x8967 0xB396 # HANGUL SYLLABLE TIKEUT-YEO-RIEULMIEUM -0x8968 0xB397 # HANGUL SYLLABLE TIKEUT-YEO-RIEULPIEUP -0x8969 0xB398 # HANGUL SYLLABLE TIKEUT-YEO-RIEULSIOS -0x896A 0xB399 # HANGUL SYLLABLE TIKEUT-YEO-RIEULTHIEUTH -0x896B 0xB39A # HANGUL SYLLABLE TIKEUT-YEO-RIEULPHIEUPH -0x896C 0xB39B # HANGUL SYLLABLE TIKEUT-YEO-RIEULHIEUH -0x896D 0xB39C # HANGUL SYLLABLE TIKEUT-YEO-MIEUM -0x896E 0xB39D # HANGUL SYLLABLE TIKEUT-YEO-PIEUP -0x896F 0xB39E # HANGUL SYLLABLE TIKEUT-YEO-PIEUPSIOS -0x8970 0xB39F # HANGUL SYLLABLE TIKEUT-YEO-SIOS -0x8971 0xB3A2 # HANGUL SYLLABLE TIKEUT-YEO-CIEUC -0x8972 0xB3A3 # HANGUL SYLLABLE TIKEUT-YEO-CHIEUCH -0x8973 0xB3A4 # HANGUL SYLLABLE TIKEUT-YEO-KHIEUKH -0x8974 0xB3A5 # HANGUL SYLLABLE TIKEUT-YEO-THIEUTH -0x8975 0xB3A6 # HANGUL SYLLABLE TIKEUT-YEO-PHIEUPH -0x8976 0xB3A7 # HANGUL SYLLABLE TIKEUT-YEO-HIEUH -0x8977 0xB3A9 # HANGUL SYLLABLE TIKEUT-YE-KIYEOK -0x8978 0xB3AA # HANGUL SYLLABLE TIKEUT-YE-SSANGKIYEOK -0x8979 0xB3AB # HANGUL SYLLABLE TIKEUT-YE-KIYEOKSIOS -0x897A 0xB3AD # HANGUL SYLLABLE TIKEUT-YE-NIEUNCIEUC -0x8981 0xB3AE # HANGUL SYLLABLE TIKEUT-YE-NIEUNHIEUH -0x8982 0xB3AF # HANGUL SYLLABLE TIKEUT-YE-TIKEUT -0x8983 0xB3B0 # HANGUL SYLLABLE TIKEUT-YE-RIEUL -0x8984 0xB3B1 # HANGUL SYLLABLE TIKEUT-YE-RIEULKIYEOK -0x8985 0xB3B2 # HANGUL SYLLABLE TIKEUT-YE-RIEULMIEUM -0x8986 0xB3B3 # HANGUL SYLLABLE TIKEUT-YE-RIEULPIEUP -0x8987 0xB3B4 # HANGUL SYLLABLE TIKEUT-YE-RIEULSIOS -0x8988 0xB3B5 # HANGUL SYLLABLE TIKEUT-YE-RIEULTHIEUTH -0x8989 0xB3B6 # HANGUL SYLLABLE TIKEUT-YE-RIEULPHIEUPH -0x898A 0xB3B7 # HANGUL SYLLABLE TIKEUT-YE-RIEULHIEUH -0x898B 0xB3B8 # HANGUL SYLLABLE TIKEUT-YE-MIEUM -0x898C 0xB3B9 # HANGUL SYLLABLE TIKEUT-YE-PIEUP -0x898D 0xB3BA # HANGUL SYLLABLE TIKEUT-YE-PIEUPSIOS -0x898E 0xB3BB # HANGUL SYLLABLE TIKEUT-YE-SIOS -0x898F 0xB3BC # HANGUL SYLLABLE TIKEUT-YE-SSANGSIOS -0x8990 0xB3BD # HANGUL SYLLABLE TIKEUT-YE-IEUNG -0x8991 0xB3BE # HANGUL SYLLABLE TIKEUT-YE-CIEUC -0x8992 0xB3BF # HANGUL SYLLABLE TIKEUT-YE-CHIEUCH -0x8993 0xB3C0 # HANGUL SYLLABLE TIKEUT-YE-KHIEUKH -0x8994 0xB3C1 # HANGUL SYLLABLE TIKEUT-YE-THIEUTH -0x8995 0xB3C2 # HANGUL SYLLABLE TIKEUT-YE-PHIEUPH -0x8996 0xB3C3 # HANGUL SYLLABLE TIKEUT-YE-HIEUH -0x8997 0xB3C6 # HANGUL SYLLABLE TIKEUT-O-SSANGKIYEOK -0x8998 0xB3C7 # HANGUL SYLLABLE TIKEUT-O-KIYEOKSIOS -0x8999 0xB3C9 # HANGUL SYLLABLE TIKEUT-O-NIEUNCIEUC -0x899A 0xB3CA # HANGUL SYLLABLE TIKEUT-O-NIEUNHIEUH -0x899B 0xB3CD # HANGUL SYLLABLE TIKEUT-O-RIEULKIYEOK -0x899C 0xB3CF # HANGUL SYLLABLE TIKEUT-O-RIEULPIEUP -0x899D 0xB3D1 # HANGUL SYLLABLE TIKEUT-O-RIEULTHIEUTH -0x899E 0xB3D2 # HANGUL SYLLABLE TIKEUT-O-RIEULPHIEUPH -0x899F 0xB3D3 # HANGUL SYLLABLE TIKEUT-O-RIEULHIEUH -0x89A0 0xB3D6 # HANGUL SYLLABLE TIKEUT-O-PIEUPSIOS -0x89A1 0xB3D8 # HANGUL SYLLABLE TIKEUT-O-SSANGSIOS -0x89A2 0xB3DA # HANGUL SYLLABLE TIKEUT-O-CIEUC -0x89A3 0xB3DC # HANGUL SYLLABLE TIKEUT-O-KHIEUKH -0x89A4 0xB3DE # HANGUL SYLLABLE TIKEUT-O-PHIEUPH -0x89A5 0xB3DF # HANGUL SYLLABLE TIKEUT-O-HIEUH -0x89A6 0xB3E1 # HANGUL SYLLABLE TIKEUT-WA-KIYEOK -0x89A7 0xB3E2 # HANGUL SYLLABLE TIKEUT-WA-SSANGKIYEOK -0x89A8 0xB3E3 # HANGUL SYLLABLE TIKEUT-WA-KIYEOKSIOS -0x89A9 0xB3E5 # HANGUL SYLLABLE TIKEUT-WA-NIEUNCIEUC -0x89AA 0xB3E6 # HANGUL SYLLABLE TIKEUT-WA-NIEUNHIEUH -0x89AB 0xB3E7 # HANGUL SYLLABLE TIKEUT-WA-TIKEUT -0x89AC 0xB3E9 # HANGUL SYLLABLE TIKEUT-WA-RIEULKIYEOK -0x89AD 0xB3EA # HANGUL SYLLABLE TIKEUT-WA-RIEULMIEUM -0x89AE 0xB3EB # HANGUL SYLLABLE TIKEUT-WA-RIEULPIEUP -0x89AF 0xB3EC # HANGUL SYLLABLE TIKEUT-WA-RIEULSIOS -0x89B0 0xB3ED # HANGUL SYLLABLE TIKEUT-WA-RIEULTHIEUTH -0x89B1 0xB3EE # HANGUL SYLLABLE TIKEUT-WA-RIEULPHIEUPH -0x89B2 0xB3EF # HANGUL SYLLABLE TIKEUT-WA-RIEULHIEUH -0x89B3 0xB3F0 # HANGUL SYLLABLE TIKEUT-WA-MIEUM -0x89B4 0xB3F1 # HANGUL SYLLABLE TIKEUT-WA-PIEUP -0x89B5 0xB3F2 # HANGUL SYLLABLE TIKEUT-WA-PIEUPSIOS -0x89B6 0xB3F3 # HANGUL SYLLABLE TIKEUT-WA-SIOS -0x89B7 0xB3F4 # HANGUL SYLLABLE TIKEUT-WA-SSANGSIOS -0x89B8 0xB3F5 # HANGUL SYLLABLE TIKEUT-WA-IEUNG -0x89B9 0xB3F6 # HANGUL SYLLABLE TIKEUT-WA-CIEUC -0x89BA 0xB3F7 # HANGUL SYLLABLE TIKEUT-WA-CHIEUCH -0x89BB 0xB3F8 # HANGUL SYLLABLE TIKEUT-WA-KHIEUKH -0x89BC 0xB3F9 # HANGUL SYLLABLE TIKEUT-WA-THIEUTH -0x89BD 0xB3FA # HANGUL SYLLABLE TIKEUT-WA-PHIEUPH -0x89BE 0xB3FB # HANGUL SYLLABLE TIKEUT-WA-HIEUH -0x89BF 0xB3FD # HANGUL SYLLABLE TIKEUT-WAE-KIYEOK -0x89C0 0xB3FE # HANGUL SYLLABLE TIKEUT-WAE-SSANGKIYEOK -0x89C1 0xB3FF # HANGUL SYLLABLE TIKEUT-WAE-KIYEOKSIOS -0x89C2 0xB400 # HANGUL SYLLABLE TIKEUT-WAE-NIEUN -0x89C3 0xB401 # HANGUL SYLLABLE TIKEUT-WAE-NIEUNCIEUC -0x89C4 0xB402 # HANGUL SYLLABLE TIKEUT-WAE-NIEUNHIEUH -0x89C5 0xB403 # HANGUL SYLLABLE TIKEUT-WAE-TIKEUT -0x89C6 0xB404 # HANGUL SYLLABLE TIKEUT-WAE-RIEUL -0x89C7 0xB405 # HANGUL SYLLABLE TIKEUT-WAE-RIEULKIYEOK -0x89C8 0xB406 # HANGUL SYLLABLE TIKEUT-WAE-RIEULMIEUM -0x89C9 0xB407 # HANGUL SYLLABLE TIKEUT-WAE-RIEULPIEUP -0x89CA 0xB408 # HANGUL SYLLABLE TIKEUT-WAE-RIEULSIOS -0x89CB 0xB409 # HANGUL SYLLABLE TIKEUT-WAE-RIEULTHIEUTH -0x89CC 0xB40A # HANGUL SYLLABLE TIKEUT-WAE-RIEULPHIEUPH -0x89CD 0xB40B # HANGUL SYLLABLE TIKEUT-WAE-RIEULHIEUH -0x89CE 0xB40C # HANGUL SYLLABLE TIKEUT-WAE-MIEUM -0x89CF 0xB40D # HANGUL SYLLABLE TIKEUT-WAE-PIEUP -0x89D0 0xB40E # HANGUL SYLLABLE TIKEUT-WAE-PIEUPSIOS -0x89D1 0xB40F # HANGUL SYLLABLE TIKEUT-WAE-SIOS -0x89D2 0xB411 # HANGUL SYLLABLE TIKEUT-WAE-IEUNG -0x89D3 0xB412 # HANGUL SYLLABLE TIKEUT-WAE-CIEUC -0x89D4 0xB413 # HANGUL SYLLABLE TIKEUT-WAE-CHIEUCH -0x89D5 0xB414 # HANGUL SYLLABLE TIKEUT-WAE-KHIEUKH -0x89D6 0xB415 # HANGUL SYLLABLE TIKEUT-WAE-THIEUTH -0x89D7 0xB416 # HANGUL SYLLABLE TIKEUT-WAE-PHIEUPH -0x89D8 0xB417 # HANGUL SYLLABLE TIKEUT-WAE-HIEUH -0x89D9 0xB419 # HANGUL SYLLABLE TIKEUT-OE-KIYEOK -0x89DA 0xB41A # HANGUL SYLLABLE TIKEUT-OE-SSANGKIYEOK -0x89DB 0xB41B # HANGUL SYLLABLE TIKEUT-OE-KIYEOKSIOS -0x89DC 0xB41D # HANGUL SYLLABLE TIKEUT-OE-NIEUNCIEUC -0x89DD 0xB41E # HANGUL SYLLABLE TIKEUT-OE-NIEUNHIEUH -0x89DE 0xB41F # HANGUL SYLLABLE TIKEUT-OE-TIKEUT -0x89DF 0xB421 # HANGUL SYLLABLE TIKEUT-OE-RIEULKIYEOK -0x89E0 0xB422 # HANGUL SYLLABLE TIKEUT-OE-RIEULMIEUM -0x89E1 0xB423 # HANGUL SYLLABLE TIKEUT-OE-RIEULPIEUP -0x89E2 0xB424 # HANGUL SYLLABLE TIKEUT-OE-RIEULSIOS -0x89E3 0xB425 # HANGUL SYLLABLE TIKEUT-OE-RIEULTHIEUTH -0x89E4 0xB426 # HANGUL SYLLABLE TIKEUT-OE-RIEULPHIEUPH -0x89E5 0xB427 # HANGUL SYLLABLE TIKEUT-OE-RIEULHIEUH -0x89E6 0xB42A # HANGUL SYLLABLE TIKEUT-OE-PIEUPSIOS -0x89E7 0xB42C # HANGUL SYLLABLE TIKEUT-OE-SSANGSIOS -0x89E8 0xB42D # HANGUL SYLLABLE TIKEUT-OE-IEUNG -0x89E9 0xB42E # HANGUL SYLLABLE TIKEUT-OE-CIEUC -0x89EA 0xB42F # HANGUL SYLLABLE TIKEUT-OE-CHIEUCH -0x89EB 0xB430 # HANGUL SYLLABLE TIKEUT-OE-KHIEUKH -0x89EC 0xB431 # HANGUL SYLLABLE TIKEUT-OE-THIEUTH -0x89ED 0xB432 # HANGUL SYLLABLE TIKEUT-OE-PHIEUPH -0x89EE 0xB433 # HANGUL SYLLABLE TIKEUT-OE-HIEUH -0x89EF 0xB435 # HANGUL SYLLABLE TIKEUT-YO-KIYEOK -0x89F0 0xB436 # HANGUL SYLLABLE TIKEUT-YO-SSANGKIYEOK -0x89F1 0xB437 # HANGUL SYLLABLE TIKEUT-YO-KIYEOKSIOS -0x89F2 0xB438 # HANGUL SYLLABLE TIKEUT-YO-NIEUN -0x89F3 0xB439 # HANGUL SYLLABLE TIKEUT-YO-NIEUNCIEUC -0x89F4 0xB43A # HANGUL SYLLABLE TIKEUT-YO-NIEUNHIEUH -0x89F5 0xB43B # HANGUL SYLLABLE TIKEUT-YO-TIKEUT -0x89F6 0xB43C # HANGUL SYLLABLE TIKEUT-YO-RIEUL -0x89F7 0xB43D # HANGUL SYLLABLE TIKEUT-YO-RIEULKIYEOK -0x89F8 0xB43E # HANGUL SYLLABLE TIKEUT-YO-RIEULMIEUM -0x89F9 0xB43F # HANGUL SYLLABLE TIKEUT-YO-RIEULPIEUP -0x89FA 0xB440 # HANGUL SYLLABLE TIKEUT-YO-RIEULSIOS -0x89FB 0xB441 # HANGUL SYLLABLE TIKEUT-YO-RIEULTHIEUTH -0x89FC 0xB442 # HANGUL SYLLABLE TIKEUT-YO-RIEULPHIEUPH -0x89FD 0xB443 # HANGUL SYLLABLE TIKEUT-YO-RIEULHIEUH -0x89FE 0xB444 # HANGUL SYLLABLE TIKEUT-YO-MIEUM -0x8A41 0xB445 # HANGUL SYLLABLE TIKEUT-YO-PIEUP -0x8A42 0xB446 # HANGUL SYLLABLE TIKEUT-YO-PIEUPSIOS -0x8A43 0xB447 # HANGUL SYLLABLE TIKEUT-YO-SIOS -0x8A44 0xB448 # HANGUL SYLLABLE TIKEUT-YO-SSANGSIOS -0x8A45 0xB449 # HANGUL SYLLABLE TIKEUT-YO-IEUNG -0x8A46 0xB44A # HANGUL SYLLABLE TIKEUT-YO-CIEUC -0x8A47 0xB44B # HANGUL SYLLABLE TIKEUT-YO-CHIEUCH -0x8A48 0xB44C # HANGUL SYLLABLE TIKEUT-YO-KHIEUKH -0x8A49 0xB44D # HANGUL SYLLABLE TIKEUT-YO-THIEUTH -0x8A4A 0xB44E # HANGUL SYLLABLE TIKEUT-YO-PHIEUPH -0x8A4B 0xB44F # HANGUL SYLLABLE TIKEUT-YO-HIEUH -0x8A4C 0xB452 # HANGUL SYLLABLE TIKEUT-U-SSANGKIYEOK -0x8A4D 0xB453 # HANGUL SYLLABLE TIKEUT-U-KIYEOKSIOS -0x8A4E 0xB455 # HANGUL SYLLABLE TIKEUT-U-NIEUNCIEUC -0x8A4F 0xB456 # HANGUL SYLLABLE TIKEUT-U-NIEUNHIEUH -0x8A50 0xB457 # HANGUL SYLLABLE TIKEUT-U-TIKEUT -0x8A51 0xB459 # HANGUL SYLLABLE TIKEUT-U-RIEULKIYEOK -0x8A52 0xB45A # HANGUL SYLLABLE TIKEUT-U-RIEULMIEUM -0x8A53 0xB45B # HANGUL SYLLABLE TIKEUT-U-RIEULPIEUP -0x8A54 0xB45C # HANGUL SYLLABLE TIKEUT-U-RIEULSIOS -0x8A55 0xB45D # HANGUL SYLLABLE TIKEUT-U-RIEULTHIEUTH -0x8A56 0xB45E # HANGUL SYLLABLE TIKEUT-U-RIEULPHIEUPH -0x8A57 0xB45F # HANGUL SYLLABLE TIKEUT-U-RIEULHIEUH -0x8A58 0xB462 # HANGUL SYLLABLE TIKEUT-U-PIEUPSIOS -0x8A59 0xB464 # HANGUL SYLLABLE TIKEUT-U-SSANGSIOS -0x8A5A 0xB466 # HANGUL SYLLABLE TIKEUT-U-CIEUC -0x8A61 0xB467 # HANGUL SYLLABLE TIKEUT-U-CHIEUCH -0x8A62 0xB468 # HANGUL SYLLABLE TIKEUT-U-KHIEUKH -0x8A63 0xB469 # HANGUL SYLLABLE TIKEUT-U-THIEUTH -0x8A64 0xB46A # HANGUL SYLLABLE TIKEUT-U-PHIEUPH -0x8A65 0xB46B # HANGUL SYLLABLE TIKEUT-U-HIEUH -0x8A66 0xB46D # HANGUL SYLLABLE TIKEUT-WEO-KIYEOK -0x8A67 0xB46E # HANGUL SYLLABLE TIKEUT-WEO-SSANGKIYEOK -0x8A68 0xB46F # HANGUL SYLLABLE TIKEUT-WEO-KIYEOKSIOS -0x8A69 0xB470 # HANGUL SYLLABLE TIKEUT-WEO-NIEUN -0x8A6A 0xB471 # HANGUL SYLLABLE TIKEUT-WEO-NIEUNCIEUC -0x8A6B 0xB472 # HANGUL SYLLABLE TIKEUT-WEO-NIEUNHIEUH -0x8A6C 0xB473 # HANGUL SYLLABLE TIKEUT-WEO-TIKEUT -0x8A6D 0xB474 # HANGUL SYLLABLE TIKEUT-WEO-RIEUL -0x8A6E 0xB475 # HANGUL SYLLABLE TIKEUT-WEO-RIEULKIYEOK -0x8A6F 0xB476 # HANGUL SYLLABLE TIKEUT-WEO-RIEULMIEUM -0x8A70 0xB477 # HANGUL SYLLABLE TIKEUT-WEO-RIEULPIEUP -0x8A71 0xB478 # HANGUL SYLLABLE TIKEUT-WEO-RIEULSIOS -0x8A72 0xB479 # HANGUL SYLLABLE TIKEUT-WEO-RIEULTHIEUTH -0x8A73 0xB47A # HANGUL SYLLABLE TIKEUT-WEO-RIEULPHIEUPH -0x8A74 0xB47B # HANGUL SYLLABLE TIKEUT-WEO-RIEULHIEUH -0x8A75 0xB47C # HANGUL SYLLABLE TIKEUT-WEO-MIEUM -0x8A76 0xB47D # HANGUL SYLLABLE TIKEUT-WEO-PIEUP -0x8A77 0xB47E # HANGUL SYLLABLE TIKEUT-WEO-PIEUPSIOS -0x8A78 0xB47F # HANGUL SYLLABLE TIKEUT-WEO-SIOS -0x8A79 0xB481 # HANGUL SYLLABLE TIKEUT-WEO-IEUNG -0x8A7A 0xB482 # HANGUL SYLLABLE TIKEUT-WEO-CIEUC -0x8A81 0xB483 # HANGUL SYLLABLE TIKEUT-WEO-CHIEUCH -0x8A82 0xB484 # HANGUL SYLLABLE TIKEUT-WEO-KHIEUKH -0x8A83 0xB485 # HANGUL SYLLABLE TIKEUT-WEO-THIEUTH -0x8A84 0xB486 # HANGUL SYLLABLE TIKEUT-WEO-PHIEUPH -0x8A85 0xB487 # HANGUL SYLLABLE TIKEUT-WEO-HIEUH -0x8A86 0xB489 # HANGUL SYLLABLE TIKEUT-WE-KIYEOK -0x8A87 0xB48A # HANGUL SYLLABLE TIKEUT-WE-SSANGKIYEOK -0x8A88 0xB48B # HANGUL SYLLABLE TIKEUT-WE-KIYEOKSIOS -0x8A89 0xB48C # HANGUL SYLLABLE TIKEUT-WE-NIEUN -0x8A8A 0xB48D # HANGUL SYLLABLE TIKEUT-WE-NIEUNCIEUC -0x8A8B 0xB48E # HANGUL SYLLABLE TIKEUT-WE-NIEUNHIEUH -0x8A8C 0xB48F # HANGUL SYLLABLE TIKEUT-WE-TIKEUT -0x8A8D 0xB490 # HANGUL SYLLABLE TIKEUT-WE-RIEUL -0x8A8E 0xB491 # HANGUL SYLLABLE TIKEUT-WE-RIEULKIYEOK -0x8A8F 0xB492 # HANGUL SYLLABLE TIKEUT-WE-RIEULMIEUM -0x8A90 0xB493 # HANGUL SYLLABLE TIKEUT-WE-RIEULPIEUP -0x8A91 0xB494 # HANGUL SYLLABLE TIKEUT-WE-RIEULSIOS -0x8A92 0xB495 # HANGUL SYLLABLE TIKEUT-WE-RIEULTHIEUTH -0x8A93 0xB496 # HANGUL SYLLABLE TIKEUT-WE-RIEULPHIEUPH -0x8A94 0xB497 # HANGUL SYLLABLE TIKEUT-WE-RIEULHIEUH -0x8A95 0xB498 # HANGUL SYLLABLE TIKEUT-WE-MIEUM -0x8A96 0xB499 # HANGUL SYLLABLE TIKEUT-WE-PIEUP -0x8A97 0xB49A # HANGUL SYLLABLE TIKEUT-WE-PIEUPSIOS -0x8A98 0xB49B # HANGUL SYLLABLE TIKEUT-WE-SIOS -0x8A99 0xB49C # HANGUL SYLLABLE TIKEUT-WE-SSANGSIOS -0x8A9A 0xB49E # HANGUL SYLLABLE TIKEUT-WE-CIEUC -0x8A9B 0xB49F # HANGUL SYLLABLE TIKEUT-WE-CHIEUCH -0x8A9C 0xB4A0 # HANGUL SYLLABLE TIKEUT-WE-KHIEUKH -0x8A9D 0xB4A1 # HANGUL SYLLABLE TIKEUT-WE-THIEUTH -0x8A9E 0xB4A2 # HANGUL SYLLABLE TIKEUT-WE-PHIEUPH -0x8A9F 0xB4A3 # HANGUL SYLLABLE TIKEUT-WE-HIEUH -0x8AA0 0xB4A5 # HANGUL SYLLABLE TIKEUT-WI-KIYEOK -0x8AA1 0xB4A6 # HANGUL SYLLABLE TIKEUT-WI-SSANGKIYEOK -0x8AA2 0xB4A7 # HANGUL SYLLABLE TIKEUT-WI-KIYEOKSIOS -0x8AA3 0xB4A9 # HANGUL SYLLABLE TIKEUT-WI-NIEUNCIEUC -0x8AA4 0xB4AA # HANGUL SYLLABLE TIKEUT-WI-NIEUNHIEUH -0x8AA5 0xB4AB # HANGUL SYLLABLE TIKEUT-WI-TIKEUT -0x8AA6 0xB4AD # HANGUL SYLLABLE TIKEUT-WI-RIEULKIYEOK -0x8AA7 0xB4AE # HANGUL SYLLABLE TIKEUT-WI-RIEULMIEUM -0x8AA8 0xB4AF # HANGUL SYLLABLE TIKEUT-WI-RIEULPIEUP -0x8AA9 0xB4B0 # HANGUL SYLLABLE TIKEUT-WI-RIEULSIOS -0x8AAA 0xB4B1 # HANGUL SYLLABLE TIKEUT-WI-RIEULTHIEUTH -0x8AAB 0xB4B2 # HANGUL SYLLABLE TIKEUT-WI-RIEULPHIEUPH -0x8AAC 0xB4B3 # HANGUL SYLLABLE TIKEUT-WI-RIEULHIEUH -0x8AAD 0xB4B4 # HANGUL SYLLABLE TIKEUT-WI-MIEUM -0x8AAE 0xB4B6 # HANGUL SYLLABLE TIKEUT-WI-PIEUPSIOS -0x8AAF 0xB4B8 # HANGUL SYLLABLE TIKEUT-WI-SSANGSIOS -0x8AB0 0xB4BA # HANGUL SYLLABLE TIKEUT-WI-CIEUC -0x8AB1 0xB4BB # HANGUL SYLLABLE TIKEUT-WI-CHIEUCH -0x8AB2 0xB4BC # HANGUL SYLLABLE TIKEUT-WI-KHIEUKH -0x8AB3 0xB4BD # HANGUL SYLLABLE TIKEUT-WI-THIEUTH -0x8AB4 0xB4BE # HANGUL SYLLABLE TIKEUT-WI-PHIEUPH -0x8AB5 0xB4BF # HANGUL SYLLABLE TIKEUT-WI-HIEUH -0x8AB6 0xB4C1 # HANGUL SYLLABLE TIKEUT-YU-KIYEOK -0x8AB7 0xB4C2 # HANGUL SYLLABLE TIKEUT-YU-SSANGKIYEOK -0x8AB8 0xB4C3 # HANGUL SYLLABLE TIKEUT-YU-KIYEOKSIOS -0x8AB9 0xB4C5 # HANGUL SYLLABLE TIKEUT-YU-NIEUNCIEUC -0x8ABA 0xB4C6 # HANGUL SYLLABLE TIKEUT-YU-NIEUNHIEUH -0x8ABB 0xB4C7 # HANGUL SYLLABLE TIKEUT-YU-TIKEUT -0x8ABC 0xB4C9 # HANGUL SYLLABLE TIKEUT-YU-RIEULKIYEOK -0x8ABD 0xB4CA # HANGUL SYLLABLE TIKEUT-YU-RIEULMIEUM -0x8ABE 0xB4CB # HANGUL SYLLABLE TIKEUT-YU-RIEULPIEUP -0x8ABF 0xB4CC # HANGUL SYLLABLE TIKEUT-YU-RIEULSIOS -0x8AC0 0xB4CD # HANGUL SYLLABLE TIKEUT-YU-RIEULTHIEUTH -0x8AC1 0xB4CE # HANGUL SYLLABLE TIKEUT-YU-RIEULPHIEUPH -0x8AC2 0xB4CF # HANGUL SYLLABLE TIKEUT-YU-RIEULHIEUH -0x8AC3 0xB4D1 # HANGUL SYLLABLE TIKEUT-YU-PIEUP -0x8AC4 0xB4D2 # HANGUL SYLLABLE TIKEUT-YU-PIEUPSIOS -0x8AC5 0xB4D3 # HANGUL SYLLABLE TIKEUT-YU-SIOS -0x8AC6 0xB4D4 # HANGUL SYLLABLE TIKEUT-YU-SSANGSIOS -0x8AC7 0xB4D6 # HANGUL SYLLABLE TIKEUT-YU-CIEUC -0x8AC8 0xB4D7 # HANGUL SYLLABLE TIKEUT-YU-CHIEUCH -0x8AC9 0xB4D8 # HANGUL SYLLABLE TIKEUT-YU-KHIEUKH -0x8ACA 0xB4D9 # HANGUL SYLLABLE TIKEUT-YU-THIEUTH -0x8ACB 0xB4DA # HANGUL SYLLABLE TIKEUT-YU-PHIEUPH -0x8ACC 0xB4DB # HANGUL SYLLABLE TIKEUT-YU-HIEUH -0x8ACD 0xB4DE # HANGUL SYLLABLE TIKEUT-EU-SSANGKIYEOK -0x8ACE 0xB4DF # HANGUL SYLLABLE TIKEUT-EU-KIYEOKSIOS -0x8ACF 0xB4E1 # HANGUL SYLLABLE TIKEUT-EU-NIEUNCIEUC -0x8AD0 0xB4E2 # HANGUL SYLLABLE TIKEUT-EU-NIEUNHIEUH -0x8AD1 0xB4E5 # HANGUL SYLLABLE TIKEUT-EU-RIEULKIYEOK -0x8AD2 0xB4E7 # HANGUL SYLLABLE TIKEUT-EU-RIEULPIEUP -0x8AD3 0xB4E8 # HANGUL SYLLABLE TIKEUT-EU-RIEULSIOS -0x8AD4 0xB4E9 # HANGUL SYLLABLE TIKEUT-EU-RIEULTHIEUTH -0x8AD5 0xB4EA # HANGUL SYLLABLE TIKEUT-EU-RIEULPHIEUPH -0x8AD6 0xB4EB # HANGUL SYLLABLE TIKEUT-EU-RIEULHIEUH -0x8AD7 0xB4EE # HANGUL SYLLABLE TIKEUT-EU-PIEUPSIOS -0x8AD8 0xB4F0 # HANGUL SYLLABLE TIKEUT-EU-SSANGSIOS -0x8AD9 0xB4F2 # HANGUL SYLLABLE TIKEUT-EU-CIEUC -0x8ADA 0xB4F3 # HANGUL SYLLABLE TIKEUT-EU-CHIEUCH -0x8ADB 0xB4F4 # HANGUL SYLLABLE TIKEUT-EU-KHIEUKH -0x8ADC 0xB4F5 # HANGUL SYLLABLE TIKEUT-EU-THIEUTH -0x8ADD 0xB4F6 # HANGUL SYLLABLE TIKEUT-EU-PHIEUPH -0x8ADE 0xB4F7 # HANGUL SYLLABLE TIKEUT-EU-HIEUH -0x8ADF 0xB4F9 # HANGUL SYLLABLE TIKEUT-YI-KIYEOK -0x8AE0 0xB4FA # HANGUL SYLLABLE TIKEUT-YI-SSANGKIYEOK -0x8AE1 0xB4FB # HANGUL SYLLABLE TIKEUT-YI-KIYEOKSIOS -0x8AE2 0xB4FC # HANGUL SYLLABLE TIKEUT-YI-NIEUN -0x8AE3 0xB4FD # HANGUL SYLLABLE TIKEUT-YI-NIEUNCIEUC -0x8AE4 0xB4FE # HANGUL SYLLABLE TIKEUT-YI-NIEUNHIEUH -0x8AE5 0xB4FF # HANGUL SYLLABLE TIKEUT-YI-TIKEUT -0x8AE6 0xB500 # HANGUL SYLLABLE TIKEUT-YI-RIEUL -0x8AE7 0xB501 # HANGUL SYLLABLE TIKEUT-YI-RIEULKIYEOK -0x8AE8 0xB502 # HANGUL SYLLABLE TIKEUT-YI-RIEULMIEUM -0x8AE9 0xB503 # HANGUL SYLLABLE TIKEUT-YI-RIEULPIEUP -0x8AEA 0xB504 # HANGUL SYLLABLE TIKEUT-YI-RIEULSIOS -0x8AEB 0xB505 # HANGUL SYLLABLE TIKEUT-YI-RIEULTHIEUTH -0x8AEC 0xB506 # HANGUL SYLLABLE TIKEUT-YI-RIEULPHIEUPH -0x8AED 0xB507 # HANGUL SYLLABLE TIKEUT-YI-RIEULHIEUH -0x8AEE 0xB508 # HANGUL SYLLABLE TIKEUT-YI-MIEUM -0x8AEF 0xB509 # HANGUL SYLLABLE TIKEUT-YI-PIEUP -0x8AF0 0xB50A # HANGUL SYLLABLE TIKEUT-YI-PIEUPSIOS -0x8AF1 0xB50B # HANGUL SYLLABLE TIKEUT-YI-SIOS -0x8AF2 0xB50C # HANGUL SYLLABLE TIKEUT-YI-SSANGSIOS -0x8AF3 0xB50D # HANGUL SYLLABLE TIKEUT-YI-IEUNG -0x8AF4 0xB50E # HANGUL SYLLABLE TIKEUT-YI-CIEUC -0x8AF5 0xB50F # HANGUL SYLLABLE TIKEUT-YI-CHIEUCH -0x8AF6 0xB510 # HANGUL SYLLABLE TIKEUT-YI-KHIEUKH -0x8AF7 0xB511 # HANGUL SYLLABLE TIKEUT-YI-THIEUTH -0x8AF8 0xB512 # HANGUL SYLLABLE TIKEUT-YI-PHIEUPH -0x8AF9 0xB513 # HANGUL SYLLABLE TIKEUT-YI-HIEUH -0x8AFA 0xB516 # HANGUL SYLLABLE TIKEUT-I-SSANGKIYEOK -0x8AFB 0xB517 # HANGUL SYLLABLE TIKEUT-I-KIYEOKSIOS -0x8AFC 0xB519 # HANGUL SYLLABLE TIKEUT-I-NIEUNCIEUC -0x8AFD 0xB51A # HANGUL SYLLABLE TIKEUT-I-NIEUNHIEUH -0x8AFE 0xB51D # HANGUL SYLLABLE TIKEUT-I-RIEULKIYEOK -0x8B41 0xB51E # HANGUL SYLLABLE TIKEUT-I-RIEULMIEUM -0x8B42 0xB51F # HANGUL SYLLABLE TIKEUT-I-RIEULPIEUP -0x8B43 0xB520 # HANGUL SYLLABLE TIKEUT-I-RIEULSIOS -0x8B44 0xB521 # HANGUL SYLLABLE TIKEUT-I-RIEULTHIEUTH -0x8B45 0xB522 # HANGUL SYLLABLE TIKEUT-I-RIEULPHIEUPH -0x8B46 0xB523 # HANGUL SYLLABLE TIKEUT-I-RIEULHIEUH -0x8B47 0xB526 # HANGUL SYLLABLE TIKEUT-I-PIEUPSIOS -0x8B48 0xB52B # HANGUL SYLLABLE TIKEUT-I-CHIEUCH -0x8B49 0xB52C # HANGUL SYLLABLE TIKEUT-I-KHIEUKH -0x8B4A 0xB52D # HANGUL SYLLABLE TIKEUT-I-THIEUTH -0x8B4B 0xB52E # HANGUL SYLLABLE TIKEUT-I-PHIEUPH -0x8B4C 0xB52F # HANGUL SYLLABLE TIKEUT-I-HIEUH -0x8B4D 0xB532 # HANGUL SYLLABLE SSANGTIKEUT-A-SSANGKIYEOK -0x8B4E 0xB533 # HANGUL SYLLABLE SSANGTIKEUT-A-KIYEOKSIOS -0x8B4F 0xB535 # HANGUL SYLLABLE SSANGTIKEUT-A-NIEUNCIEUC -0x8B50 0xB536 # HANGUL SYLLABLE SSANGTIKEUT-A-NIEUNHIEUH -0x8B51 0xB537 # HANGUL SYLLABLE SSANGTIKEUT-A-TIKEUT -0x8B52 0xB539 # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULKIYEOK -0x8B53 0xB53A # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULMIEUM -0x8B54 0xB53B # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULPIEUP -0x8B55 0xB53C # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULSIOS -0x8B56 0xB53D # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULTHIEUTH -0x8B57 0xB53E # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULPHIEUPH -0x8B58 0xB53F # HANGUL SYLLABLE SSANGTIKEUT-A-RIEULHIEUH -0x8B59 0xB542 # HANGUL SYLLABLE SSANGTIKEUT-A-PIEUPSIOS -0x8B5A 0xB546 # HANGUL SYLLABLE SSANGTIKEUT-A-CIEUC -0x8B61 0xB547 # HANGUL SYLLABLE SSANGTIKEUT-A-CHIEUCH -0x8B62 0xB548 # HANGUL SYLLABLE SSANGTIKEUT-A-KHIEUKH -0x8B63 0xB549 # HANGUL SYLLABLE SSANGTIKEUT-A-THIEUTH -0x8B64 0xB54A # HANGUL SYLLABLE SSANGTIKEUT-A-PHIEUPH -0x8B65 0xB54E # HANGUL SYLLABLE SSANGTIKEUT-AE-SSANGKIYEOK -0x8B66 0xB54F # HANGUL SYLLABLE SSANGTIKEUT-AE-KIYEOKSIOS -0x8B67 0xB551 # HANGUL SYLLABLE SSANGTIKEUT-AE-NIEUNCIEUC -0x8B68 0xB552 # HANGUL SYLLABLE SSANGTIKEUT-AE-NIEUNHIEUH -0x8B69 0xB553 # HANGUL SYLLABLE SSANGTIKEUT-AE-TIKEUT -0x8B6A 0xB555 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULKIYEOK -0x8B6B 0xB556 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULMIEUM -0x8B6C 0xB557 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULPIEUP -0x8B6D 0xB558 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULSIOS -0x8B6E 0xB559 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULTHIEUTH -0x8B6F 0xB55A # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULPHIEUPH -0x8B70 0xB55B # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEULHIEUH -0x8B71 0xB55E # HANGUL SYLLABLE SSANGTIKEUT-AE-PIEUPSIOS -0x8B72 0xB562 # HANGUL SYLLABLE SSANGTIKEUT-AE-CIEUC -0x8B73 0xB563 # HANGUL SYLLABLE SSANGTIKEUT-AE-CHIEUCH -0x8B74 0xB564 # HANGUL SYLLABLE SSANGTIKEUT-AE-KHIEUKH -0x8B75 0xB565 # HANGUL SYLLABLE SSANGTIKEUT-AE-THIEUTH -0x8B76 0xB566 # HANGUL SYLLABLE SSANGTIKEUT-AE-PHIEUPH -0x8B77 0xB567 # HANGUL SYLLABLE SSANGTIKEUT-AE-HIEUH -0x8B78 0xB568 # HANGUL SYLLABLE SSANGTIKEUT-YA -0x8B79 0xB569 # HANGUL SYLLABLE SSANGTIKEUT-YA-KIYEOK -0x8B7A 0xB56A # HANGUL SYLLABLE SSANGTIKEUT-YA-SSANGKIYEOK -0x8B81 0xB56B # HANGUL SYLLABLE SSANGTIKEUT-YA-KIYEOKSIOS -0x8B82 0xB56C # HANGUL SYLLABLE SSANGTIKEUT-YA-NIEUN -0x8B83 0xB56D # HANGUL SYLLABLE SSANGTIKEUT-YA-NIEUNCIEUC -0x8B84 0xB56E # HANGUL SYLLABLE SSANGTIKEUT-YA-NIEUNHIEUH -0x8B85 0xB56F # HANGUL SYLLABLE SSANGTIKEUT-YA-TIKEUT -0x8B86 0xB570 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEUL -0x8B87 0xB571 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULKIYEOK -0x8B88 0xB572 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULMIEUM -0x8B89 0xB573 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULPIEUP -0x8B8A 0xB574 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULSIOS -0x8B8B 0xB575 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULTHIEUTH -0x8B8C 0xB576 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULPHIEUPH -0x8B8D 0xB577 # HANGUL SYLLABLE SSANGTIKEUT-YA-RIEULHIEUH -0x8B8E 0xB578 # HANGUL SYLLABLE SSANGTIKEUT-YA-MIEUM -0x8B8F 0xB579 # HANGUL SYLLABLE SSANGTIKEUT-YA-PIEUP -0x8B90 0xB57A # HANGUL SYLLABLE SSANGTIKEUT-YA-PIEUPSIOS -0x8B91 0xB57B # HANGUL SYLLABLE SSANGTIKEUT-YA-SIOS -0x8B92 0xB57C # HANGUL SYLLABLE SSANGTIKEUT-YA-SSANGSIOS -0x8B93 0xB57D # HANGUL SYLLABLE SSANGTIKEUT-YA-IEUNG -0x8B94 0xB57E # HANGUL SYLLABLE SSANGTIKEUT-YA-CIEUC -0x8B95 0xB57F # HANGUL SYLLABLE SSANGTIKEUT-YA-CHIEUCH -0x8B96 0xB580 # HANGUL SYLLABLE SSANGTIKEUT-YA-KHIEUKH -0x8B97 0xB581 # HANGUL SYLLABLE SSANGTIKEUT-YA-THIEUTH -0x8B98 0xB582 # HANGUL SYLLABLE SSANGTIKEUT-YA-PHIEUPH -0x8B99 0xB583 # HANGUL SYLLABLE SSANGTIKEUT-YA-HIEUH -0x8B9A 0xB584 # HANGUL SYLLABLE SSANGTIKEUT-YAE -0x8B9B 0xB585 # HANGUL SYLLABLE SSANGTIKEUT-YAE-KIYEOK -0x8B9C 0xB586 # HANGUL SYLLABLE SSANGTIKEUT-YAE-SSANGKIYEOK -0x8B9D 0xB587 # HANGUL SYLLABLE SSANGTIKEUT-YAE-KIYEOKSIOS -0x8B9E 0xB588 # HANGUL SYLLABLE SSANGTIKEUT-YAE-NIEUN -0x8B9F 0xB589 # HANGUL SYLLABLE SSANGTIKEUT-YAE-NIEUNCIEUC -0x8BA0 0xB58A # HANGUL SYLLABLE SSANGTIKEUT-YAE-NIEUNHIEUH -0x8BA1 0xB58B # HANGUL SYLLABLE SSANGTIKEUT-YAE-TIKEUT -0x8BA2 0xB58C # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEUL -0x8BA3 0xB58D # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULKIYEOK -0x8BA4 0xB58E # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULMIEUM -0x8BA5 0xB58F # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULPIEUP -0x8BA6 0xB590 # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULSIOS -0x8BA7 0xB591 # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULTHIEUTH -0x8BA8 0xB592 # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULPHIEUPH -0x8BA9 0xB593 # HANGUL SYLLABLE SSANGTIKEUT-YAE-RIEULHIEUH -0x8BAA 0xB594 # HANGUL SYLLABLE SSANGTIKEUT-YAE-MIEUM -0x8BAB 0xB595 # HANGUL SYLLABLE SSANGTIKEUT-YAE-PIEUP -0x8BAC 0xB596 # HANGUL SYLLABLE SSANGTIKEUT-YAE-PIEUPSIOS -0x8BAD 0xB597 # HANGUL SYLLABLE SSANGTIKEUT-YAE-SIOS -0x8BAE 0xB598 # HANGUL SYLLABLE SSANGTIKEUT-YAE-SSANGSIOS -0x8BAF 0xB599 # HANGUL SYLLABLE SSANGTIKEUT-YAE-IEUNG -0x8BB0 0xB59A # HANGUL SYLLABLE SSANGTIKEUT-YAE-CIEUC -0x8BB1 0xB59B # HANGUL SYLLABLE SSANGTIKEUT-YAE-CHIEUCH -0x8BB2 0xB59C # HANGUL SYLLABLE SSANGTIKEUT-YAE-KHIEUKH -0x8BB3 0xB59D # HANGUL SYLLABLE SSANGTIKEUT-YAE-THIEUTH -0x8BB4 0xB59E # HANGUL SYLLABLE SSANGTIKEUT-YAE-PHIEUPH -0x8BB5 0xB59F # HANGUL SYLLABLE SSANGTIKEUT-YAE-HIEUH -0x8BB6 0xB5A2 # HANGUL SYLLABLE SSANGTIKEUT-EO-SSANGKIYEOK -0x8BB7 0xB5A3 # HANGUL SYLLABLE SSANGTIKEUT-EO-KIYEOKSIOS -0x8BB8 0xB5A5 # HANGUL SYLLABLE SSANGTIKEUT-EO-NIEUNCIEUC -0x8BB9 0xB5A6 # HANGUL SYLLABLE SSANGTIKEUT-EO-NIEUNHIEUH -0x8BBA 0xB5A7 # HANGUL SYLLABLE SSANGTIKEUT-EO-TIKEUT -0x8BBB 0xB5A9 # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULKIYEOK -0x8BBC 0xB5AC # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULSIOS -0x8BBD 0xB5AD # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULTHIEUTH -0x8BBE 0xB5AE # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULPHIEUPH -0x8BBF 0xB5AF # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULHIEUH -0x8BC0 0xB5B2 # HANGUL SYLLABLE SSANGTIKEUT-EO-PIEUPSIOS -0x8BC1 0xB5B6 # HANGUL SYLLABLE SSANGTIKEUT-EO-CIEUC -0x8BC2 0xB5B7 # HANGUL SYLLABLE SSANGTIKEUT-EO-CHIEUCH -0x8BC3 0xB5B8 # HANGUL SYLLABLE SSANGTIKEUT-EO-KHIEUKH -0x8BC4 0xB5B9 # HANGUL SYLLABLE SSANGTIKEUT-EO-THIEUTH -0x8BC5 0xB5BA # HANGUL SYLLABLE SSANGTIKEUT-EO-PHIEUPH -0x8BC6 0xB5BE # HANGUL SYLLABLE SSANGTIKEUT-E-SSANGKIYEOK -0x8BC7 0xB5BF # HANGUL SYLLABLE SSANGTIKEUT-E-KIYEOKSIOS -0x8BC8 0xB5C1 # HANGUL SYLLABLE SSANGTIKEUT-E-NIEUNCIEUC -0x8BC9 0xB5C2 # HANGUL SYLLABLE SSANGTIKEUT-E-NIEUNHIEUH -0x8BCA 0xB5C3 # HANGUL SYLLABLE SSANGTIKEUT-E-TIKEUT -0x8BCB 0xB5C5 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULKIYEOK -0x8BCC 0xB5C6 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULMIEUM -0x8BCD 0xB5C7 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULPIEUP -0x8BCE 0xB5C8 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULSIOS -0x8BCF 0xB5C9 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULTHIEUTH -0x8BD0 0xB5CA # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULPHIEUPH -0x8BD1 0xB5CB # HANGUL SYLLABLE SSANGTIKEUT-E-RIEULHIEUH -0x8BD2 0xB5CE # HANGUL SYLLABLE SSANGTIKEUT-E-PIEUPSIOS -0x8BD3 0xB5D2 # HANGUL SYLLABLE SSANGTIKEUT-E-CIEUC -0x8BD4 0xB5D3 # HANGUL SYLLABLE SSANGTIKEUT-E-CHIEUCH -0x8BD5 0xB5D4 # HANGUL SYLLABLE SSANGTIKEUT-E-KHIEUKH -0x8BD6 0xB5D5 # HANGUL SYLLABLE SSANGTIKEUT-E-THIEUTH -0x8BD7 0xB5D6 # HANGUL SYLLABLE SSANGTIKEUT-E-PHIEUPH -0x8BD8 0xB5D7 # HANGUL SYLLABLE SSANGTIKEUT-E-HIEUH -0x8BD9 0xB5D9 # HANGUL SYLLABLE SSANGTIKEUT-YEO-KIYEOK -0x8BDA 0xB5DA # HANGUL SYLLABLE SSANGTIKEUT-YEO-SSANGKIYEOK -0x8BDB 0xB5DB # HANGUL SYLLABLE SSANGTIKEUT-YEO-KIYEOKSIOS -0x8BDC 0xB5DC # HANGUL SYLLABLE SSANGTIKEUT-YEO-NIEUN -0x8BDD 0xB5DD # HANGUL SYLLABLE SSANGTIKEUT-YEO-NIEUNCIEUC -0x8BDE 0xB5DE # HANGUL SYLLABLE SSANGTIKEUT-YEO-NIEUNHIEUH -0x8BDF 0xB5DF # HANGUL SYLLABLE SSANGTIKEUT-YEO-TIKEUT -0x8BE0 0xB5E0 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEUL -0x8BE1 0xB5E1 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULKIYEOK -0x8BE2 0xB5E2 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULMIEUM -0x8BE3 0xB5E3 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULPIEUP -0x8BE4 0xB5E4 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULSIOS -0x8BE5 0xB5E5 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULTHIEUTH -0x8BE6 0xB5E6 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULPHIEUPH -0x8BE7 0xB5E7 # HANGUL SYLLABLE SSANGTIKEUT-YEO-RIEULHIEUH -0x8BE8 0xB5E8 # HANGUL SYLLABLE SSANGTIKEUT-YEO-MIEUM -0x8BE9 0xB5E9 # HANGUL SYLLABLE SSANGTIKEUT-YEO-PIEUP -0x8BEA 0xB5EA # HANGUL SYLLABLE SSANGTIKEUT-YEO-PIEUPSIOS -0x8BEB 0xB5EB # HANGUL SYLLABLE SSANGTIKEUT-YEO-SIOS -0x8BEC 0xB5ED # HANGUL SYLLABLE SSANGTIKEUT-YEO-IEUNG -0x8BED 0xB5EE # HANGUL SYLLABLE SSANGTIKEUT-YEO-CIEUC -0x8BEE 0xB5EF # HANGUL SYLLABLE SSANGTIKEUT-YEO-CHIEUCH -0x8BEF 0xB5F0 # HANGUL SYLLABLE SSANGTIKEUT-YEO-KHIEUKH -0x8BF0 0xB5F1 # HANGUL SYLLABLE SSANGTIKEUT-YEO-THIEUTH -0x8BF1 0xB5F2 # HANGUL SYLLABLE SSANGTIKEUT-YEO-PHIEUPH -0x8BF2 0xB5F3 # HANGUL SYLLABLE SSANGTIKEUT-YEO-HIEUH -0x8BF3 0xB5F4 # HANGUL SYLLABLE SSANGTIKEUT-YE -0x8BF4 0xB5F5 # HANGUL SYLLABLE SSANGTIKEUT-YE-KIYEOK -0x8BF5 0xB5F6 # HANGUL SYLLABLE SSANGTIKEUT-YE-SSANGKIYEOK -0x8BF6 0xB5F7 # HANGUL SYLLABLE SSANGTIKEUT-YE-KIYEOKSIOS -0x8BF7 0xB5F8 # HANGUL SYLLABLE SSANGTIKEUT-YE-NIEUN -0x8BF8 0xB5F9 # HANGUL SYLLABLE SSANGTIKEUT-YE-NIEUNCIEUC -0x8BF9 0xB5FA # HANGUL SYLLABLE SSANGTIKEUT-YE-NIEUNHIEUH -0x8BFA 0xB5FB # HANGUL SYLLABLE SSANGTIKEUT-YE-TIKEUT -0x8BFB 0xB5FC # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEUL -0x8BFC 0xB5FD # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULKIYEOK -0x8BFD 0xB5FE # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULMIEUM -0x8BFE 0xB5FF # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULPIEUP -0x8C41 0xB600 # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULSIOS -0x8C42 0xB601 # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULTHIEUTH -0x8C43 0xB602 # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULPHIEUPH -0x8C44 0xB603 # HANGUL SYLLABLE SSANGTIKEUT-YE-RIEULHIEUH -0x8C45 0xB604 # HANGUL SYLLABLE SSANGTIKEUT-YE-MIEUM -0x8C46 0xB605 # HANGUL SYLLABLE SSANGTIKEUT-YE-PIEUP -0x8C47 0xB606 # HANGUL SYLLABLE SSANGTIKEUT-YE-PIEUPSIOS -0x8C48 0xB607 # HANGUL SYLLABLE SSANGTIKEUT-YE-SIOS -0x8C49 0xB608 # HANGUL SYLLABLE SSANGTIKEUT-YE-SSANGSIOS -0x8C4A 0xB609 # HANGUL SYLLABLE SSANGTIKEUT-YE-IEUNG -0x8C4B 0xB60A # HANGUL SYLLABLE SSANGTIKEUT-YE-CIEUC -0x8C4C 0xB60B # HANGUL SYLLABLE SSANGTIKEUT-YE-CHIEUCH -0x8C4D 0xB60C # HANGUL SYLLABLE SSANGTIKEUT-YE-KHIEUKH -0x8C4E 0xB60D # HANGUL SYLLABLE SSANGTIKEUT-YE-THIEUTH -0x8C4F 0xB60E # HANGUL SYLLABLE SSANGTIKEUT-YE-PHIEUPH -0x8C50 0xB60F # HANGUL SYLLABLE SSANGTIKEUT-YE-HIEUH -0x8C51 0xB612 # HANGUL SYLLABLE SSANGTIKEUT-O-SSANGKIYEOK -0x8C52 0xB613 # HANGUL SYLLABLE SSANGTIKEUT-O-KIYEOKSIOS -0x8C53 0xB615 # HANGUL SYLLABLE SSANGTIKEUT-O-NIEUNCIEUC -0x8C54 0xB616 # HANGUL SYLLABLE SSANGTIKEUT-O-NIEUNHIEUH -0x8C55 0xB617 # HANGUL SYLLABLE SSANGTIKEUT-O-TIKEUT -0x8C56 0xB619 # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULKIYEOK -0x8C57 0xB61A # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULMIEUM -0x8C58 0xB61B # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULPIEUP -0x8C59 0xB61C # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULSIOS -0x8C5A 0xB61D # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULTHIEUTH -0x8C61 0xB61E # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULPHIEUPH -0x8C62 0xB61F # HANGUL SYLLABLE SSANGTIKEUT-O-RIEULHIEUH -0x8C63 0xB620 # HANGUL SYLLABLE SSANGTIKEUT-O-MIEUM -0x8C64 0xB621 # HANGUL SYLLABLE SSANGTIKEUT-O-PIEUP -0x8C65 0xB622 # HANGUL SYLLABLE SSANGTIKEUT-O-PIEUPSIOS -0x8C66 0xB623 # HANGUL SYLLABLE SSANGTIKEUT-O-SIOS -0x8C67 0xB624 # HANGUL SYLLABLE SSANGTIKEUT-O-SSANGSIOS -0x8C68 0xB626 # HANGUL SYLLABLE SSANGTIKEUT-O-CIEUC -0x8C69 0xB627 # HANGUL SYLLABLE SSANGTIKEUT-O-CHIEUCH -0x8C6A 0xB628 # HANGUL SYLLABLE SSANGTIKEUT-O-KHIEUKH -0x8C6B 0xB629 # HANGUL SYLLABLE SSANGTIKEUT-O-THIEUTH -0x8C6C 0xB62A # HANGUL SYLLABLE SSANGTIKEUT-O-PHIEUPH -0x8C6D 0xB62B # HANGUL SYLLABLE SSANGTIKEUT-O-HIEUH -0x8C6E 0xB62D # HANGUL SYLLABLE SSANGTIKEUT-WA-KIYEOK -0x8C6F 0xB62E # HANGUL SYLLABLE SSANGTIKEUT-WA-SSANGKIYEOK -0x8C70 0xB62F # HANGUL SYLLABLE SSANGTIKEUT-WA-KIYEOKSIOS -0x8C71 0xB630 # HANGUL SYLLABLE SSANGTIKEUT-WA-NIEUN -0x8C72 0xB631 # HANGUL SYLLABLE SSANGTIKEUT-WA-NIEUNCIEUC -0x8C73 0xB632 # HANGUL SYLLABLE SSANGTIKEUT-WA-NIEUNHIEUH -0x8C74 0xB633 # HANGUL SYLLABLE SSANGTIKEUT-WA-TIKEUT -0x8C75 0xB635 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULKIYEOK -0x8C76 0xB636 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULMIEUM -0x8C77 0xB637 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULPIEUP -0x8C78 0xB638 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULSIOS -0x8C79 0xB639 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULTHIEUTH -0x8C7A 0xB63A # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULPHIEUPH -0x8C81 0xB63B # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEULHIEUH -0x8C82 0xB63C # HANGUL SYLLABLE SSANGTIKEUT-WA-MIEUM -0x8C83 0xB63D # HANGUL SYLLABLE SSANGTIKEUT-WA-PIEUP -0x8C84 0xB63E # HANGUL SYLLABLE SSANGTIKEUT-WA-PIEUPSIOS -0x8C85 0xB63F # HANGUL SYLLABLE SSANGTIKEUT-WA-SIOS -0x8C86 0xB640 # HANGUL SYLLABLE SSANGTIKEUT-WA-SSANGSIOS -0x8C87 0xB641 # HANGUL SYLLABLE SSANGTIKEUT-WA-IEUNG -0x8C88 0xB642 # HANGUL SYLLABLE SSANGTIKEUT-WA-CIEUC -0x8C89 0xB643 # HANGUL SYLLABLE SSANGTIKEUT-WA-CHIEUCH -0x8C8A 0xB644 # HANGUL SYLLABLE SSANGTIKEUT-WA-KHIEUKH -0x8C8B 0xB645 # HANGUL SYLLABLE SSANGTIKEUT-WA-THIEUTH -0x8C8C 0xB646 # HANGUL SYLLABLE SSANGTIKEUT-WA-PHIEUPH -0x8C8D 0xB647 # HANGUL SYLLABLE SSANGTIKEUT-WA-HIEUH -0x8C8E 0xB649 # HANGUL SYLLABLE SSANGTIKEUT-WAE-KIYEOK -0x8C8F 0xB64A # HANGUL SYLLABLE SSANGTIKEUT-WAE-SSANGKIYEOK -0x8C90 0xB64B # HANGUL SYLLABLE SSANGTIKEUT-WAE-KIYEOKSIOS -0x8C91 0xB64C # HANGUL SYLLABLE SSANGTIKEUT-WAE-NIEUN -0x8C92 0xB64D # HANGUL SYLLABLE SSANGTIKEUT-WAE-NIEUNCIEUC -0x8C93 0xB64E # HANGUL SYLLABLE SSANGTIKEUT-WAE-NIEUNHIEUH -0x8C94 0xB64F # HANGUL SYLLABLE SSANGTIKEUT-WAE-TIKEUT -0x8C95 0xB650 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEUL -0x8C96 0xB651 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULKIYEOK -0x8C97 0xB652 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULMIEUM -0x8C98 0xB653 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULPIEUP -0x8C99 0xB654 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULSIOS -0x8C9A 0xB655 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULTHIEUTH -0x8C9B 0xB656 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULPHIEUPH -0x8C9C 0xB657 # HANGUL SYLLABLE SSANGTIKEUT-WAE-RIEULHIEUH -0x8C9D 0xB658 # HANGUL SYLLABLE SSANGTIKEUT-WAE-MIEUM -0x8C9E 0xB659 # HANGUL SYLLABLE SSANGTIKEUT-WAE-PIEUP -0x8C9F 0xB65A # HANGUL SYLLABLE SSANGTIKEUT-WAE-PIEUPSIOS -0x8CA0 0xB65B # HANGUL SYLLABLE SSANGTIKEUT-WAE-SIOS -0x8CA1 0xB65C # HANGUL SYLLABLE SSANGTIKEUT-WAE-SSANGSIOS -0x8CA2 0xB65D # HANGUL SYLLABLE SSANGTIKEUT-WAE-IEUNG -0x8CA3 0xB65E # HANGUL SYLLABLE SSANGTIKEUT-WAE-CIEUC -0x8CA4 0xB65F # HANGUL SYLLABLE SSANGTIKEUT-WAE-CHIEUCH -0x8CA5 0xB660 # HANGUL SYLLABLE SSANGTIKEUT-WAE-KHIEUKH -0x8CA6 0xB661 # HANGUL SYLLABLE SSANGTIKEUT-WAE-THIEUTH -0x8CA7 0xB662 # HANGUL SYLLABLE SSANGTIKEUT-WAE-PHIEUPH -0x8CA8 0xB663 # HANGUL SYLLABLE SSANGTIKEUT-WAE-HIEUH -0x8CA9 0xB665 # HANGUL SYLLABLE SSANGTIKEUT-OE-KIYEOK -0x8CAA 0xB666 # HANGUL SYLLABLE SSANGTIKEUT-OE-SSANGKIYEOK -0x8CAB 0xB667 # HANGUL SYLLABLE SSANGTIKEUT-OE-KIYEOKSIOS -0x8CAC 0xB669 # HANGUL SYLLABLE SSANGTIKEUT-OE-NIEUNCIEUC -0x8CAD 0xB66A # HANGUL SYLLABLE SSANGTIKEUT-OE-NIEUNHIEUH -0x8CAE 0xB66B # HANGUL SYLLABLE SSANGTIKEUT-OE-TIKEUT -0x8CAF 0xB66C # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEUL -0x8CB0 0xB66D # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULKIYEOK -0x8CB1 0xB66E # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULMIEUM -0x8CB2 0xB66F # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULPIEUP -0x8CB3 0xB670 # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULSIOS -0x8CB4 0xB671 # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULTHIEUTH -0x8CB5 0xB672 # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULPHIEUPH -0x8CB6 0xB673 # HANGUL SYLLABLE SSANGTIKEUT-OE-RIEULHIEUH -0x8CB7 0xB674 # HANGUL SYLLABLE SSANGTIKEUT-OE-MIEUM -0x8CB8 0xB675 # HANGUL SYLLABLE SSANGTIKEUT-OE-PIEUP -0x8CB9 0xB676 # HANGUL SYLLABLE SSANGTIKEUT-OE-PIEUPSIOS -0x8CBA 0xB677 # HANGUL SYLLABLE SSANGTIKEUT-OE-SIOS -0x8CBB 0xB678 # HANGUL SYLLABLE SSANGTIKEUT-OE-SSANGSIOS -0x8CBC 0xB679 # HANGUL SYLLABLE SSANGTIKEUT-OE-IEUNG -0x8CBD 0xB67A # HANGUL SYLLABLE SSANGTIKEUT-OE-CIEUC -0x8CBE 0xB67B # HANGUL SYLLABLE SSANGTIKEUT-OE-CHIEUCH -0x8CBF 0xB67C # HANGUL SYLLABLE SSANGTIKEUT-OE-KHIEUKH -0x8CC0 0xB67D # HANGUL SYLLABLE SSANGTIKEUT-OE-THIEUTH -0x8CC1 0xB67E # HANGUL SYLLABLE SSANGTIKEUT-OE-PHIEUPH -0x8CC2 0xB67F # HANGUL SYLLABLE SSANGTIKEUT-OE-HIEUH -0x8CC3 0xB680 # HANGUL SYLLABLE SSANGTIKEUT-YO -0x8CC4 0xB681 # HANGUL SYLLABLE SSANGTIKEUT-YO-KIYEOK -0x8CC5 0xB682 # HANGUL SYLLABLE SSANGTIKEUT-YO-SSANGKIYEOK -0x8CC6 0xB683 # HANGUL SYLLABLE SSANGTIKEUT-YO-KIYEOKSIOS -0x8CC7 0xB684 # HANGUL SYLLABLE SSANGTIKEUT-YO-NIEUN -0x8CC8 0xB685 # HANGUL SYLLABLE SSANGTIKEUT-YO-NIEUNCIEUC -0x8CC9 0xB686 # HANGUL SYLLABLE SSANGTIKEUT-YO-NIEUNHIEUH -0x8CCA 0xB687 # HANGUL SYLLABLE SSANGTIKEUT-YO-TIKEUT -0x8CCB 0xB688 # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEUL -0x8CCC 0xB689 # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULKIYEOK -0x8CCD 0xB68A # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULMIEUM -0x8CCE 0xB68B # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULPIEUP -0x8CCF 0xB68C # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULSIOS -0x8CD0 0xB68D # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULTHIEUTH -0x8CD1 0xB68E # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULPHIEUPH -0x8CD2 0xB68F # HANGUL SYLLABLE SSANGTIKEUT-YO-RIEULHIEUH -0x8CD3 0xB690 # HANGUL SYLLABLE SSANGTIKEUT-YO-MIEUM -0x8CD4 0xB691 # HANGUL SYLLABLE SSANGTIKEUT-YO-PIEUP -0x8CD5 0xB692 # HANGUL SYLLABLE SSANGTIKEUT-YO-PIEUPSIOS -0x8CD6 0xB693 # HANGUL SYLLABLE SSANGTIKEUT-YO-SIOS -0x8CD7 0xB694 # HANGUL SYLLABLE SSANGTIKEUT-YO-SSANGSIOS -0x8CD8 0xB695 # HANGUL SYLLABLE SSANGTIKEUT-YO-IEUNG -0x8CD9 0xB696 # HANGUL SYLLABLE SSANGTIKEUT-YO-CIEUC -0x8CDA 0xB697 # HANGUL SYLLABLE SSANGTIKEUT-YO-CHIEUCH -0x8CDB 0xB698 # HANGUL SYLLABLE SSANGTIKEUT-YO-KHIEUKH -0x8CDC 0xB699 # HANGUL SYLLABLE SSANGTIKEUT-YO-THIEUTH -0x8CDD 0xB69A # HANGUL SYLLABLE SSANGTIKEUT-YO-PHIEUPH -0x8CDE 0xB69B # HANGUL SYLLABLE SSANGTIKEUT-YO-HIEUH -0x8CDF 0xB69E # HANGUL SYLLABLE SSANGTIKEUT-U-SSANGKIYEOK -0x8CE0 0xB69F # HANGUL SYLLABLE SSANGTIKEUT-U-KIYEOKSIOS -0x8CE1 0xB6A1 # HANGUL SYLLABLE SSANGTIKEUT-U-NIEUNCIEUC -0x8CE2 0xB6A2 # HANGUL SYLLABLE SSANGTIKEUT-U-NIEUNHIEUH -0x8CE3 0xB6A3 # HANGUL SYLLABLE SSANGTIKEUT-U-TIKEUT -0x8CE4 0xB6A5 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULKIYEOK -0x8CE5 0xB6A6 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULMIEUM -0x8CE6 0xB6A7 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULPIEUP -0x8CE7 0xB6A8 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULSIOS -0x8CE8 0xB6A9 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULTHIEUTH -0x8CE9 0xB6AA # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULPHIEUPH -0x8CEA 0xB6AD # HANGUL SYLLABLE SSANGTIKEUT-U-PIEUP -0x8CEB 0xB6AE # HANGUL SYLLABLE SSANGTIKEUT-U-PIEUPSIOS -0x8CEC 0xB6AF # HANGUL SYLLABLE SSANGTIKEUT-U-SIOS -0x8CED 0xB6B0 # HANGUL SYLLABLE SSANGTIKEUT-U-SSANGSIOS -0x8CEE 0xB6B2 # HANGUL SYLLABLE SSANGTIKEUT-U-CIEUC -0x8CEF 0xB6B3 # HANGUL SYLLABLE SSANGTIKEUT-U-CHIEUCH -0x8CF0 0xB6B4 # HANGUL SYLLABLE SSANGTIKEUT-U-KHIEUKH -0x8CF1 0xB6B5 # HANGUL SYLLABLE SSANGTIKEUT-U-THIEUTH -0x8CF2 0xB6B6 # HANGUL SYLLABLE SSANGTIKEUT-U-PHIEUPH -0x8CF3 0xB6B7 # HANGUL SYLLABLE SSANGTIKEUT-U-HIEUH -0x8CF4 0xB6B8 # HANGUL SYLLABLE SSANGTIKEUT-WEO -0x8CF5 0xB6B9 # HANGUL SYLLABLE SSANGTIKEUT-WEO-KIYEOK -0x8CF6 0xB6BA # HANGUL SYLLABLE SSANGTIKEUT-WEO-SSANGKIYEOK -0x8CF7 0xB6BB # HANGUL SYLLABLE SSANGTIKEUT-WEO-KIYEOKSIOS -0x8CF8 0xB6BC # HANGUL SYLLABLE SSANGTIKEUT-WEO-NIEUN -0x8CF9 0xB6BD # HANGUL SYLLABLE SSANGTIKEUT-WEO-NIEUNCIEUC -0x8CFA 0xB6BE # HANGUL SYLLABLE SSANGTIKEUT-WEO-NIEUNHIEUH -0x8CFB 0xB6BF # HANGUL SYLLABLE SSANGTIKEUT-WEO-TIKEUT -0x8CFC 0xB6C0 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEUL -0x8CFD 0xB6C1 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULKIYEOK -0x8CFE 0xB6C2 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULMIEUM -0x8D41 0xB6C3 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULPIEUP -0x8D42 0xB6C4 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULSIOS -0x8D43 0xB6C5 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULTHIEUTH -0x8D44 0xB6C6 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULPHIEUPH -0x8D45 0xB6C7 # HANGUL SYLLABLE SSANGTIKEUT-WEO-RIEULHIEUH -0x8D46 0xB6C8 # HANGUL SYLLABLE SSANGTIKEUT-WEO-MIEUM -0x8D47 0xB6C9 # HANGUL SYLLABLE SSANGTIKEUT-WEO-PIEUP -0x8D48 0xB6CA # HANGUL SYLLABLE SSANGTIKEUT-WEO-PIEUPSIOS -0x8D49 0xB6CB # HANGUL SYLLABLE SSANGTIKEUT-WEO-SIOS -0x8D4A 0xB6CC # HANGUL SYLLABLE SSANGTIKEUT-WEO-SSANGSIOS -0x8D4B 0xB6CD # HANGUL SYLLABLE SSANGTIKEUT-WEO-IEUNG -0x8D4C 0xB6CE # HANGUL SYLLABLE SSANGTIKEUT-WEO-CIEUC -0x8D4D 0xB6CF # HANGUL SYLLABLE SSANGTIKEUT-WEO-CHIEUCH -0x8D4E 0xB6D0 # HANGUL SYLLABLE SSANGTIKEUT-WEO-KHIEUKH -0x8D4F 0xB6D1 # HANGUL SYLLABLE SSANGTIKEUT-WEO-THIEUTH -0x8D50 0xB6D2 # HANGUL SYLLABLE SSANGTIKEUT-WEO-PHIEUPH -0x8D51 0xB6D3 # HANGUL SYLLABLE SSANGTIKEUT-WEO-HIEUH -0x8D52 0xB6D5 # HANGUL SYLLABLE SSANGTIKEUT-WE-KIYEOK -0x8D53 0xB6D6 # HANGUL SYLLABLE SSANGTIKEUT-WE-SSANGKIYEOK -0x8D54 0xB6D7 # HANGUL SYLLABLE SSANGTIKEUT-WE-KIYEOKSIOS -0x8D55 0xB6D8 # HANGUL SYLLABLE SSANGTIKEUT-WE-NIEUN -0x8D56 0xB6D9 # HANGUL SYLLABLE SSANGTIKEUT-WE-NIEUNCIEUC -0x8D57 0xB6DA # HANGUL SYLLABLE SSANGTIKEUT-WE-NIEUNHIEUH -0x8D58 0xB6DB # HANGUL SYLLABLE SSANGTIKEUT-WE-TIKEUT -0x8D59 0xB6DC # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEUL -0x8D5A 0xB6DD # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULKIYEOK -0x8D61 0xB6DE # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULMIEUM -0x8D62 0xB6DF # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULPIEUP -0x8D63 0xB6E0 # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULSIOS -0x8D64 0xB6E1 # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULTHIEUTH -0x8D65 0xB6E2 # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULPHIEUPH -0x8D66 0xB6E3 # HANGUL SYLLABLE SSANGTIKEUT-WE-RIEULHIEUH -0x8D67 0xB6E4 # HANGUL SYLLABLE SSANGTIKEUT-WE-MIEUM -0x8D68 0xB6E5 # HANGUL SYLLABLE SSANGTIKEUT-WE-PIEUP -0x8D69 0xB6E6 # HANGUL SYLLABLE SSANGTIKEUT-WE-PIEUPSIOS -0x8D6A 0xB6E7 # HANGUL SYLLABLE SSANGTIKEUT-WE-SIOS -0x8D6B 0xB6E8 # HANGUL SYLLABLE SSANGTIKEUT-WE-SSANGSIOS -0x8D6C 0xB6E9 # HANGUL SYLLABLE SSANGTIKEUT-WE-IEUNG -0x8D6D 0xB6EA # HANGUL SYLLABLE SSANGTIKEUT-WE-CIEUC -0x8D6E 0xB6EB # HANGUL SYLLABLE SSANGTIKEUT-WE-CHIEUCH -0x8D6F 0xB6EC # HANGUL SYLLABLE SSANGTIKEUT-WE-KHIEUKH -0x8D70 0xB6ED # HANGUL SYLLABLE SSANGTIKEUT-WE-THIEUTH -0x8D71 0xB6EE # HANGUL SYLLABLE SSANGTIKEUT-WE-PHIEUPH -0x8D72 0xB6EF # HANGUL SYLLABLE SSANGTIKEUT-WE-HIEUH -0x8D73 0xB6F1 # HANGUL SYLLABLE SSANGTIKEUT-WI-KIYEOK -0x8D74 0xB6F2 # HANGUL SYLLABLE SSANGTIKEUT-WI-SSANGKIYEOK -0x8D75 0xB6F3 # HANGUL SYLLABLE SSANGTIKEUT-WI-KIYEOKSIOS -0x8D76 0xB6F5 # HANGUL SYLLABLE SSANGTIKEUT-WI-NIEUNCIEUC -0x8D77 0xB6F6 # HANGUL SYLLABLE SSANGTIKEUT-WI-NIEUNHIEUH -0x8D78 0xB6F7 # HANGUL SYLLABLE SSANGTIKEUT-WI-TIKEUT -0x8D79 0xB6F9 # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULKIYEOK -0x8D7A 0xB6FA # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULMIEUM -0x8D81 0xB6FB # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULPIEUP -0x8D82 0xB6FC # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULSIOS -0x8D83 0xB6FD # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULTHIEUTH -0x8D84 0xB6FE # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULPHIEUPH -0x8D85 0xB6FF # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEULHIEUH -0x8D86 0xB702 # HANGUL SYLLABLE SSANGTIKEUT-WI-PIEUPSIOS -0x8D87 0xB703 # HANGUL SYLLABLE SSANGTIKEUT-WI-SIOS -0x8D88 0xB704 # HANGUL SYLLABLE SSANGTIKEUT-WI-SSANGSIOS -0x8D89 0xB706 # HANGUL SYLLABLE SSANGTIKEUT-WI-CIEUC -0x8D8A 0xB707 # HANGUL SYLLABLE SSANGTIKEUT-WI-CHIEUCH -0x8D8B 0xB708 # HANGUL SYLLABLE SSANGTIKEUT-WI-KHIEUKH -0x8D8C 0xB709 # HANGUL SYLLABLE SSANGTIKEUT-WI-THIEUTH -0x8D8D 0xB70A # HANGUL SYLLABLE SSANGTIKEUT-WI-PHIEUPH -0x8D8E 0xB70B # HANGUL SYLLABLE SSANGTIKEUT-WI-HIEUH -0x8D8F 0xB70C # HANGUL SYLLABLE SSANGTIKEUT-YU -0x8D90 0xB70D # HANGUL SYLLABLE SSANGTIKEUT-YU-KIYEOK -0x8D91 0xB70E # HANGUL SYLLABLE SSANGTIKEUT-YU-SSANGKIYEOK -0x8D92 0xB70F # HANGUL SYLLABLE SSANGTIKEUT-YU-KIYEOKSIOS -0x8D93 0xB710 # HANGUL SYLLABLE SSANGTIKEUT-YU-NIEUN -0x8D94 0xB711 # HANGUL SYLLABLE SSANGTIKEUT-YU-NIEUNCIEUC -0x8D95 0xB712 # HANGUL SYLLABLE SSANGTIKEUT-YU-NIEUNHIEUH -0x8D96 0xB713 # HANGUL SYLLABLE SSANGTIKEUT-YU-TIKEUT -0x8D97 0xB714 # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEUL -0x8D98 0xB715 # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULKIYEOK -0x8D99 0xB716 # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULMIEUM -0x8D9A 0xB717 # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULPIEUP -0x8D9B 0xB718 # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULSIOS -0x8D9C 0xB719 # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULTHIEUTH -0x8D9D 0xB71A # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULPHIEUPH -0x8D9E 0xB71B # HANGUL SYLLABLE SSANGTIKEUT-YU-RIEULHIEUH -0x8D9F 0xB71C # HANGUL SYLLABLE SSANGTIKEUT-YU-MIEUM -0x8DA0 0xB71D # HANGUL SYLLABLE SSANGTIKEUT-YU-PIEUP -0x8DA1 0xB71E # HANGUL SYLLABLE SSANGTIKEUT-YU-PIEUPSIOS -0x8DA2 0xB71F # HANGUL SYLLABLE SSANGTIKEUT-YU-SIOS -0x8DA3 0xB720 # HANGUL SYLLABLE SSANGTIKEUT-YU-SSANGSIOS -0x8DA4 0xB721 # HANGUL SYLLABLE SSANGTIKEUT-YU-IEUNG -0x8DA5 0xB722 # HANGUL SYLLABLE SSANGTIKEUT-YU-CIEUC -0x8DA6 0xB723 # HANGUL SYLLABLE SSANGTIKEUT-YU-CHIEUCH -0x8DA7 0xB724 # HANGUL SYLLABLE SSANGTIKEUT-YU-KHIEUKH -0x8DA8 0xB725 # HANGUL SYLLABLE SSANGTIKEUT-YU-THIEUTH -0x8DA9 0xB726 # HANGUL SYLLABLE SSANGTIKEUT-YU-PHIEUPH -0x8DAA 0xB727 # HANGUL SYLLABLE SSANGTIKEUT-YU-HIEUH -0x8DAB 0xB72A # HANGUL SYLLABLE SSANGTIKEUT-EU-SSANGKIYEOK -0x8DAC 0xB72B # HANGUL SYLLABLE SSANGTIKEUT-EU-KIYEOKSIOS -0x8DAD 0xB72D # HANGUL SYLLABLE SSANGTIKEUT-EU-NIEUNCIEUC -0x8DAE 0xB72E # HANGUL SYLLABLE SSANGTIKEUT-EU-NIEUNHIEUH -0x8DAF 0xB731 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULKIYEOK -0x8DB0 0xB732 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULMIEUM -0x8DB1 0xB733 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULPIEUP -0x8DB2 0xB734 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULSIOS -0x8DB3 0xB735 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULTHIEUTH -0x8DB4 0xB736 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULPHIEUPH -0x8DB5 0xB737 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEULHIEUH -0x8DB6 0xB73A # HANGUL SYLLABLE SSANGTIKEUT-EU-PIEUPSIOS -0x8DB7 0xB73C # HANGUL SYLLABLE SSANGTIKEUT-EU-SSANGSIOS -0x8DB8 0xB73D # HANGUL SYLLABLE SSANGTIKEUT-EU-IEUNG -0x8DB9 0xB73E # HANGUL SYLLABLE SSANGTIKEUT-EU-CIEUC -0x8DBA 0xB73F # HANGUL SYLLABLE SSANGTIKEUT-EU-CHIEUCH -0x8DBB 0xB740 # HANGUL SYLLABLE SSANGTIKEUT-EU-KHIEUKH -0x8DBC 0xB741 # HANGUL SYLLABLE SSANGTIKEUT-EU-THIEUTH -0x8DBD 0xB742 # HANGUL SYLLABLE SSANGTIKEUT-EU-PHIEUPH -0x8DBE 0xB743 # HANGUL SYLLABLE SSANGTIKEUT-EU-HIEUH -0x8DBF 0xB745 # HANGUL SYLLABLE SSANGTIKEUT-YI-KIYEOK -0x8DC0 0xB746 # HANGUL SYLLABLE SSANGTIKEUT-YI-SSANGKIYEOK -0x8DC1 0xB747 # HANGUL SYLLABLE SSANGTIKEUT-YI-KIYEOKSIOS -0x8DC2 0xB749 # HANGUL SYLLABLE SSANGTIKEUT-YI-NIEUNCIEUC -0x8DC3 0xB74A # HANGUL SYLLABLE SSANGTIKEUT-YI-NIEUNHIEUH -0x8DC4 0xB74B # HANGUL SYLLABLE SSANGTIKEUT-YI-TIKEUT -0x8DC5 0xB74D # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULKIYEOK -0x8DC6 0xB74E # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULMIEUM -0x8DC7 0xB74F # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULPIEUP -0x8DC8 0xB750 # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULSIOS -0x8DC9 0xB751 # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULTHIEUTH -0x8DCA 0xB752 # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULPHIEUPH -0x8DCB 0xB753 # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEULHIEUH -0x8DCC 0xB756 # HANGUL SYLLABLE SSANGTIKEUT-YI-PIEUPSIOS -0x8DCD 0xB757 # HANGUL SYLLABLE SSANGTIKEUT-YI-SIOS -0x8DCE 0xB758 # HANGUL SYLLABLE SSANGTIKEUT-YI-SSANGSIOS -0x8DCF 0xB759 # HANGUL SYLLABLE SSANGTIKEUT-YI-IEUNG -0x8DD0 0xB75A # HANGUL SYLLABLE SSANGTIKEUT-YI-CIEUC -0x8DD1 0xB75B # HANGUL SYLLABLE SSANGTIKEUT-YI-CHIEUCH -0x8DD2 0xB75C # HANGUL SYLLABLE SSANGTIKEUT-YI-KHIEUKH -0x8DD3 0xB75D # HANGUL SYLLABLE SSANGTIKEUT-YI-THIEUTH -0x8DD4 0xB75E # HANGUL SYLLABLE SSANGTIKEUT-YI-PHIEUPH -0x8DD5 0xB75F # HANGUL SYLLABLE SSANGTIKEUT-YI-HIEUH -0x8DD6 0xB761 # HANGUL SYLLABLE SSANGTIKEUT-I-KIYEOK -0x8DD7 0xB762 # HANGUL SYLLABLE SSANGTIKEUT-I-SSANGKIYEOK -0x8DD8 0xB763 # HANGUL SYLLABLE SSANGTIKEUT-I-KIYEOKSIOS -0x8DD9 0xB765 # HANGUL SYLLABLE SSANGTIKEUT-I-NIEUNCIEUC -0x8DDA 0xB766 # HANGUL SYLLABLE SSANGTIKEUT-I-NIEUNHIEUH -0x8DDB 0xB767 # HANGUL SYLLABLE SSANGTIKEUT-I-TIKEUT -0x8DDC 0xB769 # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULKIYEOK -0x8DDD 0xB76A # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULMIEUM -0x8DDE 0xB76B # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULPIEUP -0x8DDF 0xB76C # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULSIOS -0x8DE0 0xB76D # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULTHIEUTH -0x8DE1 0xB76E # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULPHIEUPH -0x8DE2 0xB76F # HANGUL SYLLABLE SSANGTIKEUT-I-RIEULHIEUH -0x8DE3 0xB772 # HANGUL SYLLABLE SSANGTIKEUT-I-PIEUPSIOS -0x8DE4 0xB774 # HANGUL SYLLABLE SSANGTIKEUT-I-SSANGSIOS -0x8DE5 0xB776 # HANGUL SYLLABLE SSANGTIKEUT-I-CIEUC -0x8DE6 0xB777 # HANGUL SYLLABLE SSANGTIKEUT-I-CHIEUCH -0x8DE7 0xB778 # HANGUL SYLLABLE SSANGTIKEUT-I-KHIEUKH -0x8DE8 0xB779 # HANGUL SYLLABLE SSANGTIKEUT-I-THIEUTH -0x8DE9 0xB77A # HANGUL SYLLABLE SSANGTIKEUT-I-PHIEUPH -0x8DEA 0xB77B # HANGUL SYLLABLE SSANGTIKEUT-I-HIEUH -0x8DEB 0xB77E # HANGUL SYLLABLE RIEUL-A-SSANGKIYEOK -0x8DEC 0xB77F # HANGUL SYLLABLE RIEUL-A-KIYEOKSIOS -0x8DED 0xB781 # HANGUL SYLLABLE RIEUL-A-NIEUNCIEUC -0x8DEE 0xB782 # HANGUL SYLLABLE RIEUL-A-NIEUNHIEUH -0x8DEF 0xB783 # HANGUL SYLLABLE RIEUL-A-TIKEUT -0x8DF0 0xB785 # HANGUL SYLLABLE RIEUL-A-RIEULKIYEOK -0x8DF1 0xB786 # HANGUL SYLLABLE RIEUL-A-RIEULMIEUM -0x8DF2 0xB787 # HANGUL SYLLABLE RIEUL-A-RIEULPIEUP -0x8DF3 0xB788 # HANGUL SYLLABLE RIEUL-A-RIEULSIOS -0x8DF4 0xB789 # HANGUL SYLLABLE RIEUL-A-RIEULTHIEUTH -0x8DF5 0xB78A # HANGUL SYLLABLE RIEUL-A-RIEULPHIEUPH -0x8DF6 0xB78B # HANGUL SYLLABLE RIEUL-A-RIEULHIEUH -0x8DF7 0xB78E # HANGUL SYLLABLE RIEUL-A-PIEUPSIOS -0x8DF8 0xB793 # HANGUL SYLLABLE RIEUL-A-CHIEUCH -0x8DF9 0xB794 # HANGUL SYLLABLE RIEUL-A-KHIEUKH -0x8DFA 0xB795 # HANGUL SYLLABLE RIEUL-A-THIEUTH -0x8DFB 0xB79A # HANGUL SYLLABLE RIEUL-AE-SSANGKIYEOK -0x8DFC 0xB79B # HANGUL SYLLABLE RIEUL-AE-KIYEOKSIOS -0x8DFD 0xB79D # HANGUL SYLLABLE RIEUL-AE-NIEUNCIEUC -0x8DFE 0xB79E # HANGUL SYLLABLE RIEUL-AE-NIEUNHIEUH -0x8E41 0xB79F # HANGUL SYLLABLE RIEUL-AE-TIKEUT -0x8E42 0xB7A1 # HANGUL SYLLABLE RIEUL-AE-RIEULKIYEOK -0x8E43 0xB7A2 # HANGUL SYLLABLE RIEUL-AE-RIEULMIEUM -0x8E44 0xB7A3 # HANGUL SYLLABLE RIEUL-AE-RIEULPIEUP -0x8E45 0xB7A4 # HANGUL SYLLABLE RIEUL-AE-RIEULSIOS -0x8E46 0xB7A5 # HANGUL SYLLABLE RIEUL-AE-RIEULTHIEUTH -0x8E47 0xB7A6 # HANGUL SYLLABLE RIEUL-AE-RIEULPHIEUPH -0x8E48 0xB7A7 # HANGUL SYLLABLE RIEUL-AE-RIEULHIEUH -0x8E49 0xB7AA # HANGUL SYLLABLE RIEUL-AE-PIEUPSIOS -0x8E4A 0xB7AE # HANGUL SYLLABLE RIEUL-AE-CIEUC -0x8E4B 0xB7AF # HANGUL SYLLABLE RIEUL-AE-CHIEUCH -0x8E4C 0xB7B0 # HANGUL SYLLABLE RIEUL-AE-KHIEUKH -0x8E4D 0xB7B1 # HANGUL SYLLABLE RIEUL-AE-THIEUTH -0x8E4E 0xB7B2 # HANGUL SYLLABLE RIEUL-AE-PHIEUPH -0x8E4F 0xB7B3 # HANGUL SYLLABLE RIEUL-AE-HIEUH -0x8E50 0xB7B6 # HANGUL SYLLABLE RIEUL-YA-SSANGKIYEOK -0x8E51 0xB7B7 # HANGUL SYLLABLE RIEUL-YA-KIYEOKSIOS -0x8E52 0xB7B9 # HANGUL SYLLABLE RIEUL-YA-NIEUNCIEUC -0x8E53 0xB7BA # HANGUL SYLLABLE RIEUL-YA-NIEUNHIEUH -0x8E54 0xB7BB # HANGUL SYLLABLE RIEUL-YA-TIKEUT -0x8E55 0xB7BC # HANGUL SYLLABLE RIEUL-YA-RIEUL -0x8E56 0xB7BD # HANGUL SYLLABLE RIEUL-YA-RIEULKIYEOK -0x8E57 0xB7BE # HANGUL SYLLABLE RIEUL-YA-RIEULMIEUM -0x8E58 0xB7BF # HANGUL SYLLABLE RIEUL-YA-RIEULPIEUP -0x8E59 0xB7C0 # HANGUL SYLLABLE RIEUL-YA-RIEULSIOS -0x8E5A 0xB7C1 # HANGUL SYLLABLE RIEUL-YA-RIEULTHIEUTH -0x8E61 0xB7C2 # HANGUL SYLLABLE RIEUL-YA-RIEULPHIEUPH -0x8E62 0xB7C3 # HANGUL SYLLABLE RIEUL-YA-RIEULHIEUH -0x8E63 0xB7C4 # HANGUL SYLLABLE RIEUL-YA-MIEUM -0x8E64 0xB7C5 # HANGUL SYLLABLE RIEUL-YA-PIEUP -0x8E65 0xB7C6 # HANGUL SYLLABLE RIEUL-YA-PIEUPSIOS -0x8E66 0xB7C8 # HANGUL SYLLABLE RIEUL-YA-SSANGSIOS -0x8E67 0xB7CA # HANGUL SYLLABLE RIEUL-YA-CIEUC -0x8E68 0xB7CB # HANGUL SYLLABLE RIEUL-YA-CHIEUCH -0x8E69 0xB7CC # HANGUL SYLLABLE RIEUL-YA-KHIEUKH -0x8E6A 0xB7CD # HANGUL SYLLABLE RIEUL-YA-THIEUTH -0x8E6B 0xB7CE # HANGUL SYLLABLE RIEUL-YA-PHIEUPH -0x8E6C 0xB7CF # HANGUL SYLLABLE RIEUL-YA-HIEUH -0x8E6D 0xB7D0 # HANGUL SYLLABLE RIEUL-YAE -0x8E6E 0xB7D1 # HANGUL SYLLABLE RIEUL-YAE-KIYEOK -0x8E6F 0xB7D2 # HANGUL SYLLABLE RIEUL-YAE-SSANGKIYEOK -0x8E70 0xB7D3 # HANGUL SYLLABLE RIEUL-YAE-KIYEOKSIOS -0x8E71 0xB7D4 # HANGUL SYLLABLE RIEUL-YAE-NIEUN -0x8E72 0xB7D5 # HANGUL SYLLABLE RIEUL-YAE-NIEUNCIEUC -0x8E73 0xB7D6 # HANGUL SYLLABLE RIEUL-YAE-NIEUNHIEUH -0x8E74 0xB7D7 # HANGUL SYLLABLE RIEUL-YAE-TIKEUT -0x8E75 0xB7D8 # HANGUL SYLLABLE RIEUL-YAE-RIEUL -0x8E76 0xB7D9 # HANGUL SYLLABLE RIEUL-YAE-RIEULKIYEOK -0x8E77 0xB7DA # HANGUL SYLLABLE RIEUL-YAE-RIEULMIEUM -0x8E78 0xB7DB # HANGUL SYLLABLE RIEUL-YAE-RIEULPIEUP -0x8E79 0xB7DC # HANGUL SYLLABLE RIEUL-YAE-RIEULSIOS -0x8E7A 0xB7DD # HANGUL SYLLABLE RIEUL-YAE-RIEULTHIEUTH -0x8E81 0xB7DE # HANGUL SYLLABLE RIEUL-YAE-RIEULPHIEUPH -0x8E82 0xB7DF # HANGUL SYLLABLE RIEUL-YAE-RIEULHIEUH -0x8E83 0xB7E0 # HANGUL SYLLABLE RIEUL-YAE-MIEUM -0x8E84 0xB7E1 # HANGUL SYLLABLE RIEUL-YAE-PIEUP -0x8E85 0xB7E2 # HANGUL SYLLABLE RIEUL-YAE-PIEUPSIOS -0x8E86 0xB7E3 # HANGUL SYLLABLE RIEUL-YAE-SIOS -0x8E87 0xB7E4 # HANGUL SYLLABLE RIEUL-YAE-SSANGSIOS -0x8E88 0xB7E5 # HANGUL SYLLABLE RIEUL-YAE-IEUNG -0x8E89 0xB7E6 # HANGUL SYLLABLE RIEUL-YAE-CIEUC -0x8E8A 0xB7E7 # HANGUL SYLLABLE RIEUL-YAE-CHIEUCH -0x8E8B 0xB7E8 # HANGUL SYLLABLE RIEUL-YAE-KHIEUKH -0x8E8C 0xB7E9 # HANGUL SYLLABLE RIEUL-YAE-THIEUTH -0x8E8D 0xB7EA # HANGUL SYLLABLE RIEUL-YAE-PHIEUPH -0x8E8E 0xB7EB # HANGUL SYLLABLE RIEUL-YAE-HIEUH -0x8E8F 0xB7EE # HANGUL SYLLABLE RIEUL-EO-SSANGKIYEOK -0x8E90 0xB7EF # HANGUL SYLLABLE RIEUL-EO-KIYEOKSIOS -0x8E91 0xB7F1 # HANGUL SYLLABLE RIEUL-EO-NIEUNCIEUC -0x8E92 0xB7F2 # HANGUL SYLLABLE RIEUL-EO-NIEUNHIEUH -0x8E93 0xB7F3 # HANGUL SYLLABLE RIEUL-EO-TIKEUT -0x8E94 0xB7F5 # HANGUL SYLLABLE RIEUL-EO-RIEULKIYEOK -0x8E95 0xB7F6 # HANGUL SYLLABLE RIEUL-EO-RIEULMIEUM -0x8E96 0xB7F7 # HANGUL SYLLABLE RIEUL-EO-RIEULPIEUP -0x8E97 0xB7F8 # HANGUL SYLLABLE RIEUL-EO-RIEULSIOS -0x8E98 0xB7F9 # HANGUL SYLLABLE RIEUL-EO-RIEULTHIEUTH -0x8E99 0xB7FA # HANGUL SYLLABLE RIEUL-EO-RIEULPHIEUPH -0x8E9A 0xB7FB # HANGUL SYLLABLE RIEUL-EO-RIEULHIEUH -0x8E9B 0xB7FE # HANGUL SYLLABLE RIEUL-EO-PIEUPSIOS -0x8E9C 0xB802 # HANGUL SYLLABLE RIEUL-EO-CIEUC -0x8E9D 0xB803 # HANGUL SYLLABLE RIEUL-EO-CHIEUCH -0x8E9E 0xB804 # HANGUL SYLLABLE RIEUL-EO-KHIEUKH -0x8E9F 0xB805 # HANGUL SYLLABLE RIEUL-EO-THIEUTH -0x8EA0 0xB806 # HANGUL SYLLABLE RIEUL-EO-PHIEUPH -0x8EA1 0xB80A # HANGUL SYLLABLE RIEUL-E-SSANGKIYEOK -0x8EA2 0xB80B # HANGUL SYLLABLE RIEUL-E-KIYEOKSIOS -0x8EA3 0xB80D # HANGUL SYLLABLE RIEUL-E-NIEUNCIEUC -0x8EA4 0xB80E # HANGUL SYLLABLE RIEUL-E-NIEUNHIEUH -0x8EA5 0xB80F # HANGUL SYLLABLE RIEUL-E-TIKEUT -0x8EA6 0xB811 # HANGUL SYLLABLE RIEUL-E-RIEULKIYEOK -0x8EA7 0xB812 # HANGUL SYLLABLE RIEUL-E-RIEULMIEUM -0x8EA8 0xB813 # HANGUL SYLLABLE RIEUL-E-RIEULPIEUP -0x8EA9 0xB814 # HANGUL SYLLABLE RIEUL-E-RIEULSIOS -0x8EAA 0xB815 # HANGUL SYLLABLE RIEUL-E-RIEULTHIEUTH -0x8EAB 0xB816 # HANGUL SYLLABLE RIEUL-E-RIEULPHIEUPH -0x8EAC 0xB817 # HANGUL SYLLABLE RIEUL-E-RIEULHIEUH -0x8EAD 0xB81A # HANGUL SYLLABLE RIEUL-E-PIEUPSIOS -0x8EAE 0xB81C # HANGUL SYLLABLE RIEUL-E-SSANGSIOS -0x8EAF 0xB81E # HANGUL SYLLABLE RIEUL-E-CIEUC -0x8EB0 0xB81F # HANGUL SYLLABLE RIEUL-E-CHIEUCH -0x8EB1 0xB820 # HANGUL SYLLABLE RIEUL-E-KHIEUKH -0x8EB2 0xB821 # HANGUL SYLLABLE RIEUL-E-THIEUTH -0x8EB3 0xB822 # HANGUL SYLLABLE RIEUL-E-PHIEUPH -0x8EB4 0xB823 # HANGUL SYLLABLE RIEUL-E-HIEUH -0x8EB5 0xB826 # HANGUL SYLLABLE RIEUL-YEO-SSANGKIYEOK -0x8EB6 0xB827 # HANGUL SYLLABLE RIEUL-YEO-KIYEOKSIOS -0x8EB7 0xB829 # HANGUL SYLLABLE RIEUL-YEO-NIEUNCIEUC -0x8EB8 0xB82A # HANGUL SYLLABLE RIEUL-YEO-NIEUNHIEUH -0x8EB9 0xB82B # HANGUL SYLLABLE RIEUL-YEO-TIKEUT -0x8EBA 0xB82D # HANGUL SYLLABLE RIEUL-YEO-RIEULKIYEOK -0x8EBB 0xB82E # HANGUL SYLLABLE RIEUL-YEO-RIEULMIEUM -0x8EBC 0xB82F # HANGUL SYLLABLE RIEUL-YEO-RIEULPIEUP -0x8EBD 0xB830 # HANGUL SYLLABLE RIEUL-YEO-RIEULSIOS -0x8EBE 0xB831 # HANGUL SYLLABLE RIEUL-YEO-RIEULTHIEUTH -0x8EBF 0xB832 # HANGUL SYLLABLE RIEUL-YEO-RIEULPHIEUPH -0x8EC0 0xB833 # HANGUL SYLLABLE RIEUL-YEO-RIEULHIEUH -0x8EC1 0xB836 # HANGUL SYLLABLE RIEUL-YEO-PIEUPSIOS -0x8EC2 0xB83A # HANGUL SYLLABLE RIEUL-YEO-CIEUC -0x8EC3 0xB83B # HANGUL SYLLABLE RIEUL-YEO-CHIEUCH -0x8EC4 0xB83C # HANGUL SYLLABLE RIEUL-YEO-KHIEUKH -0x8EC5 0xB83D # HANGUL SYLLABLE RIEUL-YEO-THIEUTH -0x8EC6 0xB83E # HANGUL SYLLABLE RIEUL-YEO-PHIEUPH -0x8EC7 0xB83F # HANGUL SYLLABLE RIEUL-YEO-HIEUH -0x8EC8 0xB841 # HANGUL SYLLABLE RIEUL-YE-KIYEOK -0x8EC9 0xB842 # HANGUL SYLLABLE RIEUL-YE-SSANGKIYEOK -0x8ECA 0xB843 # HANGUL SYLLABLE RIEUL-YE-KIYEOKSIOS -0x8ECB 0xB845 # HANGUL SYLLABLE RIEUL-YE-NIEUNCIEUC -0x8ECC 0xB846 # HANGUL SYLLABLE RIEUL-YE-NIEUNHIEUH -0x8ECD 0xB847 # HANGUL SYLLABLE RIEUL-YE-TIKEUT -0x8ECE 0xB848 # HANGUL SYLLABLE RIEUL-YE-RIEUL -0x8ECF 0xB849 # HANGUL SYLLABLE RIEUL-YE-RIEULKIYEOK -0x8ED0 0xB84A # HANGUL SYLLABLE RIEUL-YE-RIEULMIEUM -0x8ED1 0xB84B # HANGUL SYLLABLE RIEUL-YE-RIEULPIEUP -0x8ED2 0xB84C # HANGUL SYLLABLE RIEUL-YE-RIEULSIOS -0x8ED3 0xB84D # HANGUL SYLLABLE RIEUL-YE-RIEULTHIEUTH -0x8ED4 0xB84E # HANGUL SYLLABLE RIEUL-YE-RIEULPHIEUPH -0x8ED5 0xB84F # HANGUL SYLLABLE RIEUL-YE-RIEULHIEUH -0x8ED6 0xB850 # HANGUL SYLLABLE RIEUL-YE-MIEUM -0x8ED7 0xB852 # HANGUL SYLLABLE RIEUL-YE-PIEUPSIOS -0x8ED8 0xB854 # HANGUL SYLLABLE RIEUL-YE-SSANGSIOS -0x8ED9 0xB855 # HANGUL SYLLABLE RIEUL-YE-IEUNG -0x8EDA 0xB856 # HANGUL SYLLABLE RIEUL-YE-CIEUC -0x8EDB 0xB857 # HANGUL SYLLABLE RIEUL-YE-CHIEUCH -0x8EDC 0xB858 # HANGUL SYLLABLE RIEUL-YE-KHIEUKH -0x8EDD 0xB859 # HANGUL SYLLABLE RIEUL-YE-THIEUTH -0x8EDE 0xB85A # HANGUL SYLLABLE RIEUL-YE-PHIEUPH -0x8EDF 0xB85B # HANGUL SYLLABLE RIEUL-YE-HIEUH -0x8EE0 0xB85E # HANGUL SYLLABLE RIEUL-O-SSANGKIYEOK -0x8EE1 0xB85F # HANGUL SYLLABLE RIEUL-O-KIYEOKSIOS -0x8EE2 0xB861 # HANGUL SYLLABLE RIEUL-O-NIEUNCIEUC -0x8EE3 0xB862 # HANGUL SYLLABLE RIEUL-O-NIEUNHIEUH -0x8EE4 0xB863 # HANGUL SYLLABLE RIEUL-O-TIKEUT -0x8EE5 0xB865 # HANGUL SYLLABLE RIEUL-O-RIEULKIYEOK -0x8EE6 0xB866 # HANGUL SYLLABLE RIEUL-O-RIEULMIEUM -0x8EE7 0xB867 # HANGUL SYLLABLE RIEUL-O-RIEULPIEUP -0x8EE8 0xB868 # HANGUL SYLLABLE RIEUL-O-RIEULSIOS -0x8EE9 0xB869 # HANGUL SYLLABLE RIEUL-O-RIEULTHIEUTH -0x8EEA 0xB86A # HANGUL SYLLABLE RIEUL-O-RIEULPHIEUPH -0x8EEB 0xB86B # HANGUL SYLLABLE RIEUL-O-RIEULHIEUH -0x8EEC 0xB86E # HANGUL SYLLABLE RIEUL-O-PIEUPSIOS -0x8EED 0xB870 # HANGUL SYLLABLE RIEUL-O-SSANGSIOS -0x8EEE 0xB872 # HANGUL SYLLABLE RIEUL-O-CIEUC -0x8EEF 0xB873 # HANGUL SYLLABLE RIEUL-O-CHIEUCH -0x8EF0 0xB874 # HANGUL SYLLABLE RIEUL-O-KHIEUKH -0x8EF1 0xB875 # HANGUL SYLLABLE RIEUL-O-THIEUTH -0x8EF2 0xB876 # HANGUL SYLLABLE RIEUL-O-PHIEUPH -0x8EF3 0xB877 # HANGUL SYLLABLE RIEUL-O-HIEUH -0x8EF4 0xB879 # HANGUL SYLLABLE RIEUL-WA-KIYEOK -0x8EF5 0xB87A # HANGUL SYLLABLE RIEUL-WA-SSANGKIYEOK -0x8EF6 0xB87B # HANGUL SYLLABLE RIEUL-WA-KIYEOKSIOS -0x8EF7 0xB87D # HANGUL SYLLABLE RIEUL-WA-NIEUNCIEUC -0x8EF8 0xB87E # HANGUL SYLLABLE RIEUL-WA-NIEUNHIEUH -0x8EF9 0xB87F # HANGUL SYLLABLE RIEUL-WA-TIKEUT -0x8EFA 0xB880 # HANGUL SYLLABLE RIEUL-WA-RIEUL -0x8EFB 0xB881 # HANGUL SYLLABLE RIEUL-WA-RIEULKIYEOK -0x8EFC 0xB882 # HANGUL SYLLABLE RIEUL-WA-RIEULMIEUM -0x8EFD 0xB883 # HANGUL SYLLABLE RIEUL-WA-RIEULPIEUP -0x8EFE 0xB884 # HANGUL SYLLABLE RIEUL-WA-RIEULSIOS -0x8F41 0xB885 # HANGUL SYLLABLE RIEUL-WA-RIEULTHIEUTH -0x8F42 0xB886 # HANGUL SYLLABLE RIEUL-WA-RIEULPHIEUPH -0x8F43 0xB887 # HANGUL SYLLABLE RIEUL-WA-RIEULHIEUH -0x8F44 0xB888 # HANGUL SYLLABLE RIEUL-WA-MIEUM -0x8F45 0xB889 # HANGUL SYLLABLE RIEUL-WA-PIEUP -0x8F46 0xB88A # HANGUL SYLLABLE RIEUL-WA-PIEUPSIOS -0x8F47 0xB88B # HANGUL SYLLABLE RIEUL-WA-SIOS -0x8F48 0xB88C # HANGUL SYLLABLE RIEUL-WA-SSANGSIOS -0x8F49 0xB88E # HANGUL SYLLABLE RIEUL-WA-CIEUC -0x8F4A 0xB88F # HANGUL SYLLABLE RIEUL-WA-CHIEUCH -0x8F4B 0xB890 # HANGUL SYLLABLE RIEUL-WA-KHIEUKH -0x8F4C 0xB891 # HANGUL SYLLABLE RIEUL-WA-THIEUTH -0x8F4D 0xB892 # HANGUL SYLLABLE RIEUL-WA-PHIEUPH -0x8F4E 0xB893 # HANGUL SYLLABLE RIEUL-WA-HIEUH -0x8F4F 0xB894 # HANGUL SYLLABLE RIEUL-WAE -0x8F50 0xB895 # HANGUL SYLLABLE RIEUL-WAE-KIYEOK -0x8F51 0xB896 # HANGUL SYLLABLE RIEUL-WAE-SSANGKIYEOK -0x8F52 0xB897 # HANGUL SYLLABLE RIEUL-WAE-KIYEOKSIOS -0x8F53 0xB898 # HANGUL SYLLABLE RIEUL-WAE-NIEUN -0x8F54 0xB899 # HANGUL SYLLABLE RIEUL-WAE-NIEUNCIEUC -0x8F55 0xB89A # HANGUL SYLLABLE RIEUL-WAE-NIEUNHIEUH -0x8F56 0xB89B # HANGUL SYLLABLE RIEUL-WAE-TIKEUT -0x8F57 0xB89C # HANGUL SYLLABLE RIEUL-WAE-RIEUL -0x8F58 0xB89D # HANGUL SYLLABLE RIEUL-WAE-RIEULKIYEOK -0x8F59 0xB89E # HANGUL SYLLABLE RIEUL-WAE-RIEULMIEUM -0x8F5A 0xB89F # HANGUL SYLLABLE RIEUL-WAE-RIEULPIEUP -0x8F61 0xB8A0 # HANGUL SYLLABLE RIEUL-WAE-RIEULSIOS -0x8F62 0xB8A1 # HANGUL SYLLABLE RIEUL-WAE-RIEULTHIEUTH -0x8F63 0xB8A2 # HANGUL SYLLABLE RIEUL-WAE-RIEULPHIEUPH -0x8F64 0xB8A3 # HANGUL SYLLABLE RIEUL-WAE-RIEULHIEUH -0x8F65 0xB8A4 # HANGUL SYLLABLE RIEUL-WAE-MIEUM -0x8F66 0xB8A5 # HANGUL SYLLABLE RIEUL-WAE-PIEUP -0x8F67 0xB8A6 # HANGUL SYLLABLE RIEUL-WAE-PIEUPSIOS -0x8F68 0xB8A7 # HANGUL SYLLABLE RIEUL-WAE-SIOS -0x8F69 0xB8A9 # HANGUL SYLLABLE RIEUL-WAE-IEUNG -0x8F6A 0xB8AA # HANGUL SYLLABLE RIEUL-WAE-CIEUC -0x8F6B 0xB8AB # HANGUL SYLLABLE RIEUL-WAE-CHIEUCH -0x8F6C 0xB8AC # HANGUL SYLLABLE RIEUL-WAE-KHIEUKH -0x8F6D 0xB8AD # HANGUL SYLLABLE RIEUL-WAE-THIEUTH -0x8F6E 0xB8AE # HANGUL SYLLABLE RIEUL-WAE-PHIEUPH -0x8F6F 0xB8AF # HANGUL SYLLABLE RIEUL-WAE-HIEUH -0x8F70 0xB8B1 # HANGUL SYLLABLE RIEUL-OE-KIYEOK -0x8F71 0xB8B2 # HANGUL SYLLABLE RIEUL-OE-SSANGKIYEOK -0x8F72 0xB8B3 # HANGUL SYLLABLE RIEUL-OE-KIYEOKSIOS -0x8F73 0xB8B5 # HANGUL SYLLABLE RIEUL-OE-NIEUNCIEUC -0x8F74 0xB8B6 # HANGUL SYLLABLE RIEUL-OE-NIEUNHIEUH -0x8F75 0xB8B7 # HANGUL SYLLABLE RIEUL-OE-TIKEUT -0x8F76 0xB8B9 # HANGUL SYLLABLE RIEUL-OE-RIEULKIYEOK -0x8F77 0xB8BA # HANGUL SYLLABLE RIEUL-OE-RIEULMIEUM -0x8F78 0xB8BB # HANGUL SYLLABLE RIEUL-OE-RIEULPIEUP -0x8F79 0xB8BC # HANGUL SYLLABLE RIEUL-OE-RIEULSIOS -0x8F7A 0xB8BD # HANGUL SYLLABLE RIEUL-OE-RIEULTHIEUTH -0x8F81 0xB8BE # HANGUL SYLLABLE RIEUL-OE-RIEULPHIEUPH -0x8F82 0xB8BF # HANGUL SYLLABLE RIEUL-OE-RIEULHIEUH -0x8F83 0xB8C2 # HANGUL SYLLABLE RIEUL-OE-PIEUPSIOS -0x8F84 0xB8C4 # HANGUL SYLLABLE RIEUL-OE-SSANGSIOS -0x8F85 0xB8C6 # HANGUL SYLLABLE RIEUL-OE-CIEUC -0x8F86 0xB8C7 # HANGUL SYLLABLE RIEUL-OE-CHIEUCH -0x8F87 0xB8C8 # HANGUL SYLLABLE RIEUL-OE-KHIEUKH -0x8F88 0xB8C9 # HANGUL SYLLABLE RIEUL-OE-THIEUTH -0x8F89 0xB8CA # HANGUL SYLLABLE RIEUL-OE-PHIEUPH -0x8F8A 0xB8CB # HANGUL SYLLABLE RIEUL-OE-HIEUH -0x8F8B 0xB8CD # HANGUL SYLLABLE RIEUL-YO-KIYEOK -0x8F8C 0xB8CE # HANGUL SYLLABLE RIEUL-YO-SSANGKIYEOK -0x8F8D 0xB8CF # HANGUL SYLLABLE RIEUL-YO-KIYEOKSIOS -0x8F8E 0xB8D1 # HANGUL SYLLABLE RIEUL-YO-NIEUNCIEUC -0x8F8F 0xB8D2 # HANGUL SYLLABLE RIEUL-YO-NIEUNHIEUH -0x8F90 0xB8D3 # HANGUL SYLLABLE RIEUL-YO-TIKEUT -0x8F91 0xB8D5 # HANGUL SYLLABLE RIEUL-YO-RIEULKIYEOK -0x8F92 0xB8D6 # HANGUL SYLLABLE RIEUL-YO-RIEULMIEUM -0x8F93 0xB8D7 # HANGUL SYLLABLE RIEUL-YO-RIEULPIEUP -0x8F94 0xB8D8 # HANGUL SYLLABLE RIEUL-YO-RIEULSIOS -0x8F95 0xB8D9 # HANGUL SYLLABLE RIEUL-YO-RIEULTHIEUTH -0x8F96 0xB8DA # HANGUL SYLLABLE RIEUL-YO-RIEULPHIEUPH -0x8F97 0xB8DB # HANGUL SYLLABLE RIEUL-YO-RIEULHIEUH -0x8F98 0xB8DC # HANGUL SYLLABLE RIEUL-YO-MIEUM -0x8F99 0xB8DE # HANGUL SYLLABLE RIEUL-YO-PIEUPSIOS -0x8F9A 0xB8E0 # HANGUL SYLLABLE RIEUL-YO-SSANGSIOS -0x8F9B 0xB8E2 # HANGUL SYLLABLE RIEUL-YO-CIEUC -0x8F9C 0xB8E3 # HANGUL SYLLABLE RIEUL-YO-CHIEUCH -0x8F9D 0xB8E4 # HANGUL SYLLABLE RIEUL-YO-KHIEUKH -0x8F9E 0xB8E5 # HANGUL SYLLABLE RIEUL-YO-THIEUTH -0x8F9F 0xB8E6 # HANGUL SYLLABLE RIEUL-YO-PHIEUPH -0x8FA0 0xB8E7 # HANGUL SYLLABLE RIEUL-YO-HIEUH -0x8FA1 0xB8EA # HANGUL SYLLABLE RIEUL-U-SSANGKIYEOK -0x8FA2 0xB8EB # HANGUL SYLLABLE RIEUL-U-KIYEOKSIOS -0x8FA3 0xB8ED # HANGUL SYLLABLE RIEUL-U-NIEUNCIEUC -0x8FA4 0xB8EE # HANGUL SYLLABLE RIEUL-U-NIEUNHIEUH -0x8FA5 0xB8EF # HANGUL SYLLABLE RIEUL-U-TIKEUT -0x8FA6 0xB8F1 # HANGUL SYLLABLE RIEUL-U-RIEULKIYEOK -0x8FA7 0xB8F2 # HANGUL SYLLABLE RIEUL-U-RIEULMIEUM -0x8FA8 0xB8F3 # HANGUL SYLLABLE RIEUL-U-RIEULPIEUP -0x8FA9 0xB8F4 # HANGUL SYLLABLE RIEUL-U-RIEULSIOS -0x8FAA 0xB8F5 # HANGUL SYLLABLE RIEUL-U-RIEULTHIEUTH -0x8FAB 0xB8F6 # HANGUL SYLLABLE RIEUL-U-RIEULPHIEUPH -0x8FAC 0xB8F7 # HANGUL SYLLABLE RIEUL-U-RIEULHIEUH -0x8FAD 0xB8FA # HANGUL SYLLABLE RIEUL-U-PIEUPSIOS -0x8FAE 0xB8FC # HANGUL SYLLABLE RIEUL-U-SSANGSIOS -0x8FAF 0xB8FE # HANGUL SYLLABLE RIEUL-U-CIEUC -0x8FB0 0xB8FF # HANGUL SYLLABLE RIEUL-U-CHIEUCH -0x8FB1 0xB900 # HANGUL SYLLABLE RIEUL-U-KHIEUKH -0x8FB2 0xB901 # HANGUL SYLLABLE RIEUL-U-THIEUTH -0x8FB3 0xB902 # HANGUL SYLLABLE RIEUL-U-PHIEUPH -0x8FB4 0xB903 # HANGUL SYLLABLE RIEUL-U-HIEUH -0x8FB5 0xB905 # HANGUL SYLLABLE RIEUL-WEO-KIYEOK -0x8FB6 0xB906 # HANGUL SYLLABLE RIEUL-WEO-SSANGKIYEOK -0x8FB7 0xB907 # HANGUL SYLLABLE RIEUL-WEO-KIYEOKSIOS -0x8FB8 0xB908 # HANGUL SYLLABLE RIEUL-WEO-NIEUN -0x8FB9 0xB909 # HANGUL SYLLABLE RIEUL-WEO-NIEUNCIEUC -0x8FBA 0xB90A # HANGUL SYLLABLE RIEUL-WEO-NIEUNHIEUH -0x8FBB 0xB90B # HANGUL SYLLABLE RIEUL-WEO-TIKEUT -0x8FBC 0xB90C # HANGUL SYLLABLE RIEUL-WEO-RIEUL -0x8FBD 0xB90D # HANGUL SYLLABLE RIEUL-WEO-RIEULKIYEOK -0x8FBE 0xB90E # HANGUL SYLLABLE RIEUL-WEO-RIEULMIEUM -0x8FBF 0xB90F # HANGUL SYLLABLE RIEUL-WEO-RIEULPIEUP -0x8FC0 0xB910 # HANGUL SYLLABLE RIEUL-WEO-RIEULSIOS -0x8FC1 0xB911 # HANGUL SYLLABLE RIEUL-WEO-RIEULTHIEUTH -0x8FC2 0xB912 # HANGUL SYLLABLE RIEUL-WEO-RIEULPHIEUPH -0x8FC3 0xB913 # HANGUL SYLLABLE RIEUL-WEO-RIEULHIEUH -0x8FC4 0xB914 # HANGUL SYLLABLE RIEUL-WEO-MIEUM -0x8FC5 0xB915 # HANGUL SYLLABLE RIEUL-WEO-PIEUP -0x8FC6 0xB916 # HANGUL SYLLABLE RIEUL-WEO-PIEUPSIOS -0x8FC7 0xB917 # HANGUL SYLLABLE RIEUL-WEO-SIOS -0x8FC8 0xB919 # HANGUL SYLLABLE RIEUL-WEO-IEUNG -0x8FC9 0xB91A # HANGUL SYLLABLE RIEUL-WEO-CIEUC -0x8FCA 0xB91B # HANGUL SYLLABLE RIEUL-WEO-CHIEUCH -0x8FCB 0xB91C # HANGUL SYLLABLE RIEUL-WEO-KHIEUKH -0x8FCC 0xB91D # HANGUL SYLLABLE RIEUL-WEO-THIEUTH -0x8FCD 0xB91E # HANGUL SYLLABLE RIEUL-WEO-PHIEUPH -0x8FCE 0xB91F # HANGUL SYLLABLE RIEUL-WEO-HIEUH -0x8FCF 0xB921 # HANGUL SYLLABLE RIEUL-WE-KIYEOK -0x8FD0 0xB922 # HANGUL SYLLABLE RIEUL-WE-SSANGKIYEOK -0x8FD1 0xB923 # HANGUL SYLLABLE RIEUL-WE-KIYEOKSIOS -0x8FD2 0xB924 # HANGUL SYLLABLE RIEUL-WE-NIEUN -0x8FD3 0xB925 # HANGUL SYLLABLE RIEUL-WE-NIEUNCIEUC -0x8FD4 0xB926 # HANGUL SYLLABLE RIEUL-WE-NIEUNHIEUH -0x8FD5 0xB927 # HANGUL SYLLABLE RIEUL-WE-TIKEUT -0x8FD6 0xB928 # HANGUL SYLLABLE RIEUL-WE-RIEUL -0x8FD7 0xB929 # HANGUL SYLLABLE RIEUL-WE-RIEULKIYEOK -0x8FD8 0xB92A # HANGUL SYLLABLE RIEUL-WE-RIEULMIEUM -0x8FD9 0xB92B # HANGUL SYLLABLE RIEUL-WE-RIEULPIEUP -0x8FDA 0xB92C # HANGUL SYLLABLE RIEUL-WE-RIEULSIOS -0x8FDB 0xB92D # HANGUL SYLLABLE RIEUL-WE-RIEULTHIEUTH -0x8FDC 0xB92E # HANGUL SYLLABLE RIEUL-WE-RIEULPHIEUPH -0x8FDD 0xB92F # HANGUL SYLLABLE RIEUL-WE-RIEULHIEUH -0x8FDE 0xB930 # HANGUL SYLLABLE RIEUL-WE-MIEUM -0x8FDF 0xB931 # HANGUL SYLLABLE RIEUL-WE-PIEUP -0x8FE0 0xB932 # HANGUL SYLLABLE RIEUL-WE-PIEUPSIOS -0x8FE1 0xB933 # HANGUL SYLLABLE RIEUL-WE-SIOS -0x8FE2 0xB934 # HANGUL SYLLABLE RIEUL-WE-SSANGSIOS -0x8FE3 0xB935 # HANGUL SYLLABLE RIEUL-WE-IEUNG -0x8FE4 0xB936 # HANGUL SYLLABLE RIEUL-WE-CIEUC -0x8FE5 0xB937 # HANGUL SYLLABLE RIEUL-WE-CHIEUCH -0x8FE6 0xB938 # HANGUL SYLLABLE RIEUL-WE-KHIEUKH -0x8FE7 0xB939 # HANGUL SYLLABLE RIEUL-WE-THIEUTH -0x8FE8 0xB93A # HANGUL SYLLABLE RIEUL-WE-PHIEUPH -0x8FE9 0xB93B # HANGUL SYLLABLE RIEUL-WE-HIEUH -0x8FEA 0xB93E # HANGUL SYLLABLE RIEUL-WI-SSANGKIYEOK -0x8FEB 0xB93F # HANGUL SYLLABLE RIEUL-WI-KIYEOKSIOS -0x8FEC 0xB941 # HANGUL SYLLABLE RIEUL-WI-NIEUNCIEUC -0x8FED 0xB942 # HANGUL SYLLABLE RIEUL-WI-NIEUNHIEUH -0x8FEE 0xB943 # HANGUL SYLLABLE RIEUL-WI-TIKEUT -0x8FEF 0xB945 # HANGUL SYLLABLE RIEUL-WI-RIEULKIYEOK -0x8FF0 0xB946 # HANGUL SYLLABLE RIEUL-WI-RIEULMIEUM -0x8FF1 0xB947 # HANGUL SYLLABLE RIEUL-WI-RIEULPIEUP -0x8FF2 0xB948 # HANGUL SYLLABLE RIEUL-WI-RIEULSIOS -0x8FF3 0xB949 # HANGUL SYLLABLE RIEUL-WI-RIEULTHIEUTH -0x8FF4 0xB94A # HANGUL SYLLABLE RIEUL-WI-RIEULPHIEUPH -0x8FF5 0xB94B # HANGUL SYLLABLE RIEUL-WI-RIEULHIEUH -0x8FF6 0xB94D # HANGUL SYLLABLE RIEUL-WI-PIEUP -0x8FF7 0xB94E # HANGUL SYLLABLE RIEUL-WI-PIEUPSIOS -0x8FF8 0xB950 # HANGUL SYLLABLE RIEUL-WI-SSANGSIOS -0x8FF9 0xB952 # HANGUL SYLLABLE RIEUL-WI-CIEUC -0x8FFA 0xB953 # HANGUL SYLLABLE RIEUL-WI-CHIEUCH -0x8FFB 0xB954 # HANGUL SYLLABLE RIEUL-WI-KHIEUKH -0x8FFC 0xB955 # HANGUL SYLLABLE RIEUL-WI-THIEUTH -0x8FFD 0xB956 # HANGUL SYLLABLE RIEUL-WI-PHIEUPH -0x8FFE 0xB957 # HANGUL SYLLABLE RIEUL-WI-HIEUH -0x9041 0xB95A # HANGUL SYLLABLE RIEUL-YU-SSANGKIYEOK -0x9042 0xB95B # HANGUL SYLLABLE RIEUL-YU-KIYEOKSIOS -0x9043 0xB95D # HANGUL SYLLABLE RIEUL-YU-NIEUNCIEUC -0x9044 0xB95E # HANGUL SYLLABLE RIEUL-YU-NIEUNHIEUH -0x9045 0xB95F # HANGUL SYLLABLE RIEUL-YU-TIKEUT -0x9046 0xB961 # HANGUL SYLLABLE RIEUL-YU-RIEULKIYEOK -0x9047 0xB962 # HANGUL SYLLABLE RIEUL-YU-RIEULMIEUM -0x9048 0xB963 # HANGUL SYLLABLE RIEUL-YU-RIEULPIEUP -0x9049 0xB964 # HANGUL SYLLABLE RIEUL-YU-RIEULSIOS -0x904A 0xB965 # HANGUL SYLLABLE RIEUL-YU-RIEULTHIEUTH -0x904B 0xB966 # HANGUL SYLLABLE RIEUL-YU-RIEULPHIEUPH -0x904C 0xB967 # HANGUL SYLLABLE RIEUL-YU-RIEULHIEUH -0x904D 0xB96A # HANGUL SYLLABLE RIEUL-YU-PIEUPSIOS -0x904E 0xB96C # HANGUL SYLLABLE RIEUL-YU-SSANGSIOS -0x904F 0xB96E # HANGUL SYLLABLE RIEUL-YU-CIEUC -0x9050 0xB96F # HANGUL SYLLABLE RIEUL-YU-CHIEUCH -0x9051 0xB970 # HANGUL SYLLABLE RIEUL-YU-KHIEUKH -0x9052 0xB971 # HANGUL SYLLABLE RIEUL-YU-THIEUTH -0x9053 0xB972 # HANGUL SYLLABLE RIEUL-YU-PHIEUPH -0x9054 0xB973 # HANGUL SYLLABLE RIEUL-YU-HIEUH -0x9055 0xB976 # HANGUL SYLLABLE RIEUL-EU-SSANGKIYEOK -0x9056 0xB977 # HANGUL SYLLABLE RIEUL-EU-KIYEOKSIOS -0x9057 0xB979 # HANGUL SYLLABLE RIEUL-EU-NIEUNCIEUC -0x9058 0xB97A # HANGUL SYLLABLE RIEUL-EU-NIEUNHIEUH -0x9059 0xB97B # HANGUL SYLLABLE RIEUL-EU-TIKEUT -0x905A 0xB97D # HANGUL SYLLABLE RIEUL-EU-RIEULKIYEOK -0x9061 0xB97E # HANGUL SYLLABLE RIEUL-EU-RIEULMIEUM -0x9062 0xB97F # HANGUL SYLLABLE RIEUL-EU-RIEULPIEUP -0x9063 0xB980 # HANGUL SYLLABLE RIEUL-EU-RIEULSIOS -0x9064 0xB981 # HANGUL SYLLABLE RIEUL-EU-RIEULTHIEUTH -0x9065 0xB982 # HANGUL SYLLABLE RIEUL-EU-RIEULPHIEUPH -0x9066 0xB983 # HANGUL SYLLABLE RIEUL-EU-RIEULHIEUH -0x9067 0xB986 # HANGUL SYLLABLE RIEUL-EU-PIEUPSIOS -0x9068 0xB988 # HANGUL SYLLABLE RIEUL-EU-SSANGSIOS -0x9069 0xB98B # HANGUL SYLLABLE RIEUL-EU-CHIEUCH -0x906A 0xB98C # HANGUL SYLLABLE RIEUL-EU-KHIEUKH -0x906B 0xB98F # HANGUL SYLLABLE RIEUL-EU-HIEUH -0x906C 0xB990 # HANGUL SYLLABLE RIEUL-YI -0x906D 0xB991 # HANGUL SYLLABLE RIEUL-YI-KIYEOK -0x906E 0xB992 # HANGUL SYLLABLE RIEUL-YI-SSANGKIYEOK -0x906F 0xB993 # HANGUL SYLLABLE RIEUL-YI-KIYEOKSIOS -0x9070 0xB994 # HANGUL SYLLABLE RIEUL-YI-NIEUN -0x9071 0xB995 # HANGUL SYLLABLE RIEUL-YI-NIEUNCIEUC -0x9072 0xB996 # HANGUL SYLLABLE RIEUL-YI-NIEUNHIEUH -0x9073 0xB997 # HANGUL SYLLABLE RIEUL-YI-TIKEUT -0x9074 0xB998 # HANGUL SYLLABLE RIEUL-YI-RIEUL -0x9075 0xB999 # HANGUL SYLLABLE RIEUL-YI-RIEULKIYEOK -0x9076 0xB99A # HANGUL SYLLABLE RIEUL-YI-RIEULMIEUM -0x9077 0xB99B # HANGUL SYLLABLE RIEUL-YI-RIEULPIEUP -0x9078 0xB99C # HANGUL SYLLABLE RIEUL-YI-RIEULSIOS -0x9079 0xB99D # HANGUL SYLLABLE RIEUL-YI-RIEULTHIEUTH -0x907A 0xB99E # HANGUL SYLLABLE RIEUL-YI-RIEULPHIEUPH -0x9081 0xB99F # HANGUL SYLLABLE RIEUL-YI-RIEULHIEUH -0x9082 0xB9A0 # HANGUL SYLLABLE RIEUL-YI-MIEUM -0x9083 0xB9A1 # HANGUL SYLLABLE RIEUL-YI-PIEUP -0x9084 0xB9A2 # HANGUL SYLLABLE RIEUL-YI-PIEUPSIOS -0x9085 0xB9A3 # HANGUL SYLLABLE RIEUL-YI-SIOS -0x9086 0xB9A4 # HANGUL SYLLABLE RIEUL-YI-SSANGSIOS -0x9087 0xB9A5 # HANGUL SYLLABLE RIEUL-YI-IEUNG -0x9088 0xB9A6 # HANGUL SYLLABLE RIEUL-YI-CIEUC -0x9089 0xB9A7 # HANGUL SYLLABLE RIEUL-YI-CHIEUCH -0x908A 0xB9A8 # HANGUL SYLLABLE RIEUL-YI-KHIEUKH -0x908B 0xB9A9 # HANGUL SYLLABLE RIEUL-YI-THIEUTH -0x908C 0xB9AA # HANGUL SYLLABLE RIEUL-YI-PHIEUPH -0x908D 0xB9AB # HANGUL SYLLABLE RIEUL-YI-HIEUH -0x908E 0xB9AE # HANGUL SYLLABLE RIEUL-I-SSANGKIYEOK -0x908F 0xB9AF # HANGUL SYLLABLE RIEUL-I-KIYEOKSIOS -0x9090 0xB9B1 # HANGUL SYLLABLE RIEUL-I-NIEUNCIEUC -0x9091 0xB9B2 # HANGUL SYLLABLE RIEUL-I-NIEUNHIEUH -0x9092 0xB9B3 # HANGUL SYLLABLE RIEUL-I-TIKEUT -0x9093 0xB9B5 # HANGUL SYLLABLE RIEUL-I-RIEULKIYEOK -0x9094 0xB9B6 # HANGUL SYLLABLE RIEUL-I-RIEULMIEUM -0x9095 0xB9B7 # HANGUL SYLLABLE RIEUL-I-RIEULPIEUP -0x9096 0xB9B8 # HANGUL SYLLABLE RIEUL-I-RIEULSIOS -0x9097 0xB9B9 # HANGUL SYLLABLE RIEUL-I-RIEULTHIEUTH -0x9098 0xB9BA # HANGUL SYLLABLE RIEUL-I-RIEULPHIEUPH -0x9099 0xB9BB # HANGUL SYLLABLE RIEUL-I-RIEULHIEUH -0x909A 0xB9BE # HANGUL SYLLABLE RIEUL-I-PIEUPSIOS -0x909B 0xB9C0 # HANGUL SYLLABLE RIEUL-I-SSANGSIOS -0x909C 0xB9C2 # HANGUL SYLLABLE RIEUL-I-CIEUC -0x909D 0xB9C3 # HANGUL SYLLABLE RIEUL-I-CHIEUCH -0x909E 0xB9C4 # HANGUL SYLLABLE RIEUL-I-KHIEUKH -0x909F 0xB9C5 # HANGUL SYLLABLE RIEUL-I-THIEUTH -0x90A0 0xB9C6 # HANGUL SYLLABLE RIEUL-I-PHIEUPH -0x90A1 0xB9C7 # HANGUL SYLLABLE RIEUL-I-HIEUH -0x90A2 0xB9CA # HANGUL SYLLABLE MIEUM-A-SSANGKIYEOK -0x90A3 0xB9CB # HANGUL SYLLABLE MIEUM-A-KIYEOKSIOS -0x90A4 0xB9CD # HANGUL SYLLABLE MIEUM-A-NIEUNCIEUC -0x90A5 0xB9D3 # HANGUL SYLLABLE MIEUM-A-RIEULPIEUP -0x90A6 0xB9D4 # HANGUL SYLLABLE MIEUM-A-RIEULSIOS -0x90A7 0xB9D5 # HANGUL SYLLABLE MIEUM-A-RIEULTHIEUTH -0x90A8 0xB9D6 # HANGUL SYLLABLE MIEUM-A-RIEULPHIEUPH -0x90A9 0xB9D7 # HANGUL SYLLABLE MIEUM-A-RIEULHIEUH -0x90AA 0xB9DA # HANGUL SYLLABLE MIEUM-A-PIEUPSIOS -0x90AB 0xB9DC # HANGUL SYLLABLE MIEUM-A-SSANGSIOS -0x90AC 0xB9DF # HANGUL SYLLABLE MIEUM-A-CHIEUCH -0x90AD 0xB9E0 # HANGUL SYLLABLE MIEUM-A-KHIEUKH -0x90AE 0xB9E2 # HANGUL SYLLABLE MIEUM-A-PHIEUPH -0x90AF 0xB9E6 # HANGUL SYLLABLE MIEUM-AE-SSANGKIYEOK -0x90B0 0xB9E7 # HANGUL SYLLABLE MIEUM-AE-KIYEOKSIOS -0x90B1 0xB9E9 # HANGUL SYLLABLE MIEUM-AE-NIEUNCIEUC -0x90B2 0xB9EA # HANGUL SYLLABLE MIEUM-AE-NIEUNHIEUH -0x90B3 0xB9EB # HANGUL SYLLABLE MIEUM-AE-TIKEUT -0x90B4 0xB9ED # HANGUL SYLLABLE MIEUM-AE-RIEULKIYEOK -0x90B5 0xB9EE # HANGUL SYLLABLE MIEUM-AE-RIEULMIEUM -0x90B6 0xB9EF # HANGUL SYLLABLE MIEUM-AE-RIEULPIEUP -0x90B7 0xB9F0 # HANGUL SYLLABLE MIEUM-AE-RIEULSIOS -0x90B8 0xB9F1 # HANGUL SYLLABLE MIEUM-AE-RIEULTHIEUTH -0x90B9 0xB9F2 # HANGUL SYLLABLE MIEUM-AE-RIEULPHIEUPH -0x90BA 0xB9F3 # HANGUL SYLLABLE MIEUM-AE-RIEULHIEUH -0x90BB 0xB9F6 # HANGUL SYLLABLE MIEUM-AE-PIEUPSIOS -0x90BC 0xB9FB # HANGUL SYLLABLE MIEUM-AE-CHIEUCH -0x90BD 0xB9FC # HANGUL SYLLABLE MIEUM-AE-KHIEUKH -0x90BE 0xB9FD # HANGUL SYLLABLE MIEUM-AE-THIEUTH -0x90BF 0xB9FE # HANGUL SYLLABLE MIEUM-AE-PHIEUPH -0x90C0 0xB9FF # HANGUL SYLLABLE MIEUM-AE-HIEUH -0x90C1 0xBA02 # HANGUL SYLLABLE MIEUM-YA-SSANGKIYEOK -0x90C2 0xBA03 # HANGUL SYLLABLE MIEUM-YA-KIYEOKSIOS -0x90C3 0xBA04 # HANGUL SYLLABLE MIEUM-YA-NIEUN -0x90C4 0xBA05 # HANGUL SYLLABLE MIEUM-YA-NIEUNCIEUC -0x90C5 0xBA06 # HANGUL SYLLABLE MIEUM-YA-NIEUNHIEUH -0x90C6 0xBA07 # HANGUL SYLLABLE MIEUM-YA-TIKEUT -0x90C7 0xBA09 # HANGUL SYLLABLE MIEUM-YA-RIEULKIYEOK -0x90C8 0xBA0A # HANGUL SYLLABLE MIEUM-YA-RIEULMIEUM -0x90C9 0xBA0B # HANGUL SYLLABLE MIEUM-YA-RIEULPIEUP -0x90CA 0xBA0C # HANGUL SYLLABLE MIEUM-YA-RIEULSIOS -0x90CB 0xBA0D # HANGUL SYLLABLE MIEUM-YA-RIEULTHIEUTH -0x90CC 0xBA0E # HANGUL SYLLABLE MIEUM-YA-RIEULPHIEUPH -0x90CD 0xBA0F # HANGUL SYLLABLE MIEUM-YA-RIEULHIEUH -0x90CE 0xBA10 # HANGUL SYLLABLE MIEUM-YA-MIEUM -0x90CF 0xBA11 # HANGUL SYLLABLE MIEUM-YA-PIEUP -0x90D0 0xBA12 # HANGUL SYLLABLE MIEUM-YA-PIEUPSIOS -0x90D1 0xBA13 # HANGUL SYLLABLE MIEUM-YA-SIOS -0x90D2 0xBA14 # HANGUL SYLLABLE MIEUM-YA-SSANGSIOS -0x90D3 0xBA16 # HANGUL SYLLABLE MIEUM-YA-CIEUC -0x90D4 0xBA17 # HANGUL SYLLABLE MIEUM-YA-CHIEUCH -0x90D5 0xBA18 # HANGUL SYLLABLE MIEUM-YA-KHIEUKH -0x90D6 0xBA19 # HANGUL SYLLABLE MIEUM-YA-THIEUTH -0x90D7 0xBA1A # HANGUL SYLLABLE MIEUM-YA-PHIEUPH -0x90D8 0xBA1B # HANGUL SYLLABLE MIEUM-YA-HIEUH -0x90D9 0xBA1C # HANGUL SYLLABLE MIEUM-YAE -0x90DA 0xBA1D # HANGUL SYLLABLE MIEUM-YAE-KIYEOK -0x90DB 0xBA1E # HANGUL SYLLABLE MIEUM-YAE-SSANGKIYEOK -0x90DC 0xBA1F # HANGUL SYLLABLE MIEUM-YAE-KIYEOKSIOS -0x90DD 0xBA20 # HANGUL SYLLABLE MIEUM-YAE-NIEUN -0x90DE 0xBA21 # HANGUL SYLLABLE MIEUM-YAE-NIEUNCIEUC -0x90DF 0xBA22 # HANGUL SYLLABLE MIEUM-YAE-NIEUNHIEUH -0x90E0 0xBA23 # HANGUL SYLLABLE MIEUM-YAE-TIKEUT -0x90E1 0xBA24 # HANGUL SYLLABLE MIEUM-YAE-RIEUL -0x90E2 0xBA25 # HANGUL SYLLABLE MIEUM-YAE-RIEULKIYEOK -0x90E3 0xBA26 # HANGUL SYLLABLE MIEUM-YAE-RIEULMIEUM -0x90E4 0xBA27 # HANGUL SYLLABLE MIEUM-YAE-RIEULPIEUP -0x90E5 0xBA28 # HANGUL SYLLABLE MIEUM-YAE-RIEULSIOS -0x90E6 0xBA29 # HANGUL SYLLABLE MIEUM-YAE-RIEULTHIEUTH -0x90E7 0xBA2A # HANGUL SYLLABLE MIEUM-YAE-RIEULPHIEUPH -0x90E8 0xBA2B # HANGUL SYLLABLE MIEUM-YAE-RIEULHIEUH -0x90E9 0xBA2C # HANGUL SYLLABLE MIEUM-YAE-MIEUM -0x90EA 0xBA2D # HANGUL SYLLABLE MIEUM-YAE-PIEUP -0x90EB 0xBA2E # HANGUL SYLLABLE MIEUM-YAE-PIEUPSIOS -0x90EC 0xBA2F # HANGUL SYLLABLE MIEUM-YAE-SIOS -0x90ED 0xBA30 # HANGUL SYLLABLE MIEUM-YAE-SSANGSIOS -0x90EE 0xBA31 # HANGUL SYLLABLE MIEUM-YAE-IEUNG -0x90EF 0xBA32 # HANGUL SYLLABLE MIEUM-YAE-CIEUC -0x90F0 0xBA33 # HANGUL SYLLABLE MIEUM-YAE-CHIEUCH -0x90F1 0xBA34 # HANGUL SYLLABLE MIEUM-YAE-KHIEUKH -0x90F2 0xBA35 # HANGUL SYLLABLE MIEUM-YAE-THIEUTH -0x90F3 0xBA36 # HANGUL SYLLABLE MIEUM-YAE-PHIEUPH -0x90F4 0xBA37 # HANGUL SYLLABLE MIEUM-YAE-HIEUH -0x90F5 0xBA3A # HANGUL SYLLABLE MIEUM-EO-SSANGKIYEOK -0x90F6 0xBA3B # HANGUL SYLLABLE MIEUM-EO-KIYEOKSIOS -0x90F7 0xBA3D # HANGUL SYLLABLE MIEUM-EO-NIEUNCIEUC -0x90F8 0xBA3E # HANGUL SYLLABLE MIEUM-EO-NIEUNHIEUH -0x90F9 0xBA3F # HANGUL SYLLABLE MIEUM-EO-TIKEUT -0x90FA 0xBA41 # HANGUL SYLLABLE MIEUM-EO-RIEULKIYEOK -0x90FB 0xBA43 # HANGUL SYLLABLE MIEUM-EO-RIEULPIEUP -0x90FC 0xBA44 # HANGUL SYLLABLE MIEUM-EO-RIEULSIOS -0x90FD 0xBA45 # HANGUL SYLLABLE MIEUM-EO-RIEULTHIEUTH -0x90FE 0xBA46 # HANGUL SYLLABLE MIEUM-EO-RIEULPHIEUPH -0x9141 0xBA47 # HANGUL SYLLABLE MIEUM-EO-RIEULHIEUH -0x9142 0xBA4A # HANGUL SYLLABLE MIEUM-EO-PIEUPSIOS -0x9143 0xBA4C # HANGUL SYLLABLE MIEUM-EO-SSANGSIOS -0x9144 0xBA4F # HANGUL SYLLABLE MIEUM-EO-CHIEUCH -0x9145 0xBA50 # HANGUL SYLLABLE MIEUM-EO-KHIEUKH -0x9146 0xBA51 # HANGUL SYLLABLE MIEUM-EO-THIEUTH -0x9147 0xBA52 # HANGUL SYLLABLE MIEUM-EO-PHIEUPH -0x9148 0xBA56 # HANGUL SYLLABLE MIEUM-E-SSANGKIYEOK -0x9149 0xBA57 # HANGUL SYLLABLE MIEUM-E-KIYEOKSIOS -0x914A 0xBA59 # HANGUL SYLLABLE MIEUM-E-NIEUNCIEUC -0x914B 0xBA5A # HANGUL SYLLABLE MIEUM-E-NIEUNHIEUH -0x914C 0xBA5B # HANGUL SYLLABLE MIEUM-E-TIKEUT -0x914D 0xBA5D # HANGUL SYLLABLE MIEUM-E-RIEULKIYEOK -0x914E 0xBA5E # HANGUL SYLLABLE MIEUM-E-RIEULMIEUM -0x914F 0xBA5F # HANGUL SYLLABLE MIEUM-E-RIEULPIEUP -0x9150 0xBA60 # HANGUL SYLLABLE MIEUM-E-RIEULSIOS -0x9151 0xBA61 # HANGUL SYLLABLE MIEUM-E-RIEULTHIEUTH -0x9152 0xBA62 # HANGUL SYLLABLE MIEUM-E-RIEULPHIEUPH -0x9153 0xBA63 # HANGUL SYLLABLE MIEUM-E-RIEULHIEUH -0x9154 0xBA66 # HANGUL SYLLABLE MIEUM-E-PIEUPSIOS -0x9155 0xBA6A # HANGUL SYLLABLE MIEUM-E-CIEUC -0x9156 0xBA6B # HANGUL SYLLABLE MIEUM-E-CHIEUCH -0x9157 0xBA6C # HANGUL SYLLABLE MIEUM-E-KHIEUKH -0x9158 0xBA6D # HANGUL SYLLABLE MIEUM-E-THIEUTH -0x9159 0xBA6E # HANGUL SYLLABLE MIEUM-E-PHIEUPH -0x915A 0xBA6F # HANGUL SYLLABLE MIEUM-E-HIEUH -0x9161 0xBA72 # HANGUL SYLLABLE MIEUM-YEO-SSANGKIYEOK -0x9162 0xBA73 # HANGUL SYLLABLE MIEUM-YEO-KIYEOKSIOS -0x9163 0xBA75 # HANGUL SYLLABLE MIEUM-YEO-NIEUNCIEUC -0x9164 0xBA76 # HANGUL SYLLABLE MIEUM-YEO-NIEUNHIEUH -0x9165 0xBA77 # HANGUL SYLLABLE MIEUM-YEO-TIKEUT -0x9166 0xBA79 # HANGUL SYLLABLE MIEUM-YEO-RIEULKIYEOK -0x9167 0xBA7A # HANGUL SYLLABLE MIEUM-YEO-RIEULMIEUM -0x9168 0xBA7B # HANGUL SYLLABLE MIEUM-YEO-RIEULPIEUP -0x9169 0xBA7C # HANGUL SYLLABLE MIEUM-YEO-RIEULSIOS -0x916A 0xBA7D # HANGUL SYLLABLE MIEUM-YEO-RIEULTHIEUTH -0x916B 0xBA7E # HANGUL SYLLABLE MIEUM-YEO-RIEULPHIEUPH -0x916C 0xBA7F # HANGUL SYLLABLE MIEUM-YEO-RIEULHIEUH -0x916D 0xBA80 # HANGUL SYLLABLE MIEUM-YEO-MIEUM -0x916E 0xBA81 # HANGUL SYLLABLE MIEUM-YEO-PIEUP -0x916F 0xBA82 # HANGUL SYLLABLE MIEUM-YEO-PIEUPSIOS -0x9170 0xBA86 # HANGUL SYLLABLE MIEUM-YEO-CIEUC -0x9171 0xBA88 # HANGUL SYLLABLE MIEUM-YEO-KHIEUKH -0x9172 0xBA89 # HANGUL SYLLABLE MIEUM-YEO-THIEUTH -0x9173 0xBA8A # HANGUL SYLLABLE MIEUM-YEO-PHIEUPH -0x9174 0xBA8B # HANGUL SYLLABLE MIEUM-YEO-HIEUH -0x9175 0xBA8D # HANGUL SYLLABLE MIEUM-YE-KIYEOK -0x9176 0xBA8E # HANGUL SYLLABLE MIEUM-YE-SSANGKIYEOK -0x9177 0xBA8F # HANGUL SYLLABLE MIEUM-YE-KIYEOKSIOS -0x9178 0xBA90 # HANGUL SYLLABLE MIEUM-YE-NIEUN -0x9179 0xBA91 # HANGUL SYLLABLE MIEUM-YE-NIEUNCIEUC -0x917A 0xBA92 # HANGUL SYLLABLE MIEUM-YE-NIEUNHIEUH -0x9181 0xBA93 # HANGUL SYLLABLE MIEUM-YE-TIKEUT -0x9182 0xBA94 # HANGUL SYLLABLE MIEUM-YE-RIEUL -0x9183 0xBA95 # HANGUL SYLLABLE MIEUM-YE-RIEULKIYEOK -0x9184 0xBA96 # HANGUL SYLLABLE MIEUM-YE-RIEULMIEUM -0x9185 0xBA97 # HANGUL SYLLABLE MIEUM-YE-RIEULPIEUP -0x9186 0xBA98 # HANGUL SYLLABLE MIEUM-YE-RIEULSIOS -0x9187 0xBA99 # HANGUL SYLLABLE MIEUM-YE-RIEULTHIEUTH -0x9188 0xBA9A # HANGUL SYLLABLE MIEUM-YE-RIEULPHIEUPH -0x9189 0xBA9B # HANGUL SYLLABLE MIEUM-YE-RIEULHIEUH -0x918A 0xBA9C # HANGUL SYLLABLE MIEUM-YE-MIEUM -0x918B 0xBA9D # HANGUL SYLLABLE MIEUM-YE-PIEUP -0x918C 0xBA9E # HANGUL SYLLABLE MIEUM-YE-PIEUPSIOS -0x918D 0xBA9F # HANGUL SYLLABLE MIEUM-YE-SIOS -0x918E 0xBAA0 # HANGUL SYLLABLE MIEUM-YE-SSANGSIOS -0x918F 0xBAA1 # HANGUL SYLLABLE MIEUM-YE-IEUNG -0x9190 0xBAA2 # HANGUL SYLLABLE MIEUM-YE-CIEUC -0x9191 0xBAA3 # HANGUL SYLLABLE MIEUM-YE-CHIEUCH -0x9192 0xBAA4 # HANGUL SYLLABLE MIEUM-YE-KHIEUKH -0x9193 0xBAA5 # HANGUL SYLLABLE MIEUM-YE-THIEUTH -0x9194 0xBAA6 # HANGUL SYLLABLE MIEUM-YE-PHIEUPH -0x9195 0xBAA7 # HANGUL SYLLABLE MIEUM-YE-HIEUH -0x9196 0xBAAA # HANGUL SYLLABLE MIEUM-O-SSANGKIYEOK -0x9197 0xBAAD # HANGUL SYLLABLE MIEUM-O-NIEUNCIEUC -0x9198 0xBAAE # HANGUL SYLLABLE MIEUM-O-NIEUNHIEUH -0x9199 0xBAAF # HANGUL SYLLABLE MIEUM-O-TIKEUT -0x919A 0xBAB1 # HANGUL SYLLABLE MIEUM-O-RIEULKIYEOK -0x919B 0xBAB3 # HANGUL SYLLABLE MIEUM-O-RIEULPIEUP -0x919C 0xBAB4 # HANGUL SYLLABLE MIEUM-O-RIEULSIOS -0x919D 0xBAB5 # HANGUL SYLLABLE MIEUM-O-RIEULTHIEUTH -0x919E 0xBAB6 # HANGUL SYLLABLE MIEUM-O-RIEULPHIEUPH -0x919F 0xBAB7 # HANGUL SYLLABLE MIEUM-O-RIEULHIEUH -0x91A0 0xBABA # HANGUL SYLLABLE MIEUM-O-PIEUPSIOS -0x91A1 0xBABC # HANGUL SYLLABLE MIEUM-O-SSANGSIOS -0x91A2 0xBABE # HANGUL SYLLABLE MIEUM-O-CIEUC -0x91A3 0xBABF # HANGUL SYLLABLE MIEUM-O-CHIEUCH -0x91A4 0xBAC0 # HANGUL SYLLABLE MIEUM-O-KHIEUKH -0x91A5 0xBAC1 # HANGUL SYLLABLE MIEUM-O-THIEUTH -0x91A6 0xBAC2 # HANGUL SYLLABLE MIEUM-O-PHIEUPH -0x91A7 0xBAC3 # HANGUL SYLLABLE MIEUM-O-HIEUH -0x91A8 0xBAC5 # HANGUL SYLLABLE MIEUM-WA-KIYEOK -0x91A9 0xBAC6 # HANGUL SYLLABLE MIEUM-WA-SSANGKIYEOK -0x91AA 0xBAC7 # HANGUL SYLLABLE MIEUM-WA-KIYEOKSIOS -0x91AB 0xBAC9 # HANGUL SYLLABLE MIEUM-WA-NIEUNCIEUC -0x91AC 0xBACA # HANGUL SYLLABLE MIEUM-WA-NIEUNHIEUH -0x91AD 0xBACB # HANGUL SYLLABLE MIEUM-WA-TIKEUT -0x91AE 0xBACC # HANGUL SYLLABLE MIEUM-WA-RIEUL -0x91AF 0xBACD # HANGUL SYLLABLE MIEUM-WA-RIEULKIYEOK -0x91B0 0xBACE # HANGUL SYLLABLE MIEUM-WA-RIEULMIEUM -0x91B1 0xBACF # HANGUL SYLLABLE MIEUM-WA-RIEULPIEUP -0x91B2 0xBAD0 # HANGUL SYLLABLE MIEUM-WA-RIEULSIOS -0x91B3 0xBAD1 # HANGUL SYLLABLE MIEUM-WA-RIEULTHIEUTH -0x91B4 0xBAD2 # HANGUL SYLLABLE MIEUM-WA-RIEULPHIEUPH -0x91B5 0xBAD3 # HANGUL SYLLABLE MIEUM-WA-RIEULHIEUH -0x91B6 0xBAD4 # HANGUL SYLLABLE MIEUM-WA-MIEUM -0x91B7 0xBAD5 # HANGUL SYLLABLE MIEUM-WA-PIEUP -0x91B8 0xBAD6 # HANGUL SYLLABLE MIEUM-WA-PIEUPSIOS -0x91B9 0xBAD7 # HANGUL SYLLABLE MIEUM-WA-SIOS -0x91BA 0xBADA # HANGUL SYLLABLE MIEUM-WA-CIEUC -0x91BB 0xBADB # HANGUL SYLLABLE MIEUM-WA-CHIEUCH -0x91BC 0xBADC # HANGUL SYLLABLE MIEUM-WA-KHIEUKH -0x91BD 0xBADD # HANGUL SYLLABLE MIEUM-WA-THIEUTH -0x91BE 0xBADE # HANGUL SYLLABLE MIEUM-WA-PHIEUPH -0x91BF 0xBADF # HANGUL SYLLABLE MIEUM-WA-HIEUH -0x91C0 0xBAE0 # HANGUL SYLLABLE MIEUM-WAE -0x91C1 0xBAE1 # HANGUL SYLLABLE MIEUM-WAE-KIYEOK -0x91C2 0xBAE2 # HANGUL SYLLABLE MIEUM-WAE-SSANGKIYEOK -0x91C3 0xBAE3 # HANGUL SYLLABLE MIEUM-WAE-KIYEOKSIOS -0x91C4 0xBAE4 # HANGUL SYLLABLE MIEUM-WAE-NIEUN -0x91C5 0xBAE5 # HANGUL SYLLABLE MIEUM-WAE-NIEUNCIEUC -0x91C6 0xBAE6 # HANGUL SYLLABLE MIEUM-WAE-NIEUNHIEUH -0x91C7 0xBAE7 # HANGUL SYLLABLE MIEUM-WAE-TIKEUT -0x91C8 0xBAE8 # HANGUL SYLLABLE MIEUM-WAE-RIEUL -0x91C9 0xBAE9 # HANGUL SYLLABLE MIEUM-WAE-RIEULKIYEOK -0x91CA 0xBAEA # HANGUL SYLLABLE MIEUM-WAE-RIEULMIEUM -0x91CB 0xBAEB # HANGUL SYLLABLE MIEUM-WAE-RIEULPIEUP -0x91CC 0xBAEC # HANGUL SYLLABLE MIEUM-WAE-RIEULSIOS -0x91CD 0xBAED # HANGUL SYLLABLE MIEUM-WAE-RIEULTHIEUTH -0x91CE 0xBAEE # HANGUL SYLLABLE MIEUM-WAE-RIEULPHIEUPH -0x91CF 0xBAEF # HANGUL SYLLABLE MIEUM-WAE-RIEULHIEUH -0x91D0 0xBAF0 # HANGUL SYLLABLE MIEUM-WAE-MIEUM -0x91D1 0xBAF1 # HANGUL SYLLABLE MIEUM-WAE-PIEUP -0x91D2 0xBAF2 # HANGUL SYLLABLE MIEUM-WAE-PIEUPSIOS -0x91D3 0xBAF3 # HANGUL SYLLABLE MIEUM-WAE-SIOS -0x91D4 0xBAF4 # HANGUL SYLLABLE MIEUM-WAE-SSANGSIOS -0x91D5 0xBAF5 # HANGUL SYLLABLE MIEUM-WAE-IEUNG -0x91D6 0xBAF6 # HANGUL SYLLABLE MIEUM-WAE-CIEUC -0x91D7 0xBAF7 # HANGUL SYLLABLE MIEUM-WAE-CHIEUCH -0x91D8 0xBAF8 # HANGUL SYLLABLE MIEUM-WAE-KHIEUKH -0x91D9 0xBAF9 # HANGUL SYLLABLE MIEUM-WAE-THIEUTH -0x91DA 0xBAFA # HANGUL SYLLABLE MIEUM-WAE-PHIEUPH -0x91DB 0xBAFB # HANGUL SYLLABLE MIEUM-WAE-HIEUH -0x91DC 0xBAFD # HANGUL SYLLABLE MIEUM-OE-KIYEOK -0x91DD 0xBAFE # HANGUL SYLLABLE MIEUM-OE-SSANGKIYEOK -0x91DE 0xBAFF # HANGUL SYLLABLE MIEUM-OE-KIYEOKSIOS -0x91DF 0xBB01 # HANGUL SYLLABLE MIEUM-OE-NIEUNCIEUC -0x91E0 0xBB02 # HANGUL SYLLABLE MIEUM-OE-NIEUNHIEUH -0x91E1 0xBB03 # HANGUL SYLLABLE MIEUM-OE-TIKEUT -0x91E2 0xBB05 # HANGUL SYLLABLE MIEUM-OE-RIEULKIYEOK -0x91E3 0xBB06 # HANGUL SYLLABLE MIEUM-OE-RIEULMIEUM -0x91E4 0xBB07 # HANGUL SYLLABLE MIEUM-OE-RIEULPIEUP -0x91E5 0xBB08 # HANGUL SYLLABLE MIEUM-OE-RIEULSIOS -0x91E6 0xBB09 # HANGUL SYLLABLE MIEUM-OE-RIEULTHIEUTH -0x91E7 0xBB0A # HANGUL SYLLABLE MIEUM-OE-RIEULPHIEUPH -0x91E8 0xBB0B # HANGUL SYLLABLE MIEUM-OE-RIEULHIEUH -0x91E9 0xBB0C # HANGUL SYLLABLE MIEUM-OE-MIEUM -0x91EA 0xBB0E # HANGUL SYLLABLE MIEUM-OE-PIEUPSIOS -0x91EB 0xBB10 # HANGUL SYLLABLE MIEUM-OE-SSANGSIOS -0x91EC 0xBB12 # HANGUL SYLLABLE MIEUM-OE-CIEUC -0x91ED 0xBB13 # HANGUL SYLLABLE MIEUM-OE-CHIEUCH -0x91EE 0xBB14 # HANGUL SYLLABLE MIEUM-OE-KHIEUKH -0x91EF 0xBB15 # HANGUL SYLLABLE MIEUM-OE-THIEUTH -0x91F0 0xBB16 # HANGUL SYLLABLE MIEUM-OE-PHIEUPH -0x91F1 0xBB17 # HANGUL SYLLABLE MIEUM-OE-HIEUH -0x91F2 0xBB19 # HANGUL SYLLABLE MIEUM-YO-KIYEOK -0x91F3 0xBB1A # HANGUL SYLLABLE MIEUM-YO-SSANGKIYEOK -0x91F4 0xBB1B # HANGUL SYLLABLE MIEUM-YO-KIYEOKSIOS -0x91F5 0xBB1D # HANGUL SYLLABLE MIEUM-YO-NIEUNCIEUC -0x91F6 0xBB1E # HANGUL SYLLABLE MIEUM-YO-NIEUNHIEUH -0x91F7 0xBB1F # HANGUL SYLLABLE MIEUM-YO-TIKEUT -0x91F8 0xBB21 # HANGUL SYLLABLE MIEUM-YO-RIEULKIYEOK -0x91F9 0xBB22 # HANGUL SYLLABLE MIEUM-YO-RIEULMIEUM -0x91FA 0xBB23 # HANGUL SYLLABLE MIEUM-YO-RIEULPIEUP -0x91FB 0xBB24 # HANGUL SYLLABLE MIEUM-YO-RIEULSIOS -0x91FC 0xBB25 # HANGUL SYLLABLE MIEUM-YO-RIEULTHIEUTH -0x91FD 0xBB26 # HANGUL SYLLABLE MIEUM-YO-RIEULPHIEUPH -0x91FE 0xBB27 # HANGUL SYLLABLE MIEUM-YO-RIEULHIEUH -0x9241 0xBB28 # HANGUL SYLLABLE MIEUM-YO-MIEUM -0x9242 0xBB2A # HANGUL SYLLABLE MIEUM-YO-PIEUPSIOS -0x9243 0xBB2C # HANGUL SYLLABLE MIEUM-YO-SSANGSIOS -0x9244 0xBB2D # HANGUL SYLLABLE MIEUM-YO-IEUNG -0x9245 0xBB2E # HANGUL SYLLABLE MIEUM-YO-CIEUC -0x9246 0xBB2F # HANGUL SYLLABLE MIEUM-YO-CHIEUCH -0x9247 0xBB30 # HANGUL SYLLABLE MIEUM-YO-KHIEUKH -0x9248 0xBB31 # HANGUL SYLLABLE MIEUM-YO-THIEUTH -0x9249 0xBB32 # HANGUL SYLLABLE MIEUM-YO-PHIEUPH -0x924A 0xBB33 # HANGUL SYLLABLE MIEUM-YO-HIEUH -0x924B 0xBB37 # HANGUL SYLLABLE MIEUM-U-KIYEOKSIOS -0x924C 0xBB39 # HANGUL SYLLABLE MIEUM-U-NIEUNCIEUC -0x924D 0xBB3A # HANGUL SYLLABLE MIEUM-U-NIEUNHIEUH -0x924E 0xBB3F # HANGUL SYLLABLE MIEUM-U-RIEULPIEUP -0x924F 0xBB40 # HANGUL SYLLABLE MIEUM-U-RIEULSIOS -0x9250 0xBB41 # HANGUL SYLLABLE MIEUM-U-RIEULTHIEUTH -0x9251 0xBB42 # HANGUL SYLLABLE MIEUM-U-RIEULPHIEUPH -0x9252 0xBB43 # HANGUL SYLLABLE MIEUM-U-RIEULHIEUH -0x9253 0xBB46 # HANGUL SYLLABLE MIEUM-U-PIEUPSIOS -0x9254 0xBB48 # HANGUL SYLLABLE MIEUM-U-SSANGSIOS -0x9255 0xBB4A # HANGUL SYLLABLE MIEUM-U-CIEUC -0x9256 0xBB4B # HANGUL SYLLABLE MIEUM-U-CHIEUCH -0x9257 0xBB4C # HANGUL SYLLABLE MIEUM-U-KHIEUKH -0x9258 0xBB4E # HANGUL SYLLABLE MIEUM-U-PHIEUPH -0x9259 0xBB51 # HANGUL SYLLABLE MIEUM-WEO-KIYEOK -0x925A 0xBB52 # HANGUL SYLLABLE MIEUM-WEO-SSANGKIYEOK -0x9261 0xBB53 # HANGUL SYLLABLE MIEUM-WEO-KIYEOKSIOS -0x9262 0xBB55 # HANGUL SYLLABLE MIEUM-WEO-NIEUNCIEUC -0x9263 0xBB56 # HANGUL SYLLABLE MIEUM-WEO-NIEUNHIEUH -0x9264 0xBB57 # HANGUL SYLLABLE MIEUM-WEO-TIKEUT -0x9265 0xBB59 # HANGUL SYLLABLE MIEUM-WEO-RIEULKIYEOK -0x9266 0xBB5A # HANGUL SYLLABLE MIEUM-WEO-RIEULMIEUM -0x9267 0xBB5B # HANGUL SYLLABLE MIEUM-WEO-RIEULPIEUP -0x9268 0xBB5C # HANGUL SYLLABLE MIEUM-WEO-RIEULSIOS -0x9269 0xBB5D # HANGUL SYLLABLE MIEUM-WEO-RIEULTHIEUTH -0x926A 0xBB5E # HANGUL SYLLABLE MIEUM-WEO-RIEULPHIEUPH -0x926B 0xBB5F # HANGUL SYLLABLE MIEUM-WEO-RIEULHIEUH -0x926C 0xBB60 # HANGUL SYLLABLE MIEUM-WEO-MIEUM -0x926D 0xBB62 # HANGUL SYLLABLE MIEUM-WEO-PIEUPSIOS -0x926E 0xBB64 # HANGUL SYLLABLE MIEUM-WEO-SSANGSIOS -0x926F 0xBB65 # HANGUL SYLLABLE MIEUM-WEO-IEUNG -0x9270 0xBB66 # HANGUL SYLLABLE MIEUM-WEO-CIEUC -0x9271 0xBB67 # HANGUL SYLLABLE MIEUM-WEO-CHIEUCH -0x9272 0xBB68 # HANGUL SYLLABLE MIEUM-WEO-KHIEUKH -0x9273 0xBB69 # HANGUL SYLLABLE MIEUM-WEO-THIEUTH -0x9274 0xBB6A # HANGUL SYLLABLE MIEUM-WEO-PHIEUPH -0x9275 0xBB6B # HANGUL SYLLABLE MIEUM-WEO-HIEUH -0x9276 0xBB6D # HANGUL SYLLABLE MIEUM-WE-KIYEOK -0x9277 0xBB6E # HANGUL SYLLABLE MIEUM-WE-SSANGKIYEOK -0x9278 0xBB6F # HANGUL SYLLABLE MIEUM-WE-KIYEOKSIOS -0x9279 0xBB70 # HANGUL SYLLABLE MIEUM-WE-NIEUN -0x927A 0xBB71 # HANGUL SYLLABLE MIEUM-WE-NIEUNCIEUC -0x9281 0xBB72 # HANGUL SYLLABLE MIEUM-WE-NIEUNHIEUH -0x9282 0xBB73 # HANGUL SYLLABLE MIEUM-WE-TIKEUT -0x9283 0xBB74 # HANGUL SYLLABLE MIEUM-WE-RIEUL -0x9284 0xBB75 # HANGUL SYLLABLE MIEUM-WE-RIEULKIYEOK -0x9285 0xBB76 # HANGUL SYLLABLE MIEUM-WE-RIEULMIEUM -0x9286 0xBB77 # HANGUL SYLLABLE MIEUM-WE-RIEULPIEUP -0x9287 0xBB78 # HANGUL SYLLABLE MIEUM-WE-RIEULSIOS -0x9288 0xBB79 # HANGUL SYLLABLE MIEUM-WE-RIEULTHIEUTH -0x9289 0xBB7A # HANGUL SYLLABLE MIEUM-WE-RIEULPHIEUPH -0x928A 0xBB7B # HANGUL SYLLABLE MIEUM-WE-RIEULHIEUH -0x928B 0xBB7C # HANGUL SYLLABLE MIEUM-WE-MIEUM -0x928C 0xBB7D # HANGUL SYLLABLE MIEUM-WE-PIEUP -0x928D 0xBB7E # HANGUL SYLLABLE MIEUM-WE-PIEUPSIOS -0x928E 0xBB7F # HANGUL SYLLABLE MIEUM-WE-SIOS -0x928F 0xBB80 # HANGUL SYLLABLE MIEUM-WE-SSANGSIOS -0x9290 0xBB81 # HANGUL SYLLABLE MIEUM-WE-IEUNG -0x9291 0xBB82 # HANGUL SYLLABLE MIEUM-WE-CIEUC -0x9292 0xBB83 # HANGUL SYLLABLE MIEUM-WE-CHIEUCH -0x9293 0xBB84 # HANGUL SYLLABLE MIEUM-WE-KHIEUKH -0x9294 0xBB85 # HANGUL SYLLABLE MIEUM-WE-THIEUTH -0x9295 0xBB86 # HANGUL SYLLABLE MIEUM-WE-PHIEUPH -0x9296 0xBB87 # HANGUL SYLLABLE MIEUM-WE-HIEUH -0x9297 0xBB89 # HANGUL SYLLABLE MIEUM-WI-KIYEOK -0x9298 0xBB8A # HANGUL SYLLABLE MIEUM-WI-SSANGKIYEOK -0x9299 0xBB8B # HANGUL SYLLABLE MIEUM-WI-KIYEOKSIOS -0x929A 0xBB8D # HANGUL SYLLABLE MIEUM-WI-NIEUNCIEUC -0x929B 0xBB8E # HANGUL SYLLABLE MIEUM-WI-NIEUNHIEUH -0x929C 0xBB8F # HANGUL SYLLABLE MIEUM-WI-TIKEUT -0x929D 0xBB91 # HANGUL SYLLABLE MIEUM-WI-RIEULKIYEOK -0x929E 0xBB92 # HANGUL SYLLABLE MIEUM-WI-RIEULMIEUM -0x929F 0xBB93 # HANGUL SYLLABLE MIEUM-WI-RIEULPIEUP -0x92A0 0xBB94 # HANGUL SYLLABLE MIEUM-WI-RIEULSIOS -0x92A1 0xBB95 # HANGUL SYLLABLE MIEUM-WI-RIEULTHIEUTH -0x92A2 0xBB96 # HANGUL SYLLABLE MIEUM-WI-RIEULPHIEUPH -0x92A3 0xBB97 # HANGUL SYLLABLE MIEUM-WI-RIEULHIEUH -0x92A4 0xBB98 # HANGUL SYLLABLE MIEUM-WI-MIEUM -0x92A5 0xBB99 # HANGUL SYLLABLE MIEUM-WI-PIEUP -0x92A6 0xBB9A # HANGUL SYLLABLE MIEUM-WI-PIEUPSIOS -0x92A7 0xBB9B # HANGUL SYLLABLE MIEUM-WI-SIOS -0x92A8 0xBB9C # HANGUL SYLLABLE MIEUM-WI-SSANGSIOS -0x92A9 0xBB9D # HANGUL SYLLABLE MIEUM-WI-IEUNG -0x92AA 0xBB9E # HANGUL SYLLABLE MIEUM-WI-CIEUC -0x92AB 0xBB9F # HANGUL SYLLABLE MIEUM-WI-CHIEUCH -0x92AC 0xBBA0 # HANGUL SYLLABLE MIEUM-WI-KHIEUKH -0x92AD 0xBBA1 # HANGUL SYLLABLE MIEUM-WI-THIEUTH -0x92AE 0xBBA2 # HANGUL SYLLABLE MIEUM-WI-PHIEUPH -0x92AF 0xBBA3 # HANGUL SYLLABLE MIEUM-WI-HIEUH -0x92B0 0xBBA5 # HANGUL SYLLABLE MIEUM-YU-KIYEOK -0x92B1 0xBBA6 # HANGUL SYLLABLE MIEUM-YU-SSANGKIYEOK -0x92B2 0xBBA7 # HANGUL SYLLABLE MIEUM-YU-KIYEOKSIOS -0x92B3 0xBBA9 # HANGUL SYLLABLE MIEUM-YU-NIEUNCIEUC -0x92B4 0xBBAA # HANGUL SYLLABLE MIEUM-YU-NIEUNHIEUH -0x92B5 0xBBAB # HANGUL SYLLABLE MIEUM-YU-TIKEUT -0x92B6 0xBBAD # HANGUL SYLLABLE MIEUM-YU-RIEULKIYEOK -0x92B7 0xBBAE # HANGUL SYLLABLE MIEUM-YU-RIEULMIEUM -0x92B8 0xBBAF # HANGUL SYLLABLE MIEUM-YU-RIEULPIEUP -0x92B9 0xBBB0 # HANGUL SYLLABLE MIEUM-YU-RIEULSIOS -0x92BA 0xBBB1 # HANGUL SYLLABLE MIEUM-YU-RIEULTHIEUTH -0x92BB 0xBBB2 # HANGUL SYLLABLE MIEUM-YU-RIEULPHIEUPH -0x92BC 0xBBB3 # HANGUL SYLLABLE MIEUM-YU-RIEULHIEUH -0x92BD 0xBBB5 # HANGUL SYLLABLE MIEUM-YU-PIEUP -0x92BE 0xBBB6 # HANGUL SYLLABLE MIEUM-YU-PIEUPSIOS -0x92BF 0xBBB8 # HANGUL SYLLABLE MIEUM-YU-SSANGSIOS -0x92C0 0xBBB9 # HANGUL SYLLABLE MIEUM-YU-IEUNG -0x92C1 0xBBBA # HANGUL SYLLABLE MIEUM-YU-CIEUC -0x92C2 0xBBBB # HANGUL SYLLABLE MIEUM-YU-CHIEUCH -0x92C3 0xBBBC # HANGUL SYLLABLE MIEUM-YU-KHIEUKH -0x92C4 0xBBBD # HANGUL SYLLABLE MIEUM-YU-THIEUTH -0x92C5 0xBBBE # HANGUL SYLLABLE MIEUM-YU-PHIEUPH -0x92C6 0xBBBF # HANGUL SYLLABLE MIEUM-YU-HIEUH -0x92C7 0xBBC1 # HANGUL SYLLABLE MIEUM-EU-KIYEOK -0x92C8 0xBBC2 # HANGUL SYLLABLE MIEUM-EU-SSANGKIYEOK -0x92C9 0xBBC3 # HANGUL SYLLABLE MIEUM-EU-KIYEOKSIOS -0x92CA 0xBBC5 # HANGUL SYLLABLE MIEUM-EU-NIEUNCIEUC -0x92CB 0xBBC6 # HANGUL SYLLABLE MIEUM-EU-NIEUNHIEUH -0x92CC 0xBBC7 # HANGUL SYLLABLE MIEUM-EU-TIKEUT -0x92CD 0xBBC9 # HANGUL SYLLABLE MIEUM-EU-RIEULKIYEOK -0x92CE 0xBBCA # HANGUL SYLLABLE MIEUM-EU-RIEULMIEUM -0x92CF 0xBBCB # HANGUL SYLLABLE MIEUM-EU-RIEULPIEUP -0x92D0 0xBBCC # HANGUL SYLLABLE MIEUM-EU-RIEULSIOS -0x92D1 0xBBCD # HANGUL SYLLABLE MIEUM-EU-RIEULTHIEUTH -0x92D2 0xBBCE # HANGUL SYLLABLE MIEUM-EU-RIEULPHIEUPH -0x92D3 0xBBCF # HANGUL SYLLABLE MIEUM-EU-RIEULHIEUH -0x92D4 0xBBD1 # HANGUL SYLLABLE MIEUM-EU-PIEUP -0x92D5 0xBBD2 # HANGUL SYLLABLE MIEUM-EU-PIEUPSIOS -0x92D6 0xBBD4 # HANGUL SYLLABLE MIEUM-EU-SSANGSIOS -0x92D7 0xBBD5 # HANGUL SYLLABLE MIEUM-EU-IEUNG -0x92D8 0xBBD6 # HANGUL SYLLABLE MIEUM-EU-CIEUC -0x92D9 0xBBD7 # HANGUL SYLLABLE MIEUM-EU-CHIEUCH -0x92DA 0xBBD8 # HANGUL SYLLABLE MIEUM-EU-KHIEUKH -0x92DB 0xBBD9 # HANGUL SYLLABLE MIEUM-EU-THIEUTH -0x92DC 0xBBDA # HANGUL SYLLABLE MIEUM-EU-PHIEUPH -0x92DD 0xBBDB # HANGUL SYLLABLE MIEUM-EU-HIEUH -0x92DE 0xBBDC # HANGUL SYLLABLE MIEUM-YI -0x92DF 0xBBDD # HANGUL SYLLABLE MIEUM-YI-KIYEOK -0x92E0 0xBBDE # HANGUL SYLLABLE MIEUM-YI-SSANGKIYEOK -0x92E1 0xBBDF # HANGUL SYLLABLE MIEUM-YI-KIYEOKSIOS -0x92E2 0xBBE0 # HANGUL SYLLABLE MIEUM-YI-NIEUN -0x92E3 0xBBE1 # HANGUL SYLLABLE MIEUM-YI-NIEUNCIEUC -0x92E4 0xBBE2 # HANGUL SYLLABLE MIEUM-YI-NIEUNHIEUH -0x92E5 0xBBE3 # HANGUL SYLLABLE MIEUM-YI-TIKEUT -0x92E6 0xBBE4 # HANGUL SYLLABLE MIEUM-YI-RIEUL -0x92E7 0xBBE5 # HANGUL SYLLABLE MIEUM-YI-RIEULKIYEOK -0x92E8 0xBBE6 # HANGUL SYLLABLE MIEUM-YI-RIEULMIEUM -0x92E9 0xBBE7 # HANGUL SYLLABLE MIEUM-YI-RIEULPIEUP -0x92EA 0xBBE8 # HANGUL SYLLABLE MIEUM-YI-RIEULSIOS -0x92EB 0xBBE9 # HANGUL SYLLABLE MIEUM-YI-RIEULTHIEUTH -0x92EC 0xBBEA # HANGUL SYLLABLE MIEUM-YI-RIEULPHIEUPH -0x92ED 0xBBEB # HANGUL SYLLABLE MIEUM-YI-RIEULHIEUH -0x92EE 0xBBEC # HANGUL SYLLABLE MIEUM-YI-MIEUM -0x92EF 0xBBED # HANGUL SYLLABLE MIEUM-YI-PIEUP -0x92F0 0xBBEE # HANGUL SYLLABLE MIEUM-YI-PIEUPSIOS -0x92F1 0xBBEF # HANGUL SYLLABLE MIEUM-YI-SIOS -0x92F2 0xBBF0 # HANGUL SYLLABLE MIEUM-YI-SSANGSIOS -0x92F3 0xBBF1 # HANGUL SYLLABLE MIEUM-YI-IEUNG -0x92F4 0xBBF2 # HANGUL SYLLABLE MIEUM-YI-CIEUC -0x92F5 0xBBF3 # HANGUL SYLLABLE MIEUM-YI-CHIEUCH -0x92F6 0xBBF4 # HANGUL SYLLABLE MIEUM-YI-KHIEUKH -0x92F7 0xBBF5 # HANGUL SYLLABLE MIEUM-YI-THIEUTH -0x92F8 0xBBF6 # HANGUL SYLLABLE MIEUM-YI-PHIEUPH -0x92F9 0xBBF7 # HANGUL SYLLABLE MIEUM-YI-HIEUH -0x92FA 0xBBFA # HANGUL SYLLABLE MIEUM-I-SSANGKIYEOK -0x92FB 0xBBFB # HANGUL SYLLABLE MIEUM-I-KIYEOKSIOS -0x92FC 0xBBFD # HANGUL SYLLABLE MIEUM-I-NIEUNCIEUC -0x92FD 0xBBFE # HANGUL SYLLABLE MIEUM-I-NIEUNHIEUH -0x92FE 0xBC01 # HANGUL SYLLABLE MIEUM-I-RIEULKIYEOK -0x9341 0xBC03 # HANGUL SYLLABLE MIEUM-I-RIEULPIEUP -0x9342 0xBC04 # HANGUL SYLLABLE MIEUM-I-RIEULSIOS -0x9343 0xBC05 # HANGUL SYLLABLE MIEUM-I-RIEULTHIEUTH -0x9344 0xBC06 # HANGUL SYLLABLE MIEUM-I-RIEULPHIEUPH -0x9345 0xBC07 # HANGUL SYLLABLE MIEUM-I-RIEULHIEUH -0x9346 0xBC0A # HANGUL SYLLABLE MIEUM-I-PIEUPSIOS -0x9347 0xBC0E # HANGUL SYLLABLE MIEUM-I-CIEUC -0x9348 0xBC10 # HANGUL SYLLABLE MIEUM-I-KHIEUKH -0x9349 0xBC12 # HANGUL SYLLABLE MIEUM-I-PHIEUPH -0x934A 0xBC13 # HANGUL SYLLABLE MIEUM-I-HIEUH -0x934B 0xBC19 # HANGUL SYLLABLE PIEUP-A-NIEUNCIEUC -0x934C 0xBC1A # HANGUL SYLLABLE PIEUP-A-NIEUNHIEUH -0x934D 0xBC20 # HANGUL SYLLABLE PIEUP-A-RIEULSIOS -0x934E 0xBC21 # HANGUL SYLLABLE PIEUP-A-RIEULTHIEUTH -0x934F 0xBC22 # HANGUL SYLLABLE PIEUP-A-RIEULPHIEUPH -0x9350 0xBC23 # HANGUL SYLLABLE PIEUP-A-RIEULHIEUH -0x9351 0xBC26 # HANGUL SYLLABLE PIEUP-A-PIEUPSIOS -0x9352 0xBC28 # HANGUL SYLLABLE PIEUP-A-SSANGSIOS -0x9353 0xBC2A # HANGUL SYLLABLE PIEUP-A-CIEUC -0x9354 0xBC2B # HANGUL SYLLABLE PIEUP-A-CHIEUCH -0x9355 0xBC2C # HANGUL SYLLABLE PIEUP-A-KHIEUKH -0x9356 0xBC2E # HANGUL SYLLABLE PIEUP-A-PHIEUPH -0x9357 0xBC2F # HANGUL SYLLABLE PIEUP-A-HIEUH -0x9358 0xBC32 # HANGUL SYLLABLE PIEUP-AE-SSANGKIYEOK -0x9359 0xBC33 # HANGUL SYLLABLE PIEUP-AE-KIYEOKSIOS -0x935A 0xBC35 # HANGUL SYLLABLE PIEUP-AE-NIEUNCIEUC -0x9361 0xBC36 # HANGUL SYLLABLE PIEUP-AE-NIEUNHIEUH -0x9362 0xBC37 # HANGUL SYLLABLE PIEUP-AE-TIKEUT -0x9363 0xBC39 # HANGUL SYLLABLE PIEUP-AE-RIEULKIYEOK -0x9364 0xBC3A # HANGUL SYLLABLE PIEUP-AE-RIEULMIEUM -0x9365 0xBC3B # HANGUL SYLLABLE PIEUP-AE-RIEULPIEUP -0x9366 0xBC3C # HANGUL SYLLABLE PIEUP-AE-RIEULSIOS -0x9367 0xBC3D # HANGUL SYLLABLE PIEUP-AE-RIEULTHIEUTH -0x9368 0xBC3E # HANGUL SYLLABLE PIEUP-AE-RIEULPHIEUPH -0x9369 0xBC3F # HANGUL SYLLABLE PIEUP-AE-RIEULHIEUH -0x936A 0xBC42 # HANGUL SYLLABLE PIEUP-AE-PIEUPSIOS -0x936B 0xBC46 # HANGUL SYLLABLE PIEUP-AE-CIEUC -0x936C 0xBC47 # HANGUL SYLLABLE PIEUP-AE-CHIEUCH -0x936D 0xBC48 # HANGUL SYLLABLE PIEUP-AE-KHIEUKH -0x936E 0xBC4A # HANGUL SYLLABLE PIEUP-AE-PHIEUPH -0x936F 0xBC4B # HANGUL SYLLABLE PIEUP-AE-HIEUH -0x9370 0xBC4E # HANGUL SYLLABLE PIEUP-YA-SSANGKIYEOK -0x9371 0xBC4F # HANGUL SYLLABLE PIEUP-YA-KIYEOKSIOS -0x9372 0xBC51 # HANGUL SYLLABLE PIEUP-YA-NIEUNCIEUC -0x9373 0xBC52 # HANGUL SYLLABLE PIEUP-YA-NIEUNHIEUH -0x9374 0xBC53 # HANGUL SYLLABLE PIEUP-YA-TIKEUT -0x9375 0xBC54 # HANGUL SYLLABLE PIEUP-YA-RIEUL -0x9376 0xBC55 # HANGUL SYLLABLE PIEUP-YA-RIEULKIYEOK -0x9377 0xBC56 # HANGUL SYLLABLE PIEUP-YA-RIEULMIEUM -0x9378 0xBC57 # HANGUL SYLLABLE PIEUP-YA-RIEULPIEUP -0x9379 0xBC58 # HANGUL SYLLABLE PIEUP-YA-RIEULSIOS -0x937A 0xBC59 # HANGUL SYLLABLE PIEUP-YA-RIEULTHIEUTH -0x9381 0xBC5A # HANGUL SYLLABLE PIEUP-YA-RIEULPHIEUPH -0x9382 0xBC5B # HANGUL SYLLABLE PIEUP-YA-RIEULHIEUH -0x9383 0xBC5C # HANGUL SYLLABLE PIEUP-YA-MIEUM -0x9384 0xBC5E # HANGUL SYLLABLE PIEUP-YA-PIEUPSIOS -0x9385 0xBC5F # HANGUL SYLLABLE PIEUP-YA-SIOS -0x9386 0xBC60 # HANGUL SYLLABLE PIEUP-YA-SSANGSIOS -0x9387 0xBC61 # HANGUL SYLLABLE PIEUP-YA-IEUNG -0x9388 0xBC62 # HANGUL SYLLABLE PIEUP-YA-CIEUC -0x9389 0xBC63 # HANGUL SYLLABLE PIEUP-YA-CHIEUCH -0x938A 0xBC64 # HANGUL SYLLABLE PIEUP-YA-KHIEUKH -0x938B 0xBC65 # HANGUL SYLLABLE PIEUP-YA-THIEUTH -0x938C 0xBC66 # HANGUL SYLLABLE PIEUP-YA-PHIEUPH -0x938D 0xBC67 # HANGUL SYLLABLE PIEUP-YA-HIEUH -0x938E 0xBC68 # HANGUL SYLLABLE PIEUP-YAE -0x938F 0xBC69 # HANGUL SYLLABLE PIEUP-YAE-KIYEOK -0x9390 0xBC6A # HANGUL SYLLABLE PIEUP-YAE-SSANGKIYEOK -0x9391 0xBC6B # HANGUL SYLLABLE PIEUP-YAE-KIYEOKSIOS -0x9392 0xBC6C # HANGUL SYLLABLE PIEUP-YAE-NIEUN -0x9393 0xBC6D # HANGUL SYLLABLE PIEUP-YAE-NIEUNCIEUC -0x9394 0xBC6E # HANGUL SYLLABLE PIEUP-YAE-NIEUNHIEUH -0x9395 0xBC6F # HANGUL SYLLABLE PIEUP-YAE-TIKEUT -0x9396 0xBC70 # HANGUL SYLLABLE PIEUP-YAE-RIEUL -0x9397 0xBC71 # HANGUL SYLLABLE PIEUP-YAE-RIEULKIYEOK -0x9398 0xBC72 # HANGUL SYLLABLE PIEUP-YAE-RIEULMIEUM -0x9399 0xBC73 # HANGUL SYLLABLE PIEUP-YAE-RIEULPIEUP -0x939A 0xBC74 # HANGUL SYLLABLE PIEUP-YAE-RIEULSIOS -0x939B 0xBC75 # HANGUL SYLLABLE PIEUP-YAE-RIEULTHIEUTH -0x939C 0xBC76 # HANGUL SYLLABLE PIEUP-YAE-RIEULPHIEUPH -0x939D 0xBC77 # HANGUL SYLLABLE PIEUP-YAE-RIEULHIEUH -0x939E 0xBC78 # HANGUL SYLLABLE PIEUP-YAE-MIEUM -0x939F 0xBC79 # HANGUL SYLLABLE PIEUP-YAE-PIEUP -0x93A0 0xBC7A # HANGUL SYLLABLE PIEUP-YAE-PIEUPSIOS -0x93A1 0xBC7B # HANGUL SYLLABLE PIEUP-YAE-SIOS -0x93A2 0xBC7C # HANGUL SYLLABLE PIEUP-YAE-SSANGSIOS -0x93A3 0xBC7D # HANGUL SYLLABLE PIEUP-YAE-IEUNG -0x93A4 0xBC7E # HANGUL SYLLABLE PIEUP-YAE-CIEUC -0x93A5 0xBC7F # HANGUL SYLLABLE PIEUP-YAE-CHIEUCH -0x93A6 0xBC80 # HANGUL SYLLABLE PIEUP-YAE-KHIEUKH -0x93A7 0xBC81 # HANGUL SYLLABLE PIEUP-YAE-THIEUTH -0x93A8 0xBC82 # HANGUL SYLLABLE PIEUP-YAE-PHIEUPH -0x93A9 0xBC83 # HANGUL SYLLABLE PIEUP-YAE-HIEUH -0x93AA 0xBC86 # HANGUL SYLLABLE PIEUP-EO-SSANGKIYEOK -0x93AB 0xBC87 # HANGUL SYLLABLE PIEUP-EO-KIYEOKSIOS -0x93AC 0xBC89 # HANGUL SYLLABLE PIEUP-EO-NIEUNCIEUC -0x93AD 0xBC8A # HANGUL SYLLABLE PIEUP-EO-NIEUNHIEUH -0x93AE 0xBC8D # HANGUL SYLLABLE PIEUP-EO-RIEULKIYEOK -0x93AF 0xBC8F # HANGUL SYLLABLE PIEUP-EO-RIEULPIEUP -0x93B0 0xBC90 # HANGUL SYLLABLE PIEUP-EO-RIEULSIOS -0x93B1 0xBC91 # HANGUL SYLLABLE PIEUP-EO-RIEULTHIEUTH -0x93B2 0xBC92 # HANGUL SYLLABLE PIEUP-EO-RIEULPHIEUPH -0x93B3 0xBC93 # HANGUL SYLLABLE PIEUP-EO-RIEULHIEUH -0x93B4 0xBC96 # HANGUL SYLLABLE PIEUP-EO-PIEUPSIOS -0x93B5 0xBC98 # HANGUL SYLLABLE PIEUP-EO-SSANGSIOS -0x93B6 0xBC9B # HANGUL SYLLABLE PIEUP-EO-CHIEUCH -0x93B7 0xBC9C # HANGUL SYLLABLE PIEUP-EO-KHIEUKH -0x93B8 0xBC9D # HANGUL SYLLABLE PIEUP-EO-THIEUTH -0x93B9 0xBC9E # HANGUL SYLLABLE PIEUP-EO-PHIEUPH -0x93BA 0xBC9F # HANGUL SYLLABLE PIEUP-EO-HIEUH -0x93BB 0xBCA2 # HANGUL SYLLABLE PIEUP-E-SSANGKIYEOK -0x93BC 0xBCA3 # HANGUL SYLLABLE PIEUP-E-KIYEOKSIOS -0x93BD 0xBCA5 # HANGUL SYLLABLE PIEUP-E-NIEUNCIEUC -0x93BE 0xBCA6 # HANGUL SYLLABLE PIEUP-E-NIEUNHIEUH -0x93BF 0xBCA9 # HANGUL SYLLABLE PIEUP-E-RIEULKIYEOK -0x93C0 0xBCAA # HANGUL SYLLABLE PIEUP-E-RIEULMIEUM -0x93C1 0xBCAB # HANGUL SYLLABLE PIEUP-E-RIEULPIEUP -0x93C2 0xBCAC # HANGUL SYLLABLE PIEUP-E-RIEULSIOS -0x93C3 0xBCAD # HANGUL SYLLABLE PIEUP-E-RIEULTHIEUTH -0x93C4 0xBCAE # HANGUL SYLLABLE PIEUP-E-RIEULPHIEUPH -0x93C5 0xBCAF # HANGUL SYLLABLE PIEUP-E-RIEULHIEUH -0x93C6 0xBCB2 # HANGUL SYLLABLE PIEUP-E-PIEUPSIOS -0x93C7 0xBCB6 # HANGUL SYLLABLE PIEUP-E-CIEUC -0x93C8 0xBCB7 # HANGUL SYLLABLE PIEUP-E-CHIEUCH -0x93C9 0xBCB8 # HANGUL SYLLABLE PIEUP-E-KHIEUKH -0x93CA 0xBCB9 # HANGUL SYLLABLE PIEUP-E-THIEUTH -0x93CB 0xBCBA # HANGUL SYLLABLE PIEUP-E-PHIEUPH -0x93CC 0xBCBB # HANGUL SYLLABLE PIEUP-E-HIEUH -0x93CD 0xBCBE # HANGUL SYLLABLE PIEUP-YEO-SSANGKIYEOK -0x93CE 0xBCBF # HANGUL SYLLABLE PIEUP-YEO-KIYEOKSIOS -0x93CF 0xBCC1 # HANGUL SYLLABLE PIEUP-YEO-NIEUNCIEUC -0x93D0 0xBCC2 # HANGUL SYLLABLE PIEUP-YEO-NIEUNHIEUH -0x93D1 0xBCC3 # HANGUL SYLLABLE PIEUP-YEO-TIKEUT -0x93D2 0xBCC5 # HANGUL SYLLABLE PIEUP-YEO-RIEULKIYEOK -0x93D3 0xBCC6 # HANGUL SYLLABLE PIEUP-YEO-RIEULMIEUM -0x93D4 0xBCC7 # HANGUL SYLLABLE PIEUP-YEO-RIEULPIEUP -0x93D5 0xBCC8 # HANGUL SYLLABLE PIEUP-YEO-RIEULSIOS -0x93D6 0xBCC9 # HANGUL SYLLABLE PIEUP-YEO-RIEULTHIEUTH -0x93D7 0xBCCA # HANGUL SYLLABLE PIEUP-YEO-RIEULPHIEUPH -0x93D8 0xBCCB # HANGUL SYLLABLE PIEUP-YEO-RIEULHIEUH -0x93D9 0xBCCC # HANGUL SYLLABLE PIEUP-YEO-MIEUM -0x93DA 0xBCCE # HANGUL SYLLABLE PIEUP-YEO-PIEUPSIOS -0x93DB 0xBCD2 # HANGUL SYLLABLE PIEUP-YEO-CIEUC -0x93DC 0xBCD3 # HANGUL SYLLABLE PIEUP-YEO-CHIEUCH -0x93DD 0xBCD4 # HANGUL SYLLABLE PIEUP-YEO-KHIEUKH -0x93DE 0xBCD6 # HANGUL SYLLABLE PIEUP-YEO-PHIEUPH -0x93DF 0xBCD7 # HANGUL SYLLABLE PIEUP-YEO-HIEUH -0x93E0 0xBCD9 # HANGUL SYLLABLE PIEUP-YE-KIYEOK -0x93E1 0xBCDA # HANGUL SYLLABLE PIEUP-YE-SSANGKIYEOK -0x93E2 0xBCDB # HANGUL SYLLABLE PIEUP-YE-KIYEOKSIOS -0x93E3 0xBCDD # HANGUL SYLLABLE PIEUP-YE-NIEUNCIEUC -0x93E4 0xBCDE # HANGUL SYLLABLE PIEUP-YE-NIEUNHIEUH -0x93E5 0xBCDF # HANGUL SYLLABLE PIEUP-YE-TIKEUT -0x93E6 0xBCE0 # HANGUL SYLLABLE PIEUP-YE-RIEUL -0x93E7 0xBCE1 # HANGUL SYLLABLE PIEUP-YE-RIEULKIYEOK -0x93E8 0xBCE2 # HANGUL SYLLABLE PIEUP-YE-RIEULMIEUM -0x93E9 0xBCE3 # HANGUL SYLLABLE PIEUP-YE-RIEULPIEUP -0x93EA 0xBCE4 # HANGUL SYLLABLE PIEUP-YE-RIEULSIOS -0x93EB 0xBCE5 # HANGUL SYLLABLE PIEUP-YE-RIEULTHIEUTH -0x93EC 0xBCE6 # HANGUL SYLLABLE PIEUP-YE-RIEULPHIEUPH -0x93ED 0xBCE7 # HANGUL SYLLABLE PIEUP-YE-RIEULHIEUH -0x93EE 0xBCE8 # HANGUL SYLLABLE PIEUP-YE-MIEUM -0x93EF 0xBCE9 # HANGUL SYLLABLE PIEUP-YE-PIEUP -0x93F0 0xBCEA # HANGUL SYLLABLE PIEUP-YE-PIEUPSIOS -0x93F1 0xBCEB # HANGUL SYLLABLE PIEUP-YE-SIOS -0x93F2 0xBCEC # HANGUL SYLLABLE PIEUP-YE-SSANGSIOS -0x93F3 0xBCED # HANGUL SYLLABLE PIEUP-YE-IEUNG -0x93F4 0xBCEE # HANGUL SYLLABLE PIEUP-YE-CIEUC -0x93F5 0xBCEF # HANGUL SYLLABLE PIEUP-YE-CHIEUCH -0x93F6 0xBCF0 # HANGUL SYLLABLE PIEUP-YE-KHIEUKH -0x93F7 0xBCF1 # HANGUL SYLLABLE PIEUP-YE-THIEUTH -0x93F8 0xBCF2 # HANGUL SYLLABLE PIEUP-YE-PHIEUPH -0x93F9 0xBCF3 # HANGUL SYLLABLE PIEUP-YE-HIEUH -0x93FA 0xBCF7 # HANGUL SYLLABLE PIEUP-O-KIYEOKSIOS -0x93FB 0xBCF9 # HANGUL SYLLABLE PIEUP-O-NIEUNCIEUC -0x93FC 0xBCFA # HANGUL SYLLABLE PIEUP-O-NIEUNHIEUH -0x93FD 0xBCFB # HANGUL SYLLABLE PIEUP-O-TIKEUT -0x93FE 0xBCFD # HANGUL SYLLABLE PIEUP-O-RIEULKIYEOK -0x9441 0xBCFE # HANGUL SYLLABLE PIEUP-O-RIEULMIEUM -0x9442 0xBCFF # HANGUL SYLLABLE PIEUP-O-RIEULPIEUP -0x9443 0xBD00 # HANGUL SYLLABLE PIEUP-O-RIEULSIOS -0x9444 0xBD01 # HANGUL SYLLABLE PIEUP-O-RIEULTHIEUTH -0x9445 0xBD02 # HANGUL SYLLABLE PIEUP-O-RIEULPHIEUPH -0x9446 0xBD03 # HANGUL SYLLABLE PIEUP-O-RIEULHIEUH -0x9447 0xBD06 # HANGUL SYLLABLE PIEUP-O-PIEUPSIOS -0x9448 0xBD08 # HANGUL SYLLABLE PIEUP-O-SSANGSIOS -0x9449 0xBD0A # HANGUL SYLLABLE PIEUP-O-CIEUC -0x944A 0xBD0B # HANGUL SYLLABLE PIEUP-O-CHIEUCH -0x944B 0xBD0C # HANGUL SYLLABLE PIEUP-O-KHIEUKH -0x944C 0xBD0D # HANGUL SYLLABLE PIEUP-O-THIEUTH -0x944D 0xBD0E # HANGUL SYLLABLE PIEUP-O-PHIEUPH -0x944E 0xBD0F # HANGUL SYLLABLE PIEUP-O-HIEUH -0x944F 0xBD11 # HANGUL SYLLABLE PIEUP-WA-KIYEOK -0x9450 0xBD12 # HANGUL SYLLABLE PIEUP-WA-SSANGKIYEOK -0x9451 0xBD13 # HANGUL SYLLABLE PIEUP-WA-KIYEOKSIOS -0x9452 0xBD15 # HANGUL SYLLABLE PIEUP-WA-NIEUNCIEUC -0x9453 0xBD16 # HANGUL SYLLABLE PIEUP-WA-NIEUNHIEUH -0x9454 0xBD17 # HANGUL SYLLABLE PIEUP-WA-TIKEUT -0x9455 0xBD18 # HANGUL SYLLABLE PIEUP-WA-RIEUL -0x9456 0xBD19 # HANGUL SYLLABLE PIEUP-WA-RIEULKIYEOK -0x9457 0xBD1A # HANGUL SYLLABLE PIEUP-WA-RIEULMIEUM -0x9458 0xBD1B # HANGUL SYLLABLE PIEUP-WA-RIEULPIEUP -0x9459 0xBD1C # HANGUL SYLLABLE PIEUP-WA-RIEULSIOS -0x945A 0xBD1D # HANGUL SYLLABLE PIEUP-WA-RIEULTHIEUTH -0x9461 0xBD1E # HANGUL SYLLABLE PIEUP-WA-RIEULPHIEUPH -0x9462 0xBD1F # HANGUL SYLLABLE PIEUP-WA-RIEULHIEUH -0x9463 0xBD20 # HANGUL SYLLABLE PIEUP-WA-MIEUM -0x9464 0xBD21 # HANGUL SYLLABLE PIEUP-WA-PIEUP -0x9465 0xBD22 # HANGUL SYLLABLE PIEUP-WA-PIEUPSIOS -0x9466 0xBD23 # HANGUL SYLLABLE PIEUP-WA-SIOS -0x9467 0xBD25 # HANGUL SYLLABLE PIEUP-WA-IEUNG -0x9468 0xBD26 # HANGUL SYLLABLE PIEUP-WA-CIEUC -0x9469 0xBD27 # HANGUL SYLLABLE PIEUP-WA-CHIEUCH -0x946A 0xBD28 # HANGUL SYLLABLE PIEUP-WA-KHIEUKH -0x946B 0xBD29 # HANGUL SYLLABLE PIEUP-WA-THIEUTH -0x946C 0xBD2A # HANGUL SYLLABLE PIEUP-WA-PHIEUPH -0x946D 0xBD2B # HANGUL SYLLABLE PIEUP-WA-HIEUH -0x946E 0xBD2D # HANGUL SYLLABLE PIEUP-WAE-KIYEOK -0x946F 0xBD2E # HANGUL SYLLABLE PIEUP-WAE-SSANGKIYEOK -0x9470 0xBD2F # HANGUL SYLLABLE PIEUP-WAE-KIYEOKSIOS -0x9471 0xBD30 # HANGUL SYLLABLE PIEUP-WAE-NIEUN -0x9472 0xBD31 # HANGUL SYLLABLE PIEUP-WAE-NIEUNCIEUC -0x9473 0xBD32 # HANGUL SYLLABLE PIEUP-WAE-NIEUNHIEUH -0x9474 0xBD33 # HANGUL SYLLABLE PIEUP-WAE-TIKEUT -0x9475 0xBD34 # HANGUL SYLLABLE PIEUP-WAE-RIEUL -0x9476 0xBD35 # HANGUL SYLLABLE PIEUP-WAE-RIEULKIYEOK -0x9477 0xBD36 # HANGUL SYLLABLE PIEUP-WAE-RIEULMIEUM -0x9478 0xBD37 # HANGUL SYLLABLE PIEUP-WAE-RIEULPIEUP -0x9479 0xBD38 # HANGUL SYLLABLE PIEUP-WAE-RIEULSIOS -0x947A 0xBD39 # HANGUL SYLLABLE PIEUP-WAE-RIEULTHIEUTH -0x9481 0xBD3A # HANGUL SYLLABLE PIEUP-WAE-RIEULPHIEUPH -0x9482 0xBD3B # HANGUL SYLLABLE PIEUP-WAE-RIEULHIEUH -0x9483 0xBD3C # HANGUL SYLLABLE PIEUP-WAE-MIEUM -0x9484 0xBD3D # HANGUL SYLLABLE PIEUP-WAE-PIEUP -0x9485 0xBD3E # HANGUL SYLLABLE PIEUP-WAE-PIEUPSIOS -0x9486 0xBD3F # HANGUL SYLLABLE PIEUP-WAE-SIOS -0x9487 0xBD41 # HANGUL SYLLABLE PIEUP-WAE-IEUNG -0x9488 0xBD42 # HANGUL SYLLABLE PIEUP-WAE-CIEUC -0x9489 0xBD43 # HANGUL SYLLABLE PIEUP-WAE-CHIEUCH -0x948A 0xBD44 # HANGUL SYLLABLE PIEUP-WAE-KHIEUKH -0x948B 0xBD45 # HANGUL SYLLABLE PIEUP-WAE-THIEUTH -0x948C 0xBD46 # HANGUL SYLLABLE PIEUP-WAE-PHIEUPH -0x948D 0xBD47 # HANGUL SYLLABLE PIEUP-WAE-HIEUH -0x948E 0xBD4A # HANGUL SYLLABLE PIEUP-OE-SSANGKIYEOK -0x948F 0xBD4B # HANGUL SYLLABLE PIEUP-OE-KIYEOKSIOS -0x9490 0xBD4D # HANGUL SYLLABLE PIEUP-OE-NIEUNCIEUC -0x9491 0xBD4E # HANGUL SYLLABLE PIEUP-OE-NIEUNHIEUH -0x9492 0xBD4F # HANGUL SYLLABLE PIEUP-OE-TIKEUT -0x9493 0xBD51 # HANGUL SYLLABLE PIEUP-OE-RIEULKIYEOK -0x9494 0xBD52 # HANGUL SYLLABLE PIEUP-OE-RIEULMIEUM -0x9495 0xBD53 # HANGUL SYLLABLE PIEUP-OE-RIEULPIEUP -0x9496 0xBD54 # HANGUL SYLLABLE PIEUP-OE-RIEULSIOS -0x9497 0xBD55 # HANGUL SYLLABLE PIEUP-OE-RIEULTHIEUTH -0x9498 0xBD56 # HANGUL SYLLABLE PIEUP-OE-RIEULPHIEUPH -0x9499 0xBD57 # HANGUL SYLLABLE PIEUP-OE-RIEULHIEUH -0x949A 0xBD5A # HANGUL SYLLABLE PIEUP-OE-PIEUPSIOS -0x949B 0xBD5B # HANGUL SYLLABLE PIEUP-OE-SIOS -0x949C 0xBD5C # HANGUL SYLLABLE PIEUP-OE-SSANGSIOS -0x949D 0xBD5D # HANGUL SYLLABLE PIEUP-OE-IEUNG -0x949E 0xBD5E # HANGUL SYLLABLE PIEUP-OE-CIEUC -0x949F 0xBD5F # HANGUL SYLLABLE PIEUP-OE-CHIEUCH -0x94A0 0xBD60 # HANGUL SYLLABLE PIEUP-OE-KHIEUKH -0x94A1 0xBD61 # HANGUL SYLLABLE PIEUP-OE-THIEUTH -0x94A2 0xBD62 # HANGUL SYLLABLE PIEUP-OE-PHIEUPH -0x94A3 0xBD63 # HANGUL SYLLABLE PIEUP-OE-HIEUH -0x94A4 0xBD65 # HANGUL SYLLABLE PIEUP-YO-KIYEOK -0x94A5 0xBD66 # HANGUL SYLLABLE PIEUP-YO-SSANGKIYEOK -0x94A6 0xBD67 # HANGUL SYLLABLE PIEUP-YO-KIYEOKSIOS -0x94A7 0xBD69 # HANGUL SYLLABLE PIEUP-YO-NIEUNCIEUC -0x94A8 0xBD6A # HANGUL SYLLABLE PIEUP-YO-NIEUNHIEUH -0x94A9 0xBD6B # HANGUL SYLLABLE PIEUP-YO-TIKEUT -0x94AA 0xBD6C # HANGUL SYLLABLE PIEUP-YO-RIEUL -0x94AB 0xBD6D # HANGUL SYLLABLE PIEUP-YO-RIEULKIYEOK -0x94AC 0xBD6E # HANGUL SYLLABLE PIEUP-YO-RIEULMIEUM -0x94AD 0xBD6F # HANGUL SYLLABLE PIEUP-YO-RIEULPIEUP -0x94AE 0xBD70 # HANGUL SYLLABLE PIEUP-YO-RIEULSIOS -0x94AF 0xBD71 # HANGUL SYLLABLE PIEUP-YO-RIEULTHIEUTH -0x94B0 0xBD72 # HANGUL SYLLABLE PIEUP-YO-RIEULPHIEUPH -0x94B1 0xBD73 # HANGUL SYLLABLE PIEUP-YO-RIEULHIEUH -0x94B2 0xBD74 # HANGUL SYLLABLE PIEUP-YO-MIEUM -0x94B3 0xBD75 # HANGUL SYLLABLE PIEUP-YO-PIEUP -0x94B4 0xBD76 # HANGUL SYLLABLE PIEUP-YO-PIEUPSIOS -0x94B5 0xBD77 # HANGUL SYLLABLE PIEUP-YO-SIOS -0x94B6 0xBD78 # HANGUL SYLLABLE PIEUP-YO-SSANGSIOS -0x94B7 0xBD79 # HANGUL SYLLABLE PIEUP-YO-IEUNG -0x94B8 0xBD7A # HANGUL SYLLABLE PIEUP-YO-CIEUC -0x94B9 0xBD7B # HANGUL SYLLABLE PIEUP-YO-CHIEUCH -0x94BA 0xBD7C # HANGUL SYLLABLE PIEUP-YO-KHIEUKH -0x94BB 0xBD7D # HANGUL SYLLABLE PIEUP-YO-THIEUTH -0x94BC 0xBD7E # HANGUL SYLLABLE PIEUP-YO-PHIEUPH -0x94BD 0xBD7F # HANGUL SYLLABLE PIEUP-YO-HIEUH -0x94BE 0xBD82 # HANGUL SYLLABLE PIEUP-U-SSANGKIYEOK -0x94BF 0xBD83 # HANGUL SYLLABLE PIEUP-U-KIYEOKSIOS -0x94C0 0xBD85 # HANGUL SYLLABLE PIEUP-U-NIEUNCIEUC -0x94C1 0xBD86 # HANGUL SYLLABLE PIEUP-U-NIEUNHIEUH -0x94C2 0xBD8B # HANGUL SYLLABLE PIEUP-U-RIEULPIEUP -0x94C3 0xBD8C # HANGUL SYLLABLE PIEUP-U-RIEULSIOS -0x94C4 0xBD8D # HANGUL SYLLABLE PIEUP-U-RIEULTHIEUTH -0x94C5 0xBD8E # HANGUL SYLLABLE PIEUP-U-RIEULPHIEUPH -0x94C6 0xBD8F # HANGUL SYLLABLE PIEUP-U-RIEULHIEUH -0x94C7 0xBD92 # HANGUL SYLLABLE PIEUP-U-PIEUPSIOS -0x94C8 0xBD94 # HANGUL SYLLABLE PIEUP-U-SSANGSIOS -0x94C9 0xBD96 # HANGUL SYLLABLE PIEUP-U-CIEUC -0x94CA 0xBD97 # HANGUL SYLLABLE PIEUP-U-CHIEUCH -0x94CB 0xBD98 # HANGUL SYLLABLE PIEUP-U-KHIEUKH -0x94CC 0xBD9B # HANGUL SYLLABLE PIEUP-U-HIEUH -0x94CD 0xBD9D # HANGUL SYLLABLE PIEUP-WEO-KIYEOK -0x94CE 0xBD9E # HANGUL SYLLABLE PIEUP-WEO-SSANGKIYEOK -0x94CF 0xBD9F # HANGUL SYLLABLE PIEUP-WEO-KIYEOKSIOS -0x94D0 0xBDA0 # HANGUL SYLLABLE PIEUP-WEO-NIEUN -0x94D1 0xBDA1 # HANGUL SYLLABLE PIEUP-WEO-NIEUNCIEUC -0x94D2 0xBDA2 # HANGUL SYLLABLE PIEUP-WEO-NIEUNHIEUH -0x94D3 0xBDA3 # HANGUL SYLLABLE PIEUP-WEO-TIKEUT -0x94D4 0xBDA5 # HANGUL SYLLABLE PIEUP-WEO-RIEULKIYEOK -0x94D5 0xBDA6 # HANGUL SYLLABLE PIEUP-WEO-RIEULMIEUM -0x94D6 0xBDA7 # HANGUL SYLLABLE PIEUP-WEO-RIEULPIEUP -0x94D7 0xBDA8 # HANGUL SYLLABLE PIEUP-WEO-RIEULSIOS -0x94D8 0xBDA9 # HANGUL SYLLABLE PIEUP-WEO-RIEULTHIEUTH -0x94D9 0xBDAA # HANGUL SYLLABLE PIEUP-WEO-RIEULPHIEUPH -0x94DA 0xBDAB # HANGUL SYLLABLE PIEUP-WEO-RIEULHIEUH -0x94DB 0xBDAC # HANGUL SYLLABLE PIEUP-WEO-MIEUM -0x94DC 0xBDAD # HANGUL SYLLABLE PIEUP-WEO-PIEUP -0x94DD 0xBDAE # HANGUL SYLLABLE PIEUP-WEO-PIEUPSIOS -0x94DE 0xBDAF # HANGUL SYLLABLE PIEUP-WEO-SIOS -0x94DF 0xBDB1 # HANGUL SYLLABLE PIEUP-WEO-IEUNG -0x94E0 0xBDB2 # HANGUL SYLLABLE PIEUP-WEO-CIEUC -0x94E1 0xBDB3 # HANGUL SYLLABLE PIEUP-WEO-CHIEUCH -0x94E2 0xBDB4 # HANGUL SYLLABLE PIEUP-WEO-KHIEUKH -0x94E3 0xBDB5 # HANGUL SYLLABLE PIEUP-WEO-THIEUTH -0x94E4 0xBDB6 # HANGUL SYLLABLE PIEUP-WEO-PHIEUPH -0x94E5 0xBDB7 # HANGUL SYLLABLE PIEUP-WEO-HIEUH -0x94E6 0xBDB9 # HANGUL SYLLABLE PIEUP-WE-KIYEOK -0x94E7 0xBDBA # HANGUL SYLLABLE PIEUP-WE-SSANGKIYEOK -0x94E8 0xBDBB # HANGUL SYLLABLE PIEUP-WE-KIYEOKSIOS -0x94E9 0xBDBC # HANGUL SYLLABLE PIEUP-WE-NIEUN -0x94EA 0xBDBD # HANGUL SYLLABLE PIEUP-WE-NIEUNCIEUC -0x94EB 0xBDBE # HANGUL SYLLABLE PIEUP-WE-NIEUNHIEUH -0x94EC 0xBDBF # HANGUL SYLLABLE PIEUP-WE-TIKEUT -0x94ED 0xBDC0 # HANGUL SYLLABLE PIEUP-WE-RIEUL -0x94EE 0xBDC1 # HANGUL SYLLABLE PIEUP-WE-RIEULKIYEOK -0x94EF 0xBDC2 # HANGUL SYLLABLE PIEUP-WE-RIEULMIEUM -0x94F0 0xBDC3 # HANGUL SYLLABLE PIEUP-WE-RIEULPIEUP -0x94F1 0xBDC4 # HANGUL SYLLABLE PIEUP-WE-RIEULSIOS -0x94F2 0xBDC5 # HANGUL SYLLABLE PIEUP-WE-RIEULTHIEUTH -0x94F3 0xBDC6 # HANGUL SYLLABLE PIEUP-WE-RIEULPHIEUPH -0x94F4 0xBDC7 # HANGUL SYLLABLE PIEUP-WE-RIEULHIEUH -0x94F5 0xBDC8 # HANGUL SYLLABLE PIEUP-WE-MIEUM -0x94F6 0xBDC9 # HANGUL SYLLABLE PIEUP-WE-PIEUP -0x94F7 0xBDCA # HANGUL SYLLABLE PIEUP-WE-PIEUPSIOS -0x94F8 0xBDCB # HANGUL SYLLABLE PIEUP-WE-SIOS -0x94F9 0xBDCC # HANGUL SYLLABLE PIEUP-WE-SSANGSIOS -0x94FA 0xBDCD # HANGUL SYLLABLE PIEUP-WE-IEUNG -0x94FB 0xBDCE # HANGUL SYLLABLE PIEUP-WE-CIEUC -0x94FC 0xBDCF # HANGUL SYLLABLE PIEUP-WE-CHIEUCH -0x94FD 0xBDD0 # HANGUL SYLLABLE PIEUP-WE-KHIEUKH -0x94FE 0xBDD1 # HANGUL SYLLABLE PIEUP-WE-THIEUTH -0x9541 0xBDD2 # HANGUL SYLLABLE PIEUP-WE-PHIEUPH -0x9542 0xBDD3 # HANGUL SYLLABLE PIEUP-WE-HIEUH -0x9543 0xBDD6 # HANGUL SYLLABLE PIEUP-WI-SSANGKIYEOK -0x9544 0xBDD7 # HANGUL SYLLABLE PIEUP-WI-KIYEOKSIOS -0x9545 0xBDD9 # HANGUL SYLLABLE PIEUP-WI-NIEUNCIEUC -0x9546 0xBDDA # HANGUL SYLLABLE PIEUP-WI-NIEUNHIEUH -0x9547 0xBDDB # HANGUL SYLLABLE PIEUP-WI-TIKEUT -0x9548 0xBDDD # HANGUL SYLLABLE PIEUP-WI-RIEULKIYEOK -0x9549 0xBDDE # HANGUL SYLLABLE PIEUP-WI-RIEULMIEUM -0x954A 0xBDDF # HANGUL SYLLABLE PIEUP-WI-RIEULPIEUP -0x954B 0xBDE0 # HANGUL SYLLABLE PIEUP-WI-RIEULSIOS -0x954C 0xBDE1 # HANGUL SYLLABLE PIEUP-WI-RIEULTHIEUTH -0x954D 0xBDE2 # HANGUL SYLLABLE PIEUP-WI-RIEULPHIEUPH -0x954E 0xBDE3 # HANGUL SYLLABLE PIEUP-WI-RIEULHIEUH -0x954F 0xBDE4 # HANGUL SYLLABLE PIEUP-WI-MIEUM -0x9550 0xBDE5 # HANGUL SYLLABLE PIEUP-WI-PIEUP -0x9551 0xBDE6 # HANGUL SYLLABLE PIEUP-WI-PIEUPSIOS -0x9552 0xBDE7 # HANGUL SYLLABLE PIEUP-WI-SIOS -0x9553 0xBDE8 # HANGUL SYLLABLE PIEUP-WI-SSANGSIOS -0x9554 0xBDEA # HANGUL SYLLABLE PIEUP-WI-CIEUC -0x9555 0xBDEB # HANGUL SYLLABLE PIEUP-WI-CHIEUCH -0x9556 0xBDEC # HANGUL SYLLABLE PIEUP-WI-KHIEUKH -0x9557 0xBDED # HANGUL SYLLABLE PIEUP-WI-THIEUTH -0x9558 0xBDEE # HANGUL SYLLABLE PIEUP-WI-PHIEUPH -0x9559 0xBDEF # HANGUL SYLLABLE PIEUP-WI-HIEUH -0x955A 0xBDF1 # HANGUL SYLLABLE PIEUP-YU-KIYEOK -0x9561 0xBDF2 # HANGUL SYLLABLE PIEUP-YU-SSANGKIYEOK -0x9562 0xBDF3 # HANGUL SYLLABLE PIEUP-YU-KIYEOKSIOS -0x9563 0xBDF5 # HANGUL SYLLABLE PIEUP-YU-NIEUNCIEUC -0x9564 0xBDF6 # HANGUL SYLLABLE PIEUP-YU-NIEUNHIEUH -0x9565 0xBDF7 # HANGUL SYLLABLE PIEUP-YU-TIKEUT -0x9566 0xBDF9 # HANGUL SYLLABLE PIEUP-YU-RIEULKIYEOK -0x9567 0xBDFA # HANGUL SYLLABLE PIEUP-YU-RIEULMIEUM -0x9568 0xBDFB # HANGUL SYLLABLE PIEUP-YU-RIEULPIEUP -0x9569 0xBDFC # HANGUL SYLLABLE PIEUP-YU-RIEULSIOS -0x956A 0xBDFD # HANGUL SYLLABLE PIEUP-YU-RIEULTHIEUTH -0x956B 0xBDFE # HANGUL SYLLABLE PIEUP-YU-RIEULPHIEUPH -0x956C 0xBDFF # HANGUL SYLLABLE PIEUP-YU-RIEULHIEUH -0x956D 0xBE01 # HANGUL SYLLABLE PIEUP-YU-PIEUP -0x956E 0xBE02 # HANGUL SYLLABLE PIEUP-YU-PIEUPSIOS -0x956F 0xBE04 # HANGUL SYLLABLE PIEUP-YU-SSANGSIOS -0x9570 0xBE06 # HANGUL SYLLABLE PIEUP-YU-CIEUC -0x9571 0xBE07 # HANGUL SYLLABLE PIEUP-YU-CHIEUCH -0x9572 0xBE08 # HANGUL SYLLABLE PIEUP-YU-KHIEUKH -0x9573 0xBE09 # HANGUL SYLLABLE PIEUP-YU-THIEUTH -0x9574 0xBE0A # HANGUL SYLLABLE PIEUP-YU-PHIEUPH -0x9575 0xBE0B # HANGUL SYLLABLE PIEUP-YU-HIEUH -0x9576 0xBE0E # HANGUL SYLLABLE PIEUP-EU-SSANGKIYEOK -0x9577 0xBE0F # HANGUL SYLLABLE PIEUP-EU-KIYEOKSIOS -0x9578 0xBE11 # HANGUL SYLLABLE PIEUP-EU-NIEUNCIEUC -0x9579 0xBE12 # HANGUL SYLLABLE PIEUP-EU-NIEUNHIEUH -0x957A 0xBE13 # HANGUL SYLLABLE PIEUP-EU-TIKEUT -0x9581 0xBE15 # HANGUL SYLLABLE PIEUP-EU-RIEULKIYEOK -0x9582 0xBE16 # HANGUL SYLLABLE PIEUP-EU-RIEULMIEUM -0x9583 0xBE17 # HANGUL SYLLABLE PIEUP-EU-RIEULPIEUP -0x9584 0xBE18 # HANGUL SYLLABLE PIEUP-EU-RIEULSIOS -0x9585 0xBE19 # HANGUL SYLLABLE PIEUP-EU-RIEULTHIEUTH -0x9586 0xBE1A # HANGUL SYLLABLE PIEUP-EU-RIEULPHIEUPH -0x9587 0xBE1B # HANGUL SYLLABLE PIEUP-EU-RIEULHIEUH -0x9588 0xBE1E # HANGUL SYLLABLE PIEUP-EU-PIEUPSIOS -0x9589 0xBE20 # HANGUL SYLLABLE PIEUP-EU-SSANGSIOS -0x958A 0xBE21 # HANGUL SYLLABLE PIEUP-EU-IEUNG -0x958B 0xBE22 # HANGUL SYLLABLE PIEUP-EU-CIEUC -0x958C 0xBE23 # HANGUL SYLLABLE PIEUP-EU-CHIEUCH -0x958D 0xBE24 # HANGUL SYLLABLE PIEUP-EU-KHIEUKH -0x958E 0xBE25 # HANGUL SYLLABLE PIEUP-EU-THIEUTH -0x958F 0xBE26 # HANGUL SYLLABLE PIEUP-EU-PHIEUPH -0x9590 0xBE27 # HANGUL SYLLABLE PIEUP-EU-HIEUH -0x9591 0xBE28 # HANGUL SYLLABLE PIEUP-YI -0x9592 0xBE29 # HANGUL SYLLABLE PIEUP-YI-KIYEOK -0x9593 0xBE2A # HANGUL SYLLABLE PIEUP-YI-SSANGKIYEOK -0x9594 0xBE2B # HANGUL SYLLABLE PIEUP-YI-KIYEOKSIOS -0x9595 0xBE2C # HANGUL SYLLABLE PIEUP-YI-NIEUN -0x9596 0xBE2D # HANGUL SYLLABLE PIEUP-YI-NIEUNCIEUC -0x9597 0xBE2E # HANGUL SYLLABLE PIEUP-YI-NIEUNHIEUH -0x9598 0xBE2F # HANGUL SYLLABLE PIEUP-YI-TIKEUT -0x9599 0xBE30 # HANGUL SYLLABLE PIEUP-YI-RIEUL -0x959A 0xBE31 # HANGUL SYLLABLE PIEUP-YI-RIEULKIYEOK -0x959B 0xBE32 # HANGUL SYLLABLE PIEUP-YI-RIEULMIEUM -0x959C 0xBE33 # HANGUL SYLLABLE PIEUP-YI-RIEULPIEUP -0x959D 0xBE34 # HANGUL SYLLABLE PIEUP-YI-RIEULSIOS -0x959E 0xBE35 # HANGUL SYLLABLE PIEUP-YI-RIEULTHIEUTH -0x959F 0xBE36 # HANGUL SYLLABLE PIEUP-YI-RIEULPHIEUPH -0x95A0 0xBE37 # HANGUL SYLLABLE PIEUP-YI-RIEULHIEUH -0x95A1 0xBE38 # HANGUL SYLLABLE PIEUP-YI-MIEUM -0x95A2 0xBE39 # HANGUL SYLLABLE PIEUP-YI-PIEUP -0x95A3 0xBE3A # HANGUL SYLLABLE PIEUP-YI-PIEUPSIOS -0x95A4 0xBE3B # HANGUL SYLLABLE PIEUP-YI-SIOS -0x95A5 0xBE3C # HANGUL SYLLABLE PIEUP-YI-SSANGSIOS -0x95A6 0xBE3D # HANGUL SYLLABLE PIEUP-YI-IEUNG -0x95A7 0xBE3E # HANGUL SYLLABLE PIEUP-YI-CIEUC -0x95A8 0xBE3F # HANGUL SYLLABLE PIEUP-YI-CHIEUCH -0x95A9 0xBE40 # HANGUL SYLLABLE PIEUP-YI-KHIEUKH -0x95AA 0xBE41 # HANGUL SYLLABLE PIEUP-YI-THIEUTH -0x95AB 0xBE42 # HANGUL SYLLABLE PIEUP-YI-PHIEUPH -0x95AC 0xBE43 # HANGUL SYLLABLE PIEUP-YI-HIEUH -0x95AD 0xBE46 # HANGUL SYLLABLE PIEUP-I-SSANGKIYEOK -0x95AE 0xBE47 # HANGUL SYLLABLE PIEUP-I-KIYEOKSIOS -0x95AF 0xBE49 # HANGUL SYLLABLE PIEUP-I-NIEUNCIEUC -0x95B0 0xBE4A # HANGUL SYLLABLE PIEUP-I-NIEUNHIEUH -0x95B1 0xBE4B # HANGUL SYLLABLE PIEUP-I-TIKEUT -0x95B2 0xBE4D # HANGUL SYLLABLE PIEUP-I-RIEULKIYEOK -0x95B3 0xBE4F # HANGUL SYLLABLE PIEUP-I-RIEULPIEUP -0x95B4 0xBE50 # HANGUL SYLLABLE PIEUP-I-RIEULSIOS -0x95B5 0xBE51 # HANGUL SYLLABLE PIEUP-I-RIEULTHIEUTH -0x95B6 0xBE52 # HANGUL SYLLABLE PIEUP-I-RIEULPHIEUPH -0x95B7 0xBE53 # HANGUL SYLLABLE PIEUP-I-RIEULHIEUH -0x95B8 0xBE56 # HANGUL SYLLABLE PIEUP-I-PIEUPSIOS -0x95B9 0xBE58 # HANGUL SYLLABLE PIEUP-I-SSANGSIOS -0x95BA 0xBE5C # HANGUL SYLLABLE PIEUP-I-KHIEUKH -0x95BB 0xBE5D # HANGUL SYLLABLE PIEUP-I-THIEUTH -0x95BC 0xBE5E # HANGUL SYLLABLE PIEUP-I-PHIEUPH -0x95BD 0xBE5F # HANGUL SYLLABLE PIEUP-I-HIEUH -0x95BE 0xBE62 # HANGUL SYLLABLE SSANGPIEUP-A-SSANGKIYEOK -0x95BF 0xBE63 # HANGUL SYLLABLE SSANGPIEUP-A-KIYEOKSIOS -0x95C0 0xBE65 # HANGUL SYLLABLE SSANGPIEUP-A-NIEUNCIEUC -0x95C1 0xBE66 # HANGUL SYLLABLE SSANGPIEUP-A-NIEUNHIEUH -0x95C2 0xBE67 # HANGUL SYLLABLE SSANGPIEUP-A-TIKEUT -0x95C3 0xBE69 # HANGUL SYLLABLE SSANGPIEUP-A-RIEULKIYEOK -0x95C4 0xBE6B # HANGUL SYLLABLE SSANGPIEUP-A-RIEULPIEUP -0x95C5 0xBE6C # HANGUL SYLLABLE SSANGPIEUP-A-RIEULSIOS -0x95C6 0xBE6D # HANGUL SYLLABLE SSANGPIEUP-A-RIEULTHIEUTH -0x95C7 0xBE6E # HANGUL SYLLABLE SSANGPIEUP-A-RIEULPHIEUPH -0x95C8 0xBE6F # HANGUL SYLLABLE SSANGPIEUP-A-RIEULHIEUH -0x95C9 0xBE72 # HANGUL SYLLABLE SSANGPIEUP-A-PIEUPSIOS -0x95CA 0xBE76 # HANGUL SYLLABLE SSANGPIEUP-A-CIEUC -0x95CB 0xBE77 # HANGUL SYLLABLE SSANGPIEUP-A-CHIEUCH -0x95CC 0xBE78 # HANGUL SYLLABLE SSANGPIEUP-A-KHIEUKH -0x95CD 0xBE79 # HANGUL SYLLABLE SSANGPIEUP-A-THIEUTH -0x95CE 0xBE7A # HANGUL SYLLABLE SSANGPIEUP-A-PHIEUPH -0x95CF 0xBE7E # HANGUL SYLLABLE SSANGPIEUP-AE-SSANGKIYEOK -0x95D0 0xBE7F # HANGUL SYLLABLE SSANGPIEUP-AE-KIYEOKSIOS -0x95D1 0xBE81 # HANGUL SYLLABLE SSANGPIEUP-AE-NIEUNCIEUC -0x95D2 0xBE82 # HANGUL SYLLABLE SSANGPIEUP-AE-NIEUNHIEUH -0x95D3 0xBE83 # HANGUL SYLLABLE SSANGPIEUP-AE-TIKEUT -0x95D4 0xBE85 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULKIYEOK -0x95D5 0xBE86 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULMIEUM -0x95D6 0xBE87 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULPIEUP -0x95D7 0xBE88 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULSIOS -0x95D8 0xBE89 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULTHIEUTH -0x95D9 0xBE8A # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULPHIEUPH -0x95DA 0xBE8B # HANGUL SYLLABLE SSANGPIEUP-AE-RIEULHIEUH -0x95DB 0xBE8E # HANGUL SYLLABLE SSANGPIEUP-AE-PIEUPSIOS -0x95DC 0xBE92 # HANGUL SYLLABLE SSANGPIEUP-AE-CIEUC -0x95DD 0xBE93 # HANGUL SYLLABLE SSANGPIEUP-AE-CHIEUCH -0x95DE 0xBE94 # HANGUL SYLLABLE SSANGPIEUP-AE-KHIEUKH -0x95DF 0xBE95 # HANGUL SYLLABLE SSANGPIEUP-AE-THIEUTH -0x95E0 0xBE96 # HANGUL SYLLABLE SSANGPIEUP-AE-PHIEUPH -0x95E1 0xBE97 # HANGUL SYLLABLE SSANGPIEUP-AE-HIEUH -0x95E2 0xBE9A # HANGUL SYLLABLE SSANGPIEUP-YA-SSANGKIYEOK -0x95E3 0xBE9B # HANGUL SYLLABLE SSANGPIEUP-YA-KIYEOKSIOS -0x95E4 0xBE9C # HANGUL SYLLABLE SSANGPIEUP-YA-NIEUN -0x95E5 0xBE9D # HANGUL SYLLABLE SSANGPIEUP-YA-NIEUNCIEUC -0x95E6 0xBE9E # HANGUL SYLLABLE SSANGPIEUP-YA-NIEUNHIEUH -0x95E7 0xBE9F # HANGUL SYLLABLE SSANGPIEUP-YA-TIKEUT -0x95E8 0xBEA0 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEUL -0x95E9 0xBEA1 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULKIYEOK -0x95EA 0xBEA2 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULMIEUM -0x95EB 0xBEA3 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULPIEUP -0x95EC 0xBEA4 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULSIOS -0x95ED 0xBEA5 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULTHIEUTH -0x95EE 0xBEA6 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULPHIEUPH -0x95EF 0xBEA7 # HANGUL SYLLABLE SSANGPIEUP-YA-RIEULHIEUH -0x95F0 0xBEA9 # HANGUL SYLLABLE SSANGPIEUP-YA-PIEUP -0x95F1 0xBEAA # HANGUL SYLLABLE SSANGPIEUP-YA-PIEUPSIOS -0x95F2 0xBEAB # HANGUL SYLLABLE SSANGPIEUP-YA-SIOS -0x95F3 0xBEAC # HANGUL SYLLABLE SSANGPIEUP-YA-SSANGSIOS -0x95F4 0xBEAD # HANGUL SYLLABLE SSANGPIEUP-YA-IEUNG -0x95F5 0xBEAE # HANGUL SYLLABLE SSANGPIEUP-YA-CIEUC -0x95F6 0xBEAF # HANGUL SYLLABLE SSANGPIEUP-YA-CHIEUCH -0x95F7 0xBEB0 # HANGUL SYLLABLE SSANGPIEUP-YA-KHIEUKH -0x95F8 0xBEB1 # HANGUL SYLLABLE SSANGPIEUP-YA-THIEUTH -0x95F9 0xBEB2 # HANGUL SYLLABLE SSANGPIEUP-YA-PHIEUPH -0x95FA 0xBEB3 # HANGUL SYLLABLE SSANGPIEUP-YA-HIEUH -0x95FB 0xBEB4 # HANGUL SYLLABLE SSANGPIEUP-YAE -0x95FC 0xBEB5 # HANGUL SYLLABLE SSANGPIEUP-YAE-KIYEOK -0x95FD 0xBEB6 # HANGUL SYLLABLE SSANGPIEUP-YAE-SSANGKIYEOK -0x95FE 0xBEB7 # HANGUL SYLLABLE SSANGPIEUP-YAE-KIYEOKSIOS -0x9641 0xBEB8 # HANGUL SYLLABLE SSANGPIEUP-YAE-NIEUN -0x9642 0xBEB9 # HANGUL SYLLABLE SSANGPIEUP-YAE-NIEUNCIEUC -0x9643 0xBEBA # HANGUL SYLLABLE SSANGPIEUP-YAE-NIEUNHIEUH -0x9644 0xBEBB # HANGUL SYLLABLE SSANGPIEUP-YAE-TIKEUT -0x9645 0xBEBC # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEUL -0x9646 0xBEBD # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULKIYEOK -0x9647 0xBEBE # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULMIEUM -0x9648 0xBEBF # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULPIEUP -0x9649 0xBEC0 # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULSIOS -0x964A 0xBEC1 # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULTHIEUTH -0x964B 0xBEC2 # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULPHIEUPH -0x964C 0xBEC3 # HANGUL SYLLABLE SSANGPIEUP-YAE-RIEULHIEUH -0x964D 0xBEC4 # HANGUL SYLLABLE SSANGPIEUP-YAE-MIEUM -0x964E 0xBEC5 # HANGUL SYLLABLE SSANGPIEUP-YAE-PIEUP -0x964F 0xBEC6 # HANGUL SYLLABLE SSANGPIEUP-YAE-PIEUPSIOS -0x9650 0xBEC7 # HANGUL SYLLABLE SSANGPIEUP-YAE-SIOS -0x9651 0xBEC8 # HANGUL SYLLABLE SSANGPIEUP-YAE-SSANGSIOS -0x9652 0xBEC9 # HANGUL SYLLABLE SSANGPIEUP-YAE-IEUNG -0x9653 0xBECA # HANGUL SYLLABLE SSANGPIEUP-YAE-CIEUC -0x9654 0xBECB # HANGUL SYLLABLE SSANGPIEUP-YAE-CHIEUCH -0x9655 0xBECC # HANGUL SYLLABLE SSANGPIEUP-YAE-KHIEUKH -0x9656 0xBECD # HANGUL SYLLABLE SSANGPIEUP-YAE-THIEUTH -0x9657 0xBECE # HANGUL SYLLABLE SSANGPIEUP-YAE-PHIEUPH -0x9658 0xBECF # HANGUL SYLLABLE SSANGPIEUP-YAE-HIEUH -0x9659 0xBED2 # HANGUL SYLLABLE SSANGPIEUP-EO-SSANGKIYEOK -0x965A 0xBED3 # HANGUL SYLLABLE SSANGPIEUP-EO-KIYEOKSIOS -0x9661 0xBED5 # HANGUL SYLLABLE SSANGPIEUP-EO-NIEUNCIEUC -0x9662 0xBED6 # HANGUL SYLLABLE SSANGPIEUP-EO-NIEUNHIEUH -0x9663 0xBED9 # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULKIYEOK -0x9664 0xBEDA # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULMIEUM -0x9665 0xBEDB # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULPIEUP -0x9666 0xBEDC # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULSIOS -0x9667 0xBEDD # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULTHIEUTH -0x9668 0xBEDE # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULPHIEUPH -0x9669 0xBEDF # HANGUL SYLLABLE SSANGPIEUP-EO-RIEULHIEUH -0x966A 0xBEE1 # HANGUL SYLLABLE SSANGPIEUP-EO-PIEUP -0x966B 0xBEE2 # HANGUL SYLLABLE SSANGPIEUP-EO-PIEUPSIOS -0x966C 0xBEE6 # HANGUL SYLLABLE SSANGPIEUP-EO-CIEUC -0x966D 0xBEE7 # HANGUL SYLLABLE SSANGPIEUP-EO-CHIEUCH -0x966E 0xBEE8 # HANGUL SYLLABLE SSANGPIEUP-EO-KHIEUKH -0x966F 0xBEE9 # HANGUL SYLLABLE SSANGPIEUP-EO-THIEUTH -0x9670 0xBEEA # HANGUL SYLLABLE SSANGPIEUP-EO-PHIEUPH -0x9671 0xBEEB # HANGUL SYLLABLE SSANGPIEUP-EO-HIEUH -0x9672 0xBEED # HANGUL SYLLABLE SSANGPIEUP-E-KIYEOK -0x9673 0xBEEE # HANGUL SYLLABLE SSANGPIEUP-E-SSANGKIYEOK -0x9674 0xBEEF # HANGUL SYLLABLE SSANGPIEUP-E-KIYEOKSIOS -0x9675 0xBEF0 # HANGUL SYLLABLE SSANGPIEUP-E-NIEUN -0x9676 0xBEF1 # HANGUL SYLLABLE SSANGPIEUP-E-NIEUNCIEUC -0x9677 0xBEF2 # HANGUL SYLLABLE SSANGPIEUP-E-NIEUNHIEUH -0x9678 0xBEF3 # HANGUL SYLLABLE SSANGPIEUP-E-TIKEUT -0x9679 0xBEF4 # HANGUL SYLLABLE SSANGPIEUP-E-RIEUL -0x967A 0xBEF5 # HANGUL SYLLABLE SSANGPIEUP-E-RIEULKIYEOK -0x9681 0xBEF6 # HANGUL SYLLABLE SSANGPIEUP-E-RIEULMIEUM -0x9682 0xBEF7 # HANGUL SYLLABLE SSANGPIEUP-E-RIEULPIEUP -0x9683 0xBEF8 # HANGUL SYLLABLE SSANGPIEUP-E-RIEULSIOS -0x9684 0xBEF9 # HANGUL SYLLABLE SSANGPIEUP-E-RIEULTHIEUTH -0x9685 0xBEFA # HANGUL SYLLABLE SSANGPIEUP-E-RIEULPHIEUPH -0x9686 0xBEFB # HANGUL SYLLABLE SSANGPIEUP-E-RIEULHIEUH -0x9687 0xBEFC # HANGUL SYLLABLE SSANGPIEUP-E-MIEUM -0x9688 0xBEFD # HANGUL SYLLABLE SSANGPIEUP-E-PIEUP -0x9689 0xBEFE # HANGUL SYLLABLE SSANGPIEUP-E-PIEUPSIOS -0x968A 0xBEFF # HANGUL SYLLABLE SSANGPIEUP-E-SIOS -0x968B 0xBF00 # HANGUL SYLLABLE SSANGPIEUP-E-SSANGSIOS -0x968C 0xBF02 # HANGUL SYLLABLE SSANGPIEUP-E-CIEUC -0x968D 0xBF03 # HANGUL SYLLABLE SSANGPIEUP-E-CHIEUCH -0x968E 0xBF04 # HANGUL SYLLABLE SSANGPIEUP-E-KHIEUKH -0x968F 0xBF05 # HANGUL SYLLABLE SSANGPIEUP-E-THIEUTH -0x9690 0xBF06 # HANGUL SYLLABLE SSANGPIEUP-E-PHIEUPH -0x9691 0xBF07 # HANGUL SYLLABLE SSANGPIEUP-E-HIEUH -0x9692 0xBF0A # HANGUL SYLLABLE SSANGPIEUP-YEO-SSANGKIYEOK -0x9693 0xBF0B # HANGUL SYLLABLE SSANGPIEUP-YEO-KIYEOKSIOS -0x9694 0xBF0C # HANGUL SYLLABLE SSANGPIEUP-YEO-NIEUN -0x9695 0xBF0D # HANGUL SYLLABLE SSANGPIEUP-YEO-NIEUNCIEUC -0x9696 0xBF0E # HANGUL SYLLABLE SSANGPIEUP-YEO-NIEUNHIEUH -0x9697 0xBF0F # HANGUL SYLLABLE SSANGPIEUP-YEO-TIKEUT -0x9698 0xBF10 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEUL -0x9699 0xBF11 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULKIYEOK -0x969A 0xBF12 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULMIEUM -0x969B 0xBF13 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULPIEUP -0x969C 0xBF14 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULSIOS -0x969D 0xBF15 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULTHIEUTH -0x969E 0xBF16 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULPHIEUPH -0x969F 0xBF17 # HANGUL SYLLABLE SSANGPIEUP-YEO-RIEULHIEUH -0x96A0 0xBF1A # HANGUL SYLLABLE SSANGPIEUP-YEO-PIEUPSIOS -0x96A1 0xBF1E # HANGUL SYLLABLE SSANGPIEUP-YEO-CIEUC -0x96A2 0xBF1F # HANGUL SYLLABLE SSANGPIEUP-YEO-CHIEUCH -0x96A3 0xBF20 # HANGUL SYLLABLE SSANGPIEUP-YEO-KHIEUKH -0x96A4 0xBF21 # HANGUL SYLLABLE SSANGPIEUP-YEO-THIEUTH -0x96A5 0xBF22 # HANGUL SYLLABLE SSANGPIEUP-YEO-PHIEUPH -0x96A6 0xBF23 # HANGUL SYLLABLE SSANGPIEUP-YEO-HIEUH -0x96A7 0xBF24 # HANGUL SYLLABLE SSANGPIEUP-YE -0x96A8 0xBF25 # HANGUL SYLLABLE SSANGPIEUP-YE-KIYEOK -0x96A9 0xBF26 # HANGUL SYLLABLE SSANGPIEUP-YE-SSANGKIYEOK -0x96AA 0xBF27 # HANGUL SYLLABLE SSANGPIEUP-YE-KIYEOKSIOS -0x96AB 0xBF28 # HANGUL SYLLABLE SSANGPIEUP-YE-NIEUN -0x96AC 0xBF29 # HANGUL SYLLABLE SSANGPIEUP-YE-NIEUNCIEUC -0x96AD 0xBF2A # HANGUL SYLLABLE SSANGPIEUP-YE-NIEUNHIEUH -0x96AE 0xBF2B # HANGUL SYLLABLE SSANGPIEUP-YE-TIKEUT -0x96AF 0xBF2C # HANGUL SYLLABLE SSANGPIEUP-YE-RIEUL -0x96B0 0xBF2D # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULKIYEOK -0x96B1 0xBF2E # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULMIEUM -0x96B2 0xBF2F # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULPIEUP -0x96B3 0xBF30 # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULSIOS -0x96B4 0xBF31 # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULTHIEUTH -0x96B5 0xBF32 # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULPHIEUPH -0x96B6 0xBF33 # HANGUL SYLLABLE SSANGPIEUP-YE-RIEULHIEUH -0x96B7 0xBF34 # HANGUL SYLLABLE SSANGPIEUP-YE-MIEUM -0x96B8 0xBF35 # HANGUL SYLLABLE SSANGPIEUP-YE-PIEUP -0x96B9 0xBF36 # HANGUL SYLLABLE SSANGPIEUP-YE-PIEUPSIOS -0x96BA 0xBF37 # HANGUL SYLLABLE SSANGPIEUP-YE-SIOS -0x96BB 0xBF38 # HANGUL SYLLABLE SSANGPIEUP-YE-SSANGSIOS -0x96BC 0xBF39 # HANGUL SYLLABLE SSANGPIEUP-YE-IEUNG -0x96BD 0xBF3A # HANGUL SYLLABLE SSANGPIEUP-YE-CIEUC -0x96BE 0xBF3B # HANGUL SYLLABLE SSANGPIEUP-YE-CHIEUCH -0x96BF 0xBF3C # HANGUL SYLLABLE SSANGPIEUP-YE-KHIEUKH -0x96C0 0xBF3D # HANGUL SYLLABLE SSANGPIEUP-YE-THIEUTH -0x96C1 0xBF3E # HANGUL SYLLABLE SSANGPIEUP-YE-PHIEUPH -0x96C2 0xBF3F # HANGUL SYLLABLE SSANGPIEUP-YE-HIEUH -0x96C3 0xBF42 # HANGUL SYLLABLE SSANGPIEUP-O-SSANGKIYEOK -0x96C4 0xBF43 # HANGUL SYLLABLE SSANGPIEUP-O-KIYEOKSIOS -0x96C5 0xBF45 # HANGUL SYLLABLE SSANGPIEUP-O-NIEUNCIEUC -0x96C6 0xBF46 # HANGUL SYLLABLE SSANGPIEUP-O-NIEUNHIEUH -0x96C7 0xBF47 # HANGUL SYLLABLE SSANGPIEUP-O-TIKEUT -0x96C8 0xBF49 # HANGUL SYLLABLE SSANGPIEUP-O-RIEULKIYEOK -0x96C9 0xBF4A # HANGUL SYLLABLE SSANGPIEUP-O-RIEULMIEUM -0x96CA 0xBF4B # HANGUL SYLLABLE SSANGPIEUP-O-RIEULPIEUP -0x96CB 0xBF4C # HANGUL SYLLABLE SSANGPIEUP-O-RIEULSIOS -0x96CC 0xBF4D # HANGUL SYLLABLE SSANGPIEUP-O-RIEULTHIEUTH -0x96CD 0xBF4E # HANGUL SYLLABLE SSANGPIEUP-O-RIEULPHIEUPH -0x96CE 0xBF4F # HANGUL SYLLABLE SSANGPIEUP-O-RIEULHIEUH -0x96CF 0xBF52 # HANGUL SYLLABLE SSANGPIEUP-O-PIEUPSIOS -0x96D0 0xBF53 # HANGUL SYLLABLE SSANGPIEUP-O-SIOS -0x96D1 0xBF54 # HANGUL SYLLABLE SSANGPIEUP-O-SSANGSIOS -0x96D2 0xBF56 # HANGUL SYLLABLE SSANGPIEUP-O-CIEUC -0x96D3 0xBF57 # HANGUL SYLLABLE SSANGPIEUP-O-CHIEUCH -0x96D4 0xBF58 # HANGUL SYLLABLE SSANGPIEUP-O-KHIEUKH -0x96D5 0xBF59 # HANGUL SYLLABLE SSANGPIEUP-O-THIEUTH -0x96D6 0xBF5A # HANGUL SYLLABLE SSANGPIEUP-O-PHIEUPH -0x96D7 0xBF5B # HANGUL SYLLABLE SSANGPIEUP-O-HIEUH -0x96D8 0xBF5C # HANGUL SYLLABLE SSANGPIEUP-WA -0x96D9 0xBF5D # HANGUL SYLLABLE SSANGPIEUP-WA-KIYEOK -0x96DA 0xBF5E # HANGUL SYLLABLE SSANGPIEUP-WA-SSANGKIYEOK -0x96DB 0xBF5F # HANGUL SYLLABLE SSANGPIEUP-WA-KIYEOKSIOS -0x96DC 0xBF60 # HANGUL SYLLABLE SSANGPIEUP-WA-NIEUN -0x96DD 0xBF61 # HANGUL SYLLABLE SSANGPIEUP-WA-NIEUNCIEUC -0x96DE 0xBF62 # HANGUL SYLLABLE SSANGPIEUP-WA-NIEUNHIEUH -0x96DF 0xBF63 # HANGUL SYLLABLE SSANGPIEUP-WA-TIKEUT -0x96E0 0xBF64 # HANGUL SYLLABLE SSANGPIEUP-WA-RIEUL -0x96E1 0xBF65 # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULKIYEOK -0x96E2 0xBF66 # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULMIEUM -0x96E3 0xBF67 # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULPIEUP -0x96E4 0xBF68 # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULSIOS -0x96E5 0xBF69 # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULTHIEUTH -0x96E6 0xBF6A # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULPHIEUPH -0x96E7 0xBF6B # HANGUL SYLLABLE SSANGPIEUP-WA-RIEULHIEUH -0x96E8 0xBF6C # HANGUL SYLLABLE SSANGPIEUP-WA-MIEUM -0x96E9 0xBF6D # HANGUL SYLLABLE SSANGPIEUP-WA-PIEUP -0x96EA 0xBF6E # HANGUL SYLLABLE SSANGPIEUP-WA-PIEUPSIOS -0x96EB 0xBF6F # HANGUL SYLLABLE SSANGPIEUP-WA-SIOS -0x96EC 0xBF70 # HANGUL SYLLABLE SSANGPIEUP-WA-SSANGSIOS -0x96ED 0xBF71 # HANGUL SYLLABLE SSANGPIEUP-WA-IEUNG -0x96EE 0xBF72 # HANGUL SYLLABLE SSANGPIEUP-WA-CIEUC -0x96EF 0xBF73 # HANGUL SYLLABLE SSANGPIEUP-WA-CHIEUCH -0x96F0 0xBF74 # HANGUL SYLLABLE SSANGPIEUP-WA-KHIEUKH -0x96F1 0xBF75 # HANGUL SYLLABLE SSANGPIEUP-WA-THIEUTH -0x96F2 0xBF76 # HANGUL SYLLABLE SSANGPIEUP-WA-PHIEUPH -0x96F3 0xBF77 # HANGUL SYLLABLE SSANGPIEUP-WA-HIEUH -0x96F4 0xBF78 # HANGUL SYLLABLE SSANGPIEUP-WAE -0x96F5 0xBF79 # HANGUL SYLLABLE SSANGPIEUP-WAE-KIYEOK -0x96F6 0xBF7A # HANGUL SYLLABLE SSANGPIEUP-WAE-SSANGKIYEOK -0x96F7 0xBF7B # HANGUL SYLLABLE SSANGPIEUP-WAE-KIYEOKSIOS -0x96F8 0xBF7C # HANGUL SYLLABLE SSANGPIEUP-WAE-NIEUN -0x96F9 0xBF7D # HANGUL SYLLABLE SSANGPIEUP-WAE-NIEUNCIEUC -0x96FA 0xBF7E # HANGUL SYLLABLE SSANGPIEUP-WAE-NIEUNHIEUH -0x96FB 0xBF7F # HANGUL SYLLABLE SSANGPIEUP-WAE-TIKEUT -0x96FC 0xBF80 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEUL -0x96FD 0xBF81 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULKIYEOK -0x96FE 0xBF82 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULMIEUM -0x9741 0xBF83 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULPIEUP -0x9742 0xBF84 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULSIOS -0x9743 0xBF85 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULTHIEUTH -0x9744 0xBF86 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULPHIEUPH -0x9745 0xBF87 # HANGUL SYLLABLE SSANGPIEUP-WAE-RIEULHIEUH -0x9746 0xBF88 # HANGUL SYLLABLE SSANGPIEUP-WAE-MIEUM -0x9747 0xBF89 # HANGUL SYLLABLE SSANGPIEUP-WAE-PIEUP -0x9748 0xBF8A # HANGUL SYLLABLE SSANGPIEUP-WAE-PIEUPSIOS -0x9749 0xBF8B # HANGUL SYLLABLE SSANGPIEUP-WAE-SIOS -0x974A 0xBF8C # HANGUL SYLLABLE SSANGPIEUP-WAE-SSANGSIOS -0x974B 0xBF8D # HANGUL SYLLABLE SSANGPIEUP-WAE-IEUNG -0x974C 0xBF8E # HANGUL SYLLABLE SSANGPIEUP-WAE-CIEUC -0x974D 0xBF8F # HANGUL SYLLABLE SSANGPIEUP-WAE-CHIEUCH -0x974E 0xBF90 # HANGUL SYLLABLE SSANGPIEUP-WAE-KHIEUKH -0x974F 0xBF91 # HANGUL SYLLABLE SSANGPIEUP-WAE-THIEUTH -0x9750 0xBF92 # HANGUL SYLLABLE SSANGPIEUP-WAE-PHIEUPH -0x9751 0xBF93 # HANGUL SYLLABLE SSANGPIEUP-WAE-HIEUH -0x9752 0xBF95 # HANGUL SYLLABLE SSANGPIEUP-OE-KIYEOK -0x9753 0xBF96 # HANGUL SYLLABLE SSANGPIEUP-OE-SSANGKIYEOK -0x9754 0xBF97 # HANGUL SYLLABLE SSANGPIEUP-OE-KIYEOKSIOS -0x9755 0xBF98 # HANGUL SYLLABLE SSANGPIEUP-OE-NIEUN -0x9756 0xBF99 # HANGUL SYLLABLE SSANGPIEUP-OE-NIEUNCIEUC -0x9757 0xBF9A # HANGUL SYLLABLE SSANGPIEUP-OE-NIEUNHIEUH -0x9758 0xBF9B # HANGUL SYLLABLE SSANGPIEUP-OE-TIKEUT -0x9759 0xBF9C # HANGUL SYLLABLE SSANGPIEUP-OE-RIEUL -0x975A 0xBF9D # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULKIYEOK -0x9761 0xBF9E # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULMIEUM -0x9762 0xBF9F # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULPIEUP -0x9763 0xBFA0 # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULSIOS -0x9764 0xBFA1 # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULTHIEUTH -0x9765 0xBFA2 # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULPHIEUPH -0x9766 0xBFA3 # HANGUL SYLLABLE SSANGPIEUP-OE-RIEULHIEUH -0x9767 0xBFA4 # HANGUL SYLLABLE SSANGPIEUP-OE-MIEUM -0x9768 0xBFA5 # HANGUL SYLLABLE SSANGPIEUP-OE-PIEUP -0x9769 0xBFA6 # HANGUL SYLLABLE SSANGPIEUP-OE-PIEUPSIOS -0x976A 0xBFA7 # HANGUL SYLLABLE SSANGPIEUP-OE-SIOS -0x976B 0xBFA8 # HANGUL SYLLABLE SSANGPIEUP-OE-SSANGSIOS -0x976C 0xBFA9 # HANGUL SYLLABLE SSANGPIEUP-OE-IEUNG -0x976D 0xBFAA # HANGUL SYLLABLE SSANGPIEUP-OE-CIEUC -0x976E 0xBFAB # HANGUL SYLLABLE SSANGPIEUP-OE-CHIEUCH -0x976F 0xBFAC # HANGUL SYLLABLE SSANGPIEUP-OE-KHIEUKH -0x9770 0xBFAD # HANGUL SYLLABLE SSANGPIEUP-OE-THIEUTH -0x9771 0xBFAE # HANGUL SYLLABLE SSANGPIEUP-OE-PHIEUPH -0x9772 0xBFAF # HANGUL SYLLABLE SSANGPIEUP-OE-HIEUH -0x9773 0xBFB1 # HANGUL SYLLABLE SSANGPIEUP-YO-KIYEOK -0x9774 0xBFB2 # HANGUL SYLLABLE SSANGPIEUP-YO-SSANGKIYEOK -0x9775 0xBFB3 # HANGUL SYLLABLE SSANGPIEUP-YO-KIYEOKSIOS -0x9776 0xBFB4 # HANGUL SYLLABLE SSANGPIEUP-YO-NIEUN -0x9777 0xBFB5 # HANGUL SYLLABLE SSANGPIEUP-YO-NIEUNCIEUC -0x9778 0xBFB6 # HANGUL SYLLABLE SSANGPIEUP-YO-NIEUNHIEUH -0x9779 0xBFB7 # HANGUL SYLLABLE SSANGPIEUP-YO-TIKEUT -0x977A 0xBFB8 # HANGUL SYLLABLE SSANGPIEUP-YO-RIEUL -0x9781 0xBFB9 # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULKIYEOK -0x9782 0xBFBA # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULMIEUM -0x9783 0xBFBB # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULPIEUP -0x9784 0xBFBC # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULSIOS -0x9785 0xBFBD # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULTHIEUTH -0x9786 0xBFBE # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULPHIEUPH -0x9787 0xBFBF # HANGUL SYLLABLE SSANGPIEUP-YO-RIEULHIEUH -0x9788 0xBFC0 # HANGUL SYLLABLE SSANGPIEUP-YO-MIEUM -0x9789 0xBFC1 # HANGUL SYLLABLE SSANGPIEUP-YO-PIEUP -0x978A 0xBFC2 # HANGUL SYLLABLE SSANGPIEUP-YO-PIEUPSIOS -0x978B 0xBFC3 # HANGUL SYLLABLE SSANGPIEUP-YO-SIOS -0x978C 0xBFC4 # HANGUL SYLLABLE SSANGPIEUP-YO-SSANGSIOS -0x978D 0xBFC6 # HANGUL SYLLABLE SSANGPIEUP-YO-CIEUC -0x978E 0xBFC7 # HANGUL SYLLABLE SSANGPIEUP-YO-CHIEUCH -0x978F 0xBFC8 # HANGUL SYLLABLE SSANGPIEUP-YO-KHIEUKH -0x9790 0xBFC9 # HANGUL SYLLABLE SSANGPIEUP-YO-THIEUTH -0x9791 0xBFCA # HANGUL SYLLABLE SSANGPIEUP-YO-PHIEUPH -0x9792 0xBFCB # HANGUL SYLLABLE SSANGPIEUP-YO-HIEUH -0x9793 0xBFCE # HANGUL SYLLABLE SSANGPIEUP-U-SSANGKIYEOK -0x9794 0xBFCF # HANGUL SYLLABLE SSANGPIEUP-U-KIYEOKSIOS -0x9795 0xBFD1 # HANGUL SYLLABLE SSANGPIEUP-U-NIEUNCIEUC -0x9796 0xBFD2 # HANGUL SYLLABLE SSANGPIEUP-U-NIEUNHIEUH -0x9797 0xBFD3 # HANGUL SYLLABLE SSANGPIEUP-U-TIKEUT -0x9798 0xBFD5 # HANGUL SYLLABLE SSANGPIEUP-U-RIEULKIYEOK -0x9799 0xBFD6 # HANGUL SYLLABLE SSANGPIEUP-U-RIEULMIEUM -0x979A 0xBFD7 # HANGUL SYLLABLE SSANGPIEUP-U-RIEULPIEUP -0x979B 0xBFD8 # HANGUL SYLLABLE SSANGPIEUP-U-RIEULSIOS -0x979C 0xBFD9 # HANGUL SYLLABLE SSANGPIEUP-U-RIEULTHIEUTH -0x979D 0xBFDA # HANGUL SYLLABLE SSANGPIEUP-U-RIEULPHIEUPH -0x979E 0xBFDB # HANGUL SYLLABLE SSANGPIEUP-U-RIEULHIEUH -0x979F 0xBFDD # HANGUL SYLLABLE SSANGPIEUP-U-PIEUP -0x97A0 0xBFDE # HANGUL SYLLABLE SSANGPIEUP-U-PIEUPSIOS -0x97A1 0xBFE0 # HANGUL SYLLABLE SSANGPIEUP-U-SSANGSIOS -0x97A2 0xBFE2 # HANGUL SYLLABLE SSANGPIEUP-U-CIEUC -0x97A3 0xBFE3 # HANGUL SYLLABLE SSANGPIEUP-U-CHIEUCH -0x97A4 0xBFE4 # HANGUL SYLLABLE SSANGPIEUP-U-KHIEUKH -0x97A5 0xBFE5 # HANGUL SYLLABLE SSANGPIEUP-U-THIEUTH -0x97A6 0xBFE6 # HANGUL SYLLABLE SSANGPIEUP-U-PHIEUPH -0x97A7 0xBFE7 # HANGUL SYLLABLE SSANGPIEUP-U-HIEUH -0x97A8 0xBFE8 # HANGUL SYLLABLE SSANGPIEUP-WEO -0x97A9 0xBFE9 # HANGUL SYLLABLE SSANGPIEUP-WEO-KIYEOK -0x97AA 0xBFEA # HANGUL SYLLABLE SSANGPIEUP-WEO-SSANGKIYEOK -0x97AB 0xBFEB # HANGUL SYLLABLE SSANGPIEUP-WEO-KIYEOKSIOS -0x97AC 0xBFEC # HANGUL SYLLABLE SSANGPIEUP-WEO-NIEUN -0x97AD 0xBFED # HANGUL SYLLABLE SSANGPIEUP-WEO-NIEUNCIEUC -0x97AE 0xBFEE # HANGUL SYLLABLE SSANGPIEUP-WEO-NIEUNHIEUH -0x97AF 0xBFEF # HANGUL SYLLABLE SSANGPIEUP-WEO-TIKEUT -0x97B0 0xBFF0 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEUL -0x97B1 0xBFF1 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULKIYEOK -0x97B2 0xBFF2 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULMIEUM -0x97B3 0xBFF3 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULPIEUP -0x97B4 0xBFF4 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULSIOS -0x97B5 0xBFF5 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULTHIEUTH -0x97B6 0xBFF6 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULPHIEUPH -0x97B7 0xBFF7 # HANGUL SYLLABLE SSANGPIEUP-WEO-RIEULHIEUH -0x97B8 0xBFF8 # HANGUL SYLLABLE SSANGPIEUP-WEO-MIEUM -0x97B9 0xBFF9 # HANGUL SYLLABLE SSANGPIEUP-WEO-PIEUP -0x97BA 0xBFFA # HANGUL SYLLABLE SSANGPIEUP-WEO-PIEUPSIOS -0x97BB 0xBFFB # HANGUL SYLLABLE SSANGPIEUP-WEO-SIOS -0x97BC 0xBFFC # HANGUL SYLLABLE SSANGPIEUP-WEO-SSANGSIOS -0x97BD 0xBFFD # HANGUL SYLLABLE SSANGPIEUP-WEO-IEUNG -0x97BE 0xBFFE # HANGUL SYLLABLE SSANGPIEUP-WEO-CIEUC -0x97BF 0xBFFF # HANGUL SYLLABLE SSANGPIEUP-WEO-CHIEUCH -0x97C0 0xC000 # HANGUL SYLLABLE SSANGPIEUP-WEO-KHIEUKH -0x97C1 0xC001 # HANGUL SYLLABLE SSANGPIEUP-WEO-THIEUTH -0x97C2 0xC002 # HANGUL SYLLABLE SSANGPIEUP-WEO-PHIEUPH -0x97C3 0xC003 # HANGUL SYLLABLE SSANGPIEUP-WEO-HIEUH -0x97C4 0xC004 # HANGUL SYLLABLE SSANGPIEUP-WE -0x97C5 0xC005 # HANGUL SYLLABLE SSANGPIEUP-WE-KIYEOK -0x97C6 0xC006 # HANGUL SYLLABLE SSANGPIEUP-WE-SSANGKIYEOK -0x97C7 0xC007 # HANGUL SYLLABLE SSANGPIEUP-WE-KIYEOKSIOS -0x97C8 0xC008 # HANGUL SYLLABLE SSANGPIEUP-WE-NIEUN -0x97C9 0xC009 # HANGUL SYLLABLE SSANGPIEUP-WE-NIEUNCIEUC -0x97CA 0xC00A # HANGUL SYLLABLE SSANGPIEUP-WE-NIEUNHIEUH -0x97CB 0xC00B # HANGUL SYLLABLE SSANGPIEUP-WE-TIKEUT -0x97CC 0xC00C # HANGUL SYLLABLE SSANGPIEUP-WE-RIEUL -0x97CD 0xC00D # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULKIYEOK -0x97CE 0xC00E # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULMIEUM -0x97CF 0xC00F # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULPIEUP -0x97D0 0xC010 # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULSIOS -0x97D1 0xC011 # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULTHIEUTH -0x97D2 0xC012 # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULPHIEUPH -0x97D3 0xC013 # HANGUL SYLLABLE SSANGPIEUP-WE-RIEULHIEUH -0x97D4 0xC014 # HANGUL SYLLABLE SSANGPIEUP-WE-MIEUM -0x97D5 0xC015 # HANGUL SYLLABLE SSANGPIEUP-WE-PIEUP -0x97D6 0xC016 # HANGUL SYLLABLE SSANGPIEUP-WE-PIEUPSIOS -0x97D7 0xC017 # HANGUL SYLLABLE SSANGPIEUP-WE-SIOS -0x97D8 0xC018 # HANGUL SYLLABLE SSANGPIEUP-WE-SSANGSIOS -0x97D9 0xC019 # HANGUL SYLLABLE SSANGPIEUP-WE-IEUNG -0x97DA 0xC01A # HANGUL SYLLABLE SSANGPIEUP-WE-CIEUC -0x97DB 0xC01B # HANGUL SYLLABLE SSANGPIEUP-WE-CHIEUCH -0x97DC 0xC01C # HANGUL SYLLABLE SSANGPIEUP-WE-KHIEUKH -0x97DD 0xC01D # HANGUL SYLLABLE SSANGPIEUP-WE-THIEUTH -0x97DE 0xC01E # HANGUL SYLLABLE SSANGPIEUP-WE-PHIEUPH -0x97DF 0xC01F # HANGUL SYLLABLE SSANGPIEUP-WE-HIEUH -0x97E0 0xC020 # HANGUL SYLLABLE SSANGPIEUP-WI -0x97E1 0xC021 # HANGUL SYLLABLE SSANGPIEUP-WI-KIYEOK -0x97E2 0xC022 # HANGUL SYLLABLE SSANGPIEUP-WI-SSANGKIYEOK -0x97E3 0xC023 # HANGUL SYLLABLE SSANGPIEUP-WI-KIYEOKSIOS -0x97E4 0xC024 # HANGUL SYLLABLE SSANGPIEUP-WI-NIEUN -0x97E5 0xC025 # HANGUL SYLLABLE SSANGPIEUP-WI-NIEUNCIEUC -0x97E6 0xC026 # HANGUL SYLLABLE SSANGPIEUP-WI-NIEUNHIEUH -0x97E7 0xC027 # HANGUL SYLLABLE SSANGPIEUP-WI-TIKEUT -0x97E8 0xC028 # HANGUL SYLLABLE SSANGPIEUP-WI-RIEUL -0x97E9 0xC029 # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULKIYEOK -0x97EA 0xC02A # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULMIEUM -0x97EB 0xC02B # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULPIEUP -0x97EC 0xC02C # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULSIOS -0x97ED 0xC02D # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULTHIEUTH -0x97EE 0xC02E # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULPHIEUPH -0x97EF 0xC02F # HANGUL SYLLABLE SSANGPIEUP-WI-RIEULHIEUH -0x97F0 0xC030 # HANGUL SYLLABLE SSANGPIEUP-WI-MIEUM -0x97F1 0xC031 # HANGUL SYLLABLE SSANGPIEUP-WI-PIEUP -0x97F2 0xC032 # HANGUL SYLLABLE SSANGPIEUP-WI-PIEUPSIOS -0x97F3 0xC033 # HANGUL SYLLABLE SSANGPIEUP-WI-SIOS -0x97F4 0xC034 # HANGUL SYLLABLE SSANGPIEUP-WI-SSANGSIOS -0x97F5 0xC035 # HANGUL SYLLABLE SSANGPIEUP-WI-IEUNG -0x97F6 0xC036 # HANGUL SYLLABLE SSANGPIEUP-WI-CIEUC -0x97F7 0xC037 # HANGUL SYLLABLE SSANGPIEUP-WI-CHIEUCH -0x97F8 0xC038 # HANGUL SYLLABLE SSANGPIEUP-WI-KHIEUKH -0x97F9 0xC039 # HANGUL SYLLABLE SSANGPIEUP-WI-THIEUTH -0x97FA 0xC03A # HANGUL SYLLABLE SSANGPIEUP-WI-PHIEUPH -0x97FB 0xC03B # HANGUL SYLLABLE SSANGPIEUP-WI-HIEUH -0x97FC 0xC03D # HANGUL SYLLABLE SSANGPIEUP-YU-KIYEOK -0x97FD 0xC03E # HANGUL SYLLABLE SSANGPIEUP-YU-SSANGKIYEOK -0x97FE 0xC03F # HANGUL SYLLABLE SSANGPIEUP-YU-KIYEOKSIOS -0x9841 0xC040 # HANGUL SYLLABLE SSANGPIEUP-YU-NIEUN -0x9842 0xC041 # HANGUL SYLLABLE SSANGPIEUP-YU-NIEUNCIEUC -0x9843 0xC042 # HANGUL SYLLABLE SSANGPIEUP-YU-NIEUNHIEUH -0x9844 0xC043 # HANGUL SYLLABLE SSANGPIEUP-YU-TIKEUT -0x9845 0xC044 # HANGUL SYLLABLE SSANGPIEUP-YU-RIEUL -0x9846 0xC045 # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULKIYEOK -0x9847 0xC046 # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULMIEUM -0x9848 0xC047 # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULPIEUP -0x9849 0xC048 # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULSIOS -0x984A 0xC049 # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULTHIEUTH -0x984B 0xC04A # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULPHIEUPH -0x984C 0xC04B # HANGUL SYLLABLE SSANGPIEUP-YU-RIEULHIEUH -0x984D 0xC04C # HANGUL SYLLABLE SSANGPIEUP-YU-MIEUM -0x984E 0xC04D # HANGUL SYLLABLE SSANGPIEUP-YU-PIEUP -0x984F 0xC04E # HANGUL SYLLABLE SSANGPIEUP-YU-PIEUPSIOS -0x9850 0xC04F # HANGUL SYLLABLE SSANGPIEUP-YU-SIOS -0x9851 0xC050 # HANGUL SYLLABLE SSANGPIEUP-YU-SSANGSIOS -0x9852 0xC052 # HANGUL SYLLABLE SSANGPIEUP-YU-CIEUC -0x9853 0xC053 # HANGUL SYLLABLE SSANGPIEUP-YU-CHIEUCH -0x9854 0xC054 # HANGUL SYLLABLE SSANGPIEUP-YU-KHIEUKH -0x9855 0xC055 # HANGUL SYLLABLE SSANGPIEUP-YU-THIEUTH -0x9856 0xC056 # HANGUL SYLLABLE SSANGPIEUP-YU-PHIEUPH -0x9857 0xC057 # HANGUL SYLLABLE SSANGPIEUP-YU-HIEUH -0x9858 0xC059 # HANGUL SYLLABLE SSANGPIEUP-EU-KIYEOK -0x9859 0xC05A # HANGUL SYLLABLE SSANGPIEUP-EU-SSANGKIYEOK -0x985A 0xC05B # HANGUL SYLLABLE SSANGPIEUP-EU-KIYEOKSIOS -0x9861 0xC05D # HANGUL SYLLABLE SSANGPIEUP-EU-NIEUNCIEUC -0x9862 0xC05E # HANGUL SYLLABLE SSANGPIEUP-EU-NIEUNHIEUH -0x9863 0xC05F # HANGUL SYLLABLE SSANGPIEUP-EU-TIKEUT -0x9864 0xC061 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULKIYEOK -0x9865 0xC062 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULMIEUM -0x9866 0xC063 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULPIEUP -0x9867 0xC064 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULSIOS -0x9868 0xC065 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULTHIEUTH -0x9869 0xC066 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULPHIEUPH -0x986A 0xC067 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEULHIEUH -0x986B 0xC06A # HANGUL SYLLABLE SSANGPIEUP-EU-PIEUPSIOS -0x986C 0xC06B # HANGUL SYLLABLE SSANGPIEUP-EU-SIOS -0x986D 0xC06C # HANGUL SYLLABLE SSANGPIEUP-EU-SSANGSIOS -0x986E 0xC06D # HANGUL SYLLABLE SSANGPIEUP-EU-IEUNG -0x986F 0xC06E # HANGUL SYLLABLE SSANGPIEUP-EU-CIEUC -0x9870 0xC06F # HANGUL SYLLABLE SSANGPIEUP-EU-CHIEUCH -0x9871 0xC070 # HANGUL SYLLABLE SSANGPIEUP-EU-KHIEUKH -0x9872 0xC071 # HANGUL SYLLABLE SSANGPIEUP-EU-THIEUTH -0x9873 0xC072 # HANGUL SYLLABLE SSANGPIEUP-EU-PHIEUPH -0x9874 0xC073 # HANGUL SYLLABLE SSANGPIEUP-EU-HIEUH -0x9875 0xC074 # HANGUL SYLLABLE SSANGPIEUP-YI -0x9876 0xC075 # HANGUL SYLLABLE SSANGPIEUP-YI-KIYEOK -0x9877 0xC076 # HANGUL SYLLABLE SSANGPIEUP-YI-SSANGKIYEOK -0x9878 0xC077 # HANGUL SYLLABLE SSANGPIEUP-YI-KIYEOKSIOS -0x9879 0xC078 # HANGUL SYLLABLE SSANGPIEUP-YI-NIEUN -0x987A 0xC079 # HANGUL SYLLABLE SSANGPIEUP-YI-NIEUNCIEUC -0x9881 0xC07A # HANGUL SYLLABLE SSANGPIEUP-YI-NIEUNHIEUH -0x9882 0xC07B # HANGUL SYLLABLE SSANGPIEUP-YI-TIKEUT -0x9883 0xC07C # HANGUL SYLLABLE SSANGPIEUP-YI-RIEUL -0x9884 0xC07D # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULKIYEOK -0x9885 0xC07E # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULMIEUM -0x9886 0xC07F # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULPIEUP -0x9887 0xC080 # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULSIOS -0x9888 0xC081 # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULTHIEUTH -0x9889 0xC082 # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULPHIEUPH -0x988A 0xC083 # HANGUL SYLLABLE SSANGPIEUP-YI-RIEULHIEUH -0x988B 0xC084 # HANGUL SYLLABLE SSANGPIEUP-YI-MIEUM -0x988C 0xC085 # HANGUL SYLLABLE SSANGPIEUP-YI-PIEUP -0x988D 0xC086 # HANGUL SYLLABLE SSANGPIEUP-YI-PIEUPSIOS -0x988E 0xC087 # HANGUL SYLLABLE SSANGPIEUP-YI-SIOS -0x988F 0xC088 # HANGUL SYLLABLE SSANGPIEUP-YI-SSANGSIOS -0x9890 0xC089 # HANGUL SYLLABLE SSANGPIEUP-YI-IEUNG -0x9891 0xC08A # HANGUL SYLLABLE SSANGPIEUP-YI-CIEUC -0x9892 0xC08B # HANGUL SYLLABLE SSANGPIEUP-YI-CHIEUCH -0x9893 0xC08C # HANGUL SYLLABLE SSANGPIEUP-YI-KHIEUKH -0x9894 0xC08D # HANGUL SYLLABLE SSANGPIEUP-YI-THIEUTH -0x9895 0xC08E # HANGUL SYLLABLE SSANGPIEUP-YI-PHIEUPH -0x9896 0xC08F # HANGUL SYLLABLE SSANGPIEUP-YI-HIEUH -0x9897 0xC092 # HANGUL SYLLABLE SSANGPIEUP-I-SSANGKIYEOK -0x9898 0xC093 # HANGUL SYLLABLE SSANGPIEUP-I-KIYEOKSIOS -0x9899 0xC095 # HANGUL SYLLABLE SSANGPIEUP-I-NIEUNCIEUC -0x989A 0xC096 # HANGUL SYLLABLE SSANGPIEUP-I-NIEUNHIEUH -0x989B 0xC097 # HANGUL SYLLABLE SSANGPIEUP-I-TIKEUT -0x989C 0xC099 # HANGUL SYLLABLE SSANGPIEUP-I-RIEULKIYEOK -0x989D 0xC09A # HANGUL SYLLABLE SSANGPIEUP-I-RIEULMIEUM -0x989E 0xC09B # HANGUL SYLLABLE SSANGPIEUP-I-RIEULPIEUP -0x989F 0xC09C # HANGUL SYLLABLE SSANGPIEUP-I-RIEULSIOS -0x98A0 0xC09D # HANGUL SYLLABLE SSANGPIEUP-I-RIEULTHIEUTH -0x98A1 0xC09E # HANGUL SYLLABLE SSANGPIEUP-I-RIEULPHIEUPH -0x98A2 0xC09F # HANGUL SYLLABLE SSANGPIEUP-I-RIEULHIEUH -0x98A3 0xC0A2 # HANGUL SYLLABLE SSANGPIEUP-I-PIEUPSIOS -0x98A4 0xC0A4 # HANGUL SYLLABLE SSANGPIEUP-I-SSANGSIOS -0x98A5 0xC0A6 # HANGUL SYLLABLE SSANGPIEUP-I-CIEUC -0x98A6 0xC0A7 # HANGUL SYLLABLE SSANGPIEUP-I-CHIEUCH -0x98A7 0xC0A8 # HANGUL SYLLABLE SSANGPIEUP-I-KHIEUKH -0x98A8 0xC0A9 # HANGUL SYLLABLE SSANGPIEUP-I-THIEUTH -0x98A9 0xC0AA # HANGUL SYLLABLE SSANGPIEUP-I-PHIEUPH -0x98AA 0xC0AB # HANGUL SYLLABLE SSANGPIEUP-I-HIEUH -0x98AB 0xC0AE # HANGUL SYLLABLE SIOS-A-SSANGKIYEOK -0x98AC 0xC0B1 # HANGUL SYLLABLE SIOS-A-NIEUNCIEUC -0x98AD 0xC0B2 # HANGUL SYLLABLE SIOS-A-NIEUNHIEUH -0x98AE 0xC0B7 # HANGUL SYLLABLE SIOS-A-RIEULPIEUP -0x98AF 0xC0B8 # HANGUL SYLLABLE SIOS-A-RIEULSIOS -0x98B0 0xC0B9 # HANGUL SYLLABLE SIOS-A-RIEULTHIEUTH -0x98B1 0xC0BA # HANGUL SYLLABLE SIOS-A-RIEULPHIEUPH -0x98B2 0xC0BB # HANGUL SYLLABLE SIOS-A-RIEULHIEUH -0x98B3 0xC0BE # HANGUL SYLLABLE SIOS-A-PIEUPSIOS -0x98B4 0xC0C2 # HANGUL SYLLABLE SIOS-A-CIEUC -0x98B5 0xC0C3 # HANGUL SYLLABLE SIOS-A-CHIEUCH -0x98B6 0xC0C4 # HANGUL SYLLABLE SIOS-A-KHIEUKH -0x98B7 0xC0C6 # HANGUL SYLLABLE SIOS-A-PHIEUPH -0x98B8 0xC0C7 # HANGUL SYLLABLE SIOS-A-HIEUH -0x98B9 0xC0CA # HANGUL SYLLABLE SIOS-AE-SSANGKIYEOK -0x98BA 0xC0CB # HANGUL SYLLABLE SIOS-AE-KIYEOKSIOS -0x98BB 0xC0CD # HANGUL SYLLABLE SIOS-AE-NIEUNCIEUC -0x98BC 0xC0CE # HANGUL SYLLABLE SIOS-AE-NIEUNHIEUH -0x98BD 0xC0CF # HANGUL SYLLABLE SIOS-AE-TIKEUT -0x98BE 0xC0D1 # HANGUL SYLLABLE SIOS-AE-RIEULKIYEOK -0x98BF 0xC0D2 # HANGUL SYLLABLE SIOS-AE-RIEULMIEUM -0x98C0 0xC0D3 # HANGUL SYLLABLE SIOS-AE-RIEULPIEUP -0x98C1 0xC0D4 # HANGUL SYLLABLE SIOS-AE-RIEULSIOS -0x98C2 0xC0D5 # HANGUL SYLLABLE SIOS-AE-RIEULTHIEUTH -0x98C3 0xC0D6 # HANGUL SYLLABLE SIOS-AE-RIEULPHIEUPH -0x98C4 0xC0D7 # HANGUL SYLLABLE SIOS-AE-RIEULHIEUH -0x98C5 0xC0DA # HANGUL SYLLABLE SIOS-AE-PIEUPSIOS -0x98C6 0xC0DE # HANGUL SYLLABLE SIOS-AE-CIEUC -0x98C7 0xC0DF # HANGUL SYLLABLE SIOS-AE-CHIEUCH -0x98C8 0xC0E0 # HANGUL SYLLABLE SIOS-AE-KHIEUKH -0x98C9 0xC0E1 # HANGUL SYLLABLE SIOS-AE-THIEUTH -0x98CA 0xC0E2 # HANGUL SYLLABLE SIOS-AE-PHIEUPH -0x98CB 0xC0E3 # HANGUL SYLLABLE SIOS-AE-HIEUH -0x98CC 0xC0E6 # HANGUL SYLLABLE SIOS-YA-SSANGKIYEOK -0x98CD 0xC0E7 # HANGUL SYLLABLE SIOS-YA-KIYEOKSIOS -0x98CE 0xC0E9 # HANGUL SYLLABLE SIOS-YA-NIEUNCIEUC -0x98CF 0xC0EA # HANGUL SYLLABLE SIOS-YA-NIEUNHIEUH -0x98D0 0xC0EB # HANGUL SYLLABLE SIOS-YA-TIKEUT -0x98D1 0xC0ED # HANGUL SYLLABLE SIOS-YA-RIEULKIYEOK -0x98D2 0xC0EE # HANGUL SYLLABLE SIOS-YA-RIEULMIEUM -0x98D3 0xC0EF # HANGUL SYLLABLE SIOS-YA-RIEULPIEUP -0x98D4 0xC0F0 # HANGUL SYLLABLE SIOS-YA-RIEULSIOS -0x98D5 0xC0F1 # HANGUL SYLLABLE SIOS-YA-RIEULTHIEUTH -0x98D6 0xC0F2 # HANGUL SYLLABLE SIOS-YA-RIEULPHIEUPH -0x98D7 0xC0F3 # HANGUL SYLLABLE SIOS-YA-RIEULHIEUH -0x98D8 0xC0F6 # HANGUL SYLLABLE SIOS-YA-PIEUPSIOS -0x98D9 0xC0F8 # HANGUL SYLLABLE SIOS-YA-SSANGSIOS -0x98DA 0xC0FA # HANGUL SYLLABLE SIOS-YA-CIEUC -0x98DB 0xC0FB # HANGUL SYLLABLE SIOS-YA-CHIEUCH -0x98DC 0xC0FC # HANGUL SYLLABLE SIOS-YA-KHIEUKH -0x98DD 0xC0FD # HANGUL SYLLABLE SIOS-YA-THIEUTH -0x98DE 0xC0FE # HANGUL SYLLABLE SIOS-YA-PHIEUPH -0x98DF 0xC0FF # HANGUL SYLLABLE SIOS-YA-HIEUH -0x98E0 0xC101 # HANGUL SYLLABLE SIOS-YAE-KIYEOK -0x98E1 0xC102 # HANGUL SYLLABLE SIOS-YAE-SSANGKIYEOK -0x98E2 0xC103 # HANGUL SYLLABLE SIOS-YAE-KIYEOKSIOS -0x98E3 0xC105 # HANGUL SYLLABLE SIOS-YAE-NIEUNCIEUC -0x98E4 0xC106 # HANGUL SYLLABLE SIOS-YAE-NIEUNHIEUH -0x98E5 0xC107 # HANGUL SYLLABLE SIOS-YAE-TIKEUT -0x98E6 0xC109 # HANGUL SYLLABLE SIOS-YAE-RIEULKIYEOK -0x98E7 0xC10A # HANGUL SYLLABLE SIOS-YAE-RIEULMIEUM -0x98E8 0xC10B # HANGUL SYLLABLE SIOS-YAE-RIEULPIEUP -0x98E9 0xC10C # HANGUL SYLLABLE SIOS-YAE-RIEULSIOS -0x98EA 0xC10D # HANGUL SYLLABLE SIOS-YAE-RIEULTHIEUTH -0x98EB 0xC10E # HANGUL SYLLABLE SIOS-YAE-RIEULPHIEUPH -0x98EC 0xC10F # HANGUL SYLLABLE SIOS-YAE-RIEULHIEUH -0x98ED 0xC111 # HANGUL SYLLABLE SIOS-YAE-PIEUP -0x98EE 0xC112 # HANGUL SYLLABLE SIOS-YAE-PIEUPSIOS -0x98EF 0xC113 # HANGUL SYLLABLE SIOS-YAE-SIOS -0x98F0 0xC114 # HANGUL SYLLABLE SIOS-YAE-SSANGSIOS -0x98F1 0xC116 # HANGUL SYLLABLE SIOS-YAE-CIEUC -0x98F2 0xC117 # HANGUL SYLLABLE SIOS-YAE-CHIEUCH -0x98F3 0xC118 # HANGUL SYLLABLE SIOS-YAE-KHIEUKH -0x98F4 0xC119 # HANGUL SYLLABLE SIOS-YAE-THIEUTH -0x98F5 0xC11A # HANGUL SYLLABLE SIOS-YAE-PHIEUPH -0x98F6 0xC11B # HANGUL SYLLABLE SIOS-YAE-HIEUH -0x98F7 0xC121 # HANGUL SYLLABLE SIOS-EO-NIEUNCIEUC -0x98F8 0xC122 # HANGUL SYLLABLE SIOS-EO-NIEUNHIEUH -0x98F9 0xC125 # HANGUL SYLLABLE SIOS-EO-RIEULKIYEOK -0x98FA 0xC128 # HANGUL SYLLABLE SIOS-EO-RIEULSIOS -0x98FB 0xC129 # HANGUL SYLLABLE SIOS-EO-RIEULTHIEUTH -0x98FC 0xC12A # HANGUL SYLLABLE SIOS-EO-RIEULPHIEUPH -0x98FD 0xC12B # HANGUL SYLLABLE SIOS-EO-RIEULHIEUH -0x98FE 0xC12E # HANGUL SYLLABLE SIOS-EO-PIEUPSIOS -0x9941 0xC132 # HANGUL SYLLABLE SIOS-EO-CIEUC -0x9942 0xC133 # HANGUL SYLLABLE SIOS-EO-CHIEUCH -0x9943 0xC134 # HANGUL SYLLABLE SIOS-EO-KHIEUKH -0x9944 0xC135 # HANGUL SYLLABLE SIOS-EO-THIEUTH -0x9945 0xC137 # HANGUL SYLLABLE SIOS-EO-HIEUH -0x9946 0xC13A # HANGUL SYLLABLE SIOS-E-SSANGKIYEOK -0x9947 0xC13B # HANGUL SYLLABLE SIOS-E-KIYEOKSIOS -0x9948 0xC13D # HANGUL SYLLABLE SIOS-E-NIEUNCIEUC -0x9949 0xC13E # HANGUL SYLLABLE SIOS-E-NIEUNHIEUH -0x994A 0xC13F # HANGUL SYLLABLE SIOS-E-TIKEUT -0x994B 0xC141 # HANGUL SYLLABLE SIOS-E-RIEULKIYEOK -0x994C 0xC142 # HANGUL SYLLABLE SIOS-E-RIEULMIEUM -0x994D 0xC143 # HANGUL SYLLABLE SIOS-E-RIEULPIEUP -0x994E 0xC144 # HANGUL SYLLABLE SIOS-E-RIEULSIOS -0x994F 0xC145 # HANGUL SYLLABLE SIOS-E-RIEULTHIEUTH -0x9950 0xC146 # HANGUL SYLLABLE SIOS-E-RIEULPHIEUPH -0x9951 0xC147 # HANGUL SYLLABLE SIOS-E-RIEULHIEUH -0x9952 0xC14A # HANGUL SYLLABLE SIOS-E-PIEUPSIOS -0x9953 0xC14E # HANGUL SYLLABLE SIOS-E-CIEUC -0x9954 0xC14F # HANGUL SYLLABLE SIOS-E-CHIEUCH -0x9955 0xC150 # HANGUL SYLLABLE SIOS-E-KHIEUKH -0x9956 0xC151 # HANGUL SYLLABLE SIOS-E-THIEUTH -0x9957 0xC152 # HANGUL SYLLABLE SIOS-E-PHIEUPH -0x9958 0xC153 # HANGUL SYLLABLE SIOS-E-HIEUH -0x9959 0xC156 # HANGUL SYLLABLE SIOS-YEO-SSANGKIYEOK -0x995A 0xC157 # HANGUL SYLLABLE SIOS-YEO-KIYEOKSIOS -0x9961 0xC159 # HANGUL SYLLABLE SIOS-YEO-NIEUNCIEUC -0x9962 0xC15A # HANGUL SYLLABLE SIOS-YEO-NIEUNHIEUH -0x9963 0xC15B # HANGUL SYLLABLE SIOS-YEO-TIKEUT -0x9964 0xC15D # HANGUL SYLLABLE SIOS-YEO-RIEULKIYEOK -0x9965 0xC15E # HANGUL SYLLABLE SIOS-YEO-RIEULMIEUM -0x9966 0xC15F # HANGUL SYLLABLE SIOS-YEO-RIEULPIEUP -0x9967 0xC160 # HANGUL SYLLABLE SIOS-YEO-RIEULSIOS -0x9968 0xC161 # HANGUL SYLLABLE SIOS-YEO-RIEULTHIEUTH -0x9969 0xC162 # HANGUL SYLLABLE SIOS-YEO-RIEULPHIEUPH -0x996A 0xC163 # HANGUL SYLLABLE SIOS-YEO-RIEULHIEUH -0x996B 0xC166 # HANGUL SYLLABLE SIOS-YEO-PIEUPSIOS -0x996C 0xC16A # HANGUL SYLLABLE SIOS-YEO-CIEUC -0x996D 0xC16B # HANGUL SYLLABLE SIOS-YEO-CHIEUCH -0x996E 0xC16C # HANGUL SYLLABLE SIOS-YEO-KHIEUKH -0x996F 0xC16D # HANGUL SYLLABLE SIOS-YEO-THIEUTH -0x9970 0xC16E # HANGUL SYLLABLE SIOS-YEO-PHIEUPH -0x9971 0xC16F # HANGUL SYLLABLE SIOS-YEO-HIEUH -0x9972 0xC171 # HANGUL SYLLABLE SIOS-YE-KIYEOK -0x9973 0xC172 # HANGUL SYLLABLE SIOS-YE-SSANGKIYEOK -0x9974 0xC173 # HANGUL SYLLABLE SIOS-YE-KIYEOKSIOS -0x9975 0xC175 # HANGUL SYLLABLE SIOS-YE-NIEUNCIEUC -0x9976 0xC176 # HANGUL SYLLABLE SIOS-YE-NIEUNHIEUH -0x9977 0xC177 # HANGUL SYLLABLE SIOS-YE-TIKEUT -0x9978 0xC179 # HANGUL SYLLABLE SIOS-YE-RIEULKIYEOK -0x9979 0xC17A # HANGUL SYLLABLE SIOS-YE-RIEULMIEUM -0x997A 0xC17B # HANGUL SYLLABLE SIOS-YE-RIEULPIEUP -0x9981 0xC17C # HANGUL SYLLABLE SIOS-YE-RIEULSIOS -0x9982 0xC17D # HANGUL SYLLABLE SIOS-YE-RIEULTHIEUTH -0x9983 0xC17E # HANGUL SYLLABLE SIOS-YE-RIEULPHIEUPH -0x9984 0xC17F # HANGUL SYLLABLE SIOS-YE-RIEULHIEUH -0x9985 0xC180 # HANGUL SYLLABLE SIOS-YE-MIEUM -0x9986 0xC181 # HANGUL SYLLABLE SIOS-YE-PIEUP -0x9987 0xC182 # HANGUL SYLLABLE SIOS-YE-PIEUPSIOS -0x9988 0xC183 # HANGUL SYLLABLE SIOS-YE-SIOS -0x9989 0xC184 # HANGUL SYLLABLE SIOS-YE-SSANGSIOS -0x998A 0xC186 # HANGUL SYLLABLE SIOS-YE-CIEUC -0x998B 0xC187 # HANGUL SYLLABLE SIOS-YE-CHIEUCH -0x998C 0xC188 # HANGUL SYLLABLE SIOS-YE-KHIEUKH -0x998D 0xC189 # HANGUL SYLLABLE SIOS-YE-THIEUTH -0x998E 0xC18A # HANGUL SYLLABLE SIOS-YE-PHIEUPH -0x998F 0xC18B # HANGUL SYLLABLE SIOS-YE-HIEUH -0x9990 0xC18F # HANGUL SYLLABLE SIOS-O-KIYEOKSIOS -0x9991 0xC191 # HANGUL SYLLABLE SIOS-O-NIEUNCIEUC -0x9992 0xC192 # HANGUL SYLLABLE SIOS-O-NIEUNHIEUH -0x9993 0xC193 # HANGUL SYLLABLE SIOS-O-TIKEUT -0x9994 0xC195 # HANGUL SYLLABLE SIOS-O-RIEULKIYEOK -0x9995 0xC197 # HANGUL SYLLABLE SIOS-O-RIEULPIEUP -0x9996 0xC198 # HANGUL SYLLABLE SIOS-O-RIEULSIOS -0x9997 0xC199 # HANGUL SYLLABLE SIOS-O-RIEULTHIEUTH -0x9998 0xC19A # HANGUL SYLLABLE SIOS-O-RIEULPHIEUPH -0x9999 0xC19B # HANGUL SYLLABLE SIOS-O-RIEULHIEUH -0x999A 0xC19E # HANGUL SYLLABLE SIOS-O-PIEUPSIOS -0x999B 0xC1A0 # HANGUL SYLLABLE SIOS-O-SSANGSIOS -0x999C 0xC1A2 # HANGUL SYLLABLE SIOS-O-CIEUC -0x999D 0xC1A3 # HANGUL SYLLABLE SIOS-O-CHIEUCH -0x999E 0xC1A4 # HANGUL SYLLABLE SIOS-O-KHIEUKH -0x999F 0xC1A6 # HANGUL SYLLABLE SIOS-O-PHIEUPH -0x99A0 0xC1A7 # HANGUL SYLLABLE SIOS-O-HIEUH -0x99A1 0xC1AA # HANGUL SYLLABLE SIOS-WA-SSANGKIYEOK -0x99A2 0xC1AB # HANGUL SYLLABLE SIOS-WA-KIYEOKSIOS -0x99A3 0xC1AD # HANGUL SYLLABLE SIOS-WA-NIEUNCIEUC -0x99A4 0xC1AE # HANGUL SYLLABLE SIOS-WA-NIEUNHIEUH -0x99A5 0xC1AF # HANGUL SYLLABLE SIOS-WA-TIKEUT -0x99A6 0xC1B1 # HANGUL SYLLABLE SIOS-WA-RIEULKIYEOK -0x99A7 0xC1B2 # HANGUL SYLLABLE SIOS-WA-RIEULMIEUM -0x99A8 0xC1B3 # HANGUL SYLLABLE SIOS-WA-RIEULPIEUP -0x99A9 0xC1B4 # HANGUL SYLLABLE SIOS-WA-RIEULSIOS -0x99AA 0xC1B5 # HANGUL SYLLABLE SIOS-WA-RIEULTHIEUTH -0x99AB 0xC1B6 # HANGUL SYLLABLE SIOS-WA-RIEULPHIEUPH -0x99AC 0xC1B7 # HANGUL SYLLABLE SIOS-WA-RIEULHIEUH -0x99AD 0xC1B8 # HANGUL SYLLABLE SIOS-WA-MIEUM -0x99AE 0xC1B9 # HANGUL SYLLABLE SIOS-WA-PIEUP -0x99AF 0xC1BA # HANGUL SYLLABLE SIOS-WA-PIEUPSIOS -0x99B0 0xC1BB # HANGUL SYLLABLE SIOS-WA-SIOS -0x99B1 0xC1BC # HANGUL SYLLABLE SIOS-WA-SSANGSIOS -0x99B2 0xC1BE # HANGUL SYLLABLE SIOS-WA-CIEUC -0x99B3 0xC1BF # HANGUL SYLLABLE SIOS-WA-CHIEUCH -0x99B4 0xC1C0 # HANGUL SYLLABLE SIOS-WA-KHIEUKH -0x99B5 0xC1C1 # HANGUL SYLLABLE SIOS-WA-THIEUTH -0x99B6 0xC1C2 # HANGUL SYLLABLE SIOS-WA-PHIEUPH -0x99B7 0xC1C3 # HANGUL SYLLABLE SIOS-WA-HIEUH -0x99B8 0xC1C5 # HANGUL SYLLABLE SIOS-WAE-KIYEOK -0x99B9 0xC1C6 # HANGUL SYLLABLE SIOS-WAE-SSANGKIYEOK -0x99BA 0xC1C7 # HANGUL SYLLABLE SIOS-WAE-KIYEOKSIOS -0x99BB 0xC1C9 # HANGUL SYLLABLE SIOS-WAE-NIEUNCIEUC -0x99BC 0xC1CA # HANGUL SYLLABLE SIOS-WAE-NIEUNHIEUH -0x99BD 0xC1CB # HANGUL SYLLABLE SIOS-WAE-TIKEUT -0x99BE 0xC1CD # HANGUL SYLLABLE SIOS-WAE-RIEULKIYEOK -0x99BF 0xC1CE # HANGUL SYLLABLE SIOS-WAE-RIEULMIEUM -0x99C0 0xC1CF # HANGUL SYLLABLE SIOS-WAE-RIEULPIEUP -0x99C1 0xC1D0 # HANGUL SYLLABLE SIOS-WAE-RIEULSIOS -0x99C2 0xC1D1 # HANGUL SYLLABLE SIOS-WAE-RIEULTHIEUTH -0x99C3 0xC1D2 # HANGUL SYLLABLE SIOS-WAE-RIEULPHIEUPH -0x99C4 0xC1D3 # HANGUL SYLLABLE SIOS-WAE-RIEULHIEUH -0x99C5 0xC1D5 # HANGUL SYLLABLE SIOS-WAE-PIEUP -0x99C6 0xC1D6 # HANGUL SYLLABLE SIOS-WAE-PIEUPSIOS -0x99C7 0xC1D9 # HANGUL SYLLABLE SIOS-WAE-IEUNG -0x99C8 0xC1DA # HANGUL SYLLABLE SIOS-WAE-CIEUC -0x99C9 0xC1DB # HANGUL SYLLABLE SIOS-WAE-CHIEUCH -0x99CA 0xC1DC # HANGUL SYLLABLE SIOS-WAE-KHIEUKH -0x99CB 0xC1DD # HANGUL SYLLABLE SIOS-WAE-THIEUTH -0x99CC 0xC1DE # HANGUL SYLLABLE SIOS-WAE-PHIEUPH -0x99CD 0xC1DF # HANGUL SYLLABLE SIOS-WAE-HIEUH -0x99CE 0xC1E1 # HANGUL SYLLABLE SIOS-OE-KIYEOK -0x99CF 0xC1E2 # HANGUL SYLLABLE SIOS-OE-SSANGKIYEOK -0x99D0 0xC1E3 # HANGUL SYLLABLE SIOS-OE-KIYEOKSIOS -0x99D1 0xC1E5 # HANGUL SYLLABLE SIOS-OE-NIEUNCIEUC -0x99D2 0xC1E6 # HANGUL SYLLABLE SIOS-OE-NIEUNHIEUH -0x99D3 0xC1E7 # HANGUL SYLLABLE SIOS-OE-TIKEUT -0x99D4 0xC1E9 # HANGUL SYLLABLE SIOS-OE-RIEULKIYEOK -0x99D5 0xC1EA # HANGUL SYLLABLE SIOS-OE-RIEULMIEUM -0x99D6 0xC1EB # HANGUL SYLLABLE SIOS-OE-RIEULPIEUP -0x99D7 0xC1EC # HANGUL SYLLABLE SIOS-OE-RIEULSIOS -0x99D8 0xC1ED # HANGUL SYLLABLE SIOS-OE-RIEULTHIEUTH -0x99D9 0xC1EE # HANGUL SYLLABLE SIOS-OE-RIEULPHIEUPH -0x99DA 0xC1EF # HANGUL SYLLABLE SIOS-OE-RIEULHIEUH -0x99DB 0xC1F2 # HANGUL SYLLABLE SIOS-OE-PIEUPSIOS -0x99DC 0xC1F4 # HANGUL SYLLABLE SIOS-OE-SSANGSIOS -0x99DD 0xC1F5 # HANGUL SYLLABLE SIOS-OE-IEUNG -0x99DE 0xC1F6 # HANGUL SYLLABLE SIOS-OE-CIEUC -0x99DF 0xC1F7 # HANGUL SYLLABLE SIOS-OE-CHIEUCH -0x99E0 0xC1F8 # HANGUL SYLLABLE SIOS-OE-KHIEUKH -0x99E1 0xC1F9 # HANGUL SYLLABLE SIOS-OE-THIEUTH -0x99E2 0xC1FA # HANGUL SYLLABLE SIOS-OE-PHIEUPH -0x99E3 0xC1FB # HANGUL SYLLABLE SIOS-OE-HIEUH -0x99E4 0xC1FE # HANGUL SYLLABLE SIOS-YO-SSANGKIYEOK -0x99E5 0xC1FF # HANGUL SYLLABLE SIOS-YO-KIYEOKSIOS -0x99E6 0xC201 # HANGUL SYLLABLE SIOS-YO-NIEUNCIEUC -0x99E7 0xC202 # HANGUL SYLLABLE SIOS-YO-NIEUNHIEUH -0x99E8 0xC203 # HANGUL SYLLABLE SIOS-YO-TIKEUT -0x99E9 0xC205 # HANGUL SYLLABLE SIOS-YO-RIEULKIYEOK -0x99EA 0xC206 # HANGUL SYLLABLE SIOS-YO-RIEULMIEUM -0x99EB 0xC207 # HANGUL SYLLABLE SIOS-YO-RIEULPIEUP -0x99EC 0xC208 # HANGUL SYLLABLE SIOS-YO-RIEULSIOS -0x99ED 0xC209 # HANGUL SYLLABLE SIOS-YO-RIEULTHIEUTH -0x99EE 0xC20A # HANGUL SYLLABLE SIOS-YO-RIEULPHIEUPH -0x99EF 0xC20B # HANGUL SYLLABLE SIOS-YO-RIEULHIEUH -0x99F0 0xC20E # HANGUL SYLLABLE SIOS-YO-PIEUPSIOS -0x99F1 0xC210 # HANGUL SYLLABLE SIOS-YO-SSANGSIOS -0x99F2 0xC212 # HANGUL SYLLABLE SIOS-YO-CIEUC -0x99F3 0xC213 # HANGUL SYLLABLE SIOS-YO-CHIEUCH -0x99F4 0xC214 # HANGUL SYLLABLE SIOS-YO-KHIEUKH -0x99F5 0xC215 # HANGUL SYLLABLE SIOS-YO-THIEUTH -0x99F6 0xC216 # HANGUL SYLLABLE SIOS-YO-PHIEUPH -0x99F7 0xC217 # HANGUL SYLLABLE SIOS-YO-HIEUH -0x99F8 0xC21A # HANGUL SYLLABLE SIOS-U-SSANGKIYEOK -0x99F9 0xC21B # HANGUL SYLLABLE SIOS-U-KIYEOKSIOS -0x99FA 0xC21D # HANGUL SYLLABLE SIOS-U-NIEUNCIEUC -0x99FB 0xC21E # HANGUL SYLLABLE SIOS-U-NIEUNHIEUH -0x99FC 0xC221 # HANGUL SYLLABLE SIOS-U-RIEULKIYEOK -0x99FD 0xC222 # HANGUL SYLLABLE SIOS-U-RIEULMIEUM -0x99FE 0xC223 # HANGUL SYLLABLE SIOS-U-RIEULPIEUP -0x9A41 0xC224 # HANGUL SYLLABLE SIOS-U-RIEULSIOS -0x9A42 0xC225 # HANGUL SYLLABLE SIOS-U-RIEULTHIEUTH -0x9A43 0xC226 # HANGUL SYLLABLE SIOS-U-RIEULPHIEUPH -0x9A44 0xC227 # HANGUL SYLLABLE SIOS-U-RIEULHIEUH -0x9A45 0xC22A # HANGUL SYLLABLE SIOS-U-PIEUPSIOS -0x9A46 0xC22C # HANGUL SYLLABLE SIOS-U-SSANGSIOS -0x9A47 0xC22E # HANGUL SYLLABLE SIOS-U-CIEUC -0x9A48 0xC230 # HANGUL SYLLABLE SIOS-U-KHIEUKH -0x9A49 0xC233 # HANGUL SYLLABLE SIOS-U-HIEUH -0x9A4A 0xC235 # HANGUL SYLLABLE SIOS-WEO-KIYEOK -0x9A4B 0xC236 # HANGUL SYLLABLE SIOS-WEO-SSANGKIYEOK -0x9A4C 0xC237 # HANGUL SYLLABLE SIOS-WEO-KIYEOKSIOS -0x9A4D 0xC238 # HANGUL SYLLABLE SIOS-WEO-NIEUN -0x9A4E 0xC239 # HANGUL SYLLABLE SIOS-WEO-NIEUNCIEUC -0x9A4F 0xC23A # HANGUL SYLLABLE SIOS-WEO-NIEUNHIEUH -0x9A50 0xC23B # HANGUL SYLLABLE SIOS-WEO-TIKEUT -0x9A51 0xC23C # HANGUL SYLLABLE SIOS-WEO-RIEUL -0x9A52 0xC23D # HANGUL SYLLABLE SIOS-WEO-RIEULKIYEOK -0x9A53 0xC23E # HANGUL SYLLABLE SIOS-WEO-RIEULMIEUM -0x9A54 0xC23F # HANGUL SYLLABLE SIOS-WEO-RIEULPIEUP -0x9A55 0xC240 # HANGUL SYLLABLE SIOS-WEO-RIEULSIOS -0x9A56 0xC241 # HANGUL SYLLABLE SIOS-WEO-RIEULTHIEUTH -0x9A57 0xC242 # HANGUL SYLLABLE SIOS-WEO-RIEULPHIEUPH -0x9A58 0xC243 # HANGUL SYLLABLE SIOS-WEO-RIEULHIEUH -0x9A59 0xC244 # HANGUL SYLLABLE SIOS-WEO-MIEUM -0x9A5A 0xC245 # HANGUL SYLLABLE SIOS-WEO-PIEUP -0x9A61 0xC246 # HANGUL SYLLABLE SIOS-WEO-PIEUPSIOS -0x9A62 0xC247 # HANGUL SYLLABLE SIOS-WEO-SIOS -0x9A63 0xC249 # HANGUL SYLLABLE SIOS-WEO-IEUNG -0x9A64 0xC24A # HANGUL SYLLABLE SIOS-WEO-CIEUC -0x9A65 0xC24B # HANGUL SYLLABLE SIOS-WEO-CHIEUCH -0x9A66 0xC24C # HANGUL SYLLABLE SIOS-WEO-KHIEUKH -0x9A67 0xC24D # HANGUL SYLLABLE SIOS-WEO-THIEUTH -0x9A68 0xC24E # HANGUL SYLLABLE SIOS-WEO-PHIEUPH -0x9A69 0xC24F # HANGUL SYLLABLE SIOS-WEO-HIEUH -0x9A6A 0xC252 # HANGUL SYLLABLE SIOS-WE-SSANGKIYEOK -0x9A6B 0xC253 # HANGUL SYLLABLE SIOS-WE-KIYEOKSIOS -0x9A6C 0xC255 # HANGUL SYLLABLE SIOS-WE-NIEUNCIEUC -0x9A6D 0xC256 # HANGUL SYLLABLE SIOS-WE-NIEUNHIEUH -0x9A6E 0xC257 # HANGUL SYLLABLE SIOS-WE-TIKEUT -0x9A6F 0xC259 # HANGUL SYLLABLE SIOS-WE-RIEULKIYEOK -0x9A70 0xC25A # HANGUL SYLLABLE SIOS-WE-RIEULMIEUM -0x9A71 0xC25B # HANGUL SYLLABLE SIOS-WE-RIEULPIEUP -0x9A72 0xC25C # HANGUL SYLLABLE SIOS-WE-RIEULSIOS -0x9A73 0xC25D # HANGUL SYLLABLE SIOS-WE-RIEULTHIEUTH -0x9A74 0xC25E # HANGUL SYLLABLE SIOS-WE-RIEULPHIEUPH -0x9A75 0xC25F # HANGUL SYLLABLE SIOS-WE-RIEULHIEUH -0x9A76 0xC261 # HANGUL SYLLABLE SIOS-WE-PIEUP -0x9A77 0xC262 # HANGUL SYLLABLE SIOS-WE-PIEUPSIOS -0x9A78 0xC263 # HANGUL SYLLABLE SIOS-WE-SIOS -0x9A79 0xC264 # HANGUL SYLLABLE SIOS-WE-SSANGSIOS -0x9A7A 0xC266 # HANGUL SYLLABLE SIOS-WE-CIEUC -0x9A81 0xC267 # HANGUL SYLLABLE SIOS-WE-CHIEUCH -0x9A82 0xC268 # HANGUL SYLLABLE SIOS-WE-KHIEUKH -0x9A83 0xC269 # HANGUL SYLLABLE SIOS-WE-THIEUTH -0x9A84 0xC26A # HANGUL SYLLABLE SIOS-WE-PHIEUPH -0x9A85 0xC26B # HANGUL SYLLABLE SIOS-WE-HIEUH -0x9A86 0xC26E # HANGUL SYLLABLE SIOS-WI-SSANGKIYEOK -0x9A87 0xC26F # HANGUL SYLLABLE SIOS-WI-KIYEOKSIOS -0x9A88 0xC271 # HANGUL SYLLABLE SIOS-WI-NIEUNCIEUC -0x9A89 0xC272 # HANGUL SYLLABLE SIOS-WI-NIEUNHIEUH -0x9A8A 0xC273 # HANGUL SYLLABLE SIOS-WI-TIKEUT -0x9A8B 0xC275 # HANGUL SYLLABLE SIOS-WI-RIEULKIYEOK -0x9A8C 0xC276 # HANGUL SYLLABLE SIOS-WI-RIEULMIEUM -0x9A8D 0xC277 # HANGUL SYLLABLE SIOS-WI-RIEULPIEUP -0x9A8E 0xC278 # HANGUL SYLLABLE SIOS-WI-RIEULSIOS -0x9A8F 0xC279 # HANGUL SYLLABLE SIOS-WI-RIEULTHIEUTH -0x9A90 0xC27A # HANGUL SYLLABLE SIOS-WI-RIEULPHIEUPH -0x9A91 0xC27B # HANGUL SYLLABLE SIOS-WI-RIEULHIEUH -0x9A92 0xC27E # HANGUL SYLLABLE SIOS-WI-PIEUPSIOS -0x9A93 0xC280 # HANGUL SYLLABLE SIOS-WI-SSANGSIOS -0x9A94 0xC282 # HANGUL SYLLABLE SIOS-WI-CIEUC -0x9A95 0xC283 # HANGUL SYLLABLE SIOS-WI-CHIEUCH -0x9A96 0xC284 # HANGUL SYLLABLE SIOS-WI-KHIEUKH -0x9A97 0xC285 # HANGUL SYLLABLE SIOS-WI-THIEUTH -0x9A98 0xC286 # HANGUL SYLLABLE SIOS-WI-PHIEUPH -0x9A99 0xC287 # HANGUL SYLLABLE SIOS-WI-HIEUH -0x9A9A 0xC28A # HANGUL SYLLABLE SIOS-YU-SSANGKIYEOK -0x9A9B 0xC28B # HANGUL SYLLABLE SIOS-YU-KIYEOKSIOS -0x9A9C 0xC28C # HANGUL SYLLABLE SIOS-YU-NIEUN -0x9A9D 0xC28D # HANGUL SYLLABLE SIOS-YU-NIEUNCIEUC -0x9A9E 0xC28E # HANGUL SYLLABLE SIOS-YU-NIEUNHIEUH -0x9A9F 0xC28F # HANGUL SYLLABLE SIOS-YU-TIKEUT -0x9AA0 0xC291 # HANGUL SYLLABLE SIOS-YU-RIEULKIYEOK -0x9AA1 0xC292 # HANGUL SYLLABLE SIOS-YU-RIEULMIEUM -0x9AA2 0xC293 # HANGUL SYLLABLE SIOS-YU-RIEULPIEUP -0x9AA3 0xC294 # HANGUL SYLLABLE SIOS-YU-RIEULSIOS -0x9AA4 0xC295 # HANGUL SYLLABLE SIOS-YU-RIEULTHIEUTH -0x9AA5 0xC296 # HANGUL SYLLABLE SIOS-YU-RIEULPHIEUPH -0x9AA6 0xC297 # HANGUL SYLLABLE SIOS-YU-RIEULHIEUH -0x9AA7 0xC299 # HANGUL SYLLABLE SIOS-YU-PIEUP -0x9AA8 0xC29A # HANGUL SYLLABLE SIOS-YU-PIEUPSIOS -0x9AA9 0xC29C # HANGUL SYLLABLE SIOS-YU-SSANGSIOS -0x9AAA 0xC29E # HANGUL SYLLABLE SIOS-YU-CIEUC -0x9AAB 0xC29F # HANGUL SYLLABLE SIOS-YU-CHIEUCH -0x9AAC 0xC2A0 # HANGUL SYLLABLE SIOS-YU-KHIEUKH -0x9AAD 0xC2A1 # HANGUL SYLLABLE SIOS-YU-THIEUTH -0x9AAE 0xC2A2 # HANGUL SYLLABLE SIOS-YU-PHIEUPH -0x9AAF 0xC2A3 # HANGUL SYLLABLE SIOS-YU-HIEUH -0x9AB0 0xC2A6 # HANGUL SYLLABLE SIOS-EU-SSANGKIYEOK -0x9AB1 0xC2A7 # HANGUL SYLLABLE SIOS-EU-KIYEOKSIOS -0x9AB2 0xC2A9 # HANGUL SYLLABLE SIOS-EU-NIEUNCIEUC -0x9AB3 0xC2AA # HANGUL SYLLABLE SIOS-EU-NIEUNHIEUH -0x9AB4 0xC2AB # HANGUL SYLLABLE SIOS-EU-TIKEUT -0x9AB5 0xC2AE # HANGUL SYLLABLE SIOS-EU-RIEULMIEUM -0x9AB6 0xC2AF # HANGUL SYLLABLE SIOS-EU-RIEULPIEUP -0x9AB7 0xC2B0 # HANGUL SYLLABLE SIOS-EU-RIEULSIOS -0x9AB8 0xC2B1 # HANGUL SYLLABLE SIOS-EU-RIEULTHIEUTH -0x9AB9 0xC2B2 # HANGUL SYLLABLE SIOS-EU-RIEULPHIEUPH -0x9ABA 0xC2B3 # HANGUL SYLLABLE SIOS-EU-RIEULHIEUH -0x9ABB 0xC2B6 # HANGUL SYLLABLE SIOS-EU-PIEUPSIOS -0x9ABC 0xC2B8 # HANGUL SYLLABLE SIOS-EU-SSANGSIOS -0x9ABD 0xC2BA # HANGUL SYLLABLE SIOS-EU-CIEUC -0x9ABE 0xC2BB # HANGUL SYLLABLE SIOS-EU-CHIEUCH -0x9ABF 0xC2BC # HANGUL SYLLABLE SIOS-EU-KHIEUKH -0x9AC0 0xC2BD # HANGUL SYLLABLE SIOS-EU-THIEUTH -0x9AC1 0xC2BE # HANGUL SYLLABLE SIOS-EU-PHIEUPH -0x9AC2 0xC2BF # HANGUL SYLLABLE SIOS-EU-HIEUH -0x9AC3 0xC2C0 # HANGUL SYLLABLE SIOS-YI -0x9AC4 0xC2C1 # HANGUL SYLLABLE SIOS-YI-KIYEOK -0x9AC5 0xC2C2 # HANGUL SYLLABLE SIOS-YI-SSANGKIYEOK -0x9AC6 0xC2C3 # HANGUL SYLLABLE SIOS-YI-KIYEOKSIOS -0x9AC7 0xC2C4 # HANGUL SYLLABLE SIOS-YI-NIEUN -0x9AC8 0xC2C5 # HANGUL SYLLABLE SIOS-YI-NIEUNCIEUC -0x9AC9 0xC2C6 # HANGUL SYLLABLE SIOS-YI-NIEUNHIEUH -0x9ACA 0xC2C7 # HANGUL SYLLABLE SIOS-YI-TIKEUT -0x9ACB 0xC2C8 # HANGUL SYLLABLE SIOS-YI-RIEUL -0x9ACC 0xC2C9 # HANGUL SYLLABLE SIOS-YI-RIEULKIYEOK -0x9ACD 0xC2CA # HANGUL SYLLABLE SIOS-YI-RIEULMIEUM -0x9ACE 0xC2CB # HANGUL SYLLABLE SIOS-YI-RIEULPIEUP -0x9ACF 0xC2CC # HANGUL SYLLABLE SIOS-YI-RIEULSIOS -0x9AD0 0xC2CD # HANGUL SYLLABLE SIOS-YI-RIEULTHIEUTH -0x9AD1 0xC2CE # HANGUL SYLLABLE SIOS-YI-RIEULPHIEUPH -0x9AD2 0xC2CF # HANGUL SYLLABLE SIOS-YI-RIEULHIEUH -0x9AD3 0xC2D0 # HANGUL SYLLABLE SIOS-YI-MIEUM -0x9AD4 0xC2D1 # HANGUL SYLLABLE SIOS-YI-PIEUP -0x9AD5 0xC2D2 # HANGUL SYLLABLE SIOS-YI-PIEUPSIOS -0x9AD6 0xC2D3 # HANGUL SYLLABLE SIOS-YI-SIOS -0x9AD7 0xC2D4 # HANGUL SYLLABLE SIOS-YI-SSANGSIOS -0x9AD8 0xC2D5 # HANGUL SYLLABLE SIOS-YI-IEUNG -0x9AD9 0xC2D6 # HANGUL SYLLABLE SIOS-YI-CIEUC -0x9ADA 0xC2D7 # HANGUL SYLLABLE SIOS-YI-CHIEUCH -0x9ADB 0xC2D8 # HANGUL SYLLABLE SIOS-YI-KHIEUKH -0x9ADC 0xC2D9 # HANGUL SYLLABLE SIOS-YI-THIEUTH -0x9ADD 0xC2DA # HANGUL SYLLABLE SIOS-YI-PHIEUPH -0x9ADE 0xC2DB # HANGUL SYLLABLE SIOS-YI-HIEUH -0x9ADF 0xC2DE # HANGUL SYLLABLE SIOS-I-SSANGKIYEOK -0x9AE0 0xC2DF # HANGUL SYLLABLE SIOS-I-KIYEOKSIOS -0x9AE1 0xC2E1 # HANGUL SYLLABLE SIOS-I-NIEUNCIEUC -0x9AE2 0xC2E2 # HANGUL SYLLABLE SIOS-I-NIEUNHIEUH -0x9AE3 0xC2E5 # HANGUL SYLLABLE SIOS-I-RIEULKIYEOK -0x9AE4 0xC2E6 # HANGUL SYLLABLE SIOS-I-RIEULMIEUM -0x9AE5 0xC2E7 # HANGUL SYLLABLE SIOS-I-RIEULPIEUP -0x9AE6 0xC2E8 # HANGUL SYLLABLE SIOS-I-RIEULSIOS -0x9AE7 0xC2E9 # HANGUL SYLLABLE SIOS-I-RIEULTHIEUTH -0x9AE8 0xC2EA # HANGUL SYLLABLE SIOS-I-RIEULPHIEUPH -0x9AE9 0xC2EE # HANGUL SYLLABLE SIOS-I-PIEUPSIOS -0x9AEA 0xC2F0 # HANGUL SYLLABLE SIOS-I-SSANGSIOS -0x9AEB 0xC2F2 # HANGUL SYLLABLE SIOS-I-CIEUC -0x9AEC 0xC2F3 # HANGUL SYLLABLE SIOS-I-CHIEUCH -0x9AED 0xC2F4 # HANGUL SYLLABLE SIOS-I-KHIEUKH -0x9AEE 0xC2F5 # HANGUL SYLLABLE SIOS-I-THIEUTH -0x9AEF 0xC2F7 # HANGUL SYLLABLE SIOS-I-HIEUH -0x9AF0 0xC2FA # HANGUL SYLLABLE SSANGSIOS-A-SSANGKIYEOK -0x9AF1 0xC2FD # HANGUL SYLLABLE SSANGSIOS-A-NIEUNCIEUC -0x9AF2 0xC2FE # HANGUL SYLLABLE SSANGSIOS-A-NIEUNHIEUH -0x9AF3 0xC2FF # HANGUL SYLLABLE SSANGSIOS-A-TIKEUT -0x9AF4 0xC301 # HANGUL SYLLABLE SSANGSIOS-A-RIEULKIYEOK -0x9AF5 0xC302 # HANGUL SYLLABLE SSANGSIOS-A-RIEULMIEUM -0x9AF6 0xC303 # HANGUL SYLLABLE SSANGSIOS-A-RIEULPIEUP -0x9AF7 0xC304 # HANGUL SYLLABLE SSANGSIOS-A-RIEULSIOS -0x9AF8 0xC305 # HANGUL SYLLABLE SSANGSIOS-A-RIEULTHIEUTH -0x9AF9 0xC306 # HANGUL SYLLABLE SSANGSIOS-A-RIEULPHIEUPH -0x9AFA 0xC307 # HANGUL SYLLABLE SSANGSIOS-A-RIEULHIEUH -0x9AFB 0xC30A # HANGUL SYLLABLE SSANGSIOS-A-PIEUPSIOS -0x9AFC 0xC30B # HANGUL SYLLABLE SSANGSIOS-A-SIOS -0x9AFD 0xC30E # HANGUL SYLLABLE SSANGSIOS-A-CIEUC -0x9AFE 0xC30F # HANGUL SYLLABLE SSANGSIOS-A-CHIEUCH -0x9B41 0xC310 # HANGUL SYLLABLE SSANGSIOS-A-KHIEUKH -0x9B42 0xC311 # HANGUL SYLLABLE SSANGSIOS-A-THIEUTH -0x9B43 0xC312 # HANGUL SYLLABLE SSANGSIOS-A-PHIEUPH -0x9B44 0xC316 # HANGUL SYLLABLE SSANGSIOS-AE-SSANGKIYEOK -0x9B45 0xC317 # HANGUL SYLLABLE SSANGSIOS-AE-KIYEOKSIOS -0x9B46 0xC319 # HANGUL SYLLABLE SSANGSIOS-AE-NIEUNCIEUC -0x9B47 0xC31A # HANGUL SYLLABLE SSANGSIOS-AE-NIEUNHIEUH -0x9B48 0xC31B # HANGUL SYLLABLE SSANGSIOS-AE-TIKEUT -0x9B49 0xC31D # HANGUL SYLLABLE SSANGSIOS-AE-RIEULKIYEOK -0x9B4A 0xC31E # HANGUL SYLLABLE SSANGSIOS-AE-RIEULMIEUM -0x9B4B 0xC31F # HANGUL SYLLABLE SSANGSIOS-AE-RIEULPIEUP -0x9B4C 0xC320 # HANGUL SYLLABLE SSANGSIOS-AE-RIEULSIOS -0x9B4D 0xC321 # HANGUL SYLLABLE SSANGSIOS-AE-RIEULTHIEUTH -0x9B4E 0xC322 # HANGUL SYLLABLE SSANGSIOS-AE-RIEULPHIEUPH -0x9B4F 0xC323 # HANGUL SYLLABLE SSANGSIOS-AE-RIEULHIEUH -0x9B50 0xC326 # HANGUL SYLLABLE SSANGSIOS-AE-PIEUPSIOS -0x9B51 0xC327 # HANGUL SYLLABLE SSANGSIOS-AE-SIOS -0x9B52 0xC32A # HANGUL SYLLABLE SSANGSIOS-AE-CIEUC -0x9B53 0xC32B # HANGUL SYLLABLE SSANGSIOS-AE-CHIEUCH -0x9B54 0xC32C # HANGUL SYLLABLE SSANGSIOS-AE-KHIEUKH -0x9B55 0xC32D # HANGUL SYLLABLE SSANGSIOS-AE-THIEUTH -0x9B56 0xC32E # HANGUL SYLLABLE SSANGSIOS-AE-PHIEUPH -0x9B57 0xC32F # HANGUL SYLLABLE SSANGSIOS-AE-HIEUH -0x9B58 0xC330 # HANGUL SYLLABLE SSANGSIOS-YA -0x9B59 0xC331 # HANGUL SYLLABLE SSANGSIOS-YA-KIYEOK -0x9B5A 0xC332 # HANGUL SYLLABLE SSANGSIOS-YA-SSANGKIYEOK -0x9B61 0xC333 # HANGUL SYLLABLE SSANGSIOS-YA-KIYEOKSIOS -0x9B62 0xC334 # HANGUL SYLLABLE SSANGSIOS-YA-NIEUN -0x9B63 0xC335 # HANGUL SYLLABLE SSANGSIOS-YA-NIEUNCIEUC -0x9B64 0xC336 # HANGUL SYLLABLE SSANGSIOS-YA-NIEUNHIEUH -0x9B65 0xC337 # HANGUL SYLLABLE SSANGSIOS-YA-TIKEUT -0x9B66 0xC338 # HANGUL SYLLABLE SSANGSIOS-YA-RIEUL -0x9B67 0xC339 # HANGUL SYLLABLE SSANGSIOS-YA-RIEULKIYEOK -0x9B68 0xC33A # HANGUL SYLLABLE SSANGSIOS-YA-RIEULMIEUM -0x9B69 0xC33B # HANGUL SYLLABLE SSANGSIOS-YA-RIEULPIEUP -0x9B6A 0xC33C # HANGUL SYLLABLE SSANGSIOS-YA-RIEULSIOS -0x9B6B 0xC33D # HANGUL SYLLABLE SSANGSIOS-YA-RIEULTHIEUTH -0x9B6C 0xC33E # HANGUL SYLLABLE SSANGSIOS-YA-RIEULPHIEUPH -0x9B6D 0xC33F # HANGUL SYLLABLE SSANGSIOS-YA-RIEULHIEUH -0x9B6E 0xC340 # HANGUL SYLLABLE SSANGSIOS-YA-MIEUM -0x9B6F 0xC341 # HANGUL SYLLABLE SSANGSIOS-YA-PIEUP -0x9B70 0xC342 # HANGUL SYLLABLE SSANGSIOS-YA-PIEUPSIOS -0x9B71 0xC343 # HANGUL SYLLABLE SSANGSIOS-YA-SIOS -0x9B72 0xC344 # HANGUL SYLLABLE SSANGSIOS-YA-SSANGSIOS -0x9B73 0xC346 # HANGUL SYLLABLE SSANGSIOS-YA-CIEUC -0x9B74 0xC347 # HANGUL SYLLABLE SSANGSIOS-YA-CHIEUCH -0x9B75 0xC348 # HANGUL SYLLABLE SSANGSIOS-YA-KHIEUKH -0x9B76 0xC349 # HANGUL SYLLABLE SSANGSIOS-YA-THIEUTH -0x9B77 0xC34A # HANGUL SYLLABLE SSANGSIOS-YA-PHIEUPH -0x9B78 0xC34B # HANGUL SYLLABLE SSANGSIOS-YA-HIEUH -0x9B79 0xC34C # HANGUL SYLLABLE SSANGSIOS-YAE -0x9B7A 0xC34D # HANGUL SYLLABLE SSANGSIOS-YAE-KIYEOK -0x9B81 0xC34E # HANGUL SYLLABLE SSANGSIOS-YAE-SSANGKIYEOK -0x9B82 0xC34F # HANGUL SYLLABLE SSANGSIOS-YAE-KIYEOKSIOS -0x9B83 0xC350 # HANGUL SYLLABLE SSANGSIOS-YAE-NIEUN -0x9B84 0xC351 # HANGUL SYLLABLE SSANGSIOS-YAE-NIEUNCIEUC -0x9B85 0xC352 # HANGUL SYLLABLE SSANGSIOS-YAE-NIEUNHIEUH -0x9B86 0xC353 # HANGUL SYLLABLE SSANGSIOS-YAE-TIKEUT -0x9B87 0xC354 # HANGUL SYLLABLE SSANGSIOS-YAE-RIEUL -0x9B88 0xC355 # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULKIYEOK -0x9B89 0xC356 # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULMIEUM -0x9B8A 0xC357 # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULPIEUP -0x9B8B 0xC358 # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULSIOS -0x9B8C 0xC359 # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULTHIEUTH -0x9B8D 0xC35A # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULPHIEUPH -0x9B8E 0xC35B # HANGUL SYLLABLE SSANGSIOS-YAE-RIEULHIEUH -0x9B8F 0xC35C # HANGUL SYLLABLE SSANGSIOS-YAE-MIEUM -0x9B90 0xC35D # HANGUL SYLLABLE SSANGSIOS-YAE-PIEUP -0x9B91 0xC35E # HANGUL SYLLABLE SSANGSIOS-YAE-PIEUPSIOS -0x9B92 0xC35F # HANGUL SYLLABLE SSANGSIOS-YAE-SIOS -0x9B93 0xC360 # HANGUL SYLLABLE SSANGSIOS-YAE-SSANGSIOS -0x9B94 0xC361 # HANGUL SYLLABLE SSANGSIOS-YAE-IEUNG -0x9B95 0xC362 # HANGUL SYLLABLE SSANGSIOS-YAE-CIEUC -0x9B96 0xC363 # HANGUL SYLLABLE SSANGSIOS-YAE-CHIEUCH -0x9B97 0xC364 # HANGUL SYLLABLE SSANGSIOS-YAE-KHIEUKH -0x9B98 0xC365 # HANGUL SYLLABLE SSANGSIOS-YAE-THIEUTH -0x9B99 0xC366 # HANGUL SYLLABLE SSANGSIOS-YAE-PHIEUPH -0x9B9A 0xC367 # HANGUL SYLLABLE SSANGSIOS-YAE-HIEUH -0x9B9B 0xC36A # HANGUL SYLLABLE SSANGSIOS-EO-SSANGKIYEOK -0x9B9C 0xC36B # HANGUL SYLLABLE SSANGSIOS-EO-KIYEOKSIOS -0x9B9D 0xC36D # HANGUL SYLLABLE SSANGSIOS-EO-NIEUNCIEUC -0x9B9E 0xC36E # HANGUL SYLLABLE SSANGSIOS-EO-NIEUNHIEUH -0x9B9F 0xC36F # HANGUL SYLLABLE SSANGSIOS-EO-TIKEUT -0x9BA0 0xC371 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULKIYEOK -0x9BA1 0xC373 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULPIEUP -0x9BA2 0xC374 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULSIOS -0x9BA3 0xC375 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULTHIEUTH -0x9BA4 0xC376 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULPHIEUPH -0x9BA5 0xC377 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULHIEUH -0x9BA6 0xC37A # HANGUL SYLLABLE SSANGSIOS-EO-PIEUPSIOS -0x9BA7 0xC37B # HANGUL SYLLABLE SSANGSIOS-EO-SIOS -0x9BA8 0xC37E # HANGUL SYLLABLE SSANGSIOS-EO-CIEUC -0x9BA9 0xC37F # HANGUL SYLLABLE SSANGSIOS-EO-CHIEUCH -0x9BAA 0xC380 # HANGUL SYLLABLE SSANGSIOS-EO-KHIEUKH -0x9BAB 0xC381 # HANGUL SYLLABLE SSANGSIOS-EO-THIEUTH -0x9BAC 0xC382 # HANGUL SYLLABLE SSANGSIOS-EO-PHIEUPH -0x9BAD 0xC383 # HANGUL SYLLABLE SSANGSIOS-EO-HIEUH -0x9BAE 0xC385 # HANGUL SYLLABLE SSANGSIOS-E-KIYEOK -0x9BAF 0xC386 # HANGUL SYLLABLE SSANGSIOS-E-SSANGKIYEOK -0x9BB0 0xC387 # HANGUL SYLLABLE SSANGSIOS-E-KIYEOKSIOS -0x9BB1 0xC389 # HANGUL SYLLABLE SSANGSIOS-E-NIEUNCIEUC -0x9BB2 0xC38A # HANGUL SYLLABLE SSANGSIOS-E-NIEUNHIEUH -0x9BB3 0xC38B # HANGUL SYLLABLE SSANGSIOS-E-TIKEUT -0x9BB4 0xC38D # HANGUL SYLLABLE SSANGSIOS-E-RIEULKIYEOK -0x9BB5 0xC38E # HANGUL SYLLABLE SSANGSIOS-E-RIEULMIEUM -0x9BB6 0xC38F # HANGUL SYLLABLE SSANGSIOS-E-RIEULPIEUP -0x9BB7 0xC390 # HANGUL SYLLABLE SSANGSIOS-E-RIEULSIOS -0x9BB8 0xC391 # HANGUL SYLLABLE SSANGSIOS-E-RIEULTHIEUTH -0x9BB9 0xC392 # HANGUL SYLLABLE SSANGSIOS-E-RIEULPHIEUPH -0x9BBA 0xC393 # HANGUL SYLLABLE SSANGSIOS-E-RIEULHIEUH -0x9BBB 0xC394 # HANGUL SYLLABLE SSANGSIOS-E-MIEUM -0x9BBC 0xC395 # HANGUL SYLLABLE SSANGSIOS-E-PIEUP -0x9BBD 0xC396 # HANGUL SYLLABLE SSANGSIOS-E-PIEUPSIOS -0x9BBE 0xC397 # HANGUL SYLLABLE SSANGSIOS-E-SIOS -0x9BBF 0xC398 # HANGUL SYLLABLE SSANGSIOS-E-SSANGSIOS -0x9BC0 0xC399 # HANGUL SYLLABLE SSANGSIOS-E-IEUNG -0x9BC1 0xC39A # HANGUL SYLLABLE SSANGSIOS-E-CIEUC -0x9BC2 0xC39B # HANGUL SYLLABLE SSANGSIOS-E-CHIEUCH -0x9BC3 0xC39C # HANGUL SYLLABLE SSANGSIOS-E-KHIEUKH -0x9BC4 0xC39D # HANGUL SYLLABLE SSANGSIOS-E-THIEUTH -0x9BC5 0xC39E # HANGUL SYLLABLE SSANGSIOS-E-PHIEUPH -0x9BC6 0xC39F # HANGUL SYLLABLE SSANGSIOS-E-HIEUH -0x9BC7 0xC3A0 # HANGUL SYLLABLE SSANGSIOS-YEO -0x9BC8 0xC3A1 # HANGUL SYLLABLE SSANGSIOS-YEO-KIYEOK -0x9BC9 0xC3A2 # HANGUL SYLLABLE SSANGSIOS-YEO-SSANGKIYEOK -0x9BCA 0xC3A3 # HANGUL SYLLABLE SSANGSIOS-YEO-KIYEOKSIOS -0x9BCB 0xC3A4 # HANGUL SYLLABLE SSANGSIOS-YEO-NIEUN -0x9BCC 0xC3A5 # HANGUL SYLLABLE SSANGSIOS-YEO-NIEUNCIEUC -0x9BCD 0xC3A6 # HANGUL SYLLABLE SSANGSIOS-YEO-NIEUNHIEUH -0x9BCE 0xC3A7 # HANGUL SYLLABLE SSANGSIOS-YEO-TIKEUT -0x9BCF 0xC3A8 # HANGUL SYLLABLE SSANGSIOS-YEO-RIEUL -0x9BD0 0xC3A9 # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULKIYEOK -0x9BD1 0xC3AA # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULMIEUM -0x9BD2 0xC3AB # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULPIEUP -0x9BD3 0xC3AC # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULSIOS -0x9BD4 0xC3AD # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULTHIEUTH -0x9BD5 0xC3AE # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULPHIEUPH -0x9BD6 0xC3AF # HANGUL SYLLABLE SSANGSIOS-YEO-RIEULHIEUH -0x9BD7 0xC3B0 # HANGUL SYLLABLE SSANGSIOS-YEO-MIEUM -0x9BD8 0xC3B1 # HANGUL SYLLABLE SSANGSIOS-YEO-PIEUP -0x9BD9 0xC3B2 # HANGUL SYLLABLE SSANGSIOS-YEO-PIEUPSIOS -0x9BDA 0xC3B3 # HANGUL SYLLABLE SSANGSIOS-YEO-SIOS -0x9BDB 0xC3B4 # HANGUL SYLLABLE SSANGSIOS-YEO-SSANGSIOS -0x9BDC 0xC3B5 # HANGUL SYLLABLE SSANGSIOS-YEO-IEUNG -0x9BDD 0xC3B6 # HANGUL SYLLABLE SSANGSIOS-YEO-CIEUC -0x9BDE 0xC3B7 # HANGUL SYLLABLE SSANGSIOS-YEO-CHIEUCH -0x9BDF 0xC3B8 # HANGUL SYLLABLE SSANGSIOS-YEO-KHIEUKH -0x9BE0 0xC3B9 # HANGUL SYLLABLE SSANGSIOS-YEO-THIEUTH -0x9BE1 0xC3BA # HANGUL SYLLABLE SSANGSIOS-YEO-PHIEUPH -0x9BE2 0xC3BB # HANGUL SYLLABLE SSANGSIOS-YEO-HIEUH -0x9BE3 0xC3BC # HANGUL SYLLABLE SSANGSIOS-YE -0x9BE4 0xC3BD # HANGUL SYLLABLE SSANGSIOS-YE-KIYEOK -0x9BE5 0xC3BE # HANGUL SYLLABLE SSANGSIOS-YE-SSANGKIYEOK -0x9BE6 0xC3BF # HANGUL SYLLABLE SSANGSIOS-YE-KIYEOKSIOS -0x9BE7 0xC3C1 # HANGUL SYLLABLE SSANGSIOS-YE-NIEUNCIEUC -0x9BE8 0xC3C2 # HANGUL SYLLABLE SSANGSIOS-YE-NIEUNHIEUH -0x9BE9 0xC3C3 # HANGUL SYLLABLE SSANGSIOS-YE-TIKEUT -0x9BEA 0xC3C4 # HANGUL SYLLABLE SSANGSIOS-YE-RIEUL -0x9BEB 0xC3C5 # HANGUL SYLLABLE SSANGSIOS-YE-RIEULKIYEOK -0x9BEC 0xC3C6 # HANGUL SYLLABLE SSANGSIOS-YE-RIEULMIEUM -0x9BED 0xC3C7 # HANGUL SYLLABLE SSANGSIOS-YE-RIEULPIEUP -0x9BEE 0xC3C8 # HANGUL SYLLABLE SSANGSIOS-YE-RIEULSIOS -0x9BEF 0xC3C9 # HANGUL SYLLABLE SSANGSIOS-YE-RIEULTHIEUTH -0x9BF0 0xC3CA # HANGUL SYLLABLE SSANGSIOS-YE-RIEULPHIEUPH -0x9BF1 0xC3CB # HANGUL SYLLABLE SSANGSIOS-YE-RIEULHIEUH -0x9BF2 0xC3CC # HANGUL SYLLABLE SSANGSIOS-YE-MIEUM -0x9BF3 0xC3CD # HANGUL SYLLABLE SSANGSIOS-YE-PIEUP -0x9BF4 0xC3CE # HANGUL SYLLABLE SSANGSIOS-YE-PIEUPSIOS -0x9BF5 0xC3CF # HANGUL SYLLABLE SSANGSIOS-YE-SIOS -0x9BF6 0xC3D0 # HANGUL SYLLABLE SSANGSIOS-YE-SSANGSIOS -0x9BF7 0xC3D1 # HANGUL SYLLABLE SSANGSIOS-YE-IEUNG -0x9BF8 0xC3D2 # HANGUL SYLLABLE SSANGSIOS-YE-CIEUC -0x9BF9 0xC3D3 # HANGUL SYLLABLE SSANGSIOS-YE-CHIEUCH -0x9BFA 0xC3D4 # HANGUL SYLLABLE SSANGSIOS-YE-KHIEUKH -0x9BFB 0xC3D5 # HANGUL SYLLABLE SSANGSIOS-YE-THIEUTH -0x9BFC 0xC3D6 # HANGUL SYLLABLE SSANGSIOS-YE-PHIEUPH -0x9BFD 0xC3D7 # HANGUL SYLLABLE SSANGSIOS-YE-HIEUH -0x9BFE 0xC3DA # HANGUL SYLLABLE SSANGSIOS-O-SSANGKIYEOK -0x9C41 0xC3DB # HANGUL SYLLABLE SSANGSIOS-O-KIYEOKSIOS -0x9C42 0xC3DD # HANGUL SYLLABLE SSANGSIOS-O-NIEUNCIEUC -0x9C43 0xC3DE # HANGUL SYLLABLE SSANGSIOS-O-NIEUNHIEUH -0x9C44 0xC3E1 # HANGUL SYLLABLE SSANGSIOS-O-RIEULKIYEOK -0x9C45 0xC3E3 # HANGUL SYLLABLE SSANGSIOS-O-RIEULPIEUP -0x9C46 0xC3E4 # HANGUL SYLLABLE SSANGSIOS-O-RIEULSIOS -0x9C47 0xC3E5 # HANGUL SYLLABLE SSANGSIOS-O-RIEULTHIEUTH -0x9C48 0xC3E6 # HANGUL SYLLABLE SSANGSIOS-O-RIEULPHIEUPH -0x9C49 0xC3E7 # HANGUL SYLLABLE SSANGSIOS-O-RIEULHIEUH -0x9C4A 0xC3EA # HANGUL SYLLABLE SSANGSIOS-O-PIEUPSIOS -0x9C4B 0xC3EB # HANGUL SYLLABLE SSANGSIOS-O-SIOS -0x9C4C 0xC3EC # HANGUL SYLLABLE SSANGSIOS-O-SSANGSIOS -0x9C4D 0xC3EE # HANGUL SYLLABLE SSANGSIOS-O-CIEUC -0x9C4E 0xC3EF # HANGUL SYLLABLE SSANGSIOS-O-CHIEUCH -0x9C4F 0xC3F0 # HANGUL SYLLABLE SSANGSIOS-O-KHIEUKH -0x9C50 0xC3F1 # HANGUL SYLLABLE SSANGSIOS-O-THIEUTH -0x9C51 0xC3F2 # HANGUL SYLLABLE SSANGSIOS-O-PHIEUPH -0x9C52 0xC3F3 # HANGUL SYLLABLE SSANGSIOS-O-HIEUH -0x9C53 0xC3F6 # HANGUL SYLLABLE SSANGSIOS-WA-SSANGKIYEOK -0x9C54 0xC3F7 # HANGUL SYLLABLE SSANGSIOS-WA-KIYEOKSIOS -0x9C55 0xC3F9 # HANGUL SYLLABLE SSANGSIOS-WA-NIEUNCIEUC -0x9C56 0xC3FA # HANGUL SYLLABLE SSANGSIOS-WA-NIEUNHIEUH -0x9C57 0xC3FB # HANGUL SYLLABLE SSANGSIOS-WA-TIKEUT -0x9C58 0xC3FC # HANGUL SYLLABLE SSANGSIOS-WA-RIEUL -0x9C59 0xC3FD # HANGUL SYLLABLE SSANGSIOS-WA-RIEULKIYEOK -0x9C5A 0xC3FE # HANGUL SYLLABLE SSANGSIOS-WA-RIEULMIEUM -0x9C61 0xC3FF # HANGUL SYLLABLE SSANGSIOS-WA-RIEULPIEUP -0x9C62 0xC400 # HANGUL SYLLABLE SSANGSIOS-WA-RIEULSIOS -0x9C63 0xC401 # HANGUL SYLLABLE SSANGSIOS-WA-RIEULTHIEUTH -0x9C64 0xC402 # HANGUL SYLLABLE SSANGSIOS-WA-RIEULPHIEUPH -0x9C65 0xC403 # HANGUL SYLLABLE SSANGSIOS-WA-RIEULHIEUH -0x9C66 0xC404 # HANGUL SYLLABLE SSANGSIOS-WA-MIEUM -0x9C67 0xC405 # HANGUL SYLLABLE SSANGSIOS-WA-PIEUP -0x9C68 0xC406 # HANGUL SYLLABLE SSANGSIOS-WA-PIEUPSIOS -0x9C69 0xC407 # HANGUL SYLLABLE SSANGSIOS-WA-SIOS -0x9C6A 0xC409 # HANGUL SYLLABLE SSANGSIOS-WA-IEUNG -0x9C6B 0xC40A # HANGUL SYLLABLE SSANGSIOS-WA-CIEUC -0x9C6C 0xC40B # HANGUL SYLLABLE SSANGSIOS-WA-CHIEUCH -0x9C6D 0xC40C # HANGUL SYLLABLE SSANGSIOS-WA-KHIEUKH -0x9C6E 0xC40D # HANGUL SYLLABLE SSANGSIOS-WA-THIEUTH -0x9C6F 0xC40E # HANGUL SYLLABLE SSANGSIOS-WA-PHIEUPH -0x9C70 0xC40F # HANGUL SYLLABLE SSANGSIOS-WA-HIEUH -0x9C71 0xC411 # HANGUL SYLLABLE SSANGSIOS-WAE-KIYEOK -0x9C72 0xC412 # HANGUL SYLLABLE SSANGSIOS-WAE-SSANGKIYEOK -0x9C73 0xC413 # HANGUL SYLLABLE SSANGSIOS-WAE-KIYEOKSIOS -0x9C74 0xC414 # HANGUL SYLLABLE SSANGSIOS-WAE-NIEUN -0x9C75 0xC415 # HANGUL SYLLABLE SSANGSIOS-WAE-NIEUNCIEUC -0x9C76 0xC416 # HANGUL SYLLABLE SSANGSIOS-WAE-NIEUNHIEUH -0x9C77 0xC417 # HANGUL SYLLABLE SSANGSIOS-WAE-TIKEUT -0x9C78 0xC418 # HANGUL SYLLABLE SSANGSIOS-WAE-RIEUL -0x9C79 0xC419 # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULKIYEOK -0x9C7A 0xC41A # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULMIEUM -0x9C81 0xC41B # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULPIEUP -0x9C82 0xC41C # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULSIOS -0x9C83 0xC41D # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULTHIEUTH -0x9C84 0xC41E # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULPHIEUPH -0x9C85 0xC41F # HANGUL SYLLABLE SSANGSIOS-WAE-RIEULHIEUH -0x9C86 0xC420 # HANGUL SYLLABLE SSANGSIOS-WAE-MIEUM -0x9C87 0xC421 # HANGUL SYLLABLE SSANGSIOS-WAE-PIEUP -0x9C88 0xC422 # HANGUL SYLLABLE SSANGSIOS-WAE-PIEUPSIOS -0x9C89 0xC423 # HANGUL SYLLABLE SSANGSIOS-WAE-SIOS -0x9C8A 0xC425 # HANGUL SYLLABLE SSANGSIOS-WAE-IEUNG -0x9C8B 0xC426 # HANGUL SYLLABLE SSANGSIOS-WAE-CIEUC -0x9C8C 0xC427 # HANGUL SYLLABLE SSANGSIOS-WAE-CHIEUCH -0x9C8D 0xC428 # HANGUL SYLLABLE SSANGSIOS-WAE-KHIEUKH -0x9C8E 0xC429 # HANGUL SYLLABLE SSANGSIOS-WAE-THIEUTH -0x9C8F 0xC42A # HANGUL SYLLABLE SSANGSIOS-WAE-PHIEUPH -0x9C90 0xC42B # HANGUL SYLLABLE SSANGSIOS-WAE-HIEUH -0x9C91 0xC42D # HANGUL SYLLABLE SSANGSIOS-OE-KIYEOK -0x9C92 0xC42E # HANGUL SYLLABLE SSANGSIOS-OE-SSANGKIYEOK -0x9C93 0xC42F # HANGUL SYLLABLE SSANGSIOS-OE-KIYEOKSIOS -0x9C94 0xC431 # HANGUL SYLLABLE SSANGSIOS-OE-NIEUNCIEUC -0x9C95 0xC432 # HANGUL SYLLABLE SSANGSIOS-OE-NIEUNHIEUH -0x9C96 0xC433 # HANGUL SYLLABLE SSANGSIOS-OE-TIKEUT -0x9C97 0xC435 # HANGUL SYLLABLE SSANGSIOS-OE-RIEULKIYEOK -0x9C98 0xC436 # HANGUL SYLLABLE SSANGSIOS-OE-RIEULMIEUM -0x9C99 0xC437 # HANGUL SYLLABLE SSANGSIOS-OE-RIEULPIEUP -0x9C9A 0xC438 # HANGUL SYLLABLE SSANGSIOS-OE-RIEULSIOS -0x9C9B 0xC439 # HANGUL SYLLABLE SSANGSIOS-OE-RIEULTHIEUTH -0x9C9C 0xC43A # HANGUL SYLLABLE SSANGSIOS-OE-RIEULPHIEUPH -0x9C9D 0xC43B # HANGUL SYLLABLE SSANGSIOS-OE-RIEULHIEUH -0x9C9E 0xC43E # HANGUL SYLLABLE SSANGSIOS-OE-PIEUPSIOS -0x9C9F 0xC43F # HANGUL SYLLABLE SSANGSIOS-OE-SIOS -0x9CA0 0xC440 # HANGUL SYLLABLE SSANGSIOS-OE-SSANGSIOS -0x9CA1 0xC441 # HANGUL SYLLABLE SSANGSIOS-OE-IEUNG -0x9CA2 0xC442 # HANGUL SYLLABLE SSANGSIOS-OE-CIEUC -0x9CA3 0xC443 # HANGUL SYLLABLE SSANGSIOS-OE-CHIEUCH -0x9CA4 0xC444 # HANGUL SYLLABLE SSANGSIOS-OE-KHIEUKH -0x9CA5 0xC445 # HANGUL SYLLABLE SSANGSIOS-OE-THIEUTH -0x9CA6 0xC446 # HANGUL SYLLABLE SSANGSIOS-OE-PHIEUPH -0x9CA7 0xC447 # HANGUL SYLLABLE SSANGSIOS-OE-HIEUH -0x9CA8 0xC449 # HANGUL SYLLABLE SSANGSIOS-YO-KIYEOK -0x9CA9 0xC44A # HANGUL SYLLABLE SSANGSIOS-YO-SSANGKIYEOK -0x9CAA 0xC44B # HANGUL SYLLABLE SSANGSIOS-YO-KIYEOKSIOS -0x9CAB 0xC44C # HANGUL SYLLABLE SSANGSIOS-YO-NIEUN -0x9CAC 0xC44D # HANGUL SYLLABLE SSANGSIOS-YO-NIEUNCIEUC -0x9CAD 0xC44E # HANGUL SYLLABLE SSANGSIOS-YO-NIEUNHIEUH -0x9CAE 0xC44F # HANGUL SYLLABLE SSANGSIOS-YO-TIKEUT -0x9CAF 0xC450 # HANGUL SYLLABLE SSANGSIOS-YO-RIEUL -0x9CB0 0xC451 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULKIYEOK -0x9CB1 0xC452 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULMIEUM -0x9CB2 0xC453 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULPIEUP -0x9CB3 0xC454 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULSIOS -0x9CB4 0xC455 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULTHIEUTH -0x9CB5 0xC456 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULPHIEUPH -0x9CB6 0xC457 # HANGUL SYLLABLE SSANGSIOS-YO-RIEULHIEUH -0x9CB7 0xC458 # HANGUL SYLLABLE SSANGSIOS-YO-MIEUM -0x9CB8 0xC459 # HANGUL SYLLABLE SSANGSIOS-YO-PIEUP -0x9CB9 0xC45A # HANGUL SYLLABLE SSANGSIOS-YO-PIEUPSIOS -0x9CBA 0xC45B # HANGUL SYLLABLE SSANGSIOS-YO-SIOS -0x9CBB 0xC45C # HANGUL SYLLABLE SSANGSIOS-YO-SSANGSIOS -0x9CBC 0xC45D # HANGUL SYLLABLE SSANGSIOS-YO-IEUNG -0x9CBD 0xC45E # HANGUL SYLLABLE SSANGSIOS-YO-CIEUC -0x9CBE 0xC45F # HANGUL SYLLABLE SSANGSIOS-YO-CHIEUCH -0x9CBF 0xC460 # HANGUL SYLLABLE SSANGSIOS-YO-KHIEUKH -0x9CC0 0xC461 # HANGUL SYLLABLE SSANGSIOS-YO-THIEUTH -0x9CC1 0xC462 # HANGUL SYLLABLE SSANGSIOS-YO-PHIEUPH -0x9CC2 0xC463 # HANGUL SYLLABLE SSANGSIOS-YO-HIEUH -0x9CC3 0xC466 # HANGUL SYLLABLE SSANGSIOS-U-SSANGKIYEOK -0x9CC4 0xC467 # HANGUL SYLLABLE SSANGSIOS-U-KIYEOKSIOS -0x9CC5 0xC469 # HANGUL SYLLABLE SSANGSIOS-U-NIEUNCIEUC -0x9CC6 0xC46A # HANGUL SYLLABLE SSANGSIOS-U-NIEUNHIEUH -0x9CC7 0xC46B # HANGUL SYLLABLE SSANGSIOS-U-TIKEUT -0x9CC8 0xC46D # HANGUL SYLLABLE SSANGSIOS-U-RIEULKIYEOK -0x9CC9 0xC46E # HANGUL SYLLABLE SSANGSIOS-U-RIEULMIEUM -0x9CCA 0xC46F # HANGUL SYLLABLE SSANGSIOS-U-RIEULPIEUP -0x9CCB 0xC470 # HANGUL SYLLABLE SSANGSIOS-U-RIEULSIOS -0x9CCC 0xC471 # HANGUL SYLLABLE SSANGSIOS-U-RIEULTHIEUTH -0x9CCD 0xC472 # HANGUL SYLLABLE SSANGSIOS-U-RIEULPHIEUPH -0x9CCE 0xC473 # HANGUL SYLLABLE SSANGSIOS-U-RIEULHIEUH -0x9CCF 0xC476 # HANGUL SYLLABLE SSANGSIOS-U-PIEUPSIOS -0x9CD0 0xC477 # HANGUL SYLLABLE SSANGSIOS-U-SIOS -0x9CD1 0xC478 # HANGUL SYLLABLE SSANGSIOS-U-SSANGSIOS -0x9CD2 0xC47A # HANGUL SYLLABLE SSANGSIOS-U-CIEUC -0x9CD3 0xC47B # HANGUL SYLLABLE SSANGSIOS-U-CHIEUCH -0x9CD4 0xC47C # HANGUL SYLLABLE SSANGSIOS-U-KHIEUKH -0x9CD5 0xC47D # HANGUL SYLLABLE SSANGSIOS-U-THIEUTH -0x9CD6 0xC47E # HANGUL SYLLABLE SSANGSIOS-U-PHIEUPH -0x9CD7 0xC47F # HANGUL SYLLABLE SSANGSIOS-U-HIEUH -0x9CD8 0xC481 # HANGUL SYLLABLE SSANGSIOS-WEO-KIYEOK -0x9CD9 0xC482 # HANGUL SYLLABLE SSANGSIOS-WEO-SSANGKIYEOK -0x9CDA 0xC483 # HANGUL SYLLABLE SSANGSIOS-WEO-KIYEOKSIOS -0x9CDB 0xC484 # HANGUL SYLLABLE SSANGSIOS-WEO-NIEUN -0x9CDC 0xC485 # HANGUL SYLLABLE SSANGSIOS-WEO-NIEUNCIEUC -0x9CDD 0xC486 # HANGUL SYLLABLE SSANGSIOS-WEO-NIEUNHIEUH -0x9CDE 0xC487 # HANGUL SYLLABLE SSANGSIOS-WEO-TIKEUT -0x9CDF 0xC488 # HANGUL SYLLABLE SSANGSIOS-WEO-RIEUL -0x9CE0 0xC489 # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULKIYEOK -0x9CE1 0xC48A # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULMIEUM -0x9CE2 0xC48B # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULPIEUP -0x9CE3 0xC48C # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULSIOS -0x9CE4 0xC48D # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULTHIEUTH -0x9CE5 0xC48E # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULPHIEUPH -0x9CE6 0xC48F # HANGUL SYLLABLE SSANGSIOS-WEO-RIEULHIEUH -0x9CE7 0xC490 # HANGUL SYLLABLE SSANGSIOS-WEO-MIEUM -0x9CE8 0xC491 # HANGUL SYLLABLE SSANGSIOS-WEO-PIEUP -0x9CE9 0xC492 # HANGUL SYLLABLE SSANGSIOS-WEO-PIEUPSIOS -0x9CEA 0xC493 # HANGUL SYLLABLE SSANGSIOS-WEO-SIOS -0x9CEB 0xC495 # HANGUL SYLLABLE SSANGSIOS-WEO-IEUNG -0x9CEC 0xC496 # HANGUL SYLLABLE SSANGSIOS-WEO-CIEUC -0x9CED 0xC497 # HANGUL SYLLABLE SSANGSIOS-WEO-CHIEUCH -0x9CEE 0xC498 # HANGUL SYLLABLE SSANGSIOS-WEO-KHIEUKH -0x9CEF 0xC499 # HANGUL SYLLABLE SSANGSIOS-WEO-THIEUTH -0x9CF0 0xC49A # HANGUL SYLLABLE SSANGSIOS-WEO-PHIEUPH -0x9CF1 0xC49B # HANGUL SYLLABLE SSANGSIOS-WEO-HIEUH -0x9CF2 0xC49D # HANGUL SYLLABLE SSANGSIOS-WE-KIYEOK -0x9CF3 0xC49E # HANGUL SYLLABLE SSANGSIOS-WE-SSANGKIYEOK -0x9CF4 0xC49F # HANGUL SYLLABLE SSANGSIOS-WE-KIYEOKSIOS -0x9CF5 0xC4A0 # HANGUL SYLLABLE SSANGSIOS-WE-NIEUN -0x9CF6 0xC4A1 # HANGUL SYLLABLE SSANGSIOS-WE-NIEUNCIEUC -0x9CF7 0xC4A2 # HANGUL SYLLABLE SSANGSIOS-WE-NIEUNHIEUH -0x9CF8 0xC4A3 # HANGUL SYLLABLE SSANGSIOS-WE-TIKEUT -0x9CF9 0xC4A4 # HANGUL SYLLABLE SSANGSIOS-WE-RIEUL -0x9CFA 0xC4A5 # HANGUL SYLLABLE SSANGSIOS-WE-RIEULKIYEOK -0x9CFB 0xC4A6 # HANGUL SYLLABLE SSANGSIOS-WE-RIEULMIEUM -0x9CFC 0xC4A7 # HANGUL SYLLABLE SSANGSIOS-WE-RIEULPIEUP -0x9CFD 0xC4A8 # HANGUL SYLLABLE SSANGSIOS-WE-RIEULSIOS -0x9CFE 0xC4A9 # HANGUL SYLLABLE SSANGSIOS-WE-RIEULTHIEUTH -0x9D41 0xC4AA # HANGUL SYLLABLE SSANGSIOS-WE-RIEULPHIEUPH -0x9D42 0xC4AB # HANGUL SYLLABLE SSANGSIOS-WE-RIEULHIEUH -0x9D43 0xC4AC # HANGUL SYLLABLE SSANGSIOS-WE-MIEUM -0x9D44 0xC4AD # HANGUL SYLLABLE SSANGSIOS-WE-PIEUP -0x9D45 0xC4AE # HANGUL SYLLABLE SSANGSIOS-WE-PIEUPSIOS -0x9D46 0xC4AF # HANGUL SYLLABLE SSANGSIOS-WE-SIOS -0x9D47 0xC4B0 # HANGUL SYLLABLE SSANGSIOS-WE-SSANGSIOS -0x9D48 0xC4B1 # HANGUL SYLLABLE SSANGSIOS-WE-IEUNG -0x9D49 0xC4B2 # HANGUL SYLLABLE SSANGSIOS-WE-CIEUC -0x9D4A 0xC4B3 # HANGUL SYLLABLE SSANGSIOS-WE-CHIEUCH -0x9D4B 0xC4B4 # HANGUL SYLLABLE SSANGSIOS-WE-KHIEUKH -0x9D4C 0xC4B5 # HANGUL SYLLABLE SSANGSIOS-WE-THIEUTH -0x9D4D 0xC4B6 # HANGUL SYLLABLE SSANGSIOS-WE-PHIEUPH -0x9D4E 0xC4B7 # HANGUL SYLLABLE SSANGSIOS-WE-HIEUH -0x9D4F 0xC4B9 # HANGUL SYLLABLE SSANGSIOS-WI-KIYEOK -0x9D50 0xC4BA # HANGUL SYLLABLE SSANGSIOS-WI-SSANGKIYEOK -0x9D51 0xC4BB # HANGUL SYLLABLE SSANGSIOS-WI-KIYEOKSIOS -0x9D52 0xC4BD # HANGUL SYLLABLE SSANGSIOS-WI-NIEUNCIEUC -0x9D53 0xC4BE # HANGUL SYLLABLE SSANGSIOS-WI-NIEUNHIEUH -0x9D54 0xC4BF # HANGUL SYLLABLE SSANGSIOS-WI-TIKEUT -0x9D55 0xC4C0 # HANGUL SYLLABLE SSANGSIOS-WI-RIEUL -0x9D56 0xC4C1 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULKIYEOK -0x9D57 0xC4C2 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULMIEUM -0x9D58 0xC4C3 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULPIEUP -0x9D59 0xC4C4 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULSIOS -0x9D5A 0xC4C5 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULTHIEUTH -0x9D61 0xC4C6 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULPHIEUPH -0x9D62 0xC4C7 # HANGUL SYLLABLE SSANGSIOS-WI-RIEULHIEUH -0x9D63 0xC4C8 # HANGUL SYLLABLE SSANGSIOS-WI-MIEUM -0x9D64 0xC4C9 # HANGUL SYLLABLE SSANGSIOS-WI-PIEUP -0x9D65 0xC4CA # HANGUL SYLLABLE SSANGSIOS-WI-PIEUPSIOS -0x9D66 0xC4CB # HANGUL SYLLABLE SSANGSIOS-WI-SIOS -0x9D67 0xC4CC # HANGUL SYLLABLE SSANGSIOS-WI-SSANGSIOS -0x9D68 0xC4CD # HANGUL SYLLABLE SSANGSIOS-WI-IEUNG -0x9D69 0xC4CE # HANGUL SYLLABLE SSANGSIOS-WI-CIEUC -0x9D6A 0xC4CF # HANGUL SYLLABLE SSANGSIOS-WI-CHIEUCH -0x9D6B 0xC4D0 # HANGUL SYLLABLE SSANGSIOS-WI-KHIEUKH -0x9D6C 0xC4D1 # HANGUL SYLLABLE SSANGSIOS-WI-THIEUTH -0x9D6D 0xC4D2 # HANGUL SYLLABLE SSANGSIOS-WI-PHIEUPH -0x9D6E 0xC4D3 # HANGUL SYLLABLE SSANGSIOS-WI-HIEUH -0x9D6F 0xC4D4 # HANGUL SYLLABLE SSANGSIOS-YU -0x9D70 0xC4D5 # HANGUL SYLLABLE SSANGSIOS-YU-KIYEOK -0x9D71 0xC4D6 # HANGUL SYLLABLE SSANGSIOS-YU-SSANGKIYEOK -0x9D72 0xC4D7 # HANGUL SYLLABLE SSANGSIOS-YU-KIYEOKSIOS -0x9D73 0xC4D8 # HANGUL SYLLABLE SSANGSIOS-YU-NIEUN -0x9D74 0xC4D9 # HANGUL SYLLABLE SSANGSIOS-YU-NIEUNCIEUC -0x9D75 0xC4DA # HANGUL SYLLABLE SSANGSIOS-YU-NIEUNHIEUH -0x9D76 0xC4DB # HANGUL SYLLABLE SSANGSIOS-YU-TIKEUT -0x9D77 0xC4DC # HANGUL SYLLABLE SSANGSIOS-YU-RIEUL -0x9D78 0xC4DD # HANGUL SYLLABLE SSANGSIOS-YU-RIEULKIYEOK -0x9D79 0xC4DE # HANGUL SYLLABLE SSANGSIOS-YU-RIEULMIEUM -0x9D7A 0xC4DF # HANGUL SYLLABLE SSANGSIOS-YU-RIEULPIEUP -0x9D81 0xC4E0 # HANGUL SYLLABLE SSANGSIOS-YU-RIEULSIOS -0x9D82 0xC4E1 # HANGUL SYLLABLE SSANGSIOS-YU-RIEULTHIEUTH -0x9D83 0xC4E2 # HANGUL SYLLABLE SSANGSIOS-YU-RIEULPHIEUPH -0x9D84 0xC4E3 # HANGUL SYLLABLE SSANGSIOS-YU-RIEULHIEUH -0x9D85 0xC4E4 # HANGUL SYLLABLE SSANGSIOS-YU-MIEUM -0x9D86 0xC4E5 # HANGUL SYLLABLE SSANGSIOS-YU-PIEUP -0x9D87 0xC4E6 # HANGUL SYLLABLE SSANGSIOS-YU-PIEUPSIOS -0x9D88 0xC4E7 # HANGUL SYLLABLE SSANGSIOS-YU-SIOS -0x9D89 0xC4E8 # HANGUL SYLLABLE SSANGSIOS-YU-SSANGSIOS -0x9D8A 0xC4EA # HANGUL SYLLABLE SSANGSIOS-YU-CIEUC -0x9D8B 0xC4EB # HANGUL SYLLABLE SSANGSIOS-YU-CHIEUCH -0x9D8C 0xC4EC # HANGUL SYLLABLE SSANGSIOS-YU-KHIEUKH -0x9D8D 0xC4ED # HANGUL SYLLABLE SSANGSIOS-YU-THIEUTH -0x9D8E 0xC4EE # HANGUL SYLLABLE SSANGSIOS-YU-PHIEUPH -0x9D8F 0xC4EF # HANGUL SYLLABLE SSANGSIOS-YU-HIEUH -0x9D90 0xC4F2 # HANGUL SYLLABLE SSANGSIOS-EU-SSANGKIYEOK -0x9D91 0xC4F3 # HANGUL SYLLABLE SSANGSIOS-EU-KIYEOKSIOS -0x9D92 0xC4F5 # HANGUL SYLLABLE SSANGSIOS-EU-NIEUNCIEUC -0x9D93 0xC4F6 # HANGUL SYLLABLE SSANGSIOS-EU-NIEUNHIEUH -0x9D94 0xC4F7 # HANGUL SYLLABLE SSANGSIOS-EU-TIKEUT -0x9D95 0xC4F9 # HANGUL SYLLABLE SSANGSIOS-EU-RIEULKIYEOK -0x9D96 0xC4FB # HANGUL SYLLABLE SSANGSIOS-EU-RIEULPIEUP -0x9D97 0xC4FC # HANGUL SYLLABLE SSANGSIOS-EU-RIEULSIOS -0x9D98 0xC4FD # HANGUL SYLLABLE SSANGSIOS-EU-RIEULTHIEUTH -0x9D99 0xC4FE # HANGUL SYLLABLE SSANGSIOS-EU-RIEULPHIEUPH -0x9D9A 0xC502 # HANGUL SYLLABLE SSANGSIOS-EU-PIEUPSIOS -0x9D9B 0xC503 # HANGUL SYLLABLE SSANGSIOS-EU-SIOS -0x9D9C 0xC504 # HANGUL SYLLABLE SSANGSIOS-EU-SSANGSIOS -0x9D9D 0xC505 # HANGUL SYLLABLE SSANGSIOS-EU-IEUNG -0x9D9E 0xC506 # HANGUL SYLLABLE SSANGSIOS-EU-CIEUC -0x9D9F 0xC507 # HANGUL SYLLABLE SSANGSIOS-EU-CHIEUCH -0x9DA0 0xC508 # HANGUL SYLLABLE SSANGSIOS-EU-KHIEUKH -0x9DA1 0xC509 # HANGUL SYLLABLE SSANGSIOS-EU-THIEUTH -0x9DA2 0xC50A # HANGUL SYLLABLE SSANGSIOS-EU-PHIEUPH -0x9DA3 0xC50B # HANGUL SYLLABLE SSANGSIOS-EU-HIEUH -0x9DA4 0xC50D # HANGUL SYLLABLE SSANGSIOS-YI-KIYEOK -0x9DA5 0xC50E # HANGUL SYLLABLE SSANGSIOS-YI-SSANGKIYEOK -0x9DA6 0xC50F # HANGUL SYLLABLE SSANGSIOS-YI-KIYEOKSIOS -0x9DA7 0xC511 # HANGUL SYLLABLE SSANGSIOS-YI-NIEUNCIEUC -0x9DA8 0xC512 # HANGUL SYLLABLE SSANGSIOS-YI-NIEUNHIEUH -0x9DA9 0xC513 # HANGUL SYLLABLE SSANGSIOS-YI-TIKEUT -0x9DAA 0xC515 # HANGUL SYLLABLE SSANGSIOS-YI-RIEULKIYEOK -0x9DAB 0xC516 # HANGUL SYLLABLE SSANGSIOS-YI-RIEULMIEUM -0x9DAC 0xC517 # HANGUL SYLLABLE SSANGSIOS-YI-RIEULPIEUP -0x9DAD 0xC518 # HANGUL SYLLABLE SSANGSIOS-YI-RIEULSIOS -0x9DAE 0xC519 # HANGUL SYLLABLE SSANGSIOS-YI-RIEULTHIEUTH -0x9DAF 0xC51A # HANGUL SYLLABLE SSANGSIOS-YI-RIEULPHIEUPH -0x9DB0 0xC51B # HANGUL SYLLABLE SSANGSIOS-YI-RIEULHIEUH -0x9DB1 0xC51D # HANGUL SYLLABLE SSANGSIOS-YI-PIEUP -0x9DB2 0xC51E # HANGUL SYLLABLE SSANGSIOS-YI-PIEUPSIOS -0x9DB3 0xC51F # HANGUL SYLLABLE SSANGSIOS-YI-SIOS -0x9DB4 0xC520 # HANGUL SYLLABLE SSANGSIOS-YI-SSANGSIOS -0x9DB5 0xC521 # HANGUL SYLLABLE SSANGSIOS-YI-IEUNG -0x9DB6 0xC522 # HANGUL SYLLABLE SSANGSIOS-YI-CIEUC -0x9DB7 0xC523 # HANGUL SYLLABLE SSANGSIOS-YI-CHIEUCH -0x9DB8 0xC524 # HANGUL SYLLABLE SSANGSIOS-YI-KHIEUKH -0x9DB9 0xC525 # HANGUL SYLLABLE SSANGSIOS-YI-THIEUTH -0x9DBA 0xC526 # HANGUL SYLLABLE SSANGSIOS-YI-PHIEUPH -0x9DBB 0xC527 # HANGUL SYLLABLE SSANGSIOS-YI-HIEUH -0x9DBC 0xC52A # HANGUL SYLLABLE SSANGSIOS-I-SSANGKIYEOK -0x9DBD 0xC52B # HANGUL SYLLABLE SSANGSIOS-I-KIYEOKSIOS -0x9DBE 0xC52D # HANGUL SYLLABLE SSANGSIOS-I-NIEUNCIEUC -0x9DBF 0xC52E # HANGUL SYLLABLE SSANGSIOS-I-NIEUNHIEUH -0x9DC0 0xC52F # HANGUL SYLLABLE SSANGSIOS-I-TIKEUT -0x9DC1 0xC531 # HANGUL SYLLABLE SSANGSIOS-I-RIEULKIYEOK -0x9DC2 0xC532 # HANGUL SYLLABLE SSANGSIOS-I-RIEULMIEUM -0x9DC3 0xC533 # HANGUL SYLLABLE SSANGSIOS-I-RIEULPIEUP -0x9DC4 0xC534 # HANGUL SYLLABLE SSANGSIOS-I-RIEULSIOS -0x9DC5 0xC535 # HANGUL SYLLABLE SSANGSIOS-I-RIEULTHIEUTH -0x9DC6 0xC536 # HANGUL SYLLABLE SSANGSIOS-I-RIEULPHIEUPH -0x9DC7 0xC537 # HANGUL SYLLABLE SSANGSIOS-I-RIEULHIEUH -0x9DC8 0xC53A # HANGUL SYLLABLE SSANGSIOS-I-PIEUPSIOS -0x9DC9 0xC53C # HANGUL SYLLABLE SSANGSIOS-I-SSANGSIOS -0x9DCA 0xC53E # HANGUL SYLLABLE SSANGSIOS-I-CIEUC -0x9DCB 0xC53F # HANGUL SYLLABLE SSANGSIOS-I-CHIEUCH -0x9DCC 0xC540 # HANGUL SYLLABLE SSANGSIOS-I-KHIEUKH -0x9DCD 0xC541 # HANGUL SYLLABLE SSANGSIOS-I-THIEUTH -0x9DCE 0xC542 # HANGUL SYLLABLE SSANGSIOS-I-PHIEUPH -0x9DCF 0xC543 # HANGUL SYLLABLE SSANGSIOS-I-HIEUH -0x9DD0 0xC546 # HANGUL SYLLABLE IEUNG-A-SSANGKIYEOK -0x9DD1 0xC547 # HANGUL SYLLABLE IEUNG-A-KIYEOKSIOS -0x9DD2 0xC54B # HANGUL SYLLABLE IEUNG-A-TIKEUT -0x9DD3 0xC54F # HANGUL SYLLABLE IEUNG-A-RIEULPIEUP -0x9DD4 0xC550 # HANGUL SYLLABLE IEUNG-A-RIEULSIOS -0x9DD5 0xC551 # HANGUL SYLLABLE IEUNG-A-RIEULTHIEUTH -0x9DD6 0xC552 # HANGUL SYLLABLE IEUNG-A-RIEULPHIEUPH -0x9DD7 0xC556 # HANGUL SYLLABLE IEUNG-A-PIEUPSIOS -0x9DD8 0xC55A # HANGUL SYLLABLE IEUNG-A-CIEUC -0x9DD9 0xC55B # HANGUL SYLLABLE IEUNG-A-CHIEUCH -0x9DDA 0xC55C # HANGUL SYLLABLE IEUNG-A-KHIEUKH -0x9DDB 0xC55F # HANGUL SYLLABLE IEUNG-A-HIEUH -0x9DDC 0xC562 # HANGUL SYLLABLE IEUNG-AE-SSANGKIYEOK -0x9DDD 0xC563 # HANGUL SYLLABLE IEUNG-AE-KIYEOKSIOS -0x9DDE 0xC565 # HANGUL SYLLABLE IEUNG-AE-NIEUNCIEUC -0x9DDF 0xC566 # HANGUL SYLLABLE IEUNG-AE-NIEUNHIEUH -0x9DE0 0xC567 # HANGUL SYLLABLE IEUNG-AE-TIKEUT -0x9DE1 0xC569 # HANGUL SYLLABLE IEUNG-AE-RIEULKIYEOK -0x9DE2 0xC56A # HANGUL SYLLABLE IEUNG-AE-RIEULMIEUM -0x9DE3 0xC56B # HANGUL SYLLABLE IEUNG-AE-RIEULPIEUP -0x9DE4 0xC56C # HANGUL SYLLABLE IEUNG-AE-RIEULSIOS -0x9DE5 0xC56D # HANGUL SYLLABLE IEUNG-AE-RIEULTHIEUTH -0x9DE6 0xC56E # HANGUL SYLLABLE IEUNG-AE-RIEULPHIEUPH -0x9DE7 0xC56F # HANGUL SYLLABLE IEUNG-AE-RIEULHIEUH -0x9DE8 0xC572 # HANGUL SYLLABLE IEUNG-AE-PIEUPSIOS -0x9DE9 0xC576 # HANGUL SYLLABLE IEUNG-AE-CIEUC -0x9DEA 0xC577 # HANGUL SYLLABLE IEUNG-AE-CHIEUCH -0x9DEB 0xC578 # HANGUL SYLLABLE IEUNG-AE-KHIEUKH -0x9DEC 0xC579 # HANGUL SYLLABLE IEUNG-AE-THIEUTH -0x9DED 0xC57A # HANGUL SYLLABLE IEUNG-AE-PHIEUPH -0x9DEE 0xC57B # HANGUL SYLLABLE IEUNG-AE-HIEUH -0x9DEF 0xC57E # HANGUL SYLLABLE IEUNG-YA-SSANGKIYEOK -0x9DF0 0xC57F # HANGUL SYLLABLE IEUNG-YA-KIYEOKSIOS -0x9DF1 0xC581 # HANGUL SYLLABLE IEUNG-YA-NIEUNCIEUC -0x9DF2 0xC582 # HANGUL SYLLABLE IEUNG-YA-NIEUNHIEUH -0x9DF3 0xC583 # HANGUL SYLLABLE IEUNG-YA-TIKEUT -0x9DF4 0xC585 # HANGUL SYLLABLE IEUNG-YA-RIEULKIYEOK -0x9DF5 0xC586 # HANGUL SYLLABLE IEUNG-YA-RIEULMIEUM -0x9DF6 0xC588 # HANGUL SYLLABLE IEUNG-YA-RIEULSIOS -0x9DF7 0xC589 # HANGUL SYLLABLE IEUNG-YA-RIEULTHIEUTH -0x9DF8 0xC58A # HANGUL SYLLABLE IEUNG-YA-RIEULPHIEUPH -0x9DF9 0xC58B # HANGUL SYLLABLE IEUNG-YA-RIEULHIEUH -0x9DFA 0xC58E # HANGUL SYLLABLE IEUNG-YA-PIEUPSIOS -0x9DFB 0xC590 # HANGUL SYLLABLE IEUNG-YA-SSANGSIOS -0x9DFC 0xC592 # HANGUL SYLLABLE IEUNG-YA-CIEUC -0x9DFD 0xC593 # HANGUL SYLLABLE IEUNG-YA-CHIEUCH -0x9DFE 0xC594 # HANGUL SYLLABLE IEUNG-YA-KHIEUKH -0x9E41 0xC596 # HANGUL SYLLABLE IEUNG-YA-PHIEUPH -0x9E42 0xC599 # HANGUL SYLLABLE IEUNG-YAE-KIYEOK -0x9E43 0xC59A # HANGUL SYLLABLE IEUNG-YAE-SSANGKIYEOK -0x9E44 0xC59B # HANGUL SYLLABLE IEUNG-YAE-KIYEOKSIOS -0x9E45 0xC59D # HANGUL SYLLABLE IEUNG-YAE-NIEUNCIEUC -0x9E46 0xC59E # HANGUL SYLLABLE IEUNG-YAE-NIEUNHIEUH -0x9E47 0xC59F # HANGUL SYLLABLE IEUNG-YAE-TIKEUT -0x9E48 0xC5A1 # HANGUL SYLLABLE IEUNG-YAE-RIEULKIYEOK -0x9E49 0xC5A2 # HANGUL SYLLABLE IEUNG-YAE-RIEULMIEUM -0x9E4A 0xC5A3 # HANGUL SYLLABLE IEUNG-YAE-RIEULPIEUP -0x9E4B 0xC5A4 # HANGUL SYLLABLE IEUNG-YAE-RIEULSIOS -0x9E4C 0xC5A5 # HANGUL SYLLABLE IEUNG-YAE-RIEULTHIEUTH -0x9E4D 0xC5A6 # HANGUL SYLLABLE IEUNG-YAE-RIEULPHIEUPH -0x9E4E 0xC5A7 # HANGUL SYLLABLE IEUNG-YAE-RIEULHIEUH -0x9E4F 0xC5A8 # HANGUL SYLLABLE IEUNG-YAE-MIEUM -0x9E50 0xC5AA # HANGUL SYLLABLE IEUNG-YAE-PIEUPSIOS -0x9E51 0xC5AB # HANGUL SYLLABLE IEUNG-YAE-SIOS -0x9E52 0xC5AC # HANGUL SYLLABLE IEUNG-YAE-SSANGSIOS -0x9E53 0xC5AD # HANGUL SYLLABLE IEUNG-YAE-IEUNG -0x9E54 0xC5AE # HANGUL SYLLABLE IEUNG-YAE-CIEUC -0x9E55 0xC5AF # HANGUL SYLLABLE IEUNG-YAE-CHIEUCH -0x9E56 0xC5B0 # HANGUL SYLLABLE IEUNG-YAE-KHIEUKH -0x9E57 0xC5B1 # HANGUL SYLLABLE IEUNG-YAE-THIEUTH -0x9E58 0xC5B2 # HANGUL SYLLABLE IEUNG-YAE-PHIEUPH -0x9E59 0xC5B3 # HANGUL SYLLABLE IEUNG-YAE-HIEUH -0x9E5A 0xC5B6 # HANGUL SYLLABLE IEUNG-EO-SSANGKIYEOK -0x9E61 0xC5B7 # HANGUL SYLLABLE IEUNG-EO-KIYEOKSIOS -0x9E62 0xC5BA # HANGUL SYLLABLE IEUNG-EO-NIEUNHIEUH -0x9E63 0xC5BF # HANGUL SYLLABLE IEUNG-EO-RIEULPIEUP -0x9E64 0xC5C0 # HANGUL SYLLABLE IEUNG-EO-RIEULSIOS -0x9E65 0xC5C1 # HANGUL SYLLABLE IEUNG-EO-RIEULTHIEUTH -0x9E66 0xC5C2 # HANGUL SYLLABLE IEUNG-EO-RIEULPHIEUPH -0x9E67 0xC5C3 # HANGUL SYLLABLE IEUNG-EO-RIEULHIEUH -0x9E68 0xC5CB # HANGUL SYLLABLE IEUNG-EO-CHIEUCH -0x9E69 0xC5CD # HANGUL SYLLABLE IEUNG-EO-THIEUTH -0x9E6A 0xC5CF # HANGUL SYLLABLE IEUNG-EO-HIEUH -0x9E6B 0xC5D2 # HANGUL SYLLABLE IEUNG-E-SSANGKIYEOK -0x9E6C 0xC5D3 # HANGUL SYLLABLE IEUNG-E-KIYEOKSIOS -0x9E6D 0xC5D5 # HANGUL SYLLABLE IEUNG-E-NIEUNCIEUC -0x9E6E 0xC5D6 # HANGUL SYLLABLE IEUNG-E-NIEUNHIEUH -0x9E6F 0xC5D7 # HANGUL SYLLABLE IEUNG-E-TIKEUT -0x9E70 0xC5D9 # HANGUL SYLLABLE IEUNG-E-RIEULKIYEOK -0x9E71 0xC5DA # HANGUL SYLLABLE IEUNG-E-RIEULMIEUM -0x9E72 0xC5DB # HANGUL SYLLABLE IEUNG-E-RIEULPIEUP -0x9E73 0xC5DC # HANGUL SYLLABLE IEUNG-E-RIEULSIOS -0x9E74 0xC5DD # HANGUL SYLLABLE IEUNG-E-RIEULTHIEUTH -0x9E75 0xC5DE # HANGUL SYLLABLE IEUNG-E-RIEULPHIEUPH -0x9E76 0xC5DF # HANGUL SYLLABLE IEUNG-E-RIEULHIEUH -0x9E77 0xC5E2 # HANGUL SYLLABLE IEUNG-E-PIEUPSIOS -0x9E78 0xC5E4 # HANGUL SYLLABLE IEUNG-E-SSANGSIOS -0x9E79 0xC5E6 # HANGUL SYLLABLE IEUNG-E-CIEUC -0x9E7A 0xC5E7 # HANGUL SYLLABLE IEUNG-E-CHIEUCH -0x9E81 0xC5E8 # HANGUL SYLLABLE IEUNG-E-KHIEUKH -0x9E82 0xC5E9 # HANGUL SYLLABLE IEUNG-E-THIEUTH -0x9E83 0xC5EA # HANGUL SYLLABLE IEUNG-E-PHIEUPH -0x9E84 0xC5EB # HANGUL SYLLABLE IEUNG-E-HIEUH -0x9E85 0xC5EF # HANGUL SYLLABLE IEUNG-YEO-KIYEOKSIOS -0x9E86 0xC5F1 # HANGUL SYLLABLE IEUNG-YEO-NIEUNCIEUC -0x9E87 0xC5F2 # HANGUL SYLLABLE IEUNG-YEO-NIEUNHIEUH -0x9E88 0xC5F3 # HANGUL SYLLABLE IEUNG-YEO-TIKEUT -0x9E89 0xC5F5 # HANGUL SYLLABLE IEUNG-YEO-RIEULKIYEOK -0x9E8A 0xC5F8 # HANGUL SYLLABLE IEUNG-YEO-RIEULSIOS -0x9E8B 0xC5F9 # HANGUL SYLLABLE IEUNG-YEO-RIEULTHIEUTH -0x9E8C 0xC5FA # HANGUL SYLLABLE IEUNG-YEO-RIEULPHIEUPH -0x9E8D 0xC5FB # HANGUL SYLLABLE IEUNG-YEO-RIEULHIEUH -0x9E8E 0xC602 # HANGUL SYLLABLE IEUNG-YEO-CIEUC -0x9E8F 0xC603 # HANGUL SYLLABLE IEUNG-YEO-CHIEUCH -0x9E90 0xC604 # HANGUL SYLLABLE IEUNG-YEO-KHIEUKH -0x9E91 0xC609 # HANGUL SYLLABLE IEUNG-YE-KIYEOK -0x9E92 0xC60A # HANGUL SYLLABLE IEUNG-YE-SSANGKIYEOK -0x9E93 0xC60B # HANGUL SYLLABLE IEUNG-YE-KIYEOKSIOS -0x9E94 0xC60D # HANGUL SYLLABLE IEUNG-YE-NIEUNCIEUC -0x9E95 0xC60E # HANGUL SYLLABLE IEUNG-YE-NIEUNHIEUH -0x9E96 0xC60F # HANGUL SYLLABLE IEUNG-YE-TIKEUT -0x9E97 0xC611 # HANGUL SYLLABLE IEUNG-YE-RIEULKIYEOK -0x9E98 0xC612 # HANGUL SYLLABLE IEUNG-YE-RIEULMIEUM -0x9E99 0xC613 # HANGUL SYLLABLE IEUNG-YE-RIEULPIEUP -0x9E9A 0xC614 # HANGUL SYLLABLE IEUNG-YE-RIEULSIOS -0x9E9B 0xC615 # HANGUL SYLLABLE IEUNG-YE-RIEULTHIEUTH -0x9E9C 0xC616 # HANGUL SYLLABLE IEUNG-YE-RIEULPHIEUPH -0x9E9D 0xC617 # HANGUL SYLLABLE IEUNG-YE-RIEULHIEUH -0x9E9E 0xC61A # HANGUL SYLLABLE IEUNG-YE-PIEUPSIOS -0x9E9F 0xC61D # HANGUL SYLLABLE IEUNG-YE-IEUNG -0x9EA0 0xC61E # HANGUL SYLLABLE IEUNG-YE-CIEUC -0x9EA1 0xC61F # HANGUL SYLLABLE IEUNG-YE-CHIEUCH -0x9EA2 0xC620 # HANGUL SYLLABLE IEUNG-YE-KHIEUKH -0x9EA3 0xC621 # HANGUL SYLLABLE IEUNG-YE-THIEUTH -0x9EA4 0xC622 # HANGUL SYLLABLE IEUNG-YE-PHIEUPH -0x9EA5 0xC623 # HANGUL SYLLABLE IEUNG-YE-HIEUH -0x9EA6 0xC626 # HANGUL SYLLABLE IEUNG-O-SSANGKIYEOK -0x9EA7 0xC627 # HANGUL SYLLABLE IEUNG-O-KIYEOKSIOS -0x9EA8 0xC629 # HANGUL SYLLABLE IEUNG-O-NIEUNCIEUC -0x9EA9 0xC62A # HANGUL SYLLABLE IEUNG-O-NIEUNHIEUH -0x9EAA 0xC62B # HANGUL SYLLABLE IEUNG-O-TIKEUT -0x9EAB 0xC62F # HANGUL SYLLABLE IEUNG-O-RIEULPIEUP -0x9EAC 0xC631 # HANGUL SYLLABLE IEUNG-O-RIEULTHIEUTH -0x9EAD 0xC632 # HANGUL SYLLABLE IEUNG-O-RIEULPHIEUPH -0x9EAE 0xC636 # HANGUL SYLLABLE IEUNG-O-PIEUPSIOS -0x9EAF 0xC638 # HANGUL SYLLABLE IEUNG-O-SSANGSIOS -0x9EB0 0xC63A # HANGUL SYLLABLE IEUNG-O-CIEUC -0x9EB1 0xC63C # HANGUL SYLLABLE IEUNG-O-KHIEUKH -0x9EB2 0xC63D # HANGUL SYLLABLE IEUNG-O-THIEUTH -0x9EB3 0xC63E # HANGUL SYLLABLE IEUNG-O-PHIEUPH -0x9EB4 0xC63F # HANGUL SYLLABLE IEUNG-O-HIEUH -0x9EB5 0xC642 # HANGUL SYLLABLE IEUNG-WA-SSANGKIYEOK -0x9EB6 0xC643 # HANGUL SYLLABLE IEUNG-WA-KIYEOKSIOS -0x9EB7 0xC645 # HANGUL SYLLABLE IEUNG-WA-NIEUNCIEUC -0x9EB8 0xC646 # HANGUL SYLLABLE IEUNG-WA-NIEUNHIEUH -0x9EB9 0xC647 # HANGUL SYLLABLE IEUNG-WA-TIKEUT -0x9EBA 0xC649 # HANGUL SYLLABLE IEUNG-WA-RIEULKIYEOK -0x9EBB 0xC64A # HANGUL SYLLABLE IEUNG-WA-RIEULMIEUM -0x9EBC 0xC64B # HANGUL SYLLABLE IEUNG-WA-RIEULPIEUP -0x9EBD 0xC64C # HANGUL SYLLABLE IEUNG-WA-RIEULSIOS -0x9EBE 0xC64D # HANGUL SYLLABLE IEUNG-WA-RIEULTHIEUTH -0x9EBF 0xC64E # HANGUL SYLLABLE IEUNG-WA-RIEULPHIEUPH -0x9EC0 0xC64F # HANGUL SYLLABLE IEUNG-WA-RIEULHIEUH -0x9EC1 0xC652 # HANGUL SYLLABLE IEUNG-WA-PIEUPSIOS -0x9EC2 0xC656 # HANGUL SYLLABLE IEUNG-WA-CIEUC -0x9EC3 0xC657 # HANGUL SYLLABLE IEUNG-WA-CHIEUCH -0x9EC4 0xC658 # HANGUL SYLLABLE IEUNG-WA-KHIEUKH -0x9EC5 0xC659 # HANGUL SYLLABLE IEUNG-WA-THIEUTH -0x9EC6 0xC65A # HANGUL SYLLABLE IEUNG-WA-PHIEUPH -0x9EC7 0xC65B # HANGUL SYLLABLE IEUNG-WA-HIEUH -0x9EC8 0xC65E # HANGUL SYLLABLE IEUNG-WAE-SSANGKIYEOK -0x9EC9 0xC65F # HANGUL SYLLABLE IEUNG-WAE-KIYEOKSIOS -0x9ECA 0xC661 # HANGUL SYLLABLE IEUNG-WAE-NIEUNCIEUC -0x9ECB 0xC662 # HANGUL SYLLABLE IEUNG-WAE-NIEUNHIEUH -0x9ECC 0xC663 # HANGUL SYLLABLE IEUNG-WAE-TIKEUT -0x9ECD 0xC664 # HANGUL SYLLABLE IEUNG-WAE-RIEUL -0x9ECE 0xC665 # HANGUL SYLLABLE IEUNG-WAE-RIEULKIYEOK -0x9ECF 0xC666 # HANGUL SYLLABLE IEUNG-WAE-RIEULMIEUM -0x9ED0 0xC667 # HANGUL SYLLABLE IEUNG-WAE-RIEULPIEUP -0x9ED1 0xC668 # HANGUL SYLLABLE IEUNG-WAE-RIEULSIOS -0x9ED2 0xC669 # HANGUL SYLLABLE IEUNG-WAE-RIEULTHIEUTH -0x9ED3 0xC66A # HANGUL SYLLABLE IEUNG-WAE-RIEULPHIEUPH -0x9ED4 0xC66B # HANGUL SYLLABLE IEUNG-WAE-RIEULHIEUH -0x9ED5 0xC66D # HANGUL SYLLABLE IEUNG-WAE-PIEUP -0x9ED6 0xC66E # HANGUL SYLLABLE IEUNG-WAE-PIEUPSIOS -0x9ED7 0xC670 # HANGUL SYLLABLE IEUNG-WAE-SSANGSIOS -0x9ED8 0xC672 # HANGUL SYLLABLE IEUNG-WAE-CIEUC -0x9ED9 0xC673 # HANGUL SYLLABLE IEUNG-WAE-CHIEUCH -0x9EDA 0xC674 # HANGUL SYLLABLE IEUNG-WAE-KHIEUKH -0x9EDB 0xC675 # HANGUL SYLLABLE IEUNG-WAE-THIEUTH -0x9EDC 0xC676 # HANGUL SYLLABLE IEUNG-WAE-PHIEUPH -0x9EDD 0xC677 # HANGUL SYLLABLE IEUNG-WAE-HIEUH -0x9EDE 0xC67A # HANGUL SYLLABLE IEUNG-OE-SSANGKIYEOK -0x9EDF 0xC67B # HANGUL SYLLABLE IEUNG-OE-KIYEOKSIOS -0x9EE0 0xC67D # HANGUL SYLLABLE IEUNG-OE-NIEUNCIEUC -0x9EE1 0xC67E # HANGUL SYLLABLE IEUNG-OE-NIEUNHIEUH -0x9EE2 0xC67F # HANGUL SYLLABLE IEUNG-OE-TIKEUT -0x9EE3 0xC681 # HANGUL SYLLABLE IEUNG-OE-RIEULKIYEOK -0x9EE4 0xC682 # HANGUL SYLLABLE IEUNG-OE-RIEULMIEUM -0x9EE5 0xC683 # HANGUL SYLLABLE IEUNG-OE-RIEULPIEUP -0x9EE6 0xC684 # HANGUL SYLLABLE IEUNG-OE-RIEULSIOS -0x9EE7 0xC685 # HANGUL SYLLABLE IEUNG-OE-RIEULTHIEUTH -0x9EE8 0xC686 # HANGUL SYLLABLE IEUNG-OE-RIEULPHIEUPH -0x9EE9 0xC687 # HANGUL SYLLABLE IEUNG-OE-RIEULHIEUH -0x9EEA 0xC68A # HANGUL SYLLABLE IEUNG-OE-PIEUPSIOS -0x9EEB 0xC68C # HANGUL SYLLABLE IEUNG-OE-SSANGSIOS -0x9EEC 0xC68E # HANGUL SYLLABLE IEUNG-OE-CIEUC -0x9EED 0xC68F # HANGUL SYLLABLE IEUNG-OE-CHIEUCH -0x9EEE 0xC690 # HANGUL SYLLABLE IEUNG-OE-KHIEUKH -0x9EEF 0xC691 # HANGUL SYLLABLE IEUNG-OE-THIEUTH -0x9EF0 0xC692 # HANGUL SYLLABLE IEUNG-OE-PHIEUPH -0x9EF1 0xC693 # HANGUL SYLLABLE IEUNG-OE-HIEUH -0x9EF2 0xC696 # HANGUL SYLLABLE IEUNG-YO-SSANGKIYEOK -0x9EF3 0xC697 # HANGUL SYLLABLE IEUNG-YO-KIYEOKSIOS -0x9EF4 0xC699 # HANGUL SYLLABLE IEUNG-YO-NIEUNCIEUC -0x9EF5 0xC69A # HANGUL SYLLABLE IEUNG-YO-NIEUNHIEUH -0x9EF6 0xC69B # HANGUL SYLLABLE IEUNG-YO-TIKEUT -0x9EF7 0xC69D # HANGUL SYLLABLE IEUNG-YO-RIEULKIYEOK -0x9EF8 0xC69E # HANGUL SYLLABLE IEUNG-YO-RIEULMIEUM -0x9EF9 0xC69F # HANGUL SYLLABLE IEUNG-YO-RIEULPIEUP -0x9EFA 0xC6A0 # HANGUL SYLLABLE IEUNG-YO-RIEULSIOS -0x9EFB 0xC6A1 # HANGUL SYLLABLE IEUNG-YO-RIEULTHIEUTH -0x9EFC 0xC6A2 # HANGUL SYLLABLE IEUNG-YO-RIEULPHIEUPH -0x9EFD 0xC6A3 # HANGUL SYLLABLE IEUNG-YO-RIEULHIEUH -0x9EFE 0xC6A6 # HANGUL SYLLABLE IEUNG-YO-PIEUPSIOS -0x9F41 0xC6A8 # HANGUL SYLLABLE IEUNG-YO-SSANGSIOS -0x9F42 0xC6AA # HANGUL SYLLABLE IEUNG-YO-CIEUC -0x9F43 0xC6AB # HANGUL SYLLABLE IEUNG-YO-CHIEUCH -0x9F44 0xC6AC # HANGUL SYLLABLE IEUNG-YO-KHIEUKH -0x9F45 0xC6AD # HANGUL SYLLABLE IEUNG-YO-THIEUTH -0x9F46 0xC6AE # HANGUL SYLLABLE IEUNG-YO-PHIEUPH -0x9F47 0xC6AF # HANGUL SYLLABLE IEUNG-YO-HIEUH -0x9F48 0xC6B2 # HANGUL SYLLABLE IEUNG-U-SSANGKIYEOK -0x9F49 0xC6B3 # HANGUL SYLLABLE IEUNG-U-KIYEOKSIOS -0x9F4A 0xC6B5 # HANGUL SYLLABLE IEUNG-U-NIEUNCIEUC -0x9F4B 0xC6B6 # HANGUL SYLLABLE IEUNG-U-NIEUNHIEUH -0x9F4C 0xC6B7 # HANGUL SYLLABLE IEUNG-U-TIKEUT -0x9F4D 0xC6BB # HANGUL SYLLABLE IEUNG-U-RIEULPIEUP -0x9F4E 0xC6BC # HANGUL SYLLABLE IEUNG-U-RIEULSIOS -0x9F4F 0xC6BD # HANGUL SYLLABLE IEUNG-U-RIEULTHIEUTH -0x9F50 0xC6BE # HANGUL SYLLABLE IEUNG-U-RIEULPHIEUPH -0x9F51 0xC6BF # HANGUL SYLLABLE IEUNG-U-RIEULHIEUH -0x9F52 0xC6C2 # HANGUL SYLLABLE IEUNG-U-PIEUPSIOS -0x9F53 0xC6C4 # HANGUL SYLLABLE IEUNG-U-SSANGSIOS -0x9F54 0xC6C6 # HANGUL SYLLABLE IEUNG-U-CIEUC -0x9F55 0xC6C7 # HANGUL SYLLABLE IEUNG-U-CHIEUCH -0x9F56 0xC6C8 # HANGUL SYLLABLE IEUNG-U-KHIEUKH -0x9F57 0xC6C9 # HANGUL SYLLABLE IEUNG-U-THIEUTH -0x9F58 0xC6CA # HANGUL SYLLABLE IEUNG-U-PHIEUPH -0x9F59 0xC6CB # HANGUL SYLLABLE IEUNG-U-HIEUH -0x9F5A 0xC6CE # HANGUL SYLLABLE IEUNG-WEO-SSANGKIYEOK -0x9F61 0xC6CF # HANGUL SYLLABLE IEUNG-WEO-KIYEOKSIOS -0x9F62 0xC6D1 # HANGUL SYLLABLE IEUNG-WEO-NIEUNCIEUC -0x9F63 0xC6D2 # HANGUL SYLLABLE IEUNG-WEO-NIEUNHIEUH -0x9F64 0xC6D3 # HANGUL SYLLABLE IEUNG-WEO-TIKEUT -0x9F65 0xC6D5 # HANGUL SYLLABLE IEUNG-WEO-RIEULKIYEOK -0x9F66 0xC6D6 # HANGUL SYLLABLE IEUNG-WEO-RIEULMIEUM -0x9F67 0xC6D7 # HANGUL SYLLABLE IEUNG-WEO-RIEULPIEUP -0x9F68 0xC6D8 # HANGUL SYLLABLE IEUNG-WEO-RIEULSIOS -0x9F69 0xC6D9 # HANGUL SYLLABLE IEUNG-WEO-RIEULTHIEUTH -0x9F6A 0xC6DA # HANGUL SYLLABLE IEUNG-WEO-RIEULPHIEUPH -0x9F6B 0xC6DB # HANGUL SYLLABLE IEUNG-WEO-RIEULHIEUH -0x9F6C 0xC6DE # HANGUL SYLLABLE IEUNG-WEO-PIEUPSIOS -0x9F6D 0xC6DF # HANGUL SYLLABLE IEUNG-WEO-SIOS -0x9F6E 0xC6E2 # HANGUL SYLLABLE IEUNG-WEO-CIEUC -0x9F6F 0xC6E3 # HANGUL SYLLABLE IEUNG-WEO-CHIEUCH -0x9F70 0xC6E4 # HANGUL SYLLABLE IEUNG-WEO-KHIEUKH -0x9F71 0xC6E5 # HANGUL SYLLABLE IEUNG-WEO-THIEUTH -0x9F72 0xC6E6 # HANGUL SYLLABLE IEUNG-WEO-PHIEUPH -0x9F73 0xC6E7 # HANGUL SYLLABLE IEUNG-WEO-HIEUH -0x9F74 0xC6EA # HANGUL SYLLABLE IEUNG-WE-SSANGKIYEOK -0x9F75 0xC6EB # HANGUL SYLLABLE IEUNG-WE-KIYEOKSIOS -0x9F76 0xC6ED # HANGUL SYLLABLE IEUNG-WE-NIEUNCIEUC -0x9F77 0xC6EE # HANGUL SYLLABLE IEUNG-WE-NIEUNHIEUH -0x9F78 0xC6EF # HANGUL SYLLABLE IEUNG-WE-TIKEUT -0x9F79 0xC6F1 # HANGUL SYLLABLE IEUNG-WE-RIEULKIYEOK -0x9F7A 0xC6F2 # HANGUL SYLLABLE IEUNG-WE-RIEULMIEUM -0x9F81 0xC6F3 # HANGUL SYLLABLE IEUNG-WE-RIEULPIEUP -0x9F82 0xC6F4 # HANGUL SYLLABLE IEUNG-WE-RIEULSIOS -0x9F83 0xC6F5 # HANGUL SYLLABLE IEUNG-WE-RIEULTHIEUTH -0x9F84 0xC6F6 # HANGUL SYLLABLE IEUNG-WE-RIEULPHIEUPH -0x9F85 0xC6F7 # HANGUL SYLLABLE IEUNG-WE-RIEULHIEUH -0x9F86 0xC6FA # HANGUL SYLLABLE IEUNG-WE-PIEUPSIOS -0x9F87 0xC6FB # HANGUL SYLLABLE IEUNG-WE-SIOS -0x9F88 0xC6FC # HANGUL SYLLABLE IEUNG-WE-SSANGSIOS -0x9F89 0xC6FE # HANGUL SYLLABLE IEUNG-WE-CIEUC -0x9F8A 0xC6FF # HANGUL SYLLABLE IEUNG-WE-CHIEUCH -0x9F8B 0xC700 # HANGUL SYLLABLE IEUNG-WE-KHIEUKH -0x9F8C 0xC701 # HANGUL SYLLABLE IEUNG-WE-THIEUTH -0x9F8D 0xC702 # HANGUL SYLLABLE IEUNG-WE-PHIEUPH -0x9F8E 0xC703 # HANGUL SYLLABLE IEUNG-WE-HIEUH -0x9F8F 0xC706 # HANGUL SYLLABLE IEUNG-WI-SSANGKIYEOK -0x9F90 0xC707 # HANGUL SYLLABLE IEUNG-WI-KIYEOKSIOS -0x9F91 0xC709 # HANGUL SYLLABLE IEUNG-WI-NIEUNCIEUC -0x9F92 0xC70A # HANGUL SYLLABLE IEUNG-WI-NIEUNHIEUH -0x9F93 0xC70B # HANGUL SYLLABLE IEUNG-WI-TIKEUT -0x9F94 0xC70D # HANGUL SYLLABLE IEUNG-WI-RIEULKIYEOK -0x9F95 0xC70E # HANGUL SYLLABLE IEUNG-WI-RIEULMIEUM -0x9F96 0xC70F # HANGUL SYLLABLE IEUNG-WI-RIEULPIEUP -0x9F97 0xC710 # HANGUL SYLLABLE IEUNG-WI-RIEULSIOS -0x9F98 0xC711 # HANGUL SYLLABLE IEUNG-WI-RIEULTHIEUTH -0x9F99 0xC712 # HANGUL SYLLABLE IEUNG-WI-RIEULPHIEUPH -0x9F9A 0xC713 # HANGUL SYLLABLE IEUNG-WI-RIEULHIEUH -0x9F9B 0xC716 # HANGUL SYLLABLE IEUNG-WI-PIEUPSIOS -0x9F9C 0xC718 # HANGUL SYLLABLE IEUNG-WI-SSANGSIOS -0x9F9D 0xC71A # HANGUL SYLLABLE IEUNG-WI-CIEUC -0x9F9E 0xC71B # HANGUL SYLLABLE IEUNG-WI-CHIEUCH -0x9F9F 0xC71C # HANGUL SYLLABLE IEUNG-WI-KHIEUKH -0x9FA0 0xC71D # HANGUL SYLLABLE IEUNG-WI-THIEUTH -0x9FA1 0xC71E # HANGUL SYLLABLE IEUNG-WI-PHIEUPH -0x9FA2 0xC71F # HANGUL SYLLABLE IEUNG-WI-HIEUH -0x9FA3 0xC722 # HANGUL SYLLABLE IEUNG-YU-SSANGKIYEOK -0x9FA4 0xC723 # HANGUL SYLLABLE IEUNG-YU-KIYEOKSIOS -0x9FA5 0xC725 # HANGUL SYLLABLE IEUNG-YU-NIEUNCIEUC -0x9FA6 0xC726 # HANGUL SYLLABLE IEUNG-YU-NIEUNHIEUH -0x9FA7 0xC727 # HANGUL SYLLABLE IEUNG-YU-TIKEUT -0x9FA8 0xC729 # HANGUL SYLLABLE IEUNG-YU-RIEULKIYEOK -0x9FA9 0xC72A # HANGUL SYLLABLE IEUNG-YU-RIEULMIEUM -0x9FAA 0xC72B # HANGUL SYLLABLE IEUNG-YU-RIEULPIEUP -0x9FAB 0xC72C # HANGUL SYLLABLE IEUNG-YU-RIEULSIOS -0x9FAC 0xC72D # HANGUL SYLLABLE IEUNG-YU-RIEULTHIEUTH -0x9FAD 0xC72E # HANGUL SYLLABLE IEUNG-YU-RIEULPHIEUPH -0x9FAE 0xC72F # HANGUL SYLLABLE IEUNG-YU-RIEULHIEUH -0x9FAF 0xC732 # HANGUL SYLLABLE IEUNG-YU-PIEUPSIOS -0x9FB0 0xC734 # HANGUL SYLLABLE IEUNG-YU-SSANGSIOS -0x9FB1 0xC736 # HANGUL SYLLABLE IEUNG-YU-CIEUC -0x9FB2 0xC738 # HANGUL SYLLABLE IEUNG-YU-KHIEUKH -0x9FB3 0xC739 # HANGUL SYLLABLE IEUNG-YU-THIEUTH -0x9FB4 0xC73A # HANGUL SYLLABLE IEUNG-YU-PHIEUPH -0x9FB5 0xC73B # HANGUL SYLLABLE IEUNG-YU-HIEUH -0x9FB6 0xC73E # HANGUL SYLLABLE IEUNG-EU-SSANGKIYEOK -0x9FB7 0xC73F # HANGUL SYLLABLE IEUNG-EU-KIYEOKSIOS -0x9FB8 0xC741 # HANGUL SYLLABLE IEUNG-EU-NIEUNCIEUC -0x9FB9 0xC742 # HANGUL SYLLABLE IEUNG-EU-NIEUNHIEUH -0x9FBA 0xC743 # HANGUL SYLLABLE IEUNG-EU-TIKEUT -0x9FBB 0xC745 # HANGUL SYLLABLE IEUNG-EU-RIEULKIYEOK -0x9FBC 0xC746 # HANGUL SYLLABLE IEUNG-EU-RIEULMIEUM -0x9FBD 0xC747 # HANGUL SYLLABLE IEUNG-EU-RIEULPIEUP -0x9FBE 0xC748 # HANGUL SYLLABLE IEUNG-EU-RIEULSIOS -0x9FBF 0xC749 # HANGUL SYLLABLE IEUNG-EU-RIEULTHIEUTH -0x9FC0 0xC74B # HANGUL SYLLABLE IEUNG-EU-RIEULHIEUH -0x9FC1 0xC74E # HANGUL SYLLABLE IEUNG-EU-PIEUPSIOS -0x9FC2 0xC750 # HANGUL SYLLABLE IEUNG-EU-SSANGSIOS -0x9FC3 0xC759 # HANGUL SYLLABLE IEUNG-YI-KIYEOK -0x9FC4 0xC75A # HANGUL SYLLABLE IEUNG-YI-SSANGKIYEOK -0x9FC5 0xC75B # HANGUL SYLLABLE IEUNG-YI-KIYEOKSIOS -0x9FC6 0xC75D # HANGUL SYLLABLE IEUNG-YI-NIEUNCIEUC -0x9FC7 0xC75E # HANGUL SYLLABLE IEUNG-YI-NIEUNHIEUH -0x9FC8 0xC75F # HANGUL SYLLABLE IEUNG-YI-TIKEUT -0x9FC9 0xC761 # HANGUL SYLLABLE IEUNG-YI-RIEULKIYEOK -0x9FCA 0xC762 # HANGUL SYLLABLE IEUNG-YI-RIEULMIEUM -0x9FCB 0xC763 # HANGUL SYLLABLE IEUNG-YI-RIEULPIEUP -0x9FCC 0xC764 # HANGUL SYLLABLE IEUNG-YI-RIEULSIOS -0x9FCD 0xC765 # HANGUL SYLLABLE IEUNG-YI-RIEULTHIEUTH -0x9FCE 0xC766 # HANGUL SYLLABLE IEUNG-YI-RIEULPHIEUPH -0x9FCF 0xC767 # HANGUL SYLLABLE IEUNG-YI-RIEULHIEUH -0x9FD0 0xC769 # HANGUL SYLLABLE IEUNG-YI-PIEUP -0x9FD1 0xC76A # HANGUL SYLLABLE IEUNG-YI-PIEUPSIOS -0x9FD2 0xC76C # HANGUL SYLLABLE IEUNG-YI-SSANGSIOS -0x9FD3 0xC76D # HANGUL SYLLABLE IEUNG-YI-IEUNG -0x9FD4 0xC76E # HANGUL SYLLABLE IEUNG-YI-CIEUC -0x9FD5 0xC76F # HANGUL SYLLABLE IEUNG-YI-CHIEUCH -0x9FD6 0xC770 # HANGUL SYLLABLE IEUNG-YI-KHIEUKH -0x9FD7 0xC771 # HANGUL SYLLABLE IEUNG-YI-THIEUTH -0x9FD8 0xC772 # HANGUL SYLLABLE IEUNG-YI-PHIEUPH -0x9FD9 0xC773 # HANGUL SYLLABLE IEUNG-YI-HIEUH -0x9FDA 0xC776 # HANGUL SYLLABLE IEUNG-I-SSANGKIYEOK -0x9FDB 0xC777 # HANGUL SYLLABLE IEUNG-I-KIYEOKSIOS -0x9FDC 0xC779 # HANGUL SYLLABLE IEUNG-I-NIEUNCIEUC -0x9FDD 0xC77A # HANGUL SYLLABLE IEUNG-I-NIEUNHIEUH -0x9FDE 0xC77B # HANGUL SYLLABLE IEUNG-I-TIKEUT -0x9FDF 0xC77F # HANGUL SYLLABLE IEUNG-I-RIEULPIEUP -0x9FE0 0xC780 # HANGUL SYLLABLE IEUNG-I-RIEULSIOS -0x9FE1 0xC781 # HANGUL SYLLABLE IEUNG-I-RIEULTHIEUTH -0x9FE2 0xC782 # HANGUL SYLLABLE IEUNG-I-RIEULPHIEUPH -0x9FE3 0xC786 # HANGUL SYLLABLE IEUNG-I-PIEUPSIOS -0x9FE4 0xC78B # HANGUL SYLLABLE IEUNG-I-CHIEUCH -0x9FE5 0xC78C # HANGUL SYLLABLE IEUNG-I-KHIEUKH -0x9FE6 0xC78D # HANGUL SYLLABLE IEUNG-I-THIEUTH -0x9FE7 0xC78F # HANGUL SYLLABLE IEUNG-I-HIEUH -0x9FE8 0xC792 # HANGUL SYLLABLE CIEUC-A-SSANGKIYEOK -0x9FE9 0xC793 # HANGUL SYLLABLE CIEUC-A-KIYEOKSIOS -0x9FEA 0xC795 # HANGUL SYLLABLE CIEUC-A-NIEUNCIEUC -0x9FEB 0xC799 # HANGUL SYLLABLE CIEUC-A-RIEULKIYEOK -0x9FEC 0xC79B # HANGUL SYLLABLE CIEUC-A-RIEULPIEUP -0x9FED 0xC79C # HANGUL SYLLABLE CIEUC-A-RIEULSIOS -0x9FEE 0xC79D # HANGUL SYLLABLE CIEUC-A-RIEULTHIEUTH -0x9FEF 0xC79E # HANGUL SYLLABLE CIEUC-A-RIEULPHIEUPH -0x9FF0 0xC79F # HANGUL SYLLABLE CIEUC-A-RIEULHIEUH -0x9FF1 0xC7A2 # HANGUL SYLLABLE CIEUC-A-PIEUPSIOS -0x9FF2 0xC7A7 # HANGUL SYLLABLE CIEUC-A-CHIEUCH -0x9FF3 0xC7A8 # HANGUL SYLLABLE CIEUC-A-KHIEUKH -0x9FF4 0xC7A9 # HANGUL SYLLABLE CIEUC-A-THIEUTH -0x9FF5 0xC7AA # HANGUL SYLLABLE CIEUC-A-PHIEUPH -0x9FF6 0xC7AB # HANGUL SYLLABLE CIEUC-A-HIEUH -0x9FF7 0xC7AE # HANGUL SYLLABLE CIEUC-AE-SSANGKIYEOK -0x9FF8 0xC7AF # HANGUL SYLLABLE CIEUC-AE-KIYEOKSIOS -0x9FF9 0xC7B1 # HANGUL SYLLABLE CIEUC-AE-NIEUNCIEUC -0x9FFA 0xC7B2 # HANGUL SYLLABLE CIEUC-AE-NIEUNHIEUH -0x9FFB 0xC7B3 # HANGUL SYLLABLE CIEUC-AE-TIKEUT -0x9FFC 0xC7B5 # HANGUL SYLLABLE CIEUC-AE-RIEULKIYEOK -0x9FFD 0xC7B6 # HANGUL SYLLABLE CIEUC-AE-RIEULMIEUM -0x9FFE 0xC7B7 # HANGUL SYLLABLE CIEUC-AE-RIEULPIEUP -0xA041 0xC7B8 # HANGUL SYLLABLE CIEUC-AE-RIEULSIOS -0xA042 0xC7B9 # HANGUL SYLLABLE CIEUC-AE-RIEULTHIEUTH -0xA043 0xC7BA # HANGUL SYLLABLE CIEUC-AE-RIEULPHIEUPH -0xA044 0xC7BB # HANGUL SYLLABLE CIEUC-AE-RIEULHIEUH -0xA045 0xC7BE # HANGUL SYLLABLE CIEUC-AE-PIEUPSIOS -0xA046 0xC7C2 # HANGUL SYLLABLE CIEUC-AE-CIEUC -0xA047 0xC7C3 # HANGUL SYLLABLE CIEUC-AE-CHIEUCH -0xA048 0xC7C4 # HANGUL SYLLABLE CIEUC-AE-KHIEUKH -0xA049 0xC7C5 # HANGUL SYLLABLE CIEUC-AE-THIEUTH -0xA04A 0xC7C6 # HANGUL SYLLABLE CIEUC-AE-PHIEUPH -0xA04B 0xC7C7 # HANGUL SYLLABLE CIEUC-AE-HIEUH -0xA04C 0xC7CA # HANGUL SYLLABLE CIEUC-YA-SSANGKIYEOK -0xA04D 0xC7CB # HANGUL SYLLABLE CIEUC-YA-KIYEOKSIOS -0xA04E 0xC7CD # HANGUL SYLLABLE CIEUC-YA-NIEUNCIEUC -0xA04F 0xC7CF # HANGUL SYLLABLE CIEUC-YA-TIKEUT -0xA050 0xC7D1 # HANGUL SYLLABLE CIEUC-YA-RIEULKIYEOK -0xA051 0xC7D2 # HANGUL SYLLABLE CIEUC-YA-RIEULMIEUM -0xA052 0xC7D3 # HANGUL SYLLABLE CIEUC-YA-RIEULPIEUP -0xA053 0xC7D4 # HANGUL SYLLABLE CIEUC-YA-RIEULSIOS -0xA054 0xC7D5 # HANGUL SYLLABLE CIEUC-YA-RIEULTHIEUTH -0xA055 0xC7D6 # HANGUL SYLLABLE CIEUC-YA-RIEULPHIEUPH -0xA056 0xC7D7 # HANGUL SYLLABLE CIEUC-YA-RIEULHIEUH -0xA057 0xC7D9 # HANGUL SYLLABLE CIEUC-YA-PIEUP -0xA058 0xC7DA # HANGUL SYLLABLE CIEUC-YA-PIEUPSIOS -0xA059 0xC7DB # HANGUL SYLLABLE CIEUC-YA-SIOS -0xA05A 0xC7DC # HANGUL SYLLABLE CIEUC-YA-SSANGSIOS -0xA061 0xC7DE # HANGUL SYLLABLE CIEUC-YA-CIEUC -0xA062 0xC7DF # HANGUL SYLLABLE CIEUC-YA-CHIEUCH -0xA063 0xC7E0 # HANGUL SYLLABLE CIEUC-YA-KHIEUKH -0xA064 0xC7E1 # HANGUL SYLLABLE CIEUC-YA-THIEUTH -0xA065 0xC7E2 # HANGUL SYLLABLE CIEUC-YA-PHIEUPH -0xA066 0xC7E3 # HANGUL SYLLABLE CIEUC-YA-HIEUH -0xA067 0xC7E5 # HANGUL SYLLABLE CIEUC-YAE-KIYEOK -0xA068 0xC7E6 # HANGUL SYLLABLE CIEUC-YAE-SSANGKIYEOK -0xA069 0xC7E7 # HANGUL SYLLABLE CIEUC-YAE-KIYEOKSIOS -0xA06A 0xC7E9 # HANGUL SYLLABLE CIEUC-YAE-NIEUNCIEUC -0xA06B 0xC7EA # HANGUL SYLLABLE CIEUC-YAE-NIEUNHIEUH -0xA06C 0xC7EB # HANGUL SYLLABLE CIEUC-YAE-TIKEUT -0xA06D 0xC7ED # HANGUL SYLLABLE CIEUC-YAE-RIEULKIYEOK -0xA06E 0xC7EE # HANGUL SYLLABLE CIEUC-YAE-RIEULMIEUM -0xA06F 0xC7EF # HANGUL SYLLABLE CIEUC-YAE-RIEULPIEUP -0xA070 0xC7F0 # HANGUL SYLLABLE CIEUC-YAE-RIEULSIOS -0xA071 0xC7F1 # HANGUL SYLLABLE CIEUC-YAE-RIEULTHIEUTH -0xA072 0xC7F2 # HANGUL SYLLABLE CIEUC-YAE-RIEULPHIEUPH -0xA073 0xC7F3 # HANGUL SYLLABLE CIEUC-YAE-RIEULHIEUH -0xA074 0xC7F4 # HANGUL SYLLABLE CIEUC-YAE-MIEUM -0xA075 0xC7F5 # HANGUL SYLLABLE CIEUC-YAE-PIEUP -0xA076 0xC7F6 # HANGUL SYLLABLE CIEUC-YAE-PIEUPSIOS -0xA077 0xC7F7 # HANGUL SYLLABLE CIEUC-YAE-SIOS -0xA078 0xC7F8 # HANGUL SYLLABLE CIEUC-YAE-SSANGSIOS -0xA079 0xC7F9 # HANGUL SYLLABLE CIEUC-YAE-IEUNG -0xA07A 0xC7FA # HANGUL SYLLABLE CIEUC-YAE-CIEUC -0xA081 0xC7FB # HANGUL SYLLABLE CIEUC-YAE-CHIEUCH -0xA082 0xC7FC # HANGUL SYLLABLE CIEUC-YAE-KHIEUKH -0xA083 0xC7FD # HANGUL SYLLABLE CIEUC-YAE-THIEUTH -0xA084 0xC7FE # HANGUL SYLLABLE CIEUC-YAE-PHIEUPH -0xA085 0xC7FF # HANGUL SYLLABLE CIEUC-YAE-HIEUH -0xA086 0xC802 # HANGUL SYLLABLE CIEUC-EO-SSANGKIYEOK -0xA087 0xC803 # HANGUL SYLLABLE CIEUC-EO-KIYEOKSIOS -0xA088 0xC805 # HANGUL SYLLABLE CIEUC-EO-NIEUNCIEUC -0xA089 0xC806 # HANGUL SYLLABLE CIEUC-EO-NIEUNHIEUH -0xA08A 0xC807 # HANGUL SYLLABLE CIEUC-EO-TIKEUT -0xA08B 0xC809 # HANGUL SYLLABLE CIEUC-EO-RIEULKIYEOK -0xA08C 0xC80B # HANGUL SYLLABLE CIEUC-EO-RIEULPIEUP -0xA08D 0xC80C # HANGUL SYLLABLE CIEUC-EO-RIEULSIOS -0xA08E 0xC80D # HANGUL SYLLABLE CIEUC-EO-RIEULTHIEUTH -0xA08F 0xC80E # HANGUL SYLLABLE CIEUC-EO-RIEULPHIEUPH -0xA090 0xC80F # HANGUL SYLLABLE CIEUC-EO-RIEULHIEUH -0xA091 0xC812 # HANGUL SYLLABLE CIEUC-EO-PIEUPSIOS -0xA092 0xC814 # HANGUL SYLLABLE CIEUC-EO-SSANGSIOS -0xA093 0xC817 # HANGUL SYLLABLE CIEUC-EO-CHIEUCH -0xA094 0xC818 # HANGUL SYLLABLE CIEUC-EO-KHIEUKH -0xA095 0xC819 # HANGUL SYLLABLE CIEUC-EO-THIEUTH -0xA096 0xC81A # HANGUL SYLLABLE CIEUC-EO-PHIEUPH -0xA097 0xC81B # HANGUL SYLLABLE CIEUC-EO-HIEUH -0xA098 0xC81E # HANGUL SYLLABLE CIEUC-E-SSANGKIYEOK -0xA099 0xC81F # HANGUL SYLLABLE CIEUC-E-KIYEOKSIOS -0xA09A 0xC821 # HANGUL SYLLABLE CIEUC-E-NIEUNCIEUC -0xA09B 0xC822 # HANGUL SYLLABLE CIEUC-E-NIEUNHIEUH -0xA09C 0xC823 # HANGUL SYLLABLE CIEUC-E-TIKEUT -0xA09D 0xC825 # HANGUL SYLLABLE CIEUC-E-RIEULKIYEOK -0xA09E 0xC826 # HANGUL SYLLABLE CIEUC-E-RIEULMIEUM -0xA09F 0xC827 # HANGUL SYLLABLE CIEUC-E-RIEULPIEUP -0xA0A0 0xC828 # HANGUL SYLLABLE CIEUC-E-RIEULSIOS -0xA0A1 0xC829 # HANGUL SYLLABLE CIEUC-E-RIEULTHIEUTH -0xA0A2 0xC82A # HANGUL SYLLABLE CIEUC-E-RIEULPHIEUPH -0xA0A3 0xC82B # HANGUL SYLLABLE CIEUC-E-RIEULHIEUH -0xA0A4 0xC82E # HANGUL SYLLABLE CIEUC-E-PIEUPSIOS -0xA0A5 0xC830 # HANGUL SYLLABLE CIEUC-E-SSANGSIOS -0xA0A6 0xC832 # HANGUL SYLLABLE CIEUC-E-CIEUC -0xA0A7 0xC833 # HANGUL SYLLABLE CIEUC-E-CHIEUCH -0xA0A8 0xC834 # HANGUL SYLLABLE CIEUC-E-KHIEUKH -0xA0A9 0xC835 # HANGUL SYLLABLE CIEUC-E-THIEUTH -0xA0AA 0xC836 # HANGUL SYLLABLE CIEUC-E-PHIEUPH -0xA0AB 0xC837 # HANGUL SYLLABLE CIEUC-E-HIEUH -0xA0AC 0xC839 # HANGUL SYLLABLE CIEUC-YEO-KIYEOK -0xA0AD 0xC83A # HANGUL SYLLABLE CIEUC-YEO-SSANGKIYEOK -0xA0AE 0xC83B # HANGUL SYLLABLE CIEUC-YEO-KIYEOKSIOS -0xA0AF 0xC83D # HANGUL SYLLABLE CIEUC-YEO-NIEUNCIEUC -0xA0B0 0xC83E # HANGUL SYLLABLE CIEUC-YEO-NIEUNHIEUH -0xA0B1 0xC83F # HANGUL SYLLABLE CIEUC-YEO-TIKEUT -0xA0B2 0xC841 # HANGUL SYLLABLE CIEUC-YEO-RIEULKIYEOK -0xA0B3 0xC842 # HANGUL SYLLABLE CIEUC-YEO-RIEULMIEUM -0xA0B4 0xC843 # HANGUL SYLLABLE CIEUC-YEO-RIEULPIEUP -0xA0B5 0xC844 # HANGUL SYLLABLE CIEUC-YEO-RIEULSIOS -0xA0B6 0xC845 # HANGUL SYLLABLE CIEUC-YEO-RIEULTHIEUTH -0xA0B7 0xC846 # HANGUL SYLLABLE CIEUC-YEO-RIEULPHIEUPH -0xA0B8 0xC847 # HANGUL SYLLABLE CIEUC-YEO-RIEULHIEUH -0xA0B9 0xC84A # HANGUL SYLLABLE CIEUC-YEO-PIEUPSIOS -0xA0BA 0xC84B # HANGUL SYLLABLE CIEUC-YEO-SIOS -0xA0BB 0xC84E # HANGUL SYLLABLE CIEUC-YEO-CIEUC -0xA0BC 0xC84F # HANGUL SYLLABLE CIEUC-YEO-CHIEUCH -0xA0BD 0xC850 # HANGUL SYLLABLE CIEUC-YEO-KHIEUKH -0xA0BE 0xC851 # HANGUL SYLLABLE CIEUC-YEO-THIEUTH -0xA0BF 0xC852 # HANGUL SYLLABLE CIEUC-YEO-PHIEUPH -0xA0C0 0xC853 # HANGUL SYLLABLE CIEUC-YEO-HIEUH -0xA0C1 0xC855 # HANGUL SYLLABLE CIEUC-YE-KIYEOK -0xA0C2 0xC856 # HANGUL SYLLABLE CIEUC-YE-SSANGKIYEOK -0xA0C3 0xC857 # HANGUL SYLLABLE CIEUC-YE-KIYEOKSIOS -0xA0C4 0xC858 # HANGUL SYLLABLE CIEUC-YE-NIEUN -0xA0C5 0xC859 # HANGUL SYLLABLE CIEUC-YE-NIEUNCIEUC -0xA0C6 0xC85A # HANGUL SYLLABLE CIEUC-YE-NIEUNHIEUH -0xA0C7 0xC85B # HANGUL SYLLABLE CIEUC-YE-TIKEUT -0xA0C8 0xC85C # HANGUL SYLLABLE CIEUC-YE-RIEUL -0xA0C9 0xC85D # HANGUL SYLLABLE CIEUC-YE-RIEULKIYEOK -0xA0CA 0xC85E # HANGUL SYLLABLE CIEUC-YE-RIEULMIEUM -0xA0CB 0xC85F # HANGUL SYLLABLE CIEUC-YE-RIEULPIEUP -0xA0CC 0xC860 # HANGUL SYLLABLE CIEUC-YE-RIEULSIOS -0xA0CD 0xC861 # HANGUL SYLLABLE CIEUC-YE-RIEULTHIEUTH -0xA0CE 0xC862 # HANGUL SYLLABLE CIEUC-YE-RIEULPHIEUPH -0xA0CF 0xC863 # HANGUL SYLLABLE CIEUC-YE-RIEULHIEUH -0xA0D0 0xC864 # HANGUL SYLLABLE CIEUC-YE-MIEUM -0xA0D1 0xC865 # HANGUL SYLLABLE CIEUC-YE-PIEUP -0xA0D2 0xC866 # HANGUL SYLLABLE CIEUC-YE-PIEUPSIOS -0xA0D3 0xC867 # HANGUL SYLLABLE CIEUC-YE-SIOS -0xA0D4 0xC868 # HANGUL SYLLABLE CIEUC-YE-SSANGSIOS -0xA0D5 0xC869 # HANGUL SYLLABLE CIEUC-YE-IEUNG -0xA0D6 0xC86A # HANGUL SYLLABLE CIEUC-YE-CIEUC -0xA0D7 0xC86B # HANGUL SYLLABLE CIEUC-YE-CHIEUCH -0xA0D8 0xC86C # HANGUL SYLLABLE CIEUC-YE-KHIEUKH -0xA0D9 0xC86D # HANGUL SYLLABLE CIEUC-YE-THIEUTH -0xA0DA 0xC86E # HANGUL SYLLABLE CIEUC-YE-PHIEUPH -0xA0DB 0xC86F # HANGUL SYLLABLE CIEUC-YE-HIEUH -0xA0DC 0xC872 # HANGUL SYLLABLE CIEUC-O-SSANGKIYEOK -0xA0DD 0xC873 # HANGUL SYLLABLE CIEUC-O-KIYEOKSIOS -0xA0DE 0xC875 # HANGUL SYLLABLE CIEUC-O-NIEUNCIEUC -0xA0DF 0xC876 # HANGUL SYLLABLE CIEUC-O-NIEUNHIEUH -0xA0E0 0xC877 # HANGUL SYLLABLE CIEUC-O-TIKEUT -0xA0E1 0xC879 # HANGUL SYLLABLE CIEUC-O-RIEULKIYEOK -0xA0E2 0xC87B # HANGUL SYLLABLE CIEUC-O-RIEULPIEUP -0xA0E3 0xC87C # HANGUL SYLLABLE CIEUC-O-RIEULSIOS -0xA0E4 0xC87D # HANGUL SYLLABLE CIEUC-O-RIEULTHIEUTH -0xA0E5 0xC87E # HANGUL SYLLABLE CIEUC-O-RIEULPHIEUPH -0xA0E6 0xC87F # HANGUL SYLLABLE CIEUC-O-RIEULHIEUH -0xA0E7 0xC882 # HANGUL SYLLABLE CIEUC-O-PIEUPSIOS -0xA0E8 0xC884 # HANGUL SYLLABLE CIEUC-O-SSANGSIOS -0xA0E9 0xC888 # HANGUL SYLLABLE CIEUC-O-KHIEUKH -0xA0EA 0xC889 # HANGUL SYLLABLE CIEUC-O-THIEUTH -0xA0EB 0xC88A # HANGUL SYLLABLE CIEUC-O-PHIEUPH -0xA0EC 0xC88E # HANGUL SYLLABLE CIEUC-WA-SSANGKIYEOK -0xA0ED 0xC88F # HANGUL SYLLABLE CIEUC-WA-KIYEOKSIOS -0xA0EE 0xC890 # HANGUL SYLLABLE CIEUC-WA-NIEUN -0xA0EF 0xC891 # HANGUL SYLLABLE CIEUC-WA-NIEUNCIEUC -0xA0F0 0xC892 # HANGUL SYLLABLE CIEUC-WA-NIEUNHIEUH -0xA0F1 0xC893 # HANGUL SYLLABLE CIEUC-WA-TIKEUT -0xA0F2 0xC895 # HANGUL SYLLABLE CIEUC-WA-RIEULKIYEOK -0xA0F3 0xC896 # HANGUL SYLLABLE CIEUC-WA-RIEULMIEUM -0xA0F4 0xC897 # HANGUL SYLLABLE CIEUC-WA-RIEULPIEUP -0xA0F5 0xC898 # HANGUL SYLLABLE CIEUC-WA-RIEULSIOS -0xA0F6 0xC899 # HANGUL SYLLABLE CIEUC-WA-RIEULTHIEUTH -0xA0F7 0xC89A # HANGUL SYLLABLE CIEUC-WA-RIEULPHIEUPH -0xA0F8 0xC89B # HANGUL SYLLABLE CIEUC-WA-RIEULHIEUH -0xA0F9 0xC89C # HANGUL SYLLABLE CIEUC-WA-MIEUM -0xA0FA 0xC89E # HANGUL SYLLABLE CIEUC-WA-PIEUPSIOS -0xA0FB 0xC8A0 # HANGUL SYLLABLE CIEUC-WA-SSANGSIOS -0xA0FC 0xC8A2 # HANGUL SYLLABLE CIEUC-WA-CIEUC -0xA0FD 0xC8A3 # HANGUL SYLLABLE CIEUC-WA-CHIEUCH -0xA0FE 0xC8A4 # HANGUL SYLLABLE CIEUC-WA-KHIEUKH -0xA141 0xC8A5 # HANGUL SYLLABLE CIEUC-WA-THIEUTH -0xA142 0xC8A6 # HANGUL SYLLABLE CIEUC-WA-PHIEUPH -0xA143 0xC8A7 # HANGUL SYLLABLE CIEUC-WA-HIEUH -0xA144 0xC8A9 # HANGUL SYLLABLE CIEUC-WAE-KIYEOK -0xA145 0xC8AA # HANGUL SYLLABLE CIEUC-WAE-SSANGKIYEOK -0xA146 0xC8AB # HANGUL SYLLABLE CIEUC-WAE-KIYEOKSIOS -0xA147 0xC8AC # HANGUL SYLLABLE CIEUC-WAE-NIEUN -0xA148 0xC8AD # HANGUL SYLLABLE CIEUC-WAE-NIEUNCIEUC -0xA149 0xC8AE # HANGUL SYLLABLE CIEUC-WAE-NIEUNHIEUH -0xA14A 0xC8AF # HANGUL SYLLABLE CIEUC-WAE-TIKEUT -0xA14B 0xC8B0 # HANGUL SYLLABLE CIEUC-WAE-RIEUL -0xA14C 0xC8B1 # HANGUL SYLLABLE CIEUC-WAE-RIEULKIYEOK -0xA14D 0xC8B2 # HANGUL SYLLABLE CIEUC-WAE-RIEULMIEUM -0xA14E 0xC8B3 # HANGUL SYLLABLE CIEUC-WAE-RIEULPIEUP -0xA14F 0xC8B4 # HANGUL SYLLABLE CIEUC-WAE-RIEULSIOS -0xA150 0xC8B5 # HANGUL SYLLABLE CIEUC-WAE-RIEULTHIEUTH -0xA151 0xC8B6 # HANGUL SYLLABLE CIEUC-WAE-RIEULPHIEUPH -0xA152 0xC8B7 # HANGUL SYLLABLE CIEUC-WAE-RIEULHIEUH -0xA153 0xC8B8 # HANGUL SYLLABLE CIEUC-WAE-MIEUM -0xA154 0xC8B9 # HANGUL SYLLABLE CIEUC-WAE-PIEUP -0xA155 0xC8BA # HANGUL SYLLABLE CIEUC-WAE-PIEUPSIOS -0xA156 0xC8BB # HANGUL SYLLABLE CIEUC-WAE-SIOS -0xA157 0xC8BE # HANGUL SYLLABLE CIEUC-WAE-CIEUC -0xA158 0xC8BF # HANGUL SYLLABLE CIEUC-WAE-CHIEUCH -0xA159 0xC8C0 # HANGUL SYLLABLE CIEUC-WAE-KHIEUKH -0xA15A 0xC8C1 # HANGUL SYLLABLE CIEUC-WAE-THIEUTH -0xA161 0xC8C2 # HANGUL SYLLABLE CIEUC-WAE-PHIEUPH -0xA162 0xC8C3 # HANGUL SYLLABLE CIEUC-WAE-HIEUH -0xA163 0xC8C5 # HANGUL SYLLABLE CIEUC-OE-KIYEOK -0xA164 0xC8C6 # HANGUL SYLLABLE CIEUC-OE-SSANGKIYEOK -0xA165 0xC8C7 # HANGUL SYLLABLE CIEUC-OE-KIYEOKSIOS -0xA166 0xC8C9 # HANGUL SYLLABLE CIEUC-OE-NIEUNCIEUC -0xA167 0xC8CA # HANGUL SYLLABLE CIEUC-OE-NIEUNHIEUH -0xA168 0xC8CB # HANGUL SYLLABLE CIEUC-OE-TIKEUT -0xA169 0xC8CD # HANGUL SYLLABLE CIEUC-OE-RIEULKIYEOK -0xA16A 0xC8CE # HANGUL SYLLABLE CIEUC-OE-RIEULMIEUM -0xA16B 0xC8CF # HANGUL SYLLABLE CIEUC-OE-RIEULPIEUP -0xA16C 0xC8D0 # HANGUL SYLLABLE CIEUC-OE-RIEULSIOS -0xA16D 0xC8D1 # HANGUL SYLLABLE CIEUC-OE-RIEULTHIEUTH -0xA16E 0xC8D2 # HANGUL SYLLABLE CIEUC-OE-RIEULPHIEUPH -0xA16F 0xC8D3 # HANGUL SYLLABLE CIEUC-OE-RIEULHIEUH -0xA170 0xC8D6 # HANGUL SYLLABLE CIEUC-OE-PIEUPSIOS -0xA171 0xC8D8 # HANGUL SYLLABLE CIEUC-OE-SSANGSIOS -0xA172 0xC8DA # HANGUL SYLLABLE CIEUC-OE-CIEUC -0xA173 0xC8DB # HANGUL SYLLABLE CIEUC-OE-CHIEUCH -0xA174 0xC8DC # HANGUL SYLLABLE CIEUC-OE-KHIEUKH -0xA175 0xC8DD # HANGUL SYLLABLE CIEUC-OE-THIEUTH -0xA176 0xC8DE # HANGUL SYLLABLE CIEUC-OE-PHIEUPH -0xA177 0xC8DF # HANGUL SYLLABLE CIEUC-OE-HIEUH -0xA178 0xC8E2 # HANGUL SYLLABLE CIEUC-YO-SSANGKIYEOK -0xA179 0xC8E3 # HANGUL SYLLABLE CIEUC-YO-KIYEOKSIOS -0xA17A 0xC8E5 # HANGUL SYLLABLE CIEUC-YO-NIEUNCIEUC -0xA181 0xC8E6 # HANGUL SYLLABLE CIEUC-YO-NIEUNHIEUH -0xA182 0xC8E7 # HANGUL SYLLABLE CIEUC-YO-TIKEUT -0xA183 0xC8E8 # HANGUL SYLLABLE CIEUC-YO-RIEUL -0xA184 0xC8E9 # HANGUL SYLLABLE CIEUC-YO-RIEULKIYEOK -0xA185 0xC8EA # HANGUL SYLLABLE CIEUC-YO-RIEULMIEUM -0xA186 0xC8EB # HANGUL SYLLABLE CIEUC-YO-RIEULPIEUP -0xA187 0xC8EC # HANGUL SYLLABLE CIEUC-YO-RIEULSIOS -0xA188 0xC8ED # HANGUL SYLLABLE CIEUC-YO-RIEULTHIEUTH -0xA189 0xC8EE # HANGUL SYLLABLE CIEUC-YO-RIEULPHIEUPH -0xA18A 0xC8EF # HANGUL SYLLABLE CIEUC-YO-RIEULHIEUH -0xA18B 0xC8F0 # HANGUL SYLLABLE CIEUC-YO-MIEUM -0xA18C 0xC8F1 # HANGUL SYLLABLE CIEUC-YO-PIEUP -0xA18D 0xC8F2 # HANGUL SYLLABLE CIEUC-YO-PIEUPSIOS -0xA18E 0xC8F3 # HANGUL SYLLABLE CIEUC-YO-SIOS -0xA18F 0xC8F4 # HANGUL SYLLABLE CIEUC-YO-SSANGSIOS -0xA190 0xC8F6 # HANGUL SYLLABLE CIEUC-YO-CIEUC -0xA191 0xC8F7 # HANGUL SYLLABLE CIEUC-YO-CHIEUCH -0xA192 0xC8F8 # HANGUL SYLLABLE CIEUC-YO-KHIEUKH -0xA193 0xC8F9 # HANGUL SYLLABLE CIEUC-YO-THIEUTH -0xA194 0xC8FA # HANGUL SYLLABLE CIEUC-YO-PHIEUPH -0xA195 0xC8FB # HANGUL SYLLABLE CIEUC-YO-HIEUH -0xA196 0xC8FE # HANGUL SYLLABLE CIEUC-U-SSANGKIYEOK -0xA197 0xC8FF # HANGUL SYLLABLE CIEUC-U-KIYEOKSIOS -0xA198 0xC901 # HANGUL SYLLABLE CIEUC-U-NIEUNCIEUC -0xA199 0xC902 # HANGUL SYLLABLE CIEUC-U-NIEUNHIEUH -0xA19A 0xC903 # HANGUL SYLLABLE CIEUC-U-TIKEUT -0xA19B 0xC907 # HANGUL SYLLABLE CIEUC-U-RIEULPIEUP -0xA19C 0xC908 # HANGUL SYLLABLE CIEUC-U-RIEULSIOS -0xA19D 0xC909 # HANGUL SYLLABLE CIEUC-U-RIEULTHIEUTH -0xA19E 0xC90A # HANGUL SYLLABLE CIEUC-U-RIEULPHIEUPH -0xA19F 0xC90B # HANGUL SYLLABLE CIEUC-U-RIEULHIEUH -0xA1A0 0xC90E # HANGUL SYLLABLE CIEUC-U-PIEUPSIOS -0xA1A1 0x3000 # IDEOGRAPHIC SPACE -0xA1A2 0x3001 # IDEOGRAPHIC COMMA -0xA1A3 0x3002 # IDEOGRAPHIC FULL STOP -0xA1A4 0x00B7 # MIDDLE DOT -0xA1A5 0x2025 # TWO DOT LEADER -0xA1A6 0x2026 # HORIZONTAL ELLIPSIS -0xA1A7 0x00A8 # DIAERESIS -0xA1A8 0x3003 # DITTO MARK -0xA1A9 0x00AD # SOFT HYPHEN -0xA1AA 0x2015 # HORIZONTAL BAR -0xA1AB 0x2225 # PARALLEL TO -0xA1AC 0xFF3C # FULLWIDTH REVERSE SOLIDUS -0xA1AD 0x223C # TILDE OPERATOR -0xA1AE 0x2018 # LEFT SINGLE QUOTATION MARK -0xA1AF 0x2019 # RIGHT SINGLE QUOTATION MARK -0xA1B0 0x201C # LEFT DOUBLE QUOTATION MARK -0xA1B1 0x201D # RIGHT DOUBLE QUOTATION MARK -0xA1B2 0x3014 # LEFT TORTOISE SHELL BRACKET -0xA1B3 0x3015 # RIGHT TORTOISE SHELL BRACKET -0xA1B4 0x3008 # LEFT ANGLE BRACKET -0xA1B5 0x3009 # RIGHT ANGLE BRACKET -0xA1B6 0x300A # LEFT DOUBLE ANGLE BRACKET -0xA1B7 0x300B # RIGHT DOUBLE ANGLE BRACKET -0xA1B8 0x300C # LEFT CORNER BRACKET -0xA1B9 0x300D # RIGHT CORNER BRACKET -0xA1BA 0x300E # LEFT WHITE CORNER BRACKET -0xA1BB 0x300F # RIGHT WHITE CORNER BRACKET -0xA1BC 0x3010 # LEFT BLACK LENTICULAR BRACKET -0xA1BD 0x3011 # RIGHT BLACK LENTICULAR BRACKET -0xA1BE 0x00B1 # PLUS-MINUS SIGN -0xA1BF 0x00D7 # MULTIPLICATION SIGN -0xA1C0 0x00F7 # DIVISION SIGN -0xA1C1 0x2260 # NOT EQUAL TO -0xA1C2 0x2264 # LESS-THAN OR EQUAL TO -0xA1C3 0x2265 # GREATER-THAN OR EQUAL TO -0xA1C4 0x221E # INFINITY -0xA1C5 0x2234 # THEREFORE -0xA1C6 0x00B0 # DEGREE SIGN -0xA1C7 0x2032 # PRIME -0xA1C8 0x2033 # DOUBLE PRIME -0xA1C9 0x2103 # DEGREE CELSIUS -0xA1CA 0x212B # ANGSTROM SIGN -0xA1CB 0xFFE0 # FULLWIDTH CENT SIGN -0xA1CC 0xFFE1 # FULLWIDTH POUND SIGN -0xA1CD 0xFFE5 # FULLWIDTH YEN SIGN -0xA1CE 0x2642 # MALE SIGN -0xA1CF 0x2640 # FEMALE SIGN -0xA1D0 0x2220 # ANGLE -0xA1D1 0x22A5 # UP TACK -0xA1D2 0x2312 # ARC -0xA1D3 0x2202 # PARTIAL DIFFERENTIAL -0xA1D4 0x2207 # NABLA -0xA1D5 0x2261 # IDENTICAL TO -0xA1D6 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF -0xA1D7 0x00A7 # SECTION SIGN -0xA1D8 0x203B # REFERENCE MARK -0xA1D9 0x2606 # WHITE STAR -0xA1DA 0x2605 # BLACK STAR -0xA1DB 0x25CB # WHITE CIRCLE -0xA1DC 0x25CF # BLACK CIRCLE -0xA1DD 0x25CE # BULLSEYE -0xA1DE 0x25C7 # WHITE DIAMOND -0xA1DF 0x25C6 # BLACK DIAMOND -0xA1E0 0x25A1 # WHITE SQUARE -0xA1E1 0x25A0 # BLACK SQUARE -0xA1E2 0x25B3 # WHITE UP-POINTING TRIANGLE -0xA1E3 0x25B2 # BLACK UP-POINTING TRIANGLE -0xA1E4 0x25BD # WHITE DOWN-POINTING TRIANGLE -0xA1E5 0x25BC # BLACK DOWN-POINTING TRIANGLE -0xA1E6 0x2192 # RIGHTWARDS ARROW -0xA1E7 0x2190 # LEFTWARDS ARROW -0xA1E8 0x2191 # UPWARDS ARROW -0xA1E9 0x2193 # DOWNWARDS ARROW -0xA1EA 0x2194 # LEFT RIGHT ARROW -0xA1EB 0x3013 # GETA MARK -0xA1EC 0x226A # MUCH LESS-THAN -0xA1ED 0x226B # MUCH GREATER-THAN -0xA1EE 0x221A # SQUARE ROOT -0xA1EF 0x223D # REVERSED TILDE -0xA1F0 0x221D # PROPORTIONAL TO -0xA1F1 0x2235 # BECAUSE -0xA1F2 0x222B # INTEGRAL -0xA1F3 0x222C # DOUBLE INTEGRAL -0xA1F4 0x2208 # ELEMENT OF -0xA1F5 0x220B # CONTAINS AS MEMBER -0xA1F6 0x2286 # SUBSET OF OR EQUAL TO -0xA1F7 0x2287 # SUPERSET OF OR EQUAL TO -0xA1F8 0x2282 # SUBSET OF -0xA1F9 0x2283 # SUPERSET OF -0xA1FA 0x222A # UNION -0xA1FB 0x2229 # INTERSECTION -0xA1FC 0x2227 # LOGICAL AND -0xA1FD 0x2228 # LOGICAL OR -0xA1FE 0xFFE2 # FULLWIDTH NOT SIGN -0xA241 0xC910 # HANGUL SYLLABLE CIEUC-U-SSANGSIOS -0xA242 0xC912 # HANGUL SYLLABLE CIEUC-U-CIEUC -0xA243 0xC913 # HANGUL SYLLABLE CIEUC-U-CHIEUCH -0xA244 0xC914 # HANGUL SYLLABLE CIEUC-U-KHIEUKH -0xA245 0xC915 # HANGUL SYLLABLE CIEUC-U-THIEUTH -0xA246 0xC916 # HANGUL SYLLABLE CIEUC-U-PHIEUPH -0xA247 0xC917 # HANGUL SYLLABLE CIEUC-U-HIEUH -0xA248 0xC919 # HANGUL SYLLABLE CIEUC-WEO-KIYEOK -0xA249 0xC91A # HANGUL SYLLABLE CIEUC-WEO-SSANGKIYEOK -0xA24A 0xC91B # HANGUL SYLLABLE CIEUC-WEO-KIYEOKSIOS -0xA24B 0xC91C # HANGUL SYLLABLE CIEUC-WEO-NIEUN -0xA24C 0xC91D # HANGUL SYLLABLE CIEUC-WEO-NIEUNCIEUC -0xA24D 0xC91E # HANGUL SYLLABLE CIEUC-WEO-NIEUNHIEUH -0xA24E 0xC91F # HANGUL SYLLABLE CIEUC-WEO-TIKEUT -0xA24F 0xC920 # HANGUL SYLLABLE CIEUC-WEO-RIEUL -0xA250 0xC921 # HANGUL SYLLABLE CIEUC-WEO-RIEULKIYEOK -0xA251 0xC922 # HANGUL SYLLABLE CIEUC-WEO-RIEULMIEUM -0xA252 0xC923 # HANGUL SYLLABLE CIEUC-WEO-RIEULPIEUP -0xA253 0xC924 # HANGUL SYLLABLE CIEUC-WEO-RIEULSIOS -0xA254 0xC925 # HANGUL SYLLABLE CIEUC-WEO-RIEULTHIEUTH -0xA255 0xC926 # HANGUL SYLLABLE CIEUC-WEO-RIEULPHIEUPH -0xA256 0xC927 # HANGUL SYLLABLE CIEUC-WEO-RIEULHIEUH -0xA257 0xC928 # HANGUL SYLLABLE CIEUC-WEO-MIEUM -0xA258 0xC929 # HANGUL SYLLABLE CIEUC-WEO-PIEUP -0xA259 0xC92A # HANGUL SYLLABLE CIEUC-WEO-PIEUPSIOS -0xA25A 0xC92B # HANGUL SYLLABLE CIEUC-WEO-SIOS -0xA261 0xC92D # HANGUL SYLLABLE CIEUC-WEO-IEUNG -0xA262 0xC92E # HANGUL SYLLABLE CIEUC-WEO-CIEUC -0xA263 0xC92F # HANGUL SYLLABLE CIEUC-WEO-CHIEUCH -0xA264 0xC930 # HANGUL SYLLABLE CIEUC-WEO-KHIEUKH -0xA265 0xC931 # HANGUL SYLLABLE CIEUC-WEO-THIEUTH -0xA266 0xC932 # HANGUL SYLLABLE CIEUC-WEO-PHIEUPH -0xA267 0xC933 # HANGUL SYLLABLE CIEUC-WEO-HIEUH -0xA268 0xC935 # HANGUL SYLLABLE CIEUC-WE-KIYEOK -0xA269 0xC936 # HANGUL SYLLABLE CIEUC-WE-SSANGKIYEOK -0xA26A 0xC937 # HANGUL SYLLABLE CIEUC-WE-KIYEOKSIOS -0xA26B 0xC938 # HANGUL SYLLABLE CIEUC-WE-NIEUN -0xA26C 0xC939 # HANGUL SYLLABLE CIEUC-WE-NIEUNCIEUC -0xA26D 0xC93A # HANGUL SYLLABLE CIEUC-WE-NIEUNHIEUH -0xA26E 0xC93B # HANGUL SYLLABLE CIEUC-WE-TIKEUT -0xA26F 0xC93C # HANGUL SYLLABLE CIEUC-WE-RIEUL -0xA270 0xC93D # HANGUL SYLLABLE CIEUC-WE-RIEULKIYEOK -0xA271 0xC93E # HANGUL SYLLABLE CIEUC-WE-RIEULMIEUM -0xA272 0xC93F # HANGUL SYLLABLE CIEUC-WE-RIEULPIEUP -0xA273 0xC940 # HANGUL SYLLABLE CIEUC-WE-RIEULSIOS -0xA274 0xC941 # HANGUL SYLLABLE CIEUC-WE-RIEULTHIEUTH -0xA275 0xC942 # HANGUL SYLLABLE CIEUC-WE-RIEULPHIEUPH -0xA276 0xC943 # HANGUL SYLLABLE CIEUC-WE-RIEULHIEUH -0xA277 0xC944 # HANGUL SYLLABLE CIEUC-WE-MIEUM -0xA278 0xC945 # HANGUL SYLLABLE CIEUC-WE-PIEUP -0xA279 0xC946 # HANGUL SYLLABLE CIEUC-WE-PIEUPSIOS -0xA27A 0xC947 # HANGUL SYLLABLE CIEUC-WE-SIOS -0xA281 0xC948 # HANGUL SYLLABLE CIEUC-WE-SSANGSIOS -0xA282 0xC949 # HANGUL SYLLABLE CIEUC-WE-IEUNG -0xA283 0xC94A # HANGUL SYLLABLE CIEUC-WE-CIEUC -0xA284 0xC94B # HANGUL SYLLABLE CIEUC-WE-CHIEUCH -0xA285 0xC94C # HANGUL SYLLABLE CIEUC-WE-KHIEUKH -0xA286 0xC94D # HANGUL SYLLABLE CIEUC-WE-THIEUTH -0xA287 0xC94E # HANGUL SYLLABLE CIEUC-WE-PHIEUPH -0xA288 0xC94F # HANGUL SYLLABLE CIEUC-WE-HIEUH -0xA289 0xC952 # HANGUL SYLLABLE CIEUC-WI-SSANGKIYEOK -0xA28A 0xC953 # HANGUL SYLLABLE CIEUC-WI-KIYEOKSIOS -0xA28B 0xC955 # HANGUL SYLLABLE CIEUC-WI-NIEUNCIEUC -0xA28C 0xC956 # HANGUL SYLLABLE CIEUC-WI-NIEUNHIEUH -0xA28D 0xC957 # HANGUL SYLLABLE CIEUC-WI-TIKEUT -0xA28E 0xC959 # HANGUL SYLLABLE CIEUC-WI-RIEULKIYEOK -0xA28F 0xC95A # HANGUL SYLLABLE CIEUC-WI-RIEULMIEUM -0xA290 0xC95B # HANGUL SYLLABLE CIEUC-WI-RIEULPIEUP -0xA291 0xC95C # HANGUL SYLLABLE CIEUC-WI-RIEULSIOS -0xA292 0xC95D # HANGUL SYLLABLE CIEUC-WI-RIEULTHIEUTH -0xA293 0xC95E # HANGUL SYLLABLE CIEUC-WI-RIEULPHIEUPH -0xA294 0xC95F # HANGUL SYLLABLE CIEUC-WI-RIEULHIEUH -0xA295 0xC962 # HANGUL SYLLABLE CIEUC-WI-PIEUPSIOS -0xA296 0xC964 # HANGUL SYLLABLE CIEUC-WI-SSANGSIOS -0xA297 0xC965 # HANGUL SYLLABLE CIEUC-WI-IEUNG -0xA298 0xC966 # HANGUL SYLLABLE CIEUC-WI-CIEUC -0xA299 0xC967 # HANGUL SYLLABLE CIEUC-WI-CHIEUCH -0xA29A 0xC968 # HANGUL SYLLABLE CIEUC-WI-KHIEUKH -0xA29B 0xC969 # HANGUL SYLLABLE CIEUC-WI-THIEUTH -0xA29C 0xC96A # HANGUL SYLLABLE CIEUC-WI-PHIEUPH -0xA29D 0xC96B # HANGUL SYLLABLE CIEUC-WI-HIEUH -0xA29E 0xC96D # HANGUL SYLLABLE CIEUC-YU-KIYEOK -0xA29F 0xC96E # HANGUL SYLLABLE CIEUC-YU-SSANGKIYEOK -0xA2A0 0xC96F # HANGUL SYLLABLE CIEUC-YU-KIYEOKSIOS -0xA2A1 0x21D2 # RIGHTWARDS DOUBLE ARROW -0xA2A2 0x21D4 # LEFT RIGHT DOUBLE ARROW -0xA2A3 0x2200 # FOR ALL -0xA2A4 0x2203 # THERE EXISTS -0xA2A5 0x00B4 # ACUTE ACCENT -0xA2A6 0xFF5E # FULLWIDTH TILDE -0xA2A7 0x02C7 # CARON -0xA2A8 0x02D8 # BREVE -0xA2A9 0x02DD # DOUBLE ACUTE ACCENT -0xA2AA 0x02DA # RING ABOVE -0xA2AB 0x02D9 # DOT ABOVE -0xA2AC 0x00B8 # CEDILLA -0xA2AD 0x02DB # OGONEK -0xA2AE 0x00A1 # INVERTED EXCLAMATION MARK -0xA2AF 0x00BF # INVERTED QUESTION MARK -0xA2B0 0x02D0 # MODIFIER LETTER TRIANGULAR COLON -0xA2B1 0x222E # CONTOUR INTEGRAL -0xA2B2 0x2211 # N-ARY SUMMATION -0xA2B3 0x220F # N-ARY PRODUCT -0xA2B4 0x00A4 # CURRENCY SIGN -0xA2B5 0x2109 # DEGREE FAHRENHEIT -0xA2B6 0x2030 # PER MILLE SIGN -0xA2B7 0x25C1 # WHITE LEFT-POINTING TRIANGLE -0xA2B8 0x25C0 # BLACK LEFT-POINTING TRIANGLE -0xA2B9 0x25B7 # WHITE RIGHT-POINTING TRIANGLE -0xA2BA 0x25B6 # BLACK RIGHT-POINTING TRIANGLE -0xA2BB 0x2664 # WHITE SPADE SUIT -0xA2BC 0x2660 # BLACK SPADE SUIT -0xA2BD 0x2661 # WHITE HEART SUIT -0xA2BE 0x2665 # BLACK HEART SUIT -0xA2BF 0x2667 # WHITE CLUB SUIT -0xA2C0 0x2663 # BLACK CLUB SUIT -0xA2C1 0x2299 # CIRCLED DOT OPERATOR -0xA2C2 0x25C8 # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND -0xA2C3 0x25A3 # WHITE SQUARE CONTAINING BLACK SMALL SQUARE -0xA2C4 0x25D0 # CIRCLE WITH LEFT HALF BLACK -0xA2C5 0x25D1 # CIRCLE WITH RIGHT HALF BLACK -0xA2C6 0x2592 # MEDIUM SHADE -0xA2C7 0x25A4 # SQUARE WITH HORIZONTAL FILL -0xA2C8 0x25A5 # SQUARE WITH VERTICAL FILL -0xA2C9 0x25A8 # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL -0xA2CA 0x25A7 # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL -0xA2CB 0x25A6 # SQUARE WITH ORTHOGONAL CROSSHATCH FILL -0xA2CC 0x25A9 # SQUARE WITH DIAGONAL CROSSHATCH FILL -0xA2CD 0x2668 # HOT SPRINGS -0xA2CE 0x260F # WHITE TELEPHONE -0xA2CF 0x260E # BLACK TELEPHONE -0xA2D0 0x261C # WHITE LEFT POINTING INDEX -0xA2D1 0x261E # WHITE RIGHT POINTING INDEX -0xA2D2 0x00B6 # PILCROW SIGN -0xA2D3 0x2020 # DAGGER -0xA2D4 0x2021 # DOUBLE DAGGER -0xA2D5 0x2195 # UP DOWN ARROW -0xA2D6 0x2197 # NORTH EAST ARROW -0xA2D7 0x2199 # SOUTH WEST ARROW -0xA2D8 0x2196 # NORTH WEST ARROW -0xA2D9 0x2198 # SOUTH EAST ARROW -0xA2DA 0x266D # MUSIC FLAT SIGN -0xA2DB 0x2669 # QUARTER NOTE -0xA2DC 0x266A # EIGHTH NOTE -0xA2DD 0x266C # BEAMED SIXTEENTH NOTES -0xA2DE 0x327F # KOREAN STANDARD SYMBOL -0xA2DF 0x321C # PARENTHESIZED HANGUL CIEUC U -0xA2E0 0x2116 # NUMERO SIGN -0xA2E1 0x33C7 # SQUARE CO -0xA2E2 0x2122 # TRADE MARK SIGN -0xA2E3 0x33C2 # SQUARE AM -0xA2E4 0x33D8 # SQUARE PM -0xA2E5 0x2121 # TELEPHONE SIGN -0xA341 0xC971 # HANGUL SYLLABLE CIEUC-YU-NIEUNCIEUC -0xA342 0xC972 # HANGUL SYLLABLE CIEUC-YU-NIEUNHIEUH -0xA343 0xC973 # HANGUL SYLLABLE CIEUC-YU-TIKEUT -0xA344 0xC975 # HANGUL SYLLABLE CIEUC-YU-RIEULKIYEOK -0xA345 0xC976 # HANGUL SYLLABLE CIEUC-YU-RIEULMIEUM -0xA346 0xC977 # HANGUL SYLLABLE CIEUC-YU-RIEULPIEUP -0xA347 0xC978 # HANGUL SYLLABLE CIEUC-YU-RIEULSIOS -0xA348 0xC979 # HANGUL SYLLABLE CIEUC-YU-RIEULTHIEUTH -0xA349 0xC97A # HANGUL SYLLABLE CIEUC-YU-RIEULPHIEUPH -0xA34A 0xC97B # HANGUL SYLLABLE CIEUC-YU-RIEULHIEUH -0xA34B 0xC97D # HANGUL SYLLABLE CIEUC-YU-PIEUP -0xA34C 0xC97E # HANGUL SYLLABLE CIEUC-YU-PIEUPSIOS -0xA34D 0xC97F # HANGUL SYLLABLE CIEUC-YU-SIOS -0xA34E 0xC980 # HANGUL SYLLABLE CIEUC-YU-SSANGSIOS -0xA34F 0xC981 # HANGUL SYLLABLE CIEUC-YU-IEUNG -0xA350 0xC982 # HANGUL SYLLABLE CIEUC-YU-CIEUC -0xA351 0xC983 # HANGUL SYLLABLE CIEUC-YU-CHIEUCH -0xA352 0xC984 # HANGUL SYLLABLE CIEUC-YU-KHIEUKH -0xA353 0xC985 # HANGUL SYLLABLE CIEUC-YU-THIEUTH -0xA354 0xC986 # HANGUL SYLLABLE CIEUC-YU-PHIEUPH -0xA355 0xC987 # HANGUL SYLLABLE CIEUC-YU-HIEUH -0xA356 0xC98A # HANGUL SYLLABLE CIEUC-EU-SSANGKIYEOK -0xA357 0xC98B # HANGUL SYLLABLE CIEUC-EU-KIYEOKSIOS -0xA358 0xC98D # HANGUL SYLLABLE CIEUC-EU-NIEUNCIEUC -0xA359 0xC98E # HANGUL SYLLABLE CIEUC-EU-NIEUNHIEUH -0xA35A 0xC98F # HANGUL SYLLABLE CIEUC-EU-TIKEUT -0xA361 0xC991 # HANGUL SYLLABLE CIEUC-EU-RIEULKIYEOK -0xA362 0xC992 # HANGUL SYLLABLE CIEUC-EU-RIEULMIEUM -0xA363 0xC993 # HANGUL SYLLABLE CIEUC-EU-RIEULPIEUP -0xA364 0xC994 # HANGUL SYLLABLE CIEUC-EU-RIEULSIOS -0xA365 0xC995 # HANGUL SYLLABLE CIEUC-EU-RIEULTHIEUTH -0xA366 0xC996 # HANGUL SYLLABLE CIEUC-EU-RIEULPHIEUPH -0xA367 0xC997 # HANGUL SYLLABLE CIEUC-EU-RIEULHIEUH -0xA368 0xC99A # HANGUL SYLLABLE CIEUC-EU-PIEUPSIOS -0xA369 0xC99C # HANGUL SYLLABLE CIEUC-EU-SSANGSIOS -0xA36A 0xC99E # HANGUL SYLLABLE CIEUC-EU-CIEUC -0xA36B 0xC99F # HANGUL SYLLABLE CIEUC-EU-CHIEUCH -0xA36C 0xC9A0 # HANGUL SYLLABLE CIEUC-EU-KHIEUKH -0xA36D 0xC9A1 # HANGUL SYLLABLE CIEUC-EU-THIEUTH -0xA36E 0xC9A2 # HANGUL SYLLABLE CIEUC-EU-PHIEUPH -0xA36F 0xC9A3 # HANGUL SYLLABLE CIEUC-EU-HIEUH -0xA370 0xC9A4 # HANGUL SYLLABLE CIEUC-YI -0xA371 0xC9A5 # HANGUL SYLLABLE CIEUC-YI-KIYEOK -0xA372 0xC9A6 # HANGUL SYLLABLE CIEUC-YI-SSANGKIYEOK -0xA373 0xC9A7 # HANGUL SYLLABLE CIEUC-YI-KIYEOKSIOS -0xA374 0xC9A8 # HANGUL SYLLABLE CIEUC-YI-NIEUN -0xA375 0xC9A9 # HANGUL SYLLABLE CIEUC-YI-NIEUNCIEUC -0xA376 0xC9AA # HANGUL SYLLABLE CIEUC-YI-NIEUNHIEUH -0xA377 0xC9AB # HANGUL SYLLABLE CIEUC-YI-TIKEUT -0xA378 0xC9AC # HANGUL SYLLABLE CIEUC-YI-RIEUL -0xA379 0xC9AD # HANGUL SYLLABLE CIEUC-YI-RIEULKIYEOK -0xA37A 0xC9AE # HANGUL SYLLABLE CIEUC-YI-RIEULMIEUM -0xA381 0xC9AF # HANGUL SYLLABLE CIEUC-YI-RIEULPIEUP -0xA382 0xC9B0 # HANGUL SYLLABLE CIEUC-YI-RIEULSIOS -0xA383 0xC9B1 # HANGUL SYLLABLE CIEUC-YI-RIEULTHIEUTH -0xA384 0xC9B2 # HANGUL SYLLABLE CIEUC-YI-RIEULPHIEUPH -0xA385 0xC9B3 # HANGUL SYLLABLE CIEUC-YI-RIEULHIEUH -0xA386 0xC9B4 # HANGUL SYLLABLE CIEUC-YI-MIEUM -0xA387 0xC9B5 # HANGUL SYLLABLE CIEUC-YI-PIEUP -0xA388 0xC9B6 # HANGUL SYLLABLE CIEUC-YI-PIEUPSIOS -0xA389 0xC9B7 # HANGUL SYLLABLE CIEUC-YI-SIOS -0xA38A 0xC9B8 # HANGUL SYLLABLE CIEUC-YI-SSANGSIOS -0xA38B 0xC9B9 # HANGUL SYLLABLE CIEUC-YI-IEUNG -0xA38C 0xC9BA # HANGUL SYLLABLE CIEUC-YI-CIEUC -0xA38D 0xC9BB # HANGUL SYLLABLE CIEUC-YI-CHIEUCH -0xA38E 0xC9BC # HANGUL SYLLABLE CIEUC-YI-KHIEUKH -0xA38F 0xC9BD # HANGUL SYLLABLE CIEUC-YI-THIEUTH -0xA390 0xC9BE # HANGUL SYLLABLE CIEUC-YI-PHIEUPH -0xA391 0xC9BF # HANGUL SYLLABLE CIEUC-YI-HIEUH -0xA392 0xC9C2 # HANGUL SYLLABLE CIEUC-I-SSANGKIYEOK -0xA393 0xC9C3 # HANGUL SYLLABLE CIEUC-I-KIYEOKSIOS -0xA394 0xC9C5 # HANGUL SYLLABLE CIEUC-I-NIEUNCIEUC -0xA395 0xC9C6 # HANGUL SYLLABLE CIEUC-I-NIEUNHIEUH -0xA396 0xC9C9 # HANGUL SYLLABLE CIEUC-I-RIEULKIYEOK -0xA397 0xC9CB # HANGUL SYLLABLE CIEUC-I-RIEULPIEUP -0xA398 0xC9CC # HANGUL SYLLABLE CIEUC-I-RIEULSIOS -0xA399 0xC9CD # HANGUL SYLLABLE CIEUC-I-RIEULTHIEUTH -0xA39A 0xC9CE # HANGUL SYLLABLE CIEUC-I-RIEULPHIEUPH -0xA39B 0xC9CF # HANGUL SYLLABLE CIEUC-I-RIEULHIEUH -0xA39C 0xC9D2 # HANGUL SYLLABLE CIEUC-I-PIEUPSIOS -0xA39D 0xC9D4 # HANGUL SYLLABLE CIEUC-I-SSANGSIOS -0xA39E 0xC9D7 # HANGUL SYLLABLE CIEUC-I-CHIEUCH -0xA39F 0xC9D8 # HANGUL SYLLABLE CIEUC-I-KHIEUKH -0xA3A0 0xC9DB # HANGUL SYLLABLE CIEUC-I-HIEUH -0xA3A1 0xFF01 # FULLWIDTH EXCLAMATION MARK -0xA3A2 0xFF02 # FULLWIDTH QUOTATION MARK -0xA3A3 0xFF03 # FULLWIDTH NUMBER SIGN -0xA3A4 0xFF04 # FULLWIDTH DOLLAR SIGN -0xA3A5 0xFF05 # FULLWIDTH PERCENT SIGN -0xA3A6 0xFF06 # FULLWIDTH AMPERSAND -0xA3A7 0xFF07 # FULLWIDTH APOSTROPHE -0xA3A8 0xFF08 # FULLWIDTH LEFT PARENTHESIS -0xA3A9 0xFF09 # FULLWIDTH RIGHT PARENTHESIS -0xA3AA 0xFF0A # FULLWIDTH ASTERISK -0xA3AB 0xFF0B # FULLWIDTH PLUS SIGN -0xA3AC 0xFF0C # FULLWIDTH COMMA -0xA3AD 0xFF0D # FULLWIDTH HYPHEN-MINUS -0xA3AE 0xFF0E # FULLWIDTH FULL STOP -0xA3AF 0xFF0F # FULLWIDTH SOLIDUS -0xA3B0 0xFF10 # FULLWIDTH DIGIT ZERO -0xA3B1 0xFF11 # FULLWIDTH DIGIT ONE -0xA3B2 0xFF12 # FULLWIDTH DIGIT TWO -0xA3B3 0xFF13 # FULLWIDTH DIGIT THREE -0xA3B4 0xFF14 # FULLWIDTH DIGIT FOUR -0xA3B5 0xFF15 # FULLWIDTH DIGIT FIVE -0xA3B6 0xFF16 # FULLWIDTH DIGIT SIX -0xA3B7 0xFF17 # FULLWIDTH DIGIT SEVEN -0xA3B8 0xFF18 # FULLWIDTH DIGIT EIGHT -0xA3B9 0xFF19 # FULLWIDTH DIGIT NINE -0xA3BA 0xFF1A # FULLWIDTH COLON -0xA3BB 0xFF1B # FULLWIDTH SEMICOLON -0xA3BC 0xFF1C # FULLWIDTH LESS-THAN SIGN -0xA3BD 0xFF1D # FULLWIDTH EQUALS SIGN -0xA3BE 0xFF1E # FULLWIDTH GREATER-THAN SIGN -0xA3BF 0xFF1F # FULLWIDTH QUESTION MARK -0xA3C0 0xFF20 # FULLWIDTH COMMERCIAL AT -0xA3C1 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A -0xA3C2 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B -0xA3C3 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C -0xA3C4 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D -0xA3C5 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E -0xA3C6 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F -0xA3C7 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G -0xA3C8 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H -0xA3C9 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I -0xA3CA 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J -0xA3CB 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K -0xA3CC 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L -0xA3CD 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M -0xA3CE 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N -0xA3CF 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O -0xA3D0 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P -0xA3D1 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q -0xA3D2 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R -0xA3D3 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S -0xA3D4 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T -0xA3D5 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U -0xA3D6 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V -0xA3D7 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W -0xA3D8 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X -0xA3D9 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y -0xA3DA 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z -0xA3DB 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET -0xA3DC 0xFFE6 # FULLWIDTH WON SIGN -0xA3DD 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET -0xA3DE 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT -0xA3DF 0xFF3F # FULLWIDTH LOW LINE -0xA3E0 0xFF40 # FULLWIDTH GRAVE ACCENT -0xA3E1 0xFF41 # FULLWIDTH LATIN SMALL LETTER A -0xA3E2 0xFF42 # FULLWIDTH LATIN SMALL LETTER B -0xA3E3 0xFF43 # FULLWIDTH LATIN SMALL LETTER C -0xA3E4 0xFF44 # FULLWIDTH LATIN SMALL LETTER D -0xA3E5 0xFF45 # FULLWIDTH LATIN SMALL LETTER E -0xA3E6 0xFF46 # FULLWIDTH LATIN SMALL LETTER F -0xA3E7 0xFF47 # FULLWIDTH LATIN SMALL LETTER G -0xA3E8 0xFF48 # FULLWIDTH LATIN SMALL LETTER H -0xA3E9 0xFF49 # FULLWIDTH LATIN SMALL LETTER I -0xA3EA 0xFF4A # FULLWIDTH LATIN SMALL LETTER J -0xA3EB 0xFF4B # FULLWIDTH LATIN SMALL LETTER K -0xA3EC 0xFF4C # FULLWIDTH LATIN SMALL LETTER L -0xA3ED 0xFF4D # FULLWIDTH LATIN SMALL LETTER M -0xA3EE 0xFF4E # FULLWIDTH LATIN SMALL LETTER N -0xA3EF 0xFF4F # FULLWIDTH LATIN SMALL LETTER O -0xA3F0 0xFF50 # FULLWIDTH LATIN SMALL LETTER P -0xA3F1 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q -0xA3F2 0xFF52 # FULLWIDTH LATIN SMALL LETTER R -0xA3F3 0xFF53 # FULLWIDTH LATIN SMALL LETTER S -0xA3F4 0xFF54 # FULLWIDTH LATIN SMALL LETTER T -0xA3F5 0xFF55 # FULLWIDTH LATIN SMALL LETTER U -0xA3F6 0xFF56 # FULLWIDTH LATIN SMALL LETTER V -0xA3F7 0xFF57 # FULLWIDTH LATIN SMALL LETTER W -0xA3F8 0xFF58 # FULLWIDTH LATIN SMALL LETTER X -0xA3F9 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y -0xA3FA 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z -0xA3FB 0xFF5B # FULLWIDTH LEFT CURLY BRACKET -0xA3FC 0xFF5C # FULLWIDTH VERTICAL LINE -0xA3FD 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET -0xA3FE 0xFFE3 # FULLWIDTH MACRON -0xA441 0xC9DE # HANGUL SYLLABLE SSANGCIEUC-A-SSANGKIYEOK -0xA442 0xC9DF # HANGUL SYLLABLE SSANGCIEUC-A-KIYEOKSIOS -0xA443 0xC9E1 # HANGUL SYLLABLE SSANGCIEUC-A-NIEUNCIEUC -0xA444 0xC9E3 # HANGUL SYLLABLE SSANGCIEUC-A-TIKEUT -0xA445 0xC9E5 # HANGUL SYLLABLE SSANGCIEUC-A-RIEULKIYEOK -0xA446 0xC9E6 # HANGUL SYLLABLE SSANGCIEUC-A-RIEULMIEUM -0xA447 0xC9E8 # HANGUL SYLLABLE SSANGCIEUC-A-RIEULSIOS -0xA448 0xC9E9 # HANGUL SYLLABLE SSANGCIEUC-A-RIEULTHIEUTH -0xA449 0xC9EA # HANGUL SYLLABLE SSANGCIEUC-A-RIEULPHIEUPH -0xA44A 0xC9EB # HANGUL SYLLABLE SSANGCIEUC-A-RIEULHIEUH -0xA44B 0xC9EE # HANGUL SYLLABLE SSANGCIEUC-A-PIEUPSIOS -0xA44C 0xC9F2 # HANGUL SYLLABLE SSANGCIEUC-A-CIEUC -0xA44D 0xC9F3 # HANGUL SYLLABLE SSANGCIEUC-A-CHIEUCH -0xA44E 0xC9F4 # HANGUL SYLLABLE SSANGCIEUC-A-KHIEUKH -0xA44F 0xC9F5 # HANGUL SYLLABLE SSANGCIEUC-A-THIEUTH -0xA450 0xC9F6 # HANGUL SYLLABLE SSANGCIEUC-A-PHIEUPH -0xA451 0xC9F7 # HANGUL SYLLABLE SSANGCIEUC-A-HIEUH -0xA452 0xC9FA # HANGUL SYLLABLE SSANGCIEUC-AE-SSANGKIYEOK -0xA453 0xC9FB # HANGUL SYLLABLE SSANGCIEUC-AE-KIYEOKSIOS -0xA454 0xC9FD # HANGUL SYLLABLE SSANGCIEUC-AE-NIEUNCIEUC -0xA455 0xC9FE # HANGUL SYLLABLE SSANGCIEUC-AE-NIEUNHIEUH -0xA456 0xC9FF # HANGUL SYLLABLE SSANGCIEUC-AE-TIKEUT -0xA457 0xCA01 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULKIYEOK -0xA458 0xCA02 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULMIEUM -0xA459 0xCA03 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULPIEUP -0xA45A 0xCA04 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULSIOS -0xA461 0xCA05 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULTHIEUTH -0xA462 0xCA06 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULPHIEUPH -0xA463 0xCA07 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEULHIEUH -0xA464 0xCA0A # HANGUL SYLLABLE SSANGCIEUC-AE-PIEUPSIOS -0xA465 0xCA0E # HANGUL SYLLABLE SSANGCIEUC-AE-CIEUC -0xA466 0xCA0F # HANGUL SYLLABLE SSANGCIEUC-AE-CHIEUCH -0xA467 0xCA10 # HANGUL SYLLABLE SSANGCIEUC-AE-KHIEUKH -0xA468 0xCA11 # HANGUL SYLLABLE SSANGCIEUC-AE-THIEUTH -0xA469 0xCA12 # HANGUL SYLLABLE SSANGCIEUC-AE-PHIEUPH -0xA46A 0xCA13 # HANGUL SYLLABLE SSANGCIEUC-AE-HIEUH -0xA46B 0xCA15 # HANGUL SYLLABLE SSANGCIEUC-YA-KIYEOK -0xA46C 0xCA16 # HANGUL SYLLABLE SSANGCIEUC-YA-SSANGKIYEOK -0xA46D 0xCA17 # HANGUL SYLLABLE SSANGCIEUC-YA-KIYEOKSIOS -0xA46E 0xCA19 # HANGUL SYLLABLE SSANGCIEUC-YA-NIEUNCIEUC -0xA46F 0xCA1A # HANGUL SYLLABLE SSANGCIEUC-YA-NIEUNHIEUH -0xA470 0xCA1B # HANGUL SYLLABLE SSANGCIEUC-YA-TIKEUT -0xA471 0xCA1C # HANGUL SYLLABLE SSANGCIEUC-YA-RIEUL -0xA472 0xCA1D # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULKIYEOK -0xA473 0xCA1E # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULMIEUM -0xA474 0xCA1F # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULPIEUP -0xA475 0xCA20 # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULSIOS -0xA476 0xCA21 # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULTHIEUTH -0xA477 0xCA22 # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULPHIEUPH -0xA478 0xCA23 # HANGUL SYLLABLE SSANGCIEUC-YA-RIEULHIEUH -0xA479 0xCA24 # HANGUL SYLLABLE SSANGCIEUC-YA-MIEUM -0xA47A 0xCA25 # HANGUL SYLLABLE SSANGCIEUC-YA-PIEUP -0xA481 0xCA26 # HANGUL SYLLABLE SSANGCIEUC-YA-PIEUPSIOS -0xA482 0xCA27 # HANGUL SYLLABLE SSANGCIEUC-YA-SIOS -0xA483 0xCA28 # HANGUL SYLLABLE SSANGCIEUC-YA-SSANGSIOS -0xA484 0xCA2A # HANGUL SYLLABLE SSANGCIEUC-YA-CIEUC -0xA485 0xCA2B # HANGUL SYLLABLE SSANGCIEUC-YA-CHIEUCH -0xA486 0xCA2C # HANGUL SYLLABLE SSANGCIEUC-YA-KHIEUKH -0xA487 0xCA2D # HANGUL SYLLABLE SSANGCIEUC-YA-THIEUTH -0xA488 0xCA2E # HANGUL SYLLABLE SSANGCIEUC-YA-PHIEUPH -0xA489 0xCA2F # HANGUL SYLLABLE SSANGCIEUC-YA-HIEUH -0xA48A 0xCA30 # HANGUL SYLLABLE SSANGCIEUC-YAE -0xA48B 0xCA31 # HANGUL SYLLABLE SSANGCIEUC-YAE-KIYEOK -0xA48C 0xCA32 # HANGUL SYLLABLE SSANGCIEUC-YAE-SSANGKIYEOK -0xA48D 0xCA33 # HANGUL SYLLABLE SSANGCIEUC-YAE-KIYEOKSIOS -0xA48E 0xCA34 # HANGUL SYLLABLE SSANGCIEUC-YAE-NIEUN -0xA48F 0xCA35 # HANGUL SYLLABLE SSANGCIEUC-YAE-NIEUNCIEUC -0xA490 0xCA36 # HANGUL SYLLABLE SSANGCIEUC-YAE-NIEUNHIEUH -0xA491 0xCA37 # HANGUL SYLLABLE SSANGCIEUC-YAE-TIKEUT -0xA492 0xCA38 # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEUL -0xA493 0xCA39 # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULKIYEOK -0xA494 0xCA3A # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULMIEUM -0xA495 0xCA3B # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULPIEUP -0xA496 0xCA3C # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULSIOS -0xA497 0xCA3D # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULTHIEUTH -0xA498 0xCA3E # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULPHIEUPH -0xA499 0xCA3F # HANGUL SYLLABLE SSANGCIEUC-YAE-RIEULHIEUH -0xA49A 0xCA40 # HANGUL SYLLABLE SSANGCIEUC-YAE-MIEUM -0xA49B 0xCA41 # HANGUL SYLLABLE SSANGCIEUC-YAE-PIEUP -0xA49C 0xCA42 # HANGUL SYLLABLE SSANGCIEUC-YAE-PIEUPSIOS -0xA49D 0xCA43 # HANGUL SYLLABLE SSANGCIEUC-YAE-SIOS -0xA49E 0xCA44 # HANGUL SYLLABLE SSANGCIEUC-YAE-SSANGSIOS -0xA49F 0xCA45 # HANGUL SYLLABLE SSANGCIEUC-YAE-IEUNG -0xA4A0 0xCA46 # HANGUL SYLLABLE SSANGCIEUC-YAE-CIEUC -0xA4A1 0x3131 # HANGUL LETTER KIYEOK -0xA4A2 0x3132 # HANGUL LETTER SSANGKIYEOK -0xA4A3 0x3133 # HANGUL LETTER KIYEOK-SIOS -0xA4A4 0x3134 # HANGUL LETTER NIEUN -0xA4A5 0x3135 # HANGUL LETTER NIEUN-CIEUC -0xA4A6 0x3136 # HANGUL LETTER NIEUN-HIEUH -0xA4A7 0x3137 # HANGUL LETTER TIKEUT -0xA4A8 0x3138 # HANGUL LETTER SSANGTIKEUT -0xA4A9 0x3139 # HANGUL LETTER RIEUL -0xA4AA 0x313A # HANGUL LETTER RIEUL-KIYEOK -0xA4AB 0x313B # HANGUL LETTER RIEUL-MIEUM -0xA4AC 0x313C # HANGUL LETTER RIEUL-PIEUP -0xA4AD 0x313D # HANGUL LETTER RIEUL-SIOS -0xA4AE 0x313E # HANGUL LETTER RIEUL-THIEUTH -0xA4AF 0x313F # HANGUL LETTER RIEUL-PHIEUPH -0xA4B0 0x3140 # HANGUL LETTER RIEUL-HIEUH -0xA4B1 0x3141 # HANGUL LETTER MIEUM -0xA4B2 0x3142 # HANGUL LETTER PIEUP -0xA4B3 0x3143 # HANGUL LETTER SSANGPIEUP -0xA4B4 0x3144 # HANGUL LETTER PIEUP-SIOS -0xA4B5 0x3145 # HANGUL LETTER SIOS -0xA4B6 0x3146 # HANGUL LETTER SSANGSIOS -0xA4B7 0x3147 # HANGUL LETTER IEUNG -0xA4B8 0x3148 # HANGUL LETTER CIEUC -0xA4B9 0x3149 # HANGUL LETTER SSANGCIEUC -0xA4BA 0x314A # HANGUL LETTER CHIEUCH -0xA4BB 0x314B # HANGUL LETTER KHIEUKH -0xA4BC 0x314C # HANGUL LETTER THIEUTH -0xA4BD 0x314D # HANGUL LETTER PHIEUPH -0xA4BE 0x314E # HANGUL LETTER HIEUH -0xA4BF 0x314F # HANGUL LETTER A -0xA4C0 0x3150 # HANGUL LETTER AE -0xA4C1 0x3151 # HANGUL LETTER YA -0xA4C2 0x3152 # HANGUL LETTER YAE -0xA4C3 0x3153 # HANGUL LETTER EO -0xA4C4 0x3154 # HANGUL LETTER E -0xA4C5 0x3155 # HANGUL LETTER YEO -0xA4C6 0x3156 # HANGUL LETTER YE -0xA4C7 0x3157 # HANGUL LETTER O -0xA4C8 0x3158 # HANGUL LETTER WA -0xA4C9 0x3159 # HANGUL LETTER WAE -0xA4CA 0x315A # HANGUL LETTER OE -0xA4CB 0x315B # HANGUL LETTER YO -0xA4CC 0x315C # HANGUL LETTER U -0xA4CD 0x315D # HANGUL LETTER WEO -0xA4CE 0x315E # HANGUL LETTER WE -0xA4CF 0x315F # HANGUL LETTER WI -0xA4D0 0x3160 # HANGUL LETTER YU -0xA4D1 0x3161 # HANGUL LETTER EU -0xA4D2 0x3162 # HANGUL LETTER YI -0xA4D3 0x3163 # HANGUL LETTER I -0xA4D4 0x3164 # HANGUL FILLER -0xA4D5 0x3165 # HANGUL LETTER SSANGNIEUN -0xA4D6 0x3166 # HANGUL LETTER NIEUN-TIKEUT -0xA4D7 0x3167 # HANGUL LETTER NIEUN-SIOS -0xA4D8 0x3168 # HANGUL LETTER NIEUN-PANSIOS -0xA4D9 0x3169 # HANGUL LETTER RIEUL-KIYEOK-SIOS -0xA4DA 0x316A # HANGUL LETTER RIEUL-TIKEUT -0xA4DB 0x316B # HANGUL LETTER RIEUL-PIEUP-SIOS -0xA4DC 0x316C # HANGUL LETTER RIEUL-PANSIOS -0xA4DD 0x316D # HANGUL LETTER RIEUL-YEORINHIEUH -0xA4DE 0x316E # HANGUL LETTER MIEUM-PIEUP -0xA4DF 0x316F # HANGUL LETTER MIEUM-SIOS -0xA4E0 0x3170 # HANGUL LETTER MIEUM-PANSIOS -0xA4E1 0x3171 # HANGUL LETTER KAPYEOUNMIEUM -0xA4E2 0x3172 # HANGUL LETTER PIEUP-KIYEOK -0xA4E3 0x3173 # HANGUL LETTER PIEUP-TIKEUT -0xA4E4 0x3174 # HANGUL LETTER PIEUP-SIOS-KIYEOK -0xA4E5 0x3175 # HANGUL LETTER PIEUP-SIOS-TIKEUT -0xA4E6 0x3176 # HANGUL LETTER PIEUP-CIEUC -0xA4E7 0x3177 # HANGUL LETTER PIEUP-THIEUTH -0xA4E8 0x3178 # HANGUL LETTER KAPYEOUNPIEUP -0xA4E9 0x3179 # HANGUL LETTER KAPYEOUNSSANGPIEUP -0xA4EA 0x317A # HANGUL LETTER SIOS-KIYEOK -0xA4EB 0x317B # HANGUL LETTER SIOS-NIEUN -0xA4EC 0x317C # HANGUL LETTER SIOS-TIKEUT -0xA4ED 0x317D # HANGUL LETTER SIOS-PIEUP -0xA4EE 0x317E # HANGUL LETTER SIOS-CIEUC -0xA4EF 0x317F # HANGUL LETTER PANSIOS -0xA4F0 0x3180 # HANGUL LETTER SSANGIEUNG -0xA4F1 0x3181 # HANGUL LETTER YESIEUNG -0xA4F2 0x3182 # HANGUL LETTER YESIEUNG-SIOS -0xA4F3 0x3183 # HANGUL LETTER YESIEUNG-PANSIOS -0xA4F4 0x3184 # HANGUL LETTER KAPYEOUNPHIEUPH -0xA4F5 0x3185 # HANGUL LETTER SSANGHIEUH -0xA4F6 0x3186 # HANGUL LETTER YEORINHIEUH -0xA4F7 0x3187 # HANGUL LETTER YO-YA -0xA4F8 0x3188 # HANGUL LETTER YO-YAE -0xA4F9 0x3189 # HANGUL LETTER YO-I -0xA4FA 0x318A # HANGUL LETTER YU-YEO -0xA4FB 0x318B # HANGUL LETTER YU-YE -0xA4FC 0x318C # HANGUL LETTER YU-I -0xA4FD 0x318D # HANGUL LETTER ARAEA -0xA4FE 0x318E # HANGUL LETTER ARAEAE -0xA541 0xCA47 # HANGUL SYLLABLE SSANGCIEUC-YAE-CHIEUCH -0xA542 0xCA48 # HANGUL SYLLABLE SSANGCIEUC-YAE-KHIEUKH -0xA543 0xCA49 # HANGUL SYLLABLE SSANGCIEUC-YAE-THIEUTH -0xA544 0xCA4A # HANGUL SYLLABLE SSANGCIEUC-YAE-PHIEUPH -0xA545 0xCA4B # HANGUL SYLLABLE SSANGCIEUC-YAE-HIEUH -0xA546 0xCA4E # HANGUL SYLLABLE SSANGCIEUC-EO-SSANGKIYEOK -0xA547 0xCA4F # HANGUL SYLLABLE SSANGCIEUC-EO-KIYEOKSIOS -0xA548 0xCA51 # HANGUL SYLLABLE SSANGCIEUC-EO-NIEUNCIEUC -0xA549 0xCA52 # HANGUL SYLLABLE SSANGCIEUC-EO-NIEUNHIEUH -0xA54A 0xCA53 # HANGUL SYLLABLE SSANGCIEUC-EO-TIKEUT -0xA54B 0xCA55 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULKIYEOK -0xA54C 0xCA56 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULMIEUM -0xA54D 0xCA57 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULPIEUP -0xA54E 0xCA58 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULSIOS -0xA54F 0xCA59 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULTHIEUTH -0xA550 0xCA5A # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULPHIEUPH -0xA551 0xCA5B # HANGUL SYLLABLE SSANGCIEUC-EO-RIEULHIEUH -0xA552 0xCA5E # HANGUL SYLLABLE SSANGCIEUC-EO-PIEUPSIOS -0xA553 0xCA62 # HANGUL SYLLABLE SSANGCIEUC-EO-CIEUC -0xA554 0xCA63 # HANGUL SYLLABLE SSANGCIEUC-EO-CHIEUCH -0xA555 0xCA64 # HANGUL SYLLABLE SSANGCIEUC-EO-KHIEUKH -0xA556 0xCA65 # HANGUL SYLLABLE SSANGCIEUC-EO-THIEUTH -0xA557 0xCA66 # HANGUL SYLLABLE SSANGCIEUC-EO-PHIEUPH -0xA558 0xCA67 # HANGUL SYLLABLE SSANGCIEUC-EO-HIEUH -0xA559 0xCA69 # HANGUL SYLLABLE SSANGCIEUC-E-KIYEOK -0xA55A 0xCA6A # HANGUL SYLLABLE SSANGCIEUC-E-SSANGKIYEOK -0xA561 0xCA6B # HANGUL SYLLABLE SSANGCIEUC-E-KIYEOKSIOS -0xA562 0xCA6C # HANGUL SYLLABLE SSANGCIEUC-E-NIEUN -0xA563 0xCA6D # HANGUL SYLLABLE SSANGCIEUC-E-NIEUNCIEUC -0xA564 0xCA6E # HANGUL SYLLABLE SSANGCIEUC-E-NIEUNHIEUH -0xA565 0xCA6F # HANGUL SYLLABLE SSANGCIEUC-E-TIKEUT -0xA566 0xCA70 # HANGUL SYLLABLE SSANGCIEUC-E-RIEUL -0xA567 0xCA71 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULKIYEOK -0xA568 0xCA72 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULMIEUM -0xA569 0xCA73 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULPIEUP -0xA56A 0xCA74 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULSIOS -0xA56B 0xCA75 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULTHIEUTH -0xA56C 0xCA76 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULPHIEUPH -0xA56D 0xCA77 # HANGUL SYLLABLE SSANGCIEUC-E-RIEULHIEUH -0xA56E 0xCA78 # HANGUL SYLLABLE SSANGCIEUC-E-MIEUM -0xA56F 0xCA79 # HANGUL SYLLABLE SSANGCIEUC-E-PIEUP -0xA570 0xCA7A # HANGUL SYLLABLE SSANGCIEUC-E-PIEUPSIOS -0xA571 0xCA7B # HANGUL SYLLABLE SSANGCIEUC-E-SIOS -0xA572 0xCA7C # HANGUL SYLLABLE SSANGCIEUC-E-SSANGSIOS -0xA573 0xCA7E # HANGUL SYLLABLE SSANGCIEUC-E-CIEUC -0xA574 0xCA7F # HANGUL SYLLABLE SSANGCIEUC-E-CHIEUCH -0xA575 0xCA80 # HANGUL SYLLABLE SSANGCIEUC-E-KHIEUKH -0xA576 0xCA81 # HANGUL SYLLABLE SSANGCIEUC-E-THIEUTH -0xA577 0xCA82 # HANGUL SYLLABLE SSANGCIEUC-E-PHIEUPH -0xA578 0xCA83 # HANGUL SYLLABLE SSANGCIEUC-E-HIEUH -0xA579 0xCA85 # HANGUL SYLLABLE SSANGCIEUC-YEO-KIYEOK -0xA57A 0xCA86 # HANGUL SYLLABLE SSANGCIEUC-YEO-SSANGKIYEOK -0xA581 0xCA87 # HANGUL SYLLABLE SSANGCIEUC-YEO-KIYEOKSIOS -0xA582 0xCA88 # HANGUL SYLLABLE SSANGCIEUC-YEO-NIEUN -0xA583 0xCA89 # HANGUL SYLLABLE SSANGCIEUC-YEO-NIEUNCIEUC -0xA584 0xCA8A # HANGUL SYLLABLE SSANGCIEUC-YEO-NIEUNHIEUH -0xA585 0xCA8B # HANGUL SYLLABLE SSANGCIEUC-YEO-TIKEUT -0xA586 0xCA8C # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEUL -0xA587 0xCA8D # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULKIYEOK -0xA588 0xCA8E # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULMIEUM -0xA589 0xCA8F # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULPIEUP -0xA58A 0xCA90 # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULSIOS -0xA58B 0xCA91 # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULTHIEUTH -0xA58C 0xCA92 # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULPHIEUPH -0xA58D 0xCA93 # HANGUL SYLLABLE SSANGCIEUC-YEO-RIEULHIEUH -0xA58E 0xCA94 # HANGUL SYLLABLE SSANGCIEUC-YEO-MIEUM -0xA58F 0xCA95 # HANGUL SYLLABLE SSANGCIEUC-YEO-PIEUP -0xA590 0xCA96 # HANGUL SYLLABLE SSANGCIEUC-YEO-PIEUPSIOS -0xA591 0xCA97 # HANGUL SYLLABLE SSANGCIEUC-YEO-SIOS -0xA592 0xCA99 # HANGUL SYLLABLE SSANGCIEUC-YEO-IEUNG -0xA593 0xCA9A # HANGUL SYLLABLE SSANGCIEUC-YEO-CIEUC -0xA594 0xCA9B # HANGUL SYLLABLE SSANGCIEUC-YEO-CHIEUCH -0xA595 0xCA9C # HANGUL SYLLABLE SSANGCIEUC-YEO-KHIEUKH -0xA596 0xCA9D # HANGUL SYLLABLE SSANGCIEUC-YEO-THIEUTH -0xA597 0xCA9E # HANGUL SYLLABLE SSANGCIEUC-YEO-PHIEUPH -0xA598 0xCA9F # HANGUL SYLLABLE SSANGCIEUC-YEO-HIEUH -0xA599 0xCAA0 # HANGUL SYLLABLE SSANGCIEUC-YE -0xA59A 0xCAA1 # HANGUL SYLLABLE SSANGCIEUC-YE-KIYEOK -0xA59B 0xCAA2 # HANGUL SYLLABLE SSANGCIEUC-YE-SSANGKIYEOK -0xA59C 0xCAA3 # HANGUL SYLLABLE SSANGCIEUC-YE-KIYEOKSIOS -0xA59D 0xCAA4 # HANGUL SYLLABLE SSANGCIEUC-YE-NIEUN -0xA59E 0xCAA5 # HANGUL SYLLABLE SSANGCIEUC-YE-NIEUNCIEUC -0xA59F 0xCAA6 # HANGUL SYLLABLE SSANGCIEUC-YE-NIEUNHIEUH -0xA5A0 0xCAA7 # HANGUL SYLLABLE SSANGCIEUC-YE-TIKEUT -0xA5A1 0x2170 # SMALL ROMAN NUMERAL ONE -0xA5A2 0x2171 # SMALL ROMAN NUMERAL TWO -0xA5A3 0x2172 # SMALL ROMAN NUMERAL THREE -0xA5A4 0x2173 # SMALL ROMAN NUMERAL FOUR -0xA5A5 0x2174 # SMALL ROMAN NUMERAL FIVE -0xA5A6 0x2175 # SMALL ROMAN NUMERAL SIX -0xA5A7 0x2176 # SMALL ROMAN NUMERAL SEVEN -0xA5A8 0x2177 # SMALL ROMAN NUMERAL EIGHT -0xA5A9 0x2178 # SMALL ROMAN NUMERAL NINE -0xA5AA 0x2179 # SMALL ROMAN NUMERAL TEN -0xA5B0 0x2160 # ROMAN NUMERAL ONE -0xA5B1 0x2161 # ROMAN NUMERAL TWO -0xA5B2 0x2162 # ROMAN NUMERAL THREE -0xA5B3 0x2163 # ROMAN NUMERAL FOUR -0xA5B4 0x2164 # ROMAN NUMERAL FIVE -0xA5B5 0x2165 # ROMAN NUMERAL SIX -0xA5B6 0x2166 # ROMAN NUMERAL SEVEN -0xA5B7 0x2167 # ROMAN NUMERAL EIGHT -0xA5B8 0x2168 # ROMAN NUMERAL NINE -0xA5B9 0x2169 # ROMAN NUMERAL TEN -0xA5C1 0x0391 # GREEK CAPITAL LETTER ALPHA -0xA5C2 0x0392 # GREEK CAPITAL LETTER BETA -0xA5C3 0x0393 # GREEK CAPITAL LETTER GAMMA -0xA5C4 0x0394 # GREEK CAPITAL LETTER DELTA -0xA5C5 0x0395 # GREEK CAPITAL LETTER EPSILON -0xA5C6 0x0396 # GREEK CAPITAL LETTER ZETA -0xA5C7 0x0397 # GREEK CAPITAL LETTER ETA -0xA5C8 0x0398 # GREEK CAPITAL LETTER THETA -0xA5C9 0x0399 # GREEK CAPITAL LETTER IOTA -0xA5CA 0x039A # GREEK CAPITAL LETTER KAPPA -0xA5CB 0x039B # GREEK CAPITAL LETTER LAMDA -0xA5CC 0x039C # GREEK CAPITAL LETTER MU -0xA5CD 0x039D # GREEK CAPITAL LETTER NU -0xA5CE 0x039E # GREEK CAPITAL LETTER XI -0xA5CF 0x039F # GREEK CAPITAL LETTER OMICRON -0xA5D0 0x03A0 # GREEK CAPITAL LETTER PI -0xA5D1 0x03A1 # GREEK CAPITAL LETTER RHO -0xA5D2 0x03A3 # GREEK CAPITAL LETTER SIGMA -0xA5D3 0x03A4 # GREEK CAPITAL LETTER TAU -0xA5D4 0x03A5 # GREEK CAPITAL LETTER UPSILON -0xA5D5 0x03A6 # GREEK CAPITAL LETTER PHI -0xA5D6 0x03A7 # GREEK CAPITAL LETTER CHI -0xA5D7 0x03A8 # GREEK CAPITAL LETTER PSI -0xA5D8 0x03A9 # GREEK CAPITAL LETTER OMEGA -0xA5E1 0x03B1 # GREEK SMALL LETTER ALPHA -0xA5E2 0x03B2 # GREEK SMALL LETTER BETA -0xA5E3 0x03B3 # GREEK SMALL LETTER GAMMA -0xA5E4 0x03B4 # GREEK SMALL LETTER DELTA -0xA5E5 0x03B5 # GREEK SMALL LETTER EPSILON -0xA5E6 0x03B6 # GREEK SMALL LETTER ZETA -0xA5E7 0x03B7 # GREEK SMALL LETTER ETA -0xA5E8 0x03B8 # GREEK SMALL LETTER THETA -0xA5E9 0x03B9 # GREEK SMALL LETTER IOTA -0xA5EA 0x03BA # GREEK SMALL LETTER KAPPA -0xA5EB 0x03BB # GREEK SMALL LETTER LAMDA -0xA5EC 0x03BC # GREEK SMALL LETTER MU -0xA5ED 0x03BD # GREEK SMALL LETTER NU -0xA5EE 0x03BE # GREEK SMALL LETTER XI -0xA5EF 0x03BF # GREEK SMALL LETTER OMICRON -0xA5F0 0x03C0 # GREEK SMALL LETTER PI -0xA5F1 0x03C1 # GREEK SMALL LETTER RHO -0xA5F2 0x03C3 # GREEK SMALL LETTER SIGMA -0xA5F3 0x03C4 # GREEK SMALL LETTER TAU -0xA5F4 0x03C5 # GREEK SMALL LETTER UPSILON -0xA5F5 0x03C6 # GREEK SMALL LETTER PHI -0xA5F6 0x03C7 # GREEK SMALL LETTER CHI -0xA5F7 0x03C8 # GREEK SMALL LETTER PSI -0xA5F8 0x03C9 # GREEK SMALL LETTER OMEGA -0xA641 0xCAA8 # HANGUL SYLLABLE SSANGCIEUC-YE-RIEUL -0xA642 0xCAA9 # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULKIYEOK -0xA643 0xCAAA # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULMIEUM -0xA644 0xCAAB # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULPIEUP -0xA645 0xCAAC # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULSIOS -0xA646 0xCAAD # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULTHIEUTH -0xA647 0xCAAE # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULPHIEUPH -0xA648 0xCAAF # HANGUL SYLLABLE SSANGCIEUC-YE-RIEULHIEUH -0xA649 0xCAB0 # HANGUL SYLLABLE SSANGCIEUC-YE-MIEUM -0xA64A 0xCAB1 # HANGUL SYLLABLE SSANGCIEUC-YE-PIEUP -0xA64B 0xCAB2 # HANGUL SYLLABLE SSANGCIEUC-YE-PIEUPSIOS -0xA64C 0xCAB3 # HANGUL SYLLABLE SSANGCIEUC-YE-SIOS -0xA64D 0xCAB4 # HANGUL SYLLABLE SSANGCIEUC-YE-SSANGSIOS -0xA64E 0xCAB5 # HANGUL SYLLABLE SSANGCIEUC-YE-IEUNG -0xA64F 0xCAB6 # HANGUL SYLLABLE SSANGCIEUC-YE-CIEUC -0xA650 0xCAB7 # HANGUL SYLLABLE SSANGCIEUC-YE-CHIEUCH -0xA651 0xCAB8 # HANGUL SYLLABLE SSANGCIEUC-YE-KHIEUKH -0xA652 0xCAB9 # HANGUL SYLLABLE SSANGCIEUC-YE-THIEUTH -0xA653 0xCABA # HANGUL SYLLABLE SSANGCIEUC-YE-PHIEUPH -0xA654 0xCABB # HANGUL SYLLABLE SSANGCIEUC-YE-HIEUH -0xA655 0xCABE # HANGUL SYLLABLE SSANGCIEUC-O-SSANGKIYEOK -0xA656 0xCABF # HANGUL SYLLABLE SSANGCIEUC-O-KIYEOKSIOS -0xA657 0xCAC1 # HANGUL SYLLABLE SSANGCIEUC-O-NIEUNCIEUC -0xA658 0xCAC2 # HANGUL SYLLABLE SSANGCIEUC-O-NIEUNHIEUH -0xA659 0xCAC3 # HANGUL SYLLABLE SSANGCIEUC-O-TIKEUT -0xA65A 0xCAC5 # HANGUL SYLLABLE SSANGCIEUC-O-RIEULKIYEOK -0xA661 0xCAC6 # HANGUL SYLLABLE SSANGCIEUC-O-RIEULMIEUM -0xA662 0xCAC7 # HANGUL SYLLABLE SSANGCIEUC-O-RIEULPIEUP -0xA663 0xCAC8 # HANGUL SYLLABLE SSANGCIEUC-O-RIEULSIOS -0xA664 0xCAC9 # HANGUL SYLLABLE SSANGCIEUC-O-RIEULTHIEUTH -0xA665 0xCACA # HANGUL SYLLABLE SSANGCIEUC-O-RIEULPHIEUPH -0xA666 0xCACB # HANGUL SYLLABLE SSANGCIEUC-O-RIEULHIEUH -0xA667 0xCACE # HANGUL SYLLABLE SSANGCIEUC-O-PIEUPSIOS -0xA668 0xCAD0 # HANGUL SYLLABLE SSANGCIEUC-O-SSANGSIOS -0xA669 0xCAD2 # HANGUL SYLLABLE SSANGCIEUC-O-CIEUC -0xA66A 0xCAD4 # HANGUL SYLLABLE SSANGCIEUC-O-KHIEUKH -0xA66B 0xCAD5 # HANGUL SYLLABLE SSANGCIEUC-O-THIEUTH -0xA66C 0xCAD6 # HANGUL SYLLABLE SSANGCIEUC-O-PHIEUPH -0xA66D 0xCAD7 # HANGUL SYLLABLE SSANGCIEUC-O-HIEUH -0xA66E 0xCADA # HANGUL SYLLABLE SSANGCIEUC-WA-SSANGKIYEOK -0xA66F 0xCADB # HANGUL SYLLABLE SSANGCIEUC-WA-KIYEOKSIOS -0xA670 0xCADC # HANGUL SYLLABLE SSANGCIEUC-WA-NIEUN -0xA671 0xCADD # HANGUL SYLLABLE SSANGCIEUC-WA-NIEUNCIEUC -0xA672 0xCADE # HANGUL SYLLABLE SSANGCIEUC-WA-NIEUNHIEUH -0xA673 0xCADF # HANGUL SYLLABLE SSANGCIEUC-WA-TIKEUT -0xA674 0xCAE1 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULKIYEOK -0xA675 0xCAE2 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULMIEUM -0xA676 0xCAE3 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULPIEUP -0xA677 0xCAE4 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULSIOS -0xA678 0xCAE5 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULTHIEUTH -0xA679 0xCAE6 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULPHIEUPH -0xA67A 0xCAE7 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEULHIEUH -0xA681 0xCAE8 # HANGUL SYLLABLE SSANGCIEUC-WA-MIEUM -0xA682 0xCAE9 # HANGUL SYLLABLE SSANGCIEUC-WA-PIEUP -0xA683 0xCAEA # HANGUL SYLLABLE SSANGCIEUC-WA-PIEUPSIOS -0xA684 0xCAEB # HANGUL SYLLABLE SSANGCIEUC-WA-SIOS -0xA685 0xCAED # HANGUL SYLLABLE SSANGCIEUC-WA-IEUNG -0xA686 0xCAEE # HANGUL SYLLABLE SSANGCIEUC-WA-CIEUC -0xA687 0xCAEF # HANGUL SYLLABLE SSANGCIEUC-WA-CHIEUCH -0xA688 0xCAF0 # HANGUL SYLLABLE SSANGCIEUC-WA-KHIEUKH -0xA689 0xCAF1 # HANGUL SYLLABLE SSANGCIEUC-WA-THIEUTH -0xA68A 0xCAF2 # HANGUL SYLLABLE SSANGCIEUC-WA-PHIEUPH -0xA68B 0xCAF3 # HANGUL SYLLABLE SSANGCIEUC-WA-HIEUH -0xA68C 0xCAF5 # HANGUL SYLLABLE SSANGCIEUC-WAE-KIYEOK -0xA68D 0xCAF6 # HANGUL SYLLABLE SSANGCIEUC-WAE-SSANGKIYEOK -0xA68E 0xCAF7 # HANGUL SYLLABLE SSANGCIEUC-WAE-KIYEOKSIOS -0xA68F 0xCAF8 # HANGUL SYLLABLE SSANGCIEUC-WAE-NIEUN -0xA690 0xCAF9 # HANGUL SYLLABLE SSANGCIEUC-WAE-NIEUNCIEUC -0xA691 0xCAFA # HANGUL SYLLABLE SSANGCIEUC-WAE-NIEUNHIEUH -0xA692 0xCAFB # HANGUL SYLLABLE SSANGCIEUC-WAE-TIKEUT -0xA693 0xCAFC # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEUL -0xA694 0xCAFD # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULKIYEOK -0xA695 0xCAFE # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULMIEUM -0xA696 0xCAFF # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULPIEUP -0xA697 0xCB00 # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULSIOS -0xA698 0xCB01 # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULTHIEUTH -0xA699 0xCB02 # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULPHIEUPH -0xA69A 0xCB03 # HANGUL SYLLABLE SSANGCIEUC-WAE-RIEULHIEUH -0xA69B 0xCB04 # HANGUL SYLLABLE SSANGCIEUC-WAE-MIEUM -0xA69C 0xCB05 # HANGUL SYLLABLE SSANGCIEUC-WAE-PIEUP -0xA69D 0xCB06 # HANGUL SYLLABLE SSANGCIEUC-WAE-PIEUPSIOS -0xA69E 0xCB07 # HANGUL SYLLABLE SSANGCIEUC-WAE-SIOS -0xA69F 0xCB09 # HANGUL SYLLABLE SSANGCIEUC-WAE-IEUNG -0xA6A0 0xCB0A # HANGUL SYLLABLE SSANGCIEUC-WAE-CIEUC -0xA6A1 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL -0xA6A2 0x2502 # BOX DRAWINGS LIGHT VERTICAL -0xA6A3 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT -0xA6A4 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT -0xA6A5 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT -0xA6A6 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT -0xA6A7 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT -0xA6A8 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -0xA6A9 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT -0xA6AA 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL -0xA6AB 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -0xA6AC 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL -0xA6AD 0x2503 # BOX DRAWINGS HEAVY VERTICAL -0xA6AE 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT -0xA6AF 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT -0xA6B0 0x251B # BOX DRAWINGS HEAVY UP AND LEFT -0xA6B1 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT -0xA6B2 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT -0xA6B3 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL -0xA6B4 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT -0xA6B5 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL -0xA6B6 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -0xA6B7 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT -0xA6B8 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY -0xA6B9 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT -0xA6BA 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY -0xA6BB 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY -0xA6BC 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY -0xA6BD 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT -0xA6BE 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY -0xA6BF 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT -0xA6C0 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT -0xA6C1 0x2512 # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT -0xA6C2 0x2511 # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY -0xA6C3 0x251A # BOX DRAWINGS UP HEAVY AND LEFT LIGHT -0xA6C4 0x2519 # BOX DRAWINGS UP LIGHT AND LEFT HEAVY -0xA6C5 0x2516 # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT -0xA6C6 0x2515 # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY -0xA6C7 0x250E # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT -0xA6C8 0x250D # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY -0xA6C9 0x251E # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT -0xA6CA 0x251F # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT -0xA6CB 0x2521 # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY -0xA6CC 0x2522 # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY -0xA6CD 0x2526 # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT -0xA6CE 0x2527 # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT -0xA6CF 0x2529 # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY -0xA6D0 0x252A # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY -0xA6D1 0x252D # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT -0xA6D2 0x252E # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT -0xA6D3 0x2531 # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY -0xA6D4 0x2532 # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY -0xA6D5 0x2535 # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT -0xA6D6 0x2536 # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT -0xA6D7 0x2539 # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY -0xA6D8 0x253A # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY -0xA6D9 0x253D # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT -0xA6DA 0x253E # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT -0xA6DB 0x2540 # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT -0xA6DC 0x2541 # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT -0xA6DD 0x2543 # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT -0xA6DE 0x2544 # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT -0xA6DF 0x2545 # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT -0xA6E0 0x2546 # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT -0xA6E1 0x2547 # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY -0xA6E2 0x2548 # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY -0xA6E3 0x2549 # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY -0xA6E4 0x254A # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY -0xA741 0xCB0B # HANGUL SYLLABLE SSANGCIEUC-WAE-CHIEUCH -0xA742 0xCB0C # HANGUL SYLLABLE SSANGCIEUC-WAE-KHIEUKH -0xA743 0xCB0D # HANGUL SYLLABLE SSANGCIEUC-WAE-THIEUTH -0xA744 0xCB0E # HANGUL SYLLABLE SSANGCIEUC-WAE-PHIEUPH -0xA745 0xCB0F # HANGUL SYLLABLE SSANGCIEUC-WAE-HIEUH -0xA746 0xCB11 # HANGUL SYLLABLE SSANGCIEUC-OE-KIYEOK -0xA747 0xCB12 # HANGUL SYLLABLE SSANGCIEUC-OE-SSANGKIYEOK -0xA748 0xCB13 # HANGUL SYLLABLE SSANGCIEUC-OE-KIYEOKSIOS -0xA749 0xCB15 # HANGUL SYLLABLE SSANGCIEUC-OE-NIEUNCIEUC -0xA74A 0xCB16 # HANGUL SYLLABLE SSANGCIEUC-OE-NIEUNHIEUH -0xA74B 0xCB17 # HANGUL SYLLABLE SSANGCIEUC-OE-TIKEUT -0xA74C 0xCB19 # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULKIYEOK -0xA74D 0xCB1A # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULMIEUM -0xA74E 0xCB1B # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULPIEUP -0xA74F 0xCB1C # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULSIOS -0xA750 0xCB1D # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULTHIEUTH -0xA751 0xCB1E # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULPHIEUPH -0xA752 0xCB1F # HANGUL SYLLABLE SSANGCIEUC-OE-RIEULHIEUH -0xA753 0xCB22 # HANGUL SYLLABLE SSANGCIEUC-OE-PIEUPSIOS -0xA754 0xCB23 # HANGUL SYLLABLE SSANGCIEUC-OE-SIOS -0xA755 0xCB24 # HANGUL SYLLABLE SSANGCIEUC-OE-SSANGSIOS -0xA756 0xCB25 # HANGUL SYLLABLE SSANGCIEUC-OE-IEUNG -0xA757 0xCB26 # HANGUL SYLLABLE SSANGCIEUC-OE-CIEUC -0xA758 0xCB27 # HANGUL SYLLABLE SSANGCIEUC-OE-CHIEUCH -0xA759 0xCB28 # HANGUL SYLLABLE SSANGCIEUC-OE-KHIEUKH -0xA75A 0xCB29 # HANGUL SYLLABLE SSANGCIEUC-OE-THIEUTH -0xA761 0xCB2A # HANGUL SYLLABLE SSANGCIEUC-OE-PHIEUPH -0xA762 0xCB2B # HANGUL SYLLABLE SSANGCIEUC-OE-HIEUH -0xA763 0xCB2C # HANGUL SYLLABLE SSANGCIEUC-YO -0xA764 0xCB2D # HANGUL SYLLABLE SSANGCIEUC-YO-KIYEOK -0xA765 0xCB2E # HANGUL SYLLABLE SSANGCIEUC-YO-SSANGKIYEOK -0xA766 0xCB2F # HANGUL SYLLABLE SSANGCIEUC-YO-KIYEOKSIOS -0xA767 0xCB30 # HANGUL SYLLABLE SSANGCIEUC-YO-NIEUN -0xA768 0xCB31 # HANGUL SYLLABLE SSANGCIEUC-YO-NIEUNCIEUC -0xA769 0xCB32 # HANGUL SYLLABLE SSANGCIEUC-YO-NIEUNHIEUH -0xA76A 0xCB33 # HANGUL SYLLABLE SSANGCIEUC-YO-TIKEUT -0xA76B 0xCB34 # HANGUL SYLLABLE SSANGCIEUC-YO-RIEUL -0xA76C 0xCB35 # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULKIYEOK -0xA76D 0xCB36 # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULMIEUM -0xA76E 0xCB37 # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULPIEUP -0xA76F 0xCB38 # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULSIOS -0xA770 0xCB39 # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULTHIEUTH -0xA771 0xCB3A # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULPHIEUPH -0xA772 0xCB3B # HANGUL SYLLABLE SSANGCIEUC-YO-RIEULHIEUH -0xA773 0xCB3C # HANGUL SYLLABLE SSANGCIEUC-YO-MIEUM -0xA774 0xCB3D # HANGUL SYLLABLE SSANGCIEUC-YO-PIEUP -0xA775 0xCB3E # HANGUL SYLLABLE SSANGCIEUC-YO-PIEUPSIOS -0xA776 0xCB3F # HANGUL SYLLABLE SSANGCIEUC-YO-SIOS -0xA777 0xCB40 # HANGUL SYLLABLE SSANGCIEUC-YO-SSANGSIOS -0xA778 0xCB42 # HANGUL SYLLABLE SSANGCIEUC-YO-CIEUC -0xA779 0xCB43 # HANGUL SYLLABLE SSANGCIEUC-YO-CHIEUCH -0xA77A 0xCB44 # HANGUL SYLLABLE SSANGCIEUC-YO-KHIEUKH -0xA781 0xCB45 # HANGUL SYLLABLE SSANGCIEUC-YO-THIEUTH -0xA782 0xCB46 # HANGUL SYLLABLE SSANGCIEUC-YO-PHIEUPH -0xA783 0xCB47 # HANGUL SYLLABLE SSANGCIEUC-YO-HIEUH -0xA784 0xCB4A # HANGUL SYLLABLE SSANGCIEUC-U-SSANGKIYEOK -0xA785 0xCB4B # HANGUL SYLLABLE SSANGCIEUC-U-KIYEOKSIOS -0xA786 0xCB4D # HANGUL SYLLABLE SSANGCIEUC-U-NIEUNCIEUC -0xA787 0xCB4E # HANGUL SYLLABLE SSANGCIEUC-U-NIEUNHIEUH -0xA788 0xCB4F # HANGUL SYLLABLE SSANGCIEUC-U-TIKEUT -0xA789 0xCB51 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULKIYEOK -0xA78A 0xCB52 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULMIEUM -0xA78B 0xCB53 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULPIEUP -0xA78C 0xCB54 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULSIOS -0xA78D 0xCB55 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULTHIEUTH -0xA78E 0xCB56 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULPHIEUPH -0xA78F 0xCB57 # HANGUL SYLLABLE SSANGCIEUC-U-RIEULHIEUH -0xA790 0xCB5A # HANGUL SYLLABLE SSANGCIEUC-U-PIEUPSIOS -0xA791 0xCB5B # HANGUL SYLLABLE SSANGCIEUC-U-SIOS -0xA792 0xCB5C # HANGUL SYLLABLE SSANGCIEUC-U-SSANGSIOS -0xA793 0xCB5E # HANGUL SYLLABLE SSANGCIEUC-U-CIEUC -0xA794 0xCB5F # HANGUL SYLLABLE SSANGCIEUC-U-CHIEUCH -0xA795 0xCB60 # HANGUL SYLLABLE SSANGCIEUC-U-KHIEUKH -0xA796 0xCB61 # HANGUL SYLLABLE SSANGCIEUC-U-THIEUTH -0xA797 0xCB62 # HANGUL SYLLABLE SSANGCIEUC-U-PHIEUPH -0xA798 0xCB63 # HANGUL SYLLABLE SSANGCIEUC-U-HIEUH -0xA799 0xCB65 # HANGUL SYLLABLE SSANGCIEUC-WEO-KIYEOK -0xA79A 0xCB66 # HANGUL SYLLABLE SSANGCIEUC-WEO-SSANGKIYEOK -0xA79B 0xCB67 # HANGUL SYLLABLE SSANGCIEUC-WEO-KIYEOKSIOS -0xA79C 0xCB68 # HANGUL SYLLABLE SSANGCIEUC-WEO-NIEUN -0xA79D 0xCB69 # HANGUL SYLLABLE SSANGCIEUC-WEO-NIEUNCIEUC -0xA79E 0xCB6A # HANGUL SYLLABLE SSANGCIEUC-WEO-NIEUNHIEUH -0xA79F 0xCB6B # HANGUL SYLLABLE SSANGCIEUC-WEO-TIKEUT -0xA7A0 0xCB6C # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEUL -0xA7A1 0x3395 # SQUARE MU L -0xA7A2 0x3396 # SQUARE ML -0xA7A3 0x3397 # SQUARE DL -0xA7A4 0x2113 # SCRIPT SMALL L -0xA7A5 0x3398 # SQUARE KL -0xA7A6 0x33C4 # SQUARE CC -0xA7A7 0x33A3 # SQUARE MM CUBED -0xA7A8 0x33A4 # SQUARE CM CUBED -0xA7A9 0x33A5 # SQUARE M CUBED -0xA7AA 0x33A6 # SQUARE KM CUBED -0xA7AB 0x3399 # SQUARE FM -0xA7AC 0x339A # SQUARE NM -0xA7AD 0x339B # SQUARE MU M -0xA7AE 0x339C # SQUARE MM -0xA7AF 0x339D # SQUARE CM -0xA7B0 0x339E # SQUARE KM -0xA7B1 0x339F # SQUARE MM SQUARED -0xA7B2 0x33A0 # SQUARE CM SQUARED -0xA7B3 0x33A1 # SQUARE M SQUARED -0xA7B4 0x33A2 # SQUARE KM SQUARED -0xA7B5 0x33CA # SQUARE HA -0xA7B6 0x338D # SQUARE MU G -0xA7B7 0x338E # SQUARE MG -0xA7B8 0x338F # SQUARE KG -0xA7B9 0x33CF # SQUARE KT -0xA7BA 0x3388 # SQUARE CAL -0xA7BB 0x3389 # SQUARE KCAL -0xA7BC 0x33C8 # SQUARE DB -0xA7BD 0x33A7 # SQUARE M OVER S -0xA7BE 0x33A8 # SQUARE M OVER S SQUARED -0xA7BF 0x33B0 # SQUARE PS -0xA7C0 0x33B1 # SQUARE NS -0xA7C1 0x33B2 # SQUARE MU S -0xA7C2 0x33B3 # SQUARE MS -0xA7C3 0x33B4 # SQUARE PV -0xA7C4 0x33B5 # SQUARE NV -0xA7C5 0x33B6 # SQUARE MU V -0xA7C6 0x33B7 # SQUARE MV -0xA7C7 0x33B8 # SQUARE KV -0xA7C8 0x33B9 # SQUARE MV MEGA -0xA7C9 0x3380 # SQUARE PA AMPS -0xA7CA 0x3381 # SQUARE NA -0xA7CB 0x3382 # SQUARE MU A -0xA7CC 0x3383 # SQUARE MA -0xA7CD 0x3384 # SQUARE KA -0xA7CE 0x33BA # SQUARE PW -0xA7CF 0x33BB # SQUARE NW -0xA7D0 0x33BC # SQUARE MU W -0xA7D1 0x33BD # SQUARE MW -0xA7D2 0x33BE # SQUARE KW -0xA7D3 0x33BF # SQUARE MW MEGA -0xA7D4 0x3390 # SQUARE HZ -0xA7D5 0x3391 # SQUARE KHZ -0xA7D6 0x3392 # SQUARE MHZ -0xA7D7 0x3393 # SQUARE GHZ -0xA7D8 0x3394 # SQUARE THZ -0xA7D9 0x2126 # OHM SIGN -0xA7DA 0x33C0 # SQUARE K OHM -0xA7DB 0x33C1 # SQUARE M OHM -0xA7DC 0x338A # SQUARE PF -0xA7DD 0x338B # SQUARE NF -0xA7DE 0x338C # SQUARE MU F -0xA7DF 0x33D6 # SQUARE MOL -0xA7E0 0x33C5 # SQUARE CD -0xA7E1 0x33AD # SQUARE RAD -0xA7E2 0x33AE # SQUARE RAD OVER S -0xA7E3 0x33AF # SQUARE RAD OVER S SQUARED -0xA7E4 0x33DB # SQUARE SR -0xA7E5 0x33A9 # SQUARE PA -0xA7E6 0x33AA # SQUARE KPA -0xA7E7 0x33AB # SQUARE MPA -0xA7E8 0x33AC # SQUARE GPA -0xA7E9 0x33DD # SQUARE WB -0xA7EA 0x33D0 # SQUARE LM -0xA7EB 0x33D3 # SQUARE LX -0xA7EC 0x33C3 # SQUARE BQ -0xA7ED 0x33C9 # SQUARE GY -0xA7EE 0x33DC # SQUARE SV -0xA7EF 0x33C6 # SQUARE C OVER KG -0xA841 0xCB6D # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULKIYEOK -0xA842 0xCB6E # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULMIEUM -0xA843 0xCB6F # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULPIEUP -0xA844 0xCB70 # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULSIOS -0xA845 0xCB71 # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULTHIEUTH -0xA846 0xCB72 # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULPHIEUPH -0xA847 0xCB73 # HANGUL SYLLABLE SSANGCIEUC-WEO-RIEULHIEUH -0xA848 0xCB74 # HANGUL SYLLABLE SSANGCIEUC-WEO-MIEUM -0xA849 0xCB75 # HANGUL SYLLABLE SSANGCIEUC-WEO-PIEUP -0xA84A 0xCB76 # HANGUL SYLLABLE SSANGCIEUC-WEO-PIEUPSIOS -0xA84B 0xCB77 # HANGUL SYLLABLE SSANGCIEUC-WEO-SIOS -0xA84C 0xCB7A # HANGUL SYLLABLE SSANGCIEUC-WEO-CIEUC -0xA84D 0xCB7B # HANGUL SYLLABLE SSANGCIEUC-WEO-CHIEUCH -0xA84E 0xCB7C # HANGUL SYLLABLE SSANGCIEUC-WEO-KHIEUKH -0xA84F 0xCB7D # HANGUL SYLLABLE SSANGCIEUC-WEO-THIEUTH -0xA850 0xCB7E # HANGUL SYLLABLE SSANGCIEUC-WEO-PHIEUPH -0xA851 0xCB7F # HANGUL SYLLABLE SSANGCIEUC-WEO-HIEUH -0xA852 0xCB80 # HANGUL SYLLABLE SSANGCIEUC-WE -0xA853 0xCB81 # HANGUL SYLLABLE SSANGCIEUC-WE-KIYEOK -0xA854 0xCB82 # HANGUL SYLLABLE SSANGCIEUC-WE-SSANGKIYEOK -0xA855 0xCB83 # HANGUL SYLLABLE SSANGCIEUC-WE-KIYEOKSIOS -0xA856 0xCB84 # HANGUL SYLLABLE SSANGCIEUC-WE-NIEUN -0xA857 0xCB85 # HANGUL SYLLABLE SSANGCIEUC-WE-NIEUNCIEUC -0xA858 0xCB86 # HANGUL SYLLABLE SSANGCIEUC-WE-NIEUNHIEUH -0xA859 0xCB87 # HANGUL SYLLABLE SSANGCIEUC-WE-TIKEUT -0xA85A 0xCB88 # HANGUL SYLLABLE SSANGCIEUC-WE-RIEUL -0xA861 0xCB89 # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULKIYEOK -0xA862 0xCB8A # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULMIEUM -0xA863 0xCB8B # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULPIEUP -0xA864 0xCB8C # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULSIOS -0xA865 0xCB8D # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULTHIEUTH -0xA866 0xCB8E # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULPHIEUPH -0xA867 0xCB8F # HANGUL SYLLABLE SSANGCIEUC-WE-RIEULHIEUH -0xA868 0xCB90 # HANGUL SYLLABLE SSANGCIEUC-WE-MIEUM -0xA869 0xCB91 # HANGUL SYLLABLE SSANGCIEUC-WE-PIEUP -0xA86A 0xCB92 # HANGUL SYLLABLE SSANGCIEUC-WE-PIEUPSIOS -0xA86B 0xCB93 # HANGUL SYLLABLE SSANGCIEUC-WE-SIOS -0xA86C 0xCB94 # HANGUL SYLLABLE SSANGCIEUC-WE-SSANGSIOS -0xA86D 0xCB95 # HANGUL SYLLABLE SSANGCIEUC-WE-IEUNG -0xA86E 0xCB96 # HANGUL SYLLABLE SSANGCIEUC-WE-CIEUC -0xA86F 0xCB97 # HANGUL SYLLABLE SSANGCIEUC-WE-CHIEUCH -0xA870 0xCB98 # HANGUL SYLLABLE SSANGCIEUC-WE-KHIEUKH -0xA871 0xCB99 # HANGUL SYLLABLE SSANGCIEUC-WE-THIEUTH -0xA872 0xCB9A # HANGUL SYLLABLE SSANGCIEUC-WE-PHIEUPH -0xA873 0xCB9B # HANGUL SYLLABLE SSANGCIEUC-WE-HIEUH -0xA874 0xCB9D # HANGUL SYLLABLE SSANGCIEUC-WI-KIYEOK -0xA875 0xCB9E # HANGUL SYLLABLE SSANGCIEUC-WI-SSANGKIYEOK -0xA876 0xCB9F # HANGUL SYLLABLE SSANGCIEUC-WI-KIYEOKSIOS -0xA877 0xCBA0 # HANGUL SYLLABLE SSANGCIEUC-WI-NIEUN -0xA878 0xCBA1 # HANGUL SYLLABLE SSANGCIEUC-WI-NIEUNCIEUC -0xA879 0xCBA2 # HANGUL SYLLABLE SSANGCIEUC-WI-NIEUNHIEUH -0xA87A 0xCBA3 # HANGUL SYLLABLE SSANGCIEUC-WI-TIKEUT -0xA881 0xCBA4 # HANGUL SYLLABLE SSANGCIEUC-WI-RIEUL -0xA882 0xCBA5 # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULKIYEOK -0xA883 0xCBA6 # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULMIEUM -0xA884 0xCBA7 # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULPIEUP -0xA885 0xCBA8 # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULSIOS -0xA886 0xCBA9 # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULTHIEUTH -0xA887 0xCBAA # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULPHIEUPH -0xA888 0xCBAB # HANGUL SYLLABLE SSANGCIEUC-WI-RIEULHIEUH -0xA889 0xCBAC # HANGUL SYLLABLE SSANGCIEUC-WI-MIEUM -0xA88A 0xCBAD # HANGUL SYLLABLE SSANGCIEUC-WI-PIEUP -0xA88B 0xCBAE # HANGUL SYLLABLE SSANGCIEUC-WI-PIEUPSIOS -0xA88C 0xCBAF # HANGUL SYLLABLE SSANGCIEUC-WI-SIOS -0xA88D 0xCBB0 # HANGUL SYLLABLE SSANGCIEUC-WI-SSANGSIOS -0xA88E 0xCBB1 # HANGUL SYLLABLE SSANGCIEUC-WI-IEUNG -0xA88F 0xCBB2 # HANGUL SYLLABLE SSANGCIEUC-WI-CIEUC -0xA890 0xCBB3 # HANGUL SYLLABLE SSANGCIEUC-WI-CHIEUCH -0xA891 0xCBB4 # HANGUL SYLLABLE SSANGCIEUC-WI-KHIEUKH -0xA892 0xCBB5 # HANGUL SYLLABLE SSANGCIEUC-WI-THIEUTH -0xA893 0xCBB6 # HANGUL SYLLABLE SSANGCIEUC-WI-PHIEUPH -0xA894 0xCBB7 # HANGUL SYLLABLE SSANGCIEUC-WI-HIEUH -0xA895 0xCBB9 # HANGUL SYLLABLE SSANGCIEUC-YU-KIYEOK -0xA896 0xCBBA # HANGUL SYLLABLE SSANGCIEUC-YU-SSANGKIYEOK -0xA897 0xCBBB # HANGUL SYLLABLE SSANGCIEUC-YU-KIYEOKSIOS -0xA898 0xCBBC # HANGUL SYLLABLE SSANGCIEUC-YU-NIEUN -0xA899 0xCBBD # HANGUL SYLLABLE SSANGCIEUC-YU-NIEUNCIEUC -0xA89A 0xCBBE # HANGUL SYLLABLE SSANGCIEUC-YU-NIEUNHIEUH -0xA89B 0xCBBF # HANGUL SYLLABLE SSANGCIEUC-YU-TIKEUT -0xA89C 0xCBC0 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEUL -0xA89D 0xCBC1 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULKIYEOK -0xA89E 0xCBC2 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULMIEUM -0xA89F 0xCBC3 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULPIEUP -0xA8A0 0xCBC4 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULSIOS -0xA8A1 0x00C6 # LATIN CAPITAL LIGATURE AE -0xA8A2 0x00D0 # LATIN CAPITAL LETTER ETH -0xA8A3 0x00AA # FEMININE ORDINAL INDICATOR -0xA8A4 0x0126 # LATIN CAPITAL LETTER H WITH STROKE -0xA8A6 0x0132 # LATIN CAPITAL LIGATURE IJ -0xA8A8 0x013F # LATIN CAPITAL LETTER L WITH MIDDLE DOT -0xA8A9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE -0xA8AA 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0xA8AB 0x0152 # LATIN CAPITAL LIGATURE OE -0xA8AC 0x00BA # MASCULINE ORDINAL INDICATOR -0xA8AD 0x00DE # LATIN CAPITAL LETTER THORN -0xA8AE 0x0166 # LATIN CAPITAL LETTER T WITH STROKE -0xA8AF 0x014A # LATIN CAPITAL LETTER ENG -0xA8B1 0x3260 # CIRCLED HANGUL KIYEOK -0xA8B2 0x3261 # CIRCLED HANGUL NIEUN -0xA8B3 0x3262 # CIRCLED HANGUL TIKEUT -0xA8B4 0x3263 # CIRCLED HANGUL RIEUL -0xA8B5 0x3264 # CIRCLED HANGUL MIEUM -0xA8B6 0x3265 # CIRCLED HANGUL PIEUP -0xA8B7 0x3266 # CIRCLED HANGUL SIOS -0xA8B8 0x3267 # CIRCLED HANGUL IEUNG -0xA8B9 0x3268 # CIRCLED HANGUL CIEUC -0xA8BA 0x3269 # CIRCLED HANGUL CHIEUCH -0xA8BB 0x326A # CIRCLED HANGUL KHIEUKH -0xA8BC 0x326B # CIRCLED HANGUL THIEUTH -0xA8BD 0x326C # CIRCLED HANGUL PHIEUPH -0xA8BE 0x326D # CIRCLED HANGUL HIEUH -0xA8BF 0x326E # CIRCLED HANGUL KIYEOK A -0xA8C0 0x326F # CIRCLED HANGUL NIEUN A -0xA8C1 0x3270 # CIRCLED HANGUL TIKEUT A -0xA8C2 0x3271 # CIRCLED HANGUL RIEUL A -0xA8C3 0x3272 # CIRCLED HANGUL MIEUM A -0xA8C4 0x3273 # CIRCLED HANGUL PIEUP A -0xA8C5 0x3274 # CIRCLED HANGUL SIOS A -0xA8C6 0x3275 # CIRCLED HANGUL IEUNG A -0xA8C7 0x3276 # CIRCLED HANGUL CIEUC A -0xA8C8 0x3277 # CIRCLED HANGUL CHIEUCH A -0xA8C9 0x3278 # CIRCLED HANGUL KHIEUKH A -0xA8CA 0x3279 # CIRCLED HANGUL THIEUTH A -0xA8CB 0x327A # CIRCLED HANGUL PHIEUPH A -0xA8CC 0x327B # CIRCLED HANGUL HIEUH A -0xA8CD 0x24D0 # CIRCLED LATIN SMALL LETTER A -0xA8CE 0x24D1 # CIRCLED LATIN SMALL LETTER B -0xA8CF 0x24D2 # CIRCLED LATIN SMALL LETTER C -0xA8D0 0x24D3 # CIRCLED LATIN SMALL LETTER D -0xA8D1 0x24D4 # CIRCLED LATIN SMALL LETTER E -0xA8D2 0x24D5 # CIRCLED LATIN SMALL LETTER F -0xA8D3 0x24D6 # CIRCLED LATIN SMALL LETTER G -0xA8D4 0x24D7 # CIRCLED LATIN SMALL LETTER H -0xA8D5 0x24D8 # CIRCLED LATIN SMALL LETTER I -0xA8D6 0x24D9 # CIRCLED LATIN SMALL LETTER J -0xA8D7 0x24DA # CIRCLED LATIN SMALL LETTER K -0xA8D8 0x24DB # CIRCLED LATIN SMALL LETTER L -0xA8D9 0x24DC # CIRCLED LATIN SMALL LETTER M -0xA8DA 0x24DD # CIRCLED LATIN SMALL LETTER N -0xA8DB 0x24DE # CIRCLED LATIN SMALL LETTER O -0xA8DC 0x24DF # CIRCLED LATIN SMALL LETTER P -0xA8DD 0x24E0 # CIRCLED LATIN SMALL LETTER Q -0xA8DE 0x24E1 # CIRCLED LATIN SMALL LETTER R -0xA8DF 0x24E2 # CIRCLED LATIN SMALL LETTER S -0xA8E0 0x24E3 # CIRCLED LATIN SMALL LETTER T -0xA8E1 0x24E4 # CIRCLED LATIN SMALL LETTER U -0xA8E2 0x24E5 # CIRCLED LATIN SMALL LETTER V -0xA8E3 0x24E6 # CIRCLED LATIN SMALL LETTER W -0xA8E4 0x24E7 # CIRCLED LATIN SMALL LETTER X -0xA8E5 0x24E8 # CIRCLED LATIN SMALL LETTER Y -0xA8E6 0x24E9 # CIRCLED LATIN SMALL LETTER Z -0xA8E7 0x2460 # CIRCLED DIGIT ONE -0xA8E8 0x2461 # CIRCLED DIGIT TWO -0xA8E9 0x2462 # CIRCLED DIGIT THREE -0xA8EA 0x2463 # CIRCLED DIGIT FOUR -0xA8EB 0x2464 # CIRCLED DIGIT FIVE -0xA8EC 0x2465 # CIRCLED DIGIT SIX -0xA8ED 0x2466 # CIRCLED DIGIT SEVEN -0xA8EE 0x2467 # CIRCLED DIGIT EIGHT -0xA8EF 0x2468 # CIRCLED DIGIT NINE -0xA8F0 0x2469 # CIRCLED NUMBER TEN -0xA8F1 0x246A # CIRCLED NUMBER ELEVEN -0xA8F2 0x246B # CIRCLED NUMBER TWELVE -0xA8F3 0x246C # CIRCLED NUMBER THIRTEEN -0xA8F4 0x246D # CIRCLED NUMBER FOURTEEN -0xA8F5 0x246E # CIRCLED NUMBER FIFTEEN -0xA8F6 0x00BD # VULGAR FRACTION ONE HALF -0xA8F7 0x2153 # VULGAR FRACTION ONE THIRD -0xA8F8 0x2154 # VULGAR FRACTION TWO THIRDS -0xA8F9 0x00BC # VULGAR FRACTION ONE QUARTER -0xA8FA 0x00BE # VULGAR FRACTION THREE QUARTERS -0xA8FB 0x215B # VULGAR FRACTION ONE EIGHTH -0xA8FC 0x215C # VULGAR FRACTION THREE EIGHTHS -0xA8FD 0x215D # VULGAR FRACTION FIVE EIGHTHS -0xA8FE 0x215E # VULGAR FRACTION SEVEN EIGHTHS -0xA941 0xCBC5 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULTHIEUTH -0xA942 0xCBC6 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULPHIEUPH -0xA943 0xCBC7 # HANGUL SYLLABLE SSANGCIEUC-YU-RIEULHIEUH -0xA944 0xCBC8 # HANGUL SYLLABLE SSANGCIEUC-YU-MIEUM -0xA945 0xCBC9 # HANGUL SYLLABLE SSANGCIEUC-YU-PIEUP -0xA946 0xCBCA # HANGUL SYLLABLE SSANGCIEUC-YU-PIEUPSIOS -0xA947 0xCBCB # HANGUL SYLLABLE SSANGCIEUC-YU-SIOS -0xA948 0xCBCC # HANGUL SYLLABLE SSANGCIEUC-YU-SSANGSIOS -0xA949 0xCBCD # HANGUL SYLLABLE SSANGCIEUC-YU-IEUNG -0xA94A 0xCBCE # HANGUL SYLLABLE SSANGCIEUC-YU-CIEUC -0xA94B 0xCBCF # HANGUL SYLLABLE SSANGCIEUC-YU-CHIEUCH -0xA94C 0xCBD0 # HANGUL SYLLABLE SSANGCIEUC-YU-KHIEUKH -0xA94D 0xCBD1 # HANGUL SYLLABLE SSANGCIEUC-YU-THIEUTH -0xA94E 0xCBD2 # HANGUL SYLLABLE SSANGCIEUC-YU-PHIEUPH -0xA94F 0xCBD3 # HANGUL SYLLABLE SSANGCIEUC-YU-HIEUH -0xA950 0xCBD5 # HANGUL SYLLABLE SSANGCIEUC-EU-KIYEOK -0xA951 0xCBD6 # HANGUL SYLLABLE SSANGCIEUC-EU-SSANGKIYEOK -0xA952 0xCBD7 # HANGUL SYLLABLE SSANGCIEUC-EU-KIYEOKSIOS -0xA953 0xCBD8 # HANGUL SYLLABLE SSANGCIEUC-EU-NIEUN -0xA954 0xCBD9 # HANGUL SYLLABLE SSANGCIEUC-EU-NIEUNCIEUC -0xA955 0xCBDA # HANGUL SYLLABLE SSANGCIEUC-EU-NIEUNHIEUH -0xA956 0xCBDB # HANGUL SYLLABLE SSANGCIEUC-EU-TIKEUT -0xA957 0xCBDC # HANGUL SYLLABLE SSANGCIEUC-EU-RIEUL -0xA958 0xCBDD # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULKIYEOK -0xA959 0xCBDE # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULMIEUM -0xA95A 0xCBDF # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULPIEUP -0xA961 0xCBE0 # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULSIOS -0xA962 0xCBE1 # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULTHIEUTH -0xA963 0xCBE2 # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULPHIEUPH -0xA964 0xCBE3 # HANGUL SYLLABLE SSANGCIEUC-EU-RIEULHIEUH -0xA965 0xCBE5 # HANGUL SYLLABLE SSANGCIEUC-EU-PIEUP -0xA966 0xCBE6 # HANGUL SYLLABLE SSANGCIEUC-EU-PIEUPSIOS -0xA967 0xCBE8 # HANGUL SYLLABLE SSANGCIEUC-EU-SSANGSIOS -0xA968 0xCBEA # HANGUL SYLLABLE SSANGCIEUC-EU-CIEUC -0xA969 0xCBEB # HANGUL SYLLABLE SSANGCIEUC-EU-CHIEUCH -0xA96A 0xCBEC # HANGUL SYLLABLE SSANGCIEUC-EU-KHIEUKH -0xA96B 0xCBED # HANGUL SYLLABLE SSANGCIEUC-EU-THIEUTH -0xA96C 0xCBEE # HANGUL SYLLABLE SSANGCIEUC-EU-PHIEUPH -0xA96D 0xCBEF # HANGUL SYLLABLE SSANGCIEUC-EU-HIEUH -0xA96E 0xCBF0 # HANGUL SYLLABLE SSANGCIEUC-YI -0xA96F 0xCBF1 # HANGUL SYLLABLE SSANGCIEUC-YI-KIYEOK -0xA970 0xCBF2 # HANGUL SYLLABLE SSANGCIEUC-YI-SSANGKIYEOK -0xA971 0xCBF3 # HANGUL SYLLABLE SSANGCIEUC-YI-KIYEOKSIOS -0xA972 0xCBF4 # HANGUL SYLLABLE SSANGCIEUC-YI-NIEUN -0xA973 0xCBF5 # HANGUL SYLLABLE SSANGCIEUC-YI-NIEUNCIEUC -0xA974 0xCBF6 # HANGUL SYLLABLE SSANGCIEUC-YI-NIEUNHIEUH -0xA975 0xCBF7 # HANGUL SYLLABLE SSANGCIEUC-YI-TIKEUT -0xA976 0xCBF8 # HANGUL SYLLABLE SSANGCIEUC-YI-RIEUL -0xA977 0xCBF9 # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULKIYEOK -0xA978 0xCBFA # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULMIEUM -0xA979 0xCBFB # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULPIEUP -0xA97A 0xCBFC # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULSIOS -0xA981 0xCBFD # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULTHIEUTH -0xA982 0xCBFE # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULPHIEUPH -0xA983 0xCBFF # HANGUL SYLLABLE SSANGCIEUC-YI-RIEULHIEUH -0xA984 0xCC00 # HANGUL SYLLABLE SSANGCIEUC-YI-MIEUM -0xA985 0xCC01 # HANGUL SYLLABLE SSANGCIEUC-YI-PIEUP -0xA986 0xCC02 # HANGUL SYLLABLE SSANGCIEUC-YI-PIEUPSIOS -0xA987 0xCC03 # HANGUL SYLLABLE SSANGCIEUC-YI-SIOS -0xA988 0xCC04 # HANGUL SYLLABLE SSANGCIEUC-YI-SSANGSIOS -0xA989 0xCC05 # HANGUL SYLLABLE SSANGCIEUC-YI-IEUNG -0xA98A 0xCC06 # HANGUL SYLLABLE SSANGCIEUC-YI-CIEUC -0xA98B 0xCC07 # HANGUL SYLLABLE SSANGCIEUC-YI-CHIEUCH -0xA98C 0xCC08 # HANGUL SYLLABLE SSANGCIEUC-YI-KHIEUKH -0xA98D 0xCC09 # HANGUL SYLLABLE SSANGCIEUC-YI-THIEUTH -0xA98E 0xCC0A # HANGUL SYLLABLE SSANGCIEUC-YI-PHIEUPH -0xA98F 0xCC0B # HANGUL SYLLABLE SSANGCIEUC-YI-HIEUH -0xA990 0xCC0E # HANGUL SYLLABLE SSANGCIEUC-I-SSANGKIYEOK -0xA991 0xCC0F # HANGUL SYLLABLE SSANGCIEUC-I-KIYEOKSIOS -0xA992 0xCC11 # HANGUL SYLLABLE SSANGCIEUC-I-NIEUNCIEUC -0xA993 0xCC12 # HANGUL SYLLABLE SSANGCIEUC-I-NIEUNHIEUH -0xA994 0xCC13 # HANGUL SYLLABLE SSANGCIEUC-I-TIKEUT -0xA995 0xCC15 # HANGUL SYLLABLE SSANGCIEUC-I-RIEULKIYEOK -0xA996 0xCC16 # HANGUL SYLLABLE SSANGCIEUC-I-RIEULMIEUM -0xA997 0xCC17 # HANGUL SYLLABLE SSANGCIEUC-I-RIEULPIEUP -0xA998 0xCC18 # HANGUL SYLLABLE SSANGCIEUC-I-RIEULSIOS -0xA999 0xCC19 # HANGUL SYLLABLE SSANGCIEUC-I-RIEULTHIEUTH -0xA99A 0xCC1A # HANGUL SYLLABLE SSANGCIEUC-I-RIEULPHIEUPH -0xA99B 0xCC1B # HANGUL SYLLABLE SSANGCIEUC-I-RIEULHIEUH -0xA99C 0xCC1E # HANGUL SYLLABLE SSANGCIEUC-I-PIEUPSIOS -0xA99D 0xCC1F # HANGUL SYLLABLE SSANGCIEUC-I-SIOS -0xA99E 0xCC20 # HANGUL SYLLABLE SSANGCIEUC-I-SSANGSIOS -0xA99F 0xCC23 # HANGUL SYLLABLE SSANGCIEUC-I-CHIEUCH -0xA9A0 0xCC24 # HANGUL SYLLABLE SSANGCIEUC-I-KHIEUKH -0xA9A1 0x00E6 # LATIN SMALL LIGATURE AE -0xA9A2 0x0111 # LATIN SMALL LETTER D WITH STROKE -0xA9A3 0x00F0 # LATIN SMALL LETTER ETH -0xA9A4 0x0127 # LATIN SMALL LETTER H WITH STROKE -0xA9A5 0x0131 # LATIN SMALL LETTER DOTLESS I -0xA9A6 0x0133 # LATIN SMALL LIGATURE IJ -0xA9A7 0x0138 # LATIN SMALL LETTER KRA -0xA9A8 0x0140 # LATIN SMALL LETTER L WITH MIDDLE DOT -0xA9A9 0x0142 # LATIN SMALL LETTER L WITH STROKE -0xA9AA 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0xA9AB 0x0153 # LATIN SMALL LIGATURE OE -0xA9AC 0x00DF # LATIN SMALL LETTER SHARP S -0xA9AD 0x00FE # LATIN SMALL LETTER THORN -0xA9AE 0x0167 # LATIN SMALL LETTER T WITH STROKE -0xA9AF 0x014B # LATIN SMALL LETTER ENG -0xA9B0 0x0149 # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -0xA9B1 0x3200 # PARENTHESIZED HANGUL KIYEOK -0xA9B2 0x3201 # PARENTHESIZED HANGUL NIEUN -0xA9B3 0x3202 # PARENTHESIZED HANGUL TIKEUT -0xA9B4 0x3203 # PARENTHESIZED HANGUL RIEUL -0xA9B5 0x3204 # PARENTHESIZED HANGUL MIEUM -0xA9B6 0x3205 # PARENTHESIZED HANGUL PIEUP -0xA9B7 0x3206 # PARENTHESIZED HANGUL SIOS -0xA9B8 0x3207 # PARENTHESIZED HANGUL IEUNG -0xA9B9 0x3208 # PARENTHESIZED HANGUL CIEUC -0xA9BA 0x3209 # PARENTHESIZED HANGUL CHIEUCH -0xA9BB 0x320A # PARENTHESIZED HANGUL KHIEUKH -0xA9BC 0x320B # PARENTHESIZED HANGUL THIEUTH -0xA9BD 0x320C # PARENTHESIZED HANGUL PHIEUPH -0xA9BE 0x320D # PARENTHESIZED HANGUL HIEUH -0xA9BF 0x320E # PARENTHESIZED HANGUL KIYEOK A -0xA9C0 0x320F # PARENTHESIZED HANGUL NIEUN A -0xA9C1 0x3210 # PARENTHESIZED HANGUL TIKEUT A -0xA9C2 0x3211 # PARENTHESIZED HANGUL RIEUL A -0xA9C3 0x3212 # PARENTHESIZED HANGUL MIEUM A -0xA9C4 0x3213 # PARENTHESIZED HANGUL PIEUP A -0xA9C5 0x3214 # PARENTHESIZED HANGUL SIOS A -0xA9C6 0x3215 # PARENTHESIZED HANGUL IEUNG A -0xA9C7 0x3216 # PARENTHESIZED HANGUL CIEUC A -0xA9C8 0x3217 # PARENTHESIZED HANGUL CHIEUCH A -0xA9C9 0x3218 # PARENTHESIZED HANGUL KHIEUKH A -0xA9CA 0x3219 # PARENTHESIZED HANGUL THIEUTH A -0xA9CB 0x321A # PARENTHESIZED HANGUL PHIEUPH A -0xA9CC 0x321B # PARENTHESIZED HANGUL HIEUH A -0xA9CD 0x249C # PARENTHESIZED LATIN SMALL LETTER A -0xA9CE 0x249D # PARENTHESIZED LATIN SMALL LETTER B -0xA9CF 0x249E # PARENTHESIZED LATIN SMALL LETTER C -0xA9D0 0x249F # PARENTHESIZED LATIN SMALL LETTER D -0xA9D1 0x24A0 # PARENTHESIZED LATIN SMALL LETTER E -0xA9D2 0x24A1 # PARENTHESIZED LATIN SMALL LETTER F -0xA9D3 0x24A2 # PARENTHESIZED LATIN SMALL LETTER G -0xA9D4 0x24A3 # PARENTHESIZED LATIN SMALL LETTER H -0xA9D5 0x24A4 # PARENTHESIZED LATIN SMALL LETTER I -0xA9D6 0x24A5 # PARENTHESIZED LATIN SMALL LETTER J -0xA9D7 0x24A6 # PARENTHESIZED LATIN SMALL LETTER K -0xA9D8 0x24A7 # PARENTHESIZED LATIN SMALL LETTER L -0xA9D9 0x24A8 # PARENTHESIZED LATIN SMALL LETTER M -0xA9DA 0x24A9 # PARENTHESIZED LATIN SMALL LETTER N -0xA9DB 0x24AA # PARENTHESIZED LATIN SMALL LETTER O -0xA9DC 0x24AB # PARENTHESIZED LATIN SMALL LETTER P -0xA9DD 0x24AC # PARENTHESIZED LATIN SMALL LETTER Q -0xA9DE 0x24AD # PARENTHESIZED LATIN SMALL LETTER R -0xA9DF 0x24AE # PARENTHESIZED LATIN SMALL LETTER S -0xA9E0 0x24AF # PARENTHESIZED LATIN SMALL LETTER T -0xA9E1 0x24B0 # PARENTHESIZED LATIN SMALL LETTER U -0xA9E2 0x24B1 # PARENTHESIZED LATIN SMALL LETTER V -0xA9E3 0x24B2 # PARENTHESIZED LATIN SMALL LETTER W -0xA9E4 0x24B3 # PARENTHESIZED LATIN SMALL LETTER X -0xA9E5 0x24B4 # PARENTHESIZED LATIN SMALL LETTER Y -0xA9E6 0x24B5 # PARENTHESIZED LATIN SMALL LETTER Z -0xA9E7 0x2474 # PARENTHESIZED DIGIT ONE -0xA9E8 0x2475 # PARENTHESIZED DIGIT TWO -0xA9E9 0x2476 # PARENTHESIZED DIGIT THREE -0xA9EA 0x2477 # PARENTHESIZED DIGIT FOUR -0xA9EB 0x2478 # PARENTHESIZED DIGIT FIVE -0xA9EC 0x2479 # PARENTHESIZED DIGIT SIX -0xA9ED 0x247A # PARENTHESIZED DIGIT SEVEN -0xA9EE 0x247B # PARENTHESIZED DIGIT EIGHT -0xA9EF 0x247C # PARENTHESIZED DIGIT NINE -0xA9F0 0x247D # PARENTHESIZED NUMBER TEN -0xA9F1 0x247E # PARENTHESIZED NUMBER ELEVEN -0xA9F2 0x247F # PARENTHESIZED NUMBER TWELVE -0xA9F3 0x2480 # PARENTHESIZED NUMBER THIRTEEN -0xA9F4 0x2481 # PARENTHESIZED NUMBER FOURTEEN -0xA9F5 0x2482 # PARENTHESIZED NUMBER FIFTEEN -0xA9F6 0x00B9 # SUPERSCRIPT ONE -0xA9F7 0x00B2 # SUPERSCRIPT TWO -0xA9F8 0x00B3 # SUPERSCRIPT THREE -0xA9F9 0x2074 # SUPERSCRIPT FOUR -0xA9FA 0x207F # SUPERSCRIPT LATIN SMALL LETTER N -0xA9FB 0x2081 # SUBSCRIPT ONE -0xA9FC 0x2082 # SUBSCRIPT TWO -0xA9FD 0x2083 # SUBSCRIPT THREE -0xA9FE 0x2084 # SUBSCRIPT FOUR -0xAA41 0xCC25 # HANGUL SYLLABLE SSANGCIEUC-I-THIEUTH -0xAA42 0xCC26 # HANGUL SYLLABLE SSANGCIEUC-I-PHIEUPH -0xAA43 0xCC2A # HANGUL SYLLABLE CHIEUCH-A-SSANGKIYEOK -0xAA44 0xCC2B # HANGUL SYLLABLE CHIEUCH-A-KIYEOKSIOS -0xAA45 0xCC2D # HANGUL SYLLABLE CHIEUCH-A-NIEUNCIEUC -0xAA46 0xCC2F # HANGUL SYLLABLE CHIEUCH-A-TIKEUT -0xAA47 0xCC31 # HANGUL SYLLABLE CHIEUCH-A-RIEULKIYEOK -0xAA48 0xCC32 # HANGUL SYLLABLE CHIEUCH-A-RIEULMIEUM -0xAA49 0xCC33 # HANGUL SYLLABLE CHIEUCH-A-RIEULPIEUP -0xAA4A 0xCC34 # HANGUL SYLLABLE CHIEUCH-A-RIEULSIOS -0xAA4B 0xCC35 # HANGUL SYLLABLE CHIEUCH-A-RIEULTHIEUTH -0xAA4C 0xCC36 # HANGUL SYLLABLE CHIEUCH-A-RIEULPHIEUPH -0xAA4D 0xCC37 # HANGUL SYLLABLE CHIEUCH-A-RIEULHIEUH -0xAA4E 0xCC3A # HANGUL SYLLABLE CHIEUCH-A-PIEUPSIOS -0xAA4F 0xCC3F # HANGUL SYLLABLE CHIEUCH-A-CHIEUCH -0xAA50 0xCC40 # HANGUL SYLLABLE CHIEUCH-A-KHIEUKH -0xAA51 0xCC41 # HANGUL SYLLABLE CHIEUCH-A-THIEUTH -0xAA52 0xCC42 # HANGUL SYLLABLE CHIEUCH-A-PHIEUPH -0xAA53 0xCC43 # HANGUL SYLLABLE CHIEUCH-A-HIEUH -0xAA54 0xCC46 # HANGUL SYLLABLE CHIEUCH-AE-SSANGKIYEOK -0xAA55 0xCC47 # HANGUL SYLLABLE CHIEUCH-AE-KIYEOKSIOS -0xAA56 0xCC49 # HANGUL SYLLABLE CHIEUCH-AE-NIEUNCIEUC -0xAA57 0xCC4A # HANGUL SYLLABLE CHIEUCH-AE-NIEUNHIEUH -0xAA58 0xCC4B # HANGUL SYLLABLE CHIEUCH-AE-TIKEUT -0xAA59 0xCC4D # HANGUL SYLLABLE CHIEUCH-AE-RIEULKIYEOK -0xAA5A 0xCC4E # HANGUL SYLLABLE CHIEUCH-AE-RIEULMIEUM -0xAA61 0xCC4F # HANGUL SYLLABLE CHIEUCH-AE-RIEULPIEUP -0xAA62 0xCC50 # HANGUL SYLLABLE CHIEUCH-AE-RIEULSIOS -0xAA63 0xCC51 # HANGUL SYLLABLE CHIEUCH-AE-RIEULTHIEUTH -0xAA64 0xCC52 # HANGUL SYLLABLE CHIEUCH-AE-RIEULPHIEUPH -0xAA65 0xCC53 # HANGUL SYLLABLE CHIEUCH-AE-RIEULHIEUH -0xAA66 0xCC56 # HANGUL SYLLABLE CHIEUCH-AE-PIEUPSIOS -0xAA67 0xCC5A # HANGUL SYLLABLE CHIEUCH-AE-CIEUC -0xAA68 0xCC5B # HANGUL SYLLABLE CHIEUCH-AE-CHIEUCH -0xAA69 0xCC5C # HANGUL SYLLABLE CHIEUCH-AE-KHIEUKH -0xAA6A 0xCC5D # HANGUL SYLLABLE CHIEUCH-AE-THIEUTH -0xAA6B 0xCC5E # HANGUL SYLLABLE CHIEUCH-AE-PHIEUPH -0xAA6C 0xCC5F # HANGUL SYLLABLE CHIEUCH-AE-HIEUH -0xAA6D 0xCC61 # HANGUL SYLLABLE CHIEUCH-YA-KIYEOK -0xAA6E 0xCC62 # HANGUL SYLLABLE CHIEUCH-YA-SSANGKIYEOK -0xAA6F 0xCC63 # HANGUL SYLLABLE CHIEUCH-YA-KIYEOKSIOS -0xAA70 0xCC65 # HANGUL SYLLABLE CHIEUCH-YA-NIEUNCIEUC -0xAA71 0xCC67 # HANGUL SYLLABLE CHIEUCH-YA-TIKEUT -0xAA72 0xCC69 # HANGUL SYLLABLE CHIEUCH-YA-RIEULKIYEOK -0xAA73 0xCC6A # HANGUL SYLLABLE CHIEUCH-YA-RIEULMIEUM -0xAA74 0xCC6B # HANGUL SYLLABLE CHIEUCH-YA-RIEULPIEUP -0xAA75 0xCC6C # HANGUL SYLLABLE CHIEUCH-YA-RIEULSIOS -0xAA76 0xCC6D # HANGUL SYLLABLE CHIEUCH-YA-RIEULTHIEUTH -0xAA77 0xCC6E # HANGUL SYLLABLE CHIEUCH-YA-RIEULPHIEUPH -0xAA78 0xCC6F # HANGUL SYLLABLE CHIEUCH-YA-RIEULHIEUH -0xAA79 0xCC71 # HANGUL SYLLABLE CHIEUCH-YA-PIEUP -0xAA7A 0xCC72 # HANGUL SYLLABLE CHIEUCH-YA-PIEUPSIOS -0xAA81 0xCC73 # HANGUL SYLLABLE CHIEUCH-YA-SIOS -0xAA82 0xCC74 # HANGUL SYLLABLE CHIEUCH-YA-SSANGSIOS -0xAA83 0xCC76 # HANGUL SYLLABLE CHIEUCH-YA-CIEUC -0xAA84 0xCC77 # HANGUL SYLLABLE CHIEUCH-YA-CHIEUCH -0xAA85 0xCC78 # HANGUL SYLLABLE CHIEUCH-YA-KHIEUKH -0xAA86 0xCC79 # HANGUL SYLLABLE CHIEUCH-YA-THIEUTH -0xAA87 0xCC7A # HANGUL SYLLABLE CHIEUCH-YA-PHIEUPH -0xAA88 0xCC7B # HANGUL SYLLABLE CHIEUCH-YA-HIEUH -0xAA89 0xCC7C # HANGUL SYLLABLE CHIEUCH-YAE -0xAA8A 0xCC7D # HANGUL SYLLABLE CHIEUCH-YAE-KIYEOK -0xAA8B 0xCC7E # HANGUL SYLLABLE CHIEUCH-YAE-SSANGKIYEOK -0xAA8C 0xCC7F # HANGUL SYLLABLE CHIEUCH-YAE-KIYEOKSIOS -0xAA8D 0xCC80 # HANGUL SYLLABLE CHIEUCH-YAE-NIEUN -0xAA8E 0xCC81 # HANGUL SYLLABLE CHIEUCH-YAE-NIEUNCIEUC -0xAA8F 0xCC82 # HANGUL SYLLABLE CHIEUCH-YAE-NIEUNHIEUH -0xAA90 0xCC83 # HANGUL SYLLABLE CHIEUCH-YAE-TIKEUT -0xAA91 0xCC84 # HANGUL SYLLABLE CHIEUCH-YAE-RIEUL -0xAA92 0xCC85 # HANGUL SYLLABLE CHIEUCH-YAE-RIEULKIYEOK -0xAA93 0xCC86 # HANGUL SYLLABLE CHIEUCH-YAE-RIEULMIEUM -0xAA94 0xCC87 # HANGUL SYLLABLE CHIEUCH-YAE-RIEULPIEUP -0xAA95 0xCC88 # HANGUL SYLLABLE CHIEUCH-YAE-RIEULSIOS -0xAA96 0xCC89 # HANGUL SYLLABLE CHIEUCH-YAE-RIEULTHIEUTH -0xAA97 0xCC8A # HANGUL SYLLABLE CHIEUCH-YAE-RIEULPHIEUPH -0xAA98 0xCC8B # HANGUL SYLLABLE CHIEUCH-YAE-RIEULHIEUH -0xAA99 0xCC8C # HANGUL SYLLABLE CHIEUCH-YAE-MIEUM -0xAA9A 0xCC8D # HANGUL SYLLABLE CHIEUCH-YAE-PIEUP -0xAA9B 0xCC8E # HANGUL SYLLABLE CHIEUCH-YAE-PIEUPSIOS -0xAA9C 0xCC8F # HANGUL SYLLABLE CHIEUCH-YAE-SIOS -0xAA9D 0xCC90 # HANGUL SYLLABLE CHIEUCH-YAE-SSANGSIOS -0xAA9E 0xCC91 # HANGUL SYLLABLE CHIEUCH-YAE-IEUNG -0xAA9F 0xCC92 # HANGUL SYLLABLE CHIEUCH-YAE-CIEUC -0xAAA0 0xCC93 # HANGUL SYLLABLE CHIEUCH-YAE-CHIEUCH -0xAAA1 0x3041 # HIRAGANA LETTER SMALL A -0xAAA2 0x3042 # HIRAGANA LETTER A -0xAAA3 0x3043 # HIRAGANA LETTER SMALL I -0xAAA4 0x3044 # HIRAGANA LETTER I -0xAAA5 0x3045 # HIRAGANA LETTER SMALL U -0xAAA6 0x3046 # HIRAGANA LETTER U -0xAAA7 0x3047 # HIRAGANA LETTER SMALL E -0xAAA8 0x3048 # HIRAGANA LETTER E -0xAAA9 0x3049 # HIRAGANA LETTER SMALL O -0xAAAA 0x304A # HIRAGANA LETTER O -0xAAAB 0x304B # HIRAGANA LETTER KA -0xAAAC 0x304C # HIRAGANA LETTER GA -0xAAAD 0x304D # HIRAGANA LETTER KI -0xAAAE 0x304E # HIRAGANA LETTER GI -0xAAAF 0x304F # HIRAGANA LETTER KU -0xAAB0 0x3050 # HIRAGANA LETTER GU -0xAAB1 0x3051 # HIRAGANA LETTER KE -0xAAB2 0x3052 # HIRAGANA LETTER GE -0xAAB3 0x3053 # HIRAGANA LETTER KO -0xAAB4 0x3054 # HIRAGANA LETTER GO -0xAAB5 0x3055 # HIRAGANA LETTER SA -0xAAB6 0x3056 # HIRAGANA LETTER ZA -0xAAB7 0x3057 # HIRAGANA LETTER SI -0xAAB8 0x3058 # HIRAGANA LETTER ZI -0xAAB9 0x3059 # HIRAGANA LETTER SU -0xAABA 0x305A # HIRAGANA LETTER ZU -0xAABB 0x305B # HIRAGANA LETTER SE -0xAABC 0x305C # HIRAGANA LETTER ZE -0xAABD 0x305D # HIRAGANA LETTER SO -0xAABE 0x305E # HIRAGANA LETTER ZO -0xAABF 0x305F # HIRAGANA LETTER TA -0xAAC0 0x3060 # HIRAGANA LETTER DA -0xAAC1 0x3061 # HIRAGANA LETTER TI -0xAAC2 0x3062 # HIRAGANA LETTER DI -0xAAC3 0x3063 # HIRAGANA LETTER SMALL TU -0xAAC4 0x3064 # HIRAGANA LETTER TU -0xAAC5 0x3065 # HIRAGANA LETTER DU -0xAAC6 0x3066 # HIRAGANA LETTER TE -0xAAC7 0x3067 # HIRAGANA LETTER DE -0xAAC8 0x3068 # HIRAGANA LETTER TO -0xAAC9 0x3069 # HIRAGANA LETTER DO -0xAACA 0x306A # HIRAGANA LETTER NA -0xAACB 0x306B # HIRAGANA LETTER NI -0xAACC 0x306C # HIRAGANA LETTER NU -0xAACD 0x306D # HIRAGANA LETTER NE -0xAACE 0x306E # HIRAGANA LETTER NO -0xAACF 0x306F # HIRAGANA LETTER HA -0xAAD0 0x3070 # HIRAGANA LETTER BA -0xAAD1 0x3071 # HIRAGANA LETTER PA -0xAAD2 0x3072 # HIRAGANA LETTER HI -0xAAD3 0x3073 # HIRAGANA LETTER BI -0xAAD4 0x3074 # HIRAGANA LETTER PI -0xAAD5 0x3075 # HIRAGANA LETTER HU -0xAAD6 0x3076 # HIRAGANA LETTER BU -0xAAD7 0x3077 # HIRAGANA LETTER PU -0xAAD8 0x3078 # HIRAGANA LETTER HE -0xAAD9 0x3079 # HIRAGANA LETTER BE -0xAADA 0x307A # HIRAGANA LETTER PE -0xAADB 0x307B # HIRAGANA LETTER HO -0xAADC 0x307C # HIRAGANA LETTER BO -0xAADD 0x307D # HIRAGANA LETTER PO -0xAADE 0x307E # HIRAGANA LETTER MA -0xAADF 0x307F # HIRAGANA LETTER MI -0xAAE0 0x3080 # HIRAGANA LETTER MU -0xAAE1 0x3081 # HIRAGANA LETTER ME -0xAAE2 0x3082 # HIRAGANA LETTER MO -0xAAE3 0x3083 # HIRAGANA LETTER SMALL YA -0xAAE4 0x3084 # HIRAGANA LETTER YA -0xAAE5 0x3085 # HIRAGANA LETTER SMALL YU -0xAAE6 0x3086 # HIRAGANA LETTER YU -0xAAE7 0x3087 # HIRAGANA LETTER SMALL YO -0xAAE8 0x3088 # HIRAGANA LETTER YO -0xAAE9 0x3089 # HIRAGANA LETTER RA -0xAAEA 0x308A # HIRAGANA LETTER RI -0xAAEB 0x308B # HIRAGANA LETTER RU -0xAAEC 0x308C # HIRAGANA LETTER RE -0xAAED 0x308D # HIRAGANA LETTER RO -0xAAEE 0x308E # HIRAGANA LETTER SMALL WA -0xAAEF 0x308F # HIRAGANA LETTER WA -0xAAF0 0x3090 # HIRAGANA LETTER WI -0xAAF1 0x3091 # HIRAGANA LETTER WE -0xAAF2 0x3092 # HIRAGANA LETTER WO -0xAAF3 0x3093 # HIRAGANA LETTER N -0xAB41 0xCC94 # HANGUL SYLLABLE CHIEUCH-YAE-KHIEUKH -0xAB42 0xCC95 # HANGUL SYLLABLE CHIEUCH-YAE-THIEUTH -0xAB43 0xCC96 # HANGUL SYLLABLE CHIEUCH-YAE-PHIEUPH -0xAB44 0xCC97 # HANGUL SYLLABLE CHIEUCH-YAE-HIEUH -0xAB45 0xCC9A # HANGUL SYLLABLE CHIEUCH-EO-SSANGKIYEOK -0xAB46 0xCC9B # HANGUL SYLLABLE CHIEUCH-EO-KIYEOKSIOS -0xAB47 0xCC9D # HANGUL SYLLABLE CHIEUCH-EO-NIEUNCIEUC -0xAB48 0xCC9E # HANGUL SYLLABLE CHIEUCH-EO-NIEUNHIEUH -0xAB49 0xCC9F # HANGUL SYLLABLE CHIEUCH-EO-TIKEUT -0xAB4A 0xCCA1 # HANGUL SYLLABLE CHIEUCH-EO-RIEULKIYEOK -0xAB4B 0xCCA2 # HANGUL SYLLABLE CHIEUCH-EO-RIEULMIEUM -0xAB4C 0xCCA3 # HANGUL SYLLABLE CHIEUCH-EO-RIEULPIEUP -0xAB4D 0xCCA4 # HANGUL SYLLABLE CHIEUCH-EO-RIEULSIOS -0xAB4E 0xCCA5 # HANGUL SYLLABLE CHIEUCH-EO-RIEULTHIEUTH -0xAB4F 0xCCA6 # HANGUL SYLLABLE CHIEUCH-EO-RIEULPHIEUPH -0xAB50 0xCCA7 # HANGUL SYLLABLE CHIEUCH-EO-RIEULHIEUH -0xAB51 0xCCAA # HANGUL SYLLABLE CHIEUCH-EO-PIEUPSIOS -0xAB52 0xCCAE # HANGUL SYLLABLE CHIEUCH-EO-CIEUC -0xAB53 0xCCAF # HANGUL SYLLABLE CHIEUCH-EO-CHIEUCH -0xAB54 0xCCB0 # HANGUL SYLLABLE CHIEUCH-EO-KHIEUKH -0xAB55 0xCCB1 # HANGUL SYLLABLE CHIEUCH-EO-THIEUTH -0xAB56 0xCCB2 # HANGUL SYLLABLE CHIEUCH-EO-PHIEUPH -0xAB57 0xCCB3 # HANGUL SYLLABLE CHIEUCH-EO-HIEUH -0xAB58 0xCCB6 # HANGUL SYLLABLE CHIEUCH-E-SSANGKIYEOK -0xAB59 0xCCB7 # HANGUL SYLLABLE CHIEUCH-E-KIYEOKSIOS -0xAB5A 0xCCB9 # HANGUL SYLLABLE CHIEUCH-E-NIEUNCIEUC -0xAB61 0xCCBA # HANGUL SYLLABLE CHIEUCH-E-NIEUNHIEUH -0xAB62 0xCCBB # HANGUL SYLLABLE CHIEUCH-E-TIKEUT -0xAB63 0xCCBD # HANGUL SYLLABLE CHIEUCH-E-RIEULKIYEOK -0xAB64 0xCCBE # HANGUL SYLLABLE CHIEUCH-E-RIEULMIEUM -0xAB65 0xCCBF # HANGUL SYLLABLE CHIEUCH-E-RIEULPIEUP -0xAB66 0xCCC0 # HANGUL SYLLABLE CHIEUCH-E-RIEULSIOS -0xAB67 0xCCC1 # HANGUL SYLLABLE CHIEUCH-E-RIEULTHIEUTH -0xAB68 0xCCC2 # HANGUL SYLLABLE CHIEUCH-E-RIEULPHIEUPH -0xAB69 0xCCC3 # HANGUL SYLLABLE CHIEUCH-E-RIEULHIEUH -0xAB6A 0xCCC6 # HANGUL SYLLABLE CHIEUCH-E-PIEUPSIOS -0xAB6B 0xCCC8 # HANGUL SYLLABLE CHIEUCH-E-SSANGSIOS -0xAB6C 0xCCCA # HANGUL SYLLABLE CHIEUCH-E-CIEUC -0xAB6D 0xCCCB # HANGUL SYLLABLE CHIEUCH-E-CHIEUCH -0xAB6E 0xCCCC # HANGUL SYLLABLE CHIEUCH-E-KHIEUKH -0xAB6F 0xCCCD # HANGUL SYLLABLE CHIEUCH-E-THIEUTH -0xAB70 0xCCCE # HANGUL SYLLABLE CHIEUCH-E-PHIEUPH -0xAB71 0xCCCF # HANGUL SYLLABLE CHIEUCH-E-HIEUH -0xAB72 0xCCD1 # HANGUL SYLLABLE CHIEUCH-YEO-KIYEOK -0xAB73 0xCCD2 # HANGUL SYLLABLE CHIEUCH-YEO-SSANGKIYEOK -0xAB74 0xCCD3 # HANGUL SYLLABLE CHIEUCH-YEO-KIYEOKSIOS -0xAB75 0xCCD5 # HANGUL SYLLABLE CHIEUCH-YEO-NIEUNCIEUC -0xAB76 0xCCD6 # HANGUL SYLLABLE CHIEUCH-YEO-NIEUNHIEUH -0xAB77 0xCCD7 # HANGUL SYLLABLE CHIEUCH-YEO-TIKEUT -0xAB78 0xCCD8 # HANGUL SYLLABLE CHIEUCH-YEO-RIEUL -0xAB79 0xCCD9 # HANGUL SYLLABLE CHIEUCH-YEO-RIEULKIYEOK -0xAB7A 0xCCDA # HANGUL SYLLABLE CHIEUCH-YEO-RIEULMIEUM -0xAB81 0xCCDB # HANGUL SYLLABLE CHIEUCH-YEO-RIEULPIEUP -0xAB82 0xCCDC # HANGUL SYLLABLE CHIEUCH-YEO-RIEULSIOS -0xAB83 0xCCDD # HANGUL SYLLABLE CHIEUCH-YEO-RIEULTHIEUTH -0xAB84 0xCCDE # HANGUL SYLLABLE CHIEUCH-YEO-RIEULPHIEUPH -0xAB85 0xCCDF # HANGUL SYLLABLE CHIEUCH-YEO-RIEULHIEUH -0xAB86 0xCCE0 # HANGUL SYLLABLE CHIEUCH-YEO-MIEUM -0xAB87 0xCCE1 # HANGUL SYLLABLE CHIEUCH-YEO-PIEUP -0xAB88 0xCCE2 # HANGUL SYLLABLE CHIEUCH-YEO-PIEUPSIOS -0xAB89 0xCCE3 # HANGUL SYLLABLE CHIEUCH-YEO-SIOS -0xAB8A 0xCCE5 # HANGUL SYLLABLE CHIEUCH-YEO-IEUNG -0xAB8B 0xCCE6 # HANGUL SYLLABLE CHIEUCH-YEO-CIEUC -0xAB8C 0xCCE7 # HANGUL SYLLABLE CHIEUCH-YEO-CHIEUCH -0xAB8D 0xCCE8 # HANGUL SYLLABLE CHIEUCH-YEO-KHIEUKH -0xAB8E 0xCCE9 # HANGUL SYLLABLE CHIEUCH-YEO-THIEUTH -0xAB8F 0xCCEA # HANGUL SYLLABLE CHIEUCH-YEO-PHIEUPH -0xAB90 0xCCEB # HANGUL SYLLABLE CHIEUCH-YEO-HIEUH -0xAB91 0xCCED # HANGUL SYLLABLE CHIEUCH-YE-KIYEOK -0xAB92 0xCCEE # HANGUL SYLLABLE CHIEUCH-YE-SSANGKIYEOK -0xAB93 0xCCEF # HANGUL SYLLABLE CHIEUCH-YE-KIYEOKSIOS -0xAB94 0xCCF1 # HANGUL SYLLABLE CHIEUCH-YE-NIEUNCIEUC -0xAB95 0xCCF2 # HANGUL SYLLABLE CHIEUCH-YE-NIEUNHIEUH -0xAB96 0xCCF3 # HANGUL SYLLABLE CHIEUCH-YE-TIKEUT -0xAB97 0xCCF4 # HANGUL SYLLABLE CHIEUCH-YE-RIEUL -0xAB98 0xCCF5 # HANGUL SYLLABLE CHIEUCH-YE-RIEULKIYEOK -0xAB99 0xCCF6 # HANGUL SYLLABLE CHIEUCH-YE-RIEULMIEUM -0xAB9A 0xCCF7 # HANGUL SYLLABLE CHIEUCH-YE-RIEULPIEUP -0xAB9B 0xCCF8 # HANGUL SYLLABLE CHIEUCH-YE-RIEULSIOS -0xAB9C 0xCCF9 # HANGUL SYLLABLE CHIEUCH-YE-RIEULTHIEUTH -0xAB9D 0xCCFA # HANGUL SYLLABLE CHIEUCH-YE-RIEULPHIEUPH -0xAB9E 0xCCFB # HANGUL SYLLABLE CHIEUCH-YE-RIEULHIEUH -0xAB9F 0xCCFC # HANGUL SYLLABLE CHIEUCH-YE-MIEUM -0xABA0 0xCCFD # HANGUL SYLLABLE CHIEUCH-YE-PIEUP -0xABA1 0x30A1 # KATAKANA LETTER SMALL A -0xABA2 0x30A2 # KATAKANA LETTER A -0xABA3 0x30A3 # KATAKANA LETTER SMALL I -0xABA4 0x30A4 # KATAKANA LETTER I -0xABA5 0x30A5 # KATAKANA LETTER SMALL U -0xABA6 0x30A6 # KATAKANA LETTER U -0xABA7 0x30A7 # KATAKANA LETTER SMALL E -0xABA8 0x30A8 # KATAKANA LETTER E -0xABA9 0x30A9 # KATAKANA LETTER SMALL O -0xABAA 0x30AA # KATAKANA LETTER O -0xABAB 0x30AB # KATAKANA LETTER KA -0xABAC 0x30AC # KATAKANA LETTER GA -0xABAD 0x30AD # KATAKANA LETTER KI -0xABAE 0x30AE # KATAKANA LETTER GI -0xABAF 0x30AF # KATAKANA LETTER KU -0xABB0 0x30B0 # KATAKANA LETTER GU -0xABB1 0x30B1 # KATAKANA LETTER KE -0xABB2 0x30B2 # KATAKANA LETTER GE -0xABB3 0x30B3 # KATAKANA LETTER KO -0xABB4 0x30B4 # KATAKANA LETTER GO -0xABB5 0x30B5 # KATAKANA LETTER SA -0xABB6 0x30B6 # KATAKANA LETTER ZA -0xABB7 0x30B7 # KATAKANA LETTER SI -0xABB8 0x30B8 # KATAKANA LETTER ZI -0xABB9 0x30B9 # KATAKANA LETTER SU -0xABBA 0x30BA # KATAKANA LETTER ZU -0xABBB 0x30BB # KATAKANA LETTER SE -0xABBC 0x30BC # KATAKANA LETTER ZE -0xABBD 0x30BD # KATAKANA LETTER SO -0xABBE 0x30BE # KATAKANA LETTER ZO -0xABBF 0x30BF # KATAKANA LETTER TA -0xABC0 0x30C0 # KATAKANA LETTER DA -0xABC1 0x30C1 # KATAKANA LETTER TI -0xABC2 0x30C2 # KATAKANA LETTER DI -0xABC3 0x30C3 # KATAKANA LETTER SMALL TU -0xABC4 0x30C4 # KATAKANA LETTER TU -0xABC5 0x30C5 # KATAKANA LETTER DU -0xABC6 0x30C6 # KATAKANA LETTER TE -0xABC7 0x30C7 # KATAKANA LETTER DE -0xABC8 0x30C8 # KATAKANA LETTER TO -0xABC9 0x30C9 # KATAKANA LETTER DO -0xABCA 0x30CA # KATAKANA LETTER NA -0xABCB 0x30CB # KATAKANA LETTER NI -0xABCC 0x30CC # KATAKANA LETTER NU -0xABCD 0x30CD # KATAKANA LETTER NE -0xABCE 0x30CE # KATAKANA LETTER NO -0xABCF 0x30CF # KATAKANA LETTER HA -0xABD0 0x30D0 # KATAKANA LETTER BA -0xABD1 0x30D1 # KATAKANA LETTER PA -0xABD2 0x30D2 # KATAKANA LETTER HI -0xABD3 0x30D3 # KATAKANA LETTER BI -0xABD4 0x30D4 # KATAKANA LETTER PI -0xABD5 0x30D5 # KATAKANA LETTER HU -0xABD6 0x30D6 # KATAKANA LETTER BU -0xABD7 0x30D7 # KATAKANA LETTER PU -0xABD8 0x30D8 # KATAKANA LETTER HE -0xABD9 0x30D9 # KATAKANA LETTER BE -0xABDA 0x30DA # KATAKANA LETTER PE -0xABDB 0x30DB # KATAKANA LETTER HO -0xABDC 0x30DC # KATAKANA LETTER BO -0xABDD 0x30DD # KATAKANA LETTER PO -0xABDE 0x30DE # KATAKANA LETTER MA -0xABDF 0x30DF # KATAKANA LETTER MI -0xABE0 0x30E0 # KATAKANA LETTER MU -0xABE1 0x30E1 # KATAKANA LETTER ME -0xABE2 0x30E2 # KATAKANA LETTER MO -0xABE3 0x30E3 # KATAKANA LETTER SMALL YA -0xABE4 0x30E4 # KATAKANA LETTER YA -0xABE5 0x30E5 # KATAKANA LETTER SMALL YU -0xABE6 0x30E6 # KATAKANA LETTER YU -0xABE7 0x30E7 # KATAKANA LETTER SMALL YO -0xABE8 0x30E8 # KATAKANA LETTER YO -0xABE9 0x30E9 # KATAKANA LETTER RA -0xABEA 0x30EA # KATAKANA LETTER RI -0xABEB 0x30EB # KATAKANA LETTER RU -0xABEC 0x30EC # KATAKANA LETTER RE -0xABED 0x30ED # KATAKANA LETTER RO -0xABEE 0x30EE # KATAKANA LETTER SMALL WA -0xABEF 0x30EF # KATAKANA LETTER WA -0xABF0 0x30F0 # KATAKANA LETTER WI -0xABF1 0x30F1 # KATAKANA LETTER WE -0xABF2 0x30F2 # KATAKANA LETTER WO -0xABF3 0x30F3 # KATAKANA LETTER N -0xABF4 0x30F4 # KATAKANA LETTER VU -0xABF5 0x30F5 # KATAKANA LETTER SMALL KA -0xABF6 0x30F6 # KATAKANA LETTER SMALL KE -0xAC41 0xCCFE # HANGUL SYLLABLE CHIEUCH-YE-PIEUPSIOS -0xAC42 0xCCFF # HANGUL SYLLABLE CHIEUCH-YE-SIOS -0xAC43 0xCD00 # HANGUL SYLLABLE CHIEUCH-YE-SSANGSIOS -0xAC44 0xCD02 # HANGUL SYLLABLE CHIEUCH-YE-CIEUC -0xAC45 0xCD03 # HANGUL SYLLABLE CHIEUCH-YE-CHIEUCH -0xAC46 0xCD04 # HANGUL SYLLABLE CHIEUCH-YE-KHIEUKH -0xAC47 0xCD05 # HANGUL SYLLABLE CHIEUCH-YE-THIEUTH -0xAC48 0xCD06 # HANGUL SYLLABLE CHIEUCH-YE-PHIEUPH -0xAC49 0xCD07 # HANGUL SYLLABLE CHIEUCH-YE-HIEUH -0xAC4A 0xCD0A # HANGUL SYLLABLE CHIEUCH-O-SSANGKIYEOK -0xAC4B 0xCD0B # HANGUL SYLLABLE CHIEUCH-O-KIYEOKSIOS -0xAC4C 0xCD0D # HANGUL SYLLABLE CHIEUCH-O-NIEUNCIEUC -0xAC4D 0xCD0E # HANGUL SYLLABLE CHIEUCH-O-NIEUNHIEUH -0xAC4E 0xCD0F # HANGUL SYLLABLE CHIEUCH-O-TIKEUT -0xAC4F 0xCD11 # HANGUL SYLLABLE CHIEUCH-O-RIEULKIYEOK -0xAC50 0xCD12 # HANGUL SYLLABLE CHIEUCH-O-RIEULMIEUM -0xAC51 0xCD13 # HANGUL SYLLABLE CHIEUCH-O-RIEULPIEUP -0xAC52 0xCD14 # HANGUL SYLLABLE CHIEUCH-O-RIEULSIOS -0xAC53 0xCD15 # HANGUL SYLLABLE CHIEUCH-O-RIEULTHIEUTH -0xAC54 0xCD16 # HANGUL SYLLABLE CHIEUCH-O-RIEULPHIEUPH -0xAC55 0xCD17 # HANGUL SYLLABLE CHIEUCH-O-RIEULHIEUH -0xAC56 0xCD1A # HANGUL SYLLABLE CHIEUCH-O-PIEUPSIOS -0xAC57 0xCD1C # HANGUL SYLLABLE CHIEUCH-O-SSANGSIOS -0xAC58 0xCD1E # HANGUL SYLLABLE CHIEUCH-O-CIEUC -0xAC59 0xCD1F # HANGUL SYLLABLE CHIEUCH-O-CHIEUCH -0xAC5A 0xCD20 # HANGUL SYLLABLE CHIEUCH-O-KHIEUKH -0xAC61 0xCD21 # HANGUL SYLLABLE CHIEUCH-O-THIEUTH -0xAC62 0xCD22 # HANGUL SYLLABLE CHIEUCH-O-PHIEUPH -0xAC63 0xCD23 # HANGUL SYLLABLE CHIEUCH-O-HIEUH -0xAC64 0xCD25 # HANGUL SYLLABLE CHIEUCH-WA-KIYEOK -0xAC65 0xCD26 # HANGUL SYLLABLE CHIEUCH-WA-SSANGKIYEOK -0xAC66 0xCD27 # HANGUL SYLLABLE CHIEUCH-WA-KIYEOKSIOS -0xAC67 0xCD29 # HANGUL SYLLABLE CHIEUCH-WA-NIEUNCIEUC -0xAC68 0xCD2A # HANGUL SYLLABLE CHIEUCH-WA-NIEUNHIEUH -0xAC69 0xCD2B # HANGUL SYLLABLE CHIEUCH-WA-TIKEUT -0xAC6A 0xCD2D # HANGUL SYLLABLE CHIEUCH-WA-RIEULKIYEOK -0xAC6B 0xCD2E # HANGUL SYLLABLE CHIEUCH-WA-RIEULMIEUM -0xAC6C 0xCD2F # HANGUL SYLLABLE CHIEUCH-WA-RIEULPIEUP -0xAC6D 0xCD30 # HANGUL SYLLABLE CHIEUCH-WA-RIEULSIOS -0xAC6E 0xCD31 # HANGUL SYLLABLE CHIEUCH-WA-RIEULTHIEUTH -0xAC6F 0xCD32 # HANGUL SYLLABLE CHIEUCH-WA-RIEULPHIEUPH -0xAC70 0xCD33 # HANGUL SYLLABLE CHIEUCH-WA-RIEULHIEUH -0xAC71 0xCD34 # HANGUL SYLLABLE CHIEUCH-WA-MIEUM -0xAC72 0xCD35 # HANGUL SYLLABLE CHIEUCH-WA-PIEUP -0xAC73 0xCD36 # HANGUL SYLLABLE CHIEUCH-WA-PIEUPSIOS -0xAC74 0xCD37 # HANGUL SYLLABLE CHIEUCH-WA-SIOS -0xAC75 0xCD38 # HANGUL SYLLABLE CHIEUCH-WA-SSANGSIOS -0xAC76 0xCD3A # HANGUL SYLLABLE CHIEUCH-WA-CIEUC -0xAC77 0xCD3B # HANGUL SYLLABLE CHIEUCH-WA-CHIEUCH -0xAC78 0xCD3C # HANGUL SYLLABLE CHIEUCH-WA-KHIEUKH -0xAC79 0xCD3D # HANGUL SYLLABLE CHIEUCH-WA-THIEUTH -0xAC7A 0xCD3E # HANGUL SYLLABLE CHIEUCH-WA-PHIEUPH -0xAC81 0xCD3F # HANGUL SYLLABLE CHIEUCH-WA-HIEUH -0xAC82 0xCD40 # HANGUL SYLLABLE CHIEUCH-WAE -0xAC83 0xCD41 # HANGUL SYLLABLE CHIEUCH-WAE-KIYEOK -0xAC84 0xCD42 # HANGUL SYLLABLE CHIEUCH-WAE-SSANGKIYEOK -0xAC85 0xCD43 # HANGUL SYLLABLE CHIEUCH-WAE-KIYEOKSIOS -0xAC86 0xCD44 # HANGUL SYLLABLE CHIEUCH-WAE-NIEUN -0xAC87 0xCD45 # HANGUL SYLLABLE CHIEUCH-WAE-NIEUNCIEUC -0xAC88 0xCD46 # HANGUL SYLLABLE CHIEUCH-WAE-NIEUNHIEUH -0xAC89 0xCD47 # HANGUL SYLLABLE CHIEUCH-WAE-TIKEUT -0xAC8A 0xCD48 # HANGUL SYLLABLE CHIEUCH-WAE-RIEUL -0xAC8B 0xCD49 # HANGUL SYLLABLE CHIEUCH-WAE-RIEULKIYEOK -0xAC8C 0xCD4A # HANGUL SYLLABLE CHIEUCH-WAE-RIEULMIEUM -0xAC8D 0xCD4B # HANGUL SYLLABLE CHIEUCH-WAE-RIEULPIEUP -0xAC8E 0xCD4C # HANGUL SYLLABLE CHIEUCH-WAE-RIEULSIOS -0xAC8F 0xCD4D # HANGUL SYLLABLE CHIEUCH-WAE-RIEULTHIEUTH -0xAC90 0xCD4E # HANGUL SYLLABLE CHIEUCH-WAE-RIEULPHIEUPH -0xAC91 0xCD4F # HANGUL SYLLABLE CHIEUCH-WAE-RIEULHIEUH -0xAC92 0xCD50 # HANGUL SYLLABLE CHIEUCH-WAE-MIEUM -0xAC93 0xCD51 # HANGUL SYLLABLE CHIEUCH-WAE-PIEUP -0xAC94 0xCD52 # HANGUL SYLLABLE CHIEUCH-WAE-PIEUPSIOS -0xAC95 0xCD53 # HANGUL SYLLABLE CHIEUCH-WAE-SIOS -0xAC96 0xCD54 # HANGUL SYLLABLE CHIEUCH-WAE-SSANGSIOS -0xAC97 0xCD55 # HANGUL SYLLABLE CHIEUCH-WAE-IEUNG -0xAC98 0xCD56 # HANGUL SYLLABLE CHIEUCH-WAE-CIEUC -0xAC99 0xCD57 # HANGUL SYLLABLE CHIEUCH-WAE-CHIEUCH -0xAC9A 0xCD58 # HANGUL SYLLABLE CHIEUCH-WAE-KHIEUKH -0xAC9B 0xCD59 # HANGUL SYLLABLE CHIEUCH-WAE-THIEUTH -0xAC9C 0xCD5A # HANGUL SYLLABLE CHIEUCH-WAE-PHIEUPH -0xAC9D 0xCD5B # HANGUL SYLLABLE CHIEUCH-WAE-HIEUH -0xAC9E 0xCD5D # HANGUL SYLLABLE CHIEUCH-OE-KIYEOK -0xAC9F 0xCD5E # HANGUL SYLLABLE CHIEUCH-OE-SSANGKIYEOK -0xACA0 0xCD5F # HANGUL SYLLABLE CHIEUCH-OE-KIYEOKSIOS -0xACA1 0x0410 # CYRILLIC CAPITAL LETTER A -0xACA2 0x0411 # CYRILLIC CAPITAL LETTER BE -0xACA3 0x0412 # CYRILLIC CAPITAL LETTER VE -0xACA4 0x0413 # CYRILLIC CAPITAL LETTER GHE -0xACA5 0x0414 # CYRILLIC CAPITAL LETTER DE -0xACA6 0x0415 # CYRILLIC CAPITAL LETTER IE -0xACA7 0x0401 # CYRILLIC CAPITAL LETTER IO -0xACA8 0x0416 # CYRILLIC CAPITAL LETTER ZHE -0xACA9 0x0417 # CYRILLIC CAPITAL LETTER ZE -0xACAA 0x0418 # CYRILLIC CAPITAL LETTER I -0xACAB 0x0419 # CYRILLIC CAPITAL LETTER SHORT I -0xACAC 0x041A # CYRILLIC CAPITAL LETTER KA -0xACAD 0x041B # CYRILLIC CAPITAL LETTER EL -0xACAE 0x041C # CYRILLIC CAPITAL LETTER EM -0xACAF 0x041D # CYRILLIC CAPITAL LETTER EN -0xACB0 0x041E # CYRILLIC CAPITAL LETTER O -0xACB1 0x041F # CYRILLIC CAPITAL LETTER PE -0xACB2 0x0420 # CYRILLIC CAPITAL LETTER ER -0xACB3 0x0421 # CYRILLIC CAPITAL LETTER ES -0xACB4 0x0422 # CYRILLIC CAPITAL LETTER TE -0xACB5 0x0423 # CYRILLIC CAPITAL LETTER U -0xACB6 0x0424 # CYRILLIC CAPITAL LETTER EF -0xACB7 0x0425 # CYRILLIC CAPITAL LETTER HA -0xACB8 0x0426 # CYRILLIC CAPITAL LETTER TSE -0xACB9 0x0427 # CYRILLIC CAPITAL LETTER CHE -0xACBA 0x0428 # CYRILLIC CAPITAL LETTER SHA -0xACBB 0x0429 # CYRILLIC CAPITAL LETTER SHCHA -0xACBC 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN -0xACBD 0x042B # CYRILLIC CAPITAL LETTER YERU -0xACBE 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN -0xACBF 0x042D # CYRILLIC CAPITAL LETTER E -0xACC0 0x042E # CYRILLIC CAPITAL LETTER YU -0xACC1 0x042F # CYRILLIC CAPITAL LETTER YA -0xACD1 0x0430 # CYRILLIC SMALL LETTER A -0xACD2 0x0431 # CYRILLIC SMALL LETTER BE -0xACD3 0x0432 # CYRILLIC SMALL LETTER VE -0xACD4 0x0433 # CYRILLIC SMALL LETTER GHE -0xACD5 0x0434 # CYRILLIC SMALL LETTER DE -0xACD6 0x0435 # CYRILLIC SMALL LETTER IE -0xACD7 0x0451 # CYRILLIC SMALL LETTER IO -0xACD8 0x0436 # CYRILLIC SMALL LETTER ZHE -0xACD9 0x0437 # CYRILLIC SMALL LETTER ZE -0xACDA 0x0438 # CYRILLIC SMALL LETTER I -0xACDB 0x0439 # CYRILLIC SMALL LETTER SHORT I -0xACDC 0x043A # CYRILLIC SMALL LETTER KA -0xACDD 0x043B # CYRILLIC SMALL LETTER EL -0xACDE 0x043C # CYRILLIC SMALL LETTER EM -0xACDF 0x043D # CYRILLIC SMALL LETTER EN -0xACE0 0x043E # CYRILLIC SMALL LETTER O -0xACE1 0x043F # CYRILLIC SMALL LETTER PE -0xACE2 0x0440 # CYRILLIC SMALL LETTER ER -0xACE3 0x0441 # CYRILLIC SMALL LETTER ES -0xACE4 0x0442 # CYRILLIC SMALL LETTER TE -0xACE5 0x0443 # CYRILLIC SMALL LETTER U -0xACE6 0x0444 # CYRILLIC SMALL LETTER EF -0xACE7 0x0445 # CYRILLIC SMALL LETTER HA -0xACE8 0x0446 # CYRILLIC SMALL LETTER TSE -0xACE9 0x0447 # CYRILLIC SMALL LETTER CHE -0xACEA 0x0448 # CYRILLIC SMALL LETTER SHA -0xACEB 0x0449 # CYRILLIC SMALL LETTER SHCHA -0xACEC 0x044A # CYRILLIC SMALL LETTER HARD SIGN -0xACED 0x044B # CYRILLIC SMALL LETTER YERU -0xACEE 0x044C # CYRILLIC SMALL LETTER SOFT SIGN -0xACEF 0x044D # CYRILLIC SMALL LETTER E -0xACF0 0x044E # CYRILLIC SMALL LETTER YU -0xACF1 0x044F # CYRILLIC SMALL LETTER YA -0xAD41 0xCD61 # HANGUL SYLLABLE CHIEUCH-OE-NIEUNCIEUC -0xAD42 0xCD62 # HANGUL SYLLABLE CHIEUCH-OE-NIEUNHIEUH -0xAD43 0xCD63 # HANGUL SYLLABLE CHIEUCH-OE-TIKEUT -0xAD44 0xCD65 # HANGUL SYLLABLE CHIEUCH-OE-RIEULKIYEOK -0xAD45 0xCD66 # HANGUL SYLLABLE CHIEUCH-OE-RIEULMIEUM -0xAD46 0xCD67 # HANGUL SYLLABLE CHIEUCH-OE-RIEULPIEUP -0xAD47 0xCD68 # HANGUL SYLLABLE CHIEUCH-OE-RIEULSIOS -0xAD48 0xCD69 # HANGUL SYLLABLE CHIEUCH-OE-RIEULTHIEUTH -0xAD49 0xCD6A # HANGUL SYLLABLE CHIEUCH-OE-RIEULPHIEUPH -0xAD4A 0xCD6B # HANGUL SYLLABLE CHIEUCH-OE-RIEULHIEUH -0xAD4B 0xCD6E # HANGUL SYLLABLE CHIEUCH-OE-PIEUPSIOS -0xAD4C 0xCD70 # HANGUL SYLLABLE CHIEUCH-OE-SSANGSIOS -0xAD4D 0xCD72 # HANGUL SYLLABLE CHIEUCH-OE-CIEUC -0xAD4E 0xCD73 # HANGUL SYLLABLE CHIEUCH-OE-CHIEUCH -0xAD4F 0xCD74 # HANGUL SYLLABLE CHIEUCH-OE-KHIEUKH -0xAD50 0xCD75 # HANGUL SYLLABLE CHIEUCH-OE-THIEUTH -0xAD51 0xCD76 # HANGUL SYLLABLE CHIEUCH-OE-PHIEUPH -0xAD52 0xCD77 # HANGUL SYLLABLE CHIEUCH-OE-HIEUH -0xAD53 0xCD79 # HANGUL SYLLABLE CHIEUCH-YO-KIYEOK -0xAD54 0xCD7A # HANGUL SYLLABLE CHIEUCH-YO-SSANGKIYEOK -0xAD55 0xCD7B # HANGUL SYLLABLE CHIEUCH-YO-KIYEOKSIOS -0xAD56 0xCD7C # HANGUL SYLLABLE CHIEUCH-YO-NIEUN -0xAD57 0xCD7D # HANGUL SYLLABLE CHIEUCH-YO-NIEUNCIEUC -0xAD58 0xCD7E # HANGUL SYLLABLE CHIEUCH-YO-NIEUNHIEUH -0xAD59 0xCD7F # HANGUL SYLLABLE CHIEUCH-YO-TIKEUT -0xAD5A 0xCD80 # HANGUL SYLLABLE CHIEUCH-YO-RIEUL -0xAD61 0xCD81 # HANGUL SYLLABLE CHIEUCH-YO-RIEULKIYEOK -0xAD62 0xCD82 # HANGUL SYLLABLE CHIEUCH-YO-RIEULMIEUM -0xAD63 0xCD83 # HANGUL SYLLABLE CHIEUCH-YO-RIEULPIEUP -0xAD64 0xCD84 # HANGUL SYLLABLE CHIEUCH-YO-RIEULSIOS -0xAD65 0xCD85 # HANGUL SYLLABLE CHIEUCH-YO-RIEULTHIEUTH -0xAD66 0xCD86 # HANGUL SYLLABLE CHIEUCH-YO-RIEULPHIEUPH -0xAD67 0xCD87 # HANGUL SYLLABLE CHIEUCH-YO-RIEULHIEUH -0xAD68 0xCD89 # HANGUL SYLLABLE CHIEUCH-YO-PIEUP -0xAD69 0xCD8A # HANGUL SYLLABLE CHIEUCH-YO-PIEUPSIOS -0xAD6A 0xCD8B # HANGUL SYLLABLE CHIEUCH-YO-SIOS -0xAD6B 0xCD8C # HANGUL SYLLABLE CHIEUCH-YO-SSANGSIOS -0xAD6C 0xCD8D # HANGUL SYLLABLE CHIEUCH-YO-IEUNG -0xAD6D 0xCD8E # HANGUL SYLLABLE CHIEUCH-YO-CIEUC -0xAD6E 0xCD8F # HANGUL SYLLABLE CHIEUCH-YO-CHIEUCH -0xAD6F 0xCD90 # HANGUL SYLLABLE CHIEUCH-YO-KHIEUKH -0xAD70 0xCD91 # HANGUL SYLLABLE CHIEUCH-YO-THIEUTH -0xAD71 0xCD92 # HANGUL SYLLABLE CHIEUCH-YO-PHIEUPH -0xAD72 0xCD93 # HANGUL SYLLABLE CHIEUCH-YO-HIEUH -0xAD73 0xCD96 # HANGUL SYLLABLE CHIEUCH-U-SSANGKIYEOK -0xAD74 0xCD97 # HANGUL SYLLABLE CHIEUCH-U-KIYEOKSIOS -0xAD75 0xCD99 # HANGUL SYLLABLE CHIEUCH-U-NIEUNCIEUC -0xAD76 0xCD9A # HANGUL SYLLABLE CHIEUCH-U-NIEUNHIEUH -0xAD77 0xCD9B # HANGUL SYLLABLE CHIEUCH-U-TIKEUT -0xAD78 0xCD9D # HANGUL SYLLABLE CHIEUCH-U-RIEULKIYEOK -0xAD79 0xCD9E # HANGUL SYLLABLE CHIEUCH-U-RIEULMIEUM -0xAD7A 0xCD9F # HANGUL SYLLABLE CHIEUCH-U-RIEULPIEUP -0xAD81 0xCDA0 # HANGUL SYLLABLE CHIEUCH-U-RIEULSIOS -0xAD82 0xCDA1 # HANGUL SYLLABLE CHIEUCH-U-RIEULTHIEUTH -0xAD83 0xCDA2 # HANGUL SYLLABLE CHIEUCH-U-RIEULPHIEUPH -0xAD84 0xCDA3 # HANGUL SYLLABLE CHIEUCH-U-RIEULHIEUH -0xAD85 0xCDA6 # HANGUL SYLLABLE CHIEUCH-U-PIEUPSIOS -0xAD86 0xCDA8 # HANGUL SYLLABLE CHIEUCH-U-SSANGSIOS -0xAD87 0xCDAA # HANGUL SYLLABLE CHIEUCH-U-CIEUC -0xAD88 0xCDAB # HANGUL SYLLABLE CHIEUCH-U-CHIEUCH -0xAD89 0xCDAC # HANGUL SYLLABLE CHIEUCH-U-KHIEUKH -0xAD8A 0xCDAD # HANGUL SYLLABLE CHIEUCH-U-THIEUTH -0xAD8B 0xCDAE # HANGUL SYLLABLE CHIEUCH-U-PHIEUPH -0xAD8C 0xCDAF # HANGUL SYLLABLE CHIEUCH-U-HIEUH -0xAD8D 0xCDB1 # HANGUL SYLLABLE CHIEUCH-WEO-KIYEOK -0xAD8E 0xCDB2 # HANGUL SYLLABLE CHIEUCH-WEO-SSANGKIYEOK -0xAD8F 0xCDB3 # HANGUL SYLLABLE CHIEUCH-WEO-KIYEOKSIOS -0xAD90 0xCDB4 # HANGUL SYLLABLE CHIEUCH-WEO-NIEUN -0xAD91 0xCDB5 # HANGUL SYLLABLE CHIEUCH-WEO-NIEUNCIEUC -0xAD92 0xCDB6 # HANGUL SYLLABLE CHIEUCH-WEO-NIEUNHIEUH -0xAD93 0xCDB7 # HANGUL SYLLABLE CHIEUCH-WEO-TIKEUT -0xAD94 0xCDB8 # HANGUL SYLLABLE CHIEUCH-WEO-RIEUL -0xAD95 0xCDB9 # HANGUL SYLLABLE CHIEUCH-WEO-RIEULKIYEOK -0xAD96 0xCDBA # HANGUL SYLLABLE CHIEUCH-WEO-RIEULMIEUM -0xAD97 0xCDBB # HANGUL SYLLABLE CHIEUCH-WEO-RIEULPIEUP -0xAD98 0xCDBC # HANGUL SYLLABLE CHIEUCH-WEO-RIEULSIOS -0xAD99 0xCDBD # HANGUL SYLLABLE CHIEUCH-WEO-RIEULTHIEUTH -0xAD9A 0xCDBE # HANGUL SYLLABLE CHIEUCH-WEO-RIEULPHIEUPH -0xAD9B 0xCDBF # HANGUL SYLLABLE CHIEUCH-WEO-RIEULHIEUH -0xAD9C 0xCDC0 # HANGUL SYLLABLE CHIEUCH-WEO-MIEUM -0xAD9D 0xCDC1 # HANGUL SYLLABLE CHIEUCH-WEO-PIEUP -0xAD9E 0xCDC2 # HANGUL SYLLABLE CHIEUCH-WEO-PIEUPSIOS -0xAD9F 0xCDC3 # HANGUL SYLLABLE CHIEUCH-WEO-SIOS -0xADA0 0xCDC5 # HANGUL SYLLABLE CHIEUCH-WEO-IEUNG -0xAE41 0xCDC6 # HANGUL SYLLABLE CHIEUCH-WEO-CIEUC -0xAE42 0xCDC7 # HANGUL SYLLABLE CHIEUCH-WEO-CHIEUCH -0xAE43 0xCDC8 # HANGUL SYLLABLE CHIEUCH-WEO-KHIEUKH -0xAE44 0xCDC9 # HANGUL SYLLABLE CHIEUCH-WEO-THIEUTH -0xAE45 0xCDCA # HANGUL SYLLABLE CHIEUCH-WEO-PHIEUPH -0xAE46 0xCDCB # HANGUL SYLLABLE CHIEUCH-WEO-HIEUH -0xAE47 0xCDCD # HANGUL SYLLABLE CHIEUCH-WE-KIYEOK -0xAE48 0xCDCE # HANGUL SYLLABLE CHIEUCH-WE-SSANGKIYEOK -0xAE49 0xCDCF # HANGUL SYLLABLE CHIEUCH-WE-KIYEOKSIOS -0xAE4A 0xCDD1 # HANGUL SYLLABLE CHIEUCH-WE-NIEUNCIEUC -0xAE4B 0xCDD2 # HANGUL SYLLABLE CHIEUCH-WE-NIEUNHIEUH -0xAE4C 0xCDD3 # HANGUL SYLLABLE CHIEUCH-WE-TIKEUT -0xAE4D 0xCDD4 # HANGUL SYLLABLE CHIEUCH-WE-RIEUL -0xAE4E 0xCDD5 # HANGUL SYLLABLE CHIEUCH-WE-RIEULKIYEOK -0xAE4F 0xCDD6 # HANGUL SYLLABLE CHIEUCH-WE-RIEULMIEUM -0xAE50 0xCDD7 # HANGUL SYLLABLE CHIEUCH-WE-RIEULPIEUP -0xAE51 0xCDD8 # HANGUL SYLLABLE CHIEUCH-WE-RIEULSIOS -0xAE52 0xCDD9 # HANGUL SYLLABLE CHIEUCH-WE-RIEULTHIEUTH -0xAE53 0xCDDA # HANGUL SYLLABLE CHIEUCH-WE-RIEULPHIEUPH -0xAE54 0xCDDB # HANGUL SYLLABLE CHIEUCH-WE-RIEULHIEUH -0xAE55 0xCDDC # HANGUL SYLLABLE CHIEUCH-WE-MIEUM -0xAE56 0xCDDD # HANGUL SYLLABLE CHIEUCH-WE-PIEUP -0xAE57 0xCDDE # HANGUL SYLLABLE CHIEUCH-WE-PIEUPSIOS -0xAE58 0xCDDF # HANGUL SYLLABLE CHIEUCH-WE-SIOS -0xAE59 0xCDE0 # HANGUL SYLLABLE CHIEUCH-WE-SSANGSIOS -0xAE5A 0xCDE1 # HANGUL SYLLABLE CHIEUCH-WE-IEUNG -0xAE61 0xCDE2 # HANGUL SYLLABLE CHIEUCH-WE-CIEUC -0xAE62 0xCDE3 # HANGUL SYLLABLE CHIEUCH-WE-CHIEUCH -0xAE63 0xCDE4 # HANGUL SYLLABLE CHIEUCH-WE-KHIEUKH -0xAE64 0xCDE5 # HANGUL SYLLABLE CHIEUCH-WE-THIEUTH -0xAE65 0xCDE6 # HANGUL SYLLABLE CHIEUCH-WE-PHIEUPH -0xAE66 0xCDE7 # HANGUL SYLLABLE CHIEUCH-WE-HIEUH -0xAE67 0xCDE9 # HANGUL SYLLABLE CHIEUCH-WI-KIYEOK -0xAE68 0xCDEA # HANGUL SYLLABLE CHIEUCH-WI-SSANGKIYEOK -0xAE69 0xCDEB # HANGUL SYLLABLE CHIEUCH-WI-KIYEOKSIOS -0xAE6A 0xCDED # HANGUL SYLLABLE CHIEUCH-WI-NIEUNCIEUC -0xAE6B 0xCDEE # HANGUL SYLLABLE CHIEUCH-WI-NIEUNHIEUH -0xAE6C 0xCDEF # HANGUL SYLLABLE CHIEUCH-WI-TIKEUT -0xAE6D 0xCDF1 # HANGUL SYLLABLE CHIEUCH-WI-RIEULKIYEOK -0xAE6E 0xCDF2 # HANGUL SYLLABLE CHIEUCH-WI-RIEULMIEUM -0xAE6F 0xCDF3 # HANGUL SYLLABLE CHIEUCH-WI-RIEULPIEUP -0xAE70 0xCDF4 # HANGUL SYLLABLE CHIEUCH-WI-RIEULSIOS -0xAE71 0xCDF5 # HANGUL SYLLABLE CHIEUCH-WI-RIEULTHIEUTH -0xAE72 0xCDF6 # HANGUL SYLLABLE CHIEUCH-WI-RIEULPHIEUPH -0xAE73 0xCDF7 # HANGUL SYLLABLE CHIEUCH-WI-RIEULHIEUH -0xAE74 0xCDFA # HANGUL SYLLABLE CHIEUCH-WI-PIEUPSIOS -0xAE75 0xCDFC # HANGUL SYLLABLE CHIEUCH-WI-SSANGSIOS -0xAE76 0xCDFE # HANGUL SYLLABLE CHIEUCH-WI-CIEUC -0xAE77 0xCDFF # HANGUL SYLLABLE CHIEUCH-WI-CHIEUCH -0xAE78 0xCE00 # HANGUL SYLLABLE CHIEUCH-WI-KHIEUKH -0xAE79 0xCE01 # HANGUL SYLLABLE CHIEUCH-WI-THIEUTH -0xAE7A 0xCE02 # HANGUL SYLLABLE CHIEUCH-WI-PHIEUPH -0xAE81 0xCE03 # HANGUL SYLLABLE CHIEUCH-WI-HIEUH -0xAE82 0xCE05 # HANGUL SYLLABLE CHIEUCH-YU-KIYEOK -0xAE83 0xCE06 # HANGUL SYLLABLE CHIEUCH-YU-SSANGKIYEOK -0xAE84 0xCE07 # HANGUL SYLLABLE CHIEUCH-YU-KIYEOKSIOS -0xAE85 0xCE09 # HANGUL SYLLABLE CHIEUCH-YU-NIEUNCIEUC -0xAE86 0xCE0A # HANGUL SYLLABLE CHIEUCH-YU-NIEUNHIEUH -0xAE87 0xCE0B # HANGUL SYLLABLE CHIEUCH-YU-TIKEUT -0xAE88 0xCE0D # HANGUL SYLLABLE CHIEUCH-YU-RIEULKIYEOK -0xAE89 0xCE0E # HANGUL SYLLABLE CHIEUCH-YU-RIEULMIEUM -0xAE8A 0xCE0F # HANGUL SYLLABLE CHIEUCH-YU-RIEULPIEUP -0xAE8B 0xCE10 # HANGUL SYLLABLE CHIEUCH-YU-RIEULSIOS -0xAE8C 0xCE11 # HANGUL SYLLABLE CHIEUCH-YU-RIEULTHIEUTH -0xAE8D 0xCE12 # HANGUL SYLLABLE CHIEUCH-YU-RIEULPHIEUPH -0xAE8E 0xCE13 # HANGUL SYLLABLE CHIEUCH-YU-RIEULHIEUH -0xAE8F 0xCE15 # HANGUL SYLLABLE CHIEUCH-YU-PIEUP -0xAE90 0xCE16 # HANGUL SYLLABLE CHIEUCH-YU-PIEUPSIOS -0xAE91 0xCE17 # HANGUL SYLLABLE CHIEUCH-YU-SIOS -0xAE92 0xCE18 # HANGUL SYLLABLE CHIEUCH-YU-SSANGSIOS -0xAE93 0xCE1A # HANGUL SYLLABLE CHIEUCH-YU-CIEUC -0xAE94 0xCE1B # HANGUL SYLLABLE CHIEUCH-YU-CHIEUCH -0xAE95 0xCE1C # HANGUL SYLLABLE CHIEUCH-YU-KHIEUKH -0xAE96 0xCE1D # HANGUL SYLLABLE CHIEUCH-YU-THIEUTH -0xAE97 0xCE1E # HANGUL SYLLABLE CHIEUCH-YU-PHIEUPH -0xAE98 0xCE1F # HANGUL SYLLABLE CHIEUCH-YU-HIEUH -0xAE99 0xCE22 # HANGUL SYLLABLE CHIEUCH-EU-SSANGKIYEOK -0xAE9A 0xCE23 # HANGUL SYLLABLE CHIEUCH-EU-KIYEOKSIOS -0xAE9B 0xCE25 # HANGUL SYLLABLE CHIEUCH-EU-NIEUNCIEUC -0xAE9C 0xCE26 # HANGUL SYLLABLE CHIEUCH-EU-NIEUNHIEUH -0xAE9D 0xCE27 # HANGUL SYLLABLE CHIEUCH-EU-TIKEUT -0xAE9E 0xCE29 # HANGUL SYLLABLE CHIEUCH-EU-RIEULKIYEOK -0xAE9F 0xCE2A # HANGUL SYLLABLE CHIEUCH-EU-RIEULMIEUM -0xAEA0 0xCE2B # HANGUL SYLLABLE CHIEUCH-EU-RIEULPIEUP -0xAF41 0xCE2C # HANGUL SYLLABLE CHIEUCH-EU-RIEULSIOS -0xAF42 0xCE2D # HANGUL SYLLABLE CHIEUCH-EU-RIEULTHIEUTH -0xAF43 0xCE2E # HANGUL SYLLABLE CHIEUCH-EU-RIEULPHIEUPH -0xAF44 0xCE2F # HANGUL SYLLABLE CHIEUCH-EU-RIEULHIEUH -0xAF45 0xCE32 # HANGUL SYLLABLE CHIEUCH-EU-PIEUPSIOS -0xAF46 0xCE34 # HANGUL SYLLABLE CHIEUCH-EU-SSANGSIOS -0xAF47 0xCE36 # HANGUL SYLLABLE CHIEUCH-EU-CIEUC -0xAF48 0xCE37 # HANGUL SYLLABLE CHIEUCH-EU-CHIEUCH -0xAF49 0xCE38 # HANGUL SYLLABLE CHIEUCH-EU-KHIEUKH -0xAF4A 0xCE39 # HANGUL SYLLABLE CHIEUCH-EU-THIEUTH -0xAF4B 0xCE3A # HANGUL SYLLABLE CHIEUCH-EU-PHIEUPH -0xAF4C 0xCE3B # HANGUL SYLLABLE CHIEUCH-EU-HIEUH -0xAF4D 0xCE3C # HANGUL SYLLABLE CHIEUCH-YI -0xAF4E 0xCE3D # HANGUL SYLLABLE CHIEUCH-YI-KIYEOK -0xAF4F 0xCE3E # HANGUL SYLLABLE CHIEUCH-YI-SSANGKIYEOK -0xAF50 0xCE3F # HANGUL SYLLABLE CHIEUCH-YI-KIYEOKSIOS -0xAF51 0xCE40 # HANGUL SYLLABLE CHIEUCH-YI-NIEUN -0xAF52 0xCE41 # HANGUL SYLLABLE CHIEUCH-YI-NIEUNCIEUC -0xAF53 0xCE42 # HANGUL SYLLABLE CHIEUCH-YI-NIEUNHIEUH -0xAF54 0xCE43 # HANGUL SYLLABLE CHIEUCH-YI-TIKEUT -0xAF55 0xCE44 # HANGUL SYLLABLE CHIEUCH-YI-RIEUL -0xAF56 0xCE45 # HANGUL SYLLABLE CHIEUCH-YI-RIEULKIYEOK -0xAF57 0xCE46 # HANGUL SYLLABLE CHIEUCH-YI-RIEULMIEUM -0xAF58 0xCE47 # HANGUL SYLLABLE CHIEUCH-YI-RIEULPIEUP -0xAF59 0xCE48 # HANGUL SYLLABLE CHIEUCH-YI-RIEULSIOS -0xAF5A 0xCE49 # HANGUL SYLLABLE CHIEUCH-YI-RIEULTHIEUTH -0xAF61 0xCE4A # HANGUL SYLLABLE CHIEUCH-YI-RIEULPHIEUPH -0xAF62 0xCE4B # HANGUL SYLLABLE CHIEUCH-YI-RIEULHIEUH -0xAF63 0xCE4C # HANGUL SYLLABLE CHIEUCH-YI-MIEUM -0xAF64 0xCE4D # HANGUL SYLLABLE CHIEUCH-YI-PIEUP -0xAF65 0xCE4E # HANGUL SYLLABLE CHIEUCH-YI-PIEUPSIOS -0xAF66 0xCE4F # HANGUL SYLLABLE CHIEUCH-YI-SIOS -0xAF67 0xCE50 # HANGUL SYLLABLE CHIEUCH-YI-SSANGSIOS -0xAF68 0xCE51 # HANGUL SYLLABLE CHIEUCH-YI-IEUNG -0xAF69 0xCE52 # HANGUL SYLLABLE CHIEUCH-YI-CIEUC -0xAF6A 0xCE53 # HANGUL SYLLABLE CHIEUCH-YI-CHIEUCH -0xAF6B 0xCE54 # HANGUL SYLLABLE CHIEUCH-YI-KHIEUKH -0xAF6C 0xCE55 # HANGUL SYLLABLE CHIEUCH-YI-THIEUTH -0xAF6D 0xCE56 # HANGUL SYLLABLE CHIEUCH-YI-PHIEUPH -0xAF6E 0xCE57 # HANGUL SYLLABLE CHIEUCH-YI-HIEUH -0xAF6F 0xCE5A # HANGUL SYLLABLE CHIEUCH-I-SSANGKIYEOK -0xAF70 0xCE5B # HANGUL SYLLABLE CHIEUCH-I-KIYEOKSIOS -0xAF71 0xCE5D # HANGUL SYLLABLE CHIEUCH-I-NIEUNCIEUC -0xAF72 0xCE5E # HANGUL SYLLABLE CHIEUCH-I-NIEUNHIEUH -0xAF73 0xCE62 # HANGUL SYLLABLE CHIEUCH-I-RIEULMIEUM -0xAF74 0xCE63 # HANGUL SYLLABLE CHIEUCH-I-RIEULPIEUP -0xAF75 0xCE64 # HANGUL SYLLABLE CHIEUCH-I-RIEULSIOS -0xAF76 0xCE65 # HANGUL SYLLABLE CHIEUCH-I-RIEULTHIEUTH -0xAF77 0xCE66 # HANGUL SYLLABLE CHIEUCH-I-RIEULPHIEUPH -0xAF78 0xCE67 # HANGUL SYLLABLE CHIEUCH-I-RIEULHIEUH -0xAF79 0xCE6A # HANGUL SYLLABLE CHIEUCH-I-PIEUPSIOS -0xAF7A 0xCE6C # HANGUL SYLLABLE CHIEUCH-I-SSANGSIOS -0xAF81 0xCE6E # HANGUL SYLLABLE CHIEUCH-I-CIEUC -0xAF82 0xCE6F # HANGUL SYLLABLE CHIEUCH-I-CHIEUCH -0xAF83 0xCE70 # HANGUL SYLLABLE CHIEUCH-I-KHIEUKH -0xAF84 0xCE71 # HANGUL SYLLABLE CHIEUCH-I-THIEUTH -0xAF85 0xCE72 # HANGUL SYLLABLE CHIEUCH-I-PHIEUPH -0xAF86 0xCE73 # HANGUL SYLLABLE CHIEUCH-I-HIEUH -0xAF87 0xCE76 # HANGUL SYLLABLE KHIEUKH-A-SSANGKIYEOK -0xAF88 0xCE77 # HANGUL SYLLABLE KHIEUKH-A-KIYEOKSIOS -0xAF89 0xCE79 # HANGUL SYLLABLE KHIEUKH-A-NIEUNCIEUC -0xAF8A 0xCE7A # HANGUL SYLLABLE KHIEUKH-A-NIEUNHIEUH -0xAF8B 0xCE7B # HANGUL SYLLABLE KHIEUKH-A-TIKEUT -0xAF8C 0xCE7D # HANGUL SYLLABLE KHIEUKH-A-RIEULKIYEOK -0xAF8D 0xCE7E # HANGUL SYLLABLE KHIEUKH-A-RIEULMIEUM -0xAF8E 0xCE7F # HANGUL SYLLABLE KHIEUKH-A-RIEULPIEUP -0xAF8F 0xCE80 # HANGUL SYLLABLE KHIEUKH-A-RIEULSIOS -0xAF90 0xCE81 # HANGUL SYLLABLE KHIEUKH-A-RIEULTHIEUTH -0xAF91 0xCE82 # HANGUL SYLLABLE KHIEUKH-A-RIEULPHIEUPH -0xAF92 0xCE83 # HANGUL SYLLABLE KHIEUKH-A-RIEULHIEUH -0xAF93 0xCE86 # HANGUL SYLLABLE KHIEUKH-A-PIEUPSIOS -0xAF94 0xCE88 # HANGUL SYLLABLE KHIEUKH-A-SSANGSIOS -0xAF95 0xCE8A # HANGUL SYLLABLE KHIEUKH-A-CIEUC -0xAF96 0xCE8B # HANGUL SYLLABLE KHIEUKH-A-CHIEUCH -0xAF97 0xCE8C # HANGUL SYLLABLE KHIEUKH-A-KHIEUKH -0xAF98 0xCE8D # HANGUL SYLLABLE KHIEUKH-A-THIEUTH -0xAF99 0xCE8E # HANGUL SYLLABLE KHIEUKH-A-PHIEUPH -0xAF9A 0xCE8F # HANGUL SYLLABLE KHIEUKH-A-HIEUH -0xAF9B 0xCE92 # HANGUL SYLLABLE KHIEUKH-AE-SSANGKIYEOK -0xAF9C 0xCE93 # HANGUL SYLLABLE KHIEUKH-AE-KIYEOKSIOS -0xAF9D 0xCE95 # HANGUL SYLLABLE KHIEUKH-AE-NIEUNCIEUC -0xAF9E 0xCE96 # HANGUL SYLLABLE KHIEUKH-AE-NIEUNHIEUH -0xAF9F 0xCE97 # HANGUL SYLLABLE KHIEUKH-AE-TIKEUT -0xAFA0 0xCE99 # HANGUL SYLLABLE KHIEUKH-AE-RIEULKIYEOK -0xB041 0xCE9A # HANGUL SYLLABLE KHIEUKH-AE-RIEULMIEUM -0xB042 0xCE9B # HANGUL SYLLABLE KHIEUKH-AE-RIEULPIEUP -0xB043 0xCE9C # HANGUL SYLLABLE KHIEUKH-AE-RIEULSIOS -0xB044 0xCE9D # HANGUL SYLLABLE KHIEUKH-AE-RIEULTHIEUTH -0xB045 0xCE9E # HANGUL SYLLABLE KHIEUKH-AE-RIEULPHIEUPH -0xB046 0xCE9F # HANGUL SYLLABLE KHIEUKH-AE-RIEULHIEUH -0xB047 0xCEA2 # HANGUL SYLLABLE KHIEUKH-AE-PIEUPSIOS -0xB048 0xCEA6 # HANGUL SYLLABLE KHIEUKH-AE-CIEUC -0xB049 0xCEA7 # HANGUL SYLLABLE KHIEUKH-AE-CHIEUCH -0xB04A 0xCEA8 # HANGUL SYLLABLE KHIEUKH-AE-KHIEUKH -0xB04B 0xCEA9 # HANGUL SYLLABLE KHIEUKH-AE-THIEUTH -0xB04C 0xCEAA # HANGUL SYLLABLE KHIEUKH-AE-PHIEUPH -0xB04D 0xCEAB # HANGUL SYLLABLE KHIEUKH-AE-HIEUH -0xB04E 0xCEAE # HANGUL SYLLABLE KHIEUKH-YA-SSANGKIYEOK -0xB04F 0xCEAF # HANGUL SYLLABLE KHIEUKH-YA-KIYEOKSIOS -0xB050 0xCEB0 # HANGUL SYLLABLE KHIEUKH-YA-NIEUN -0xB051 0xCEB1 # HANGUL SYLLABLE KHIEUKH-YA-NIEUNCIEUC -0xB052 0xCEB2 # HANGUL SYLLABLE KHIEUKH-YA-NIEUNHIEUH -0xB053 0xCEB3 # HANGUL SYLLABLE KHIEUKH-YA-TIKEUT -0xB054 0xCEB4 # HANGUL SYLLABLE KHIEUKH-YA-RIEUL -0xB055 0xCEB5 # HANGUL SYLLABLE KHIEUKH-YA-RIEULKIYEOK -0xB056 0xCEB6 # HANGUL SYLLABLE KHIEUKH-YA-RIEULMIEUM -0xB057 0xCEB7 # HANGUL SYLLABLE KHIEUKH-YA-RIEULPIEUP -0xB058 0xCEB8 # HANGUL SYLLABLE KHIEUKH-YA-RIEULSIOS -0xB059 0xCEB9 # HANGUL SYLLABLE KHIEUKH-YA-RIEULTHIEUTH -0xB05A 0xCEBA # HANGUL SYLLABLE KHIEUKH-YA-RIEULPHIEUPH -0xB061 0xCEBB # HANGUL SYLLABLE KHIEUKH-YA-RIEULHIEUH -0xB062 0xCEBC # HANGUL SYLLABLE KHIEUKH-YA-MIEUM -0xB063 0xCEBD # HANGUL SYLLABLE KHIEUKH-YA-PIEUP -0xB064 0xCEBE # HANGUL SYLLABLE KHIEUKH-YA-PIEUPSIOS -0xB065 0xCEBF # HANGUL SYLLABLE KHIEUKH-YA-SIOS -0xB066 0xCEC0 # HANGUL SYLLABLE KHIEUKH-YA-SSANGSIOS -0xB067 0xCEC2 # HANGUL SYLLABLE KHIEUKH-YA-CIEUC -0xB068 0xCEC3 # HANGUL SYLLABLE KHIEUKH-YA-CHIEUCH -0xB069 0xCEC4 # HANGUL SYLLABLE KHIEUKH-YA-KHIEUKH -0xB06A 0xCEC5 # HANGUL SYLLABLE KHIEUKH-YA-THIEUTH -0xB06B 0xCEC6 # HANGUL SYLLABLE KHIEUKH-YA-PHIEUPH -0xB06C 0xCEC7 # HANGUL SYLLABLE KHIEUKH-YA-HIEUH -0xB06D 0xCEC8 # HANGUL SYLLABLE KHIEUKH-YAE -0xB06E 0xCEC9 # HANGUL SYLLABLE KHIEUKH-YAE-KIYEOK -0xB06F 0xCECA # HANGUL SYLLABLE KHIEUKH-YAE-SSANGKIYEOK -0xB070 0xCECB # HANGUL SYLLABLE KHIEUKH-YAE-KIYEOKSIOS -0xB071 0xCECC # HANGUL SYLLABLE KHIEUKH-YAE-NIEUN -0xB072 0xCECD # HANGUL SYLLABLE KHIEUKH-YAE-NIEUNCIEUC -0xB073 0xCECE # HANGUL SYLLABLE KHIEUKH-YAE-NIEUNHIEUH -0xB074 0xCECF # HANGUL SYLLABLE KHIEUKH-YAE-TIKEUT -0xB075 0xCED0 # HANGUL SYLLABLE KHIEUKH-YAE-RIEUL -0xB076 0xCED1 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULKIYEOK -0xB077 0xCED2 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULMIEUM -0xB078 0xCED3 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULPIEUP -0xB079 0xCED4 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULSIOS -0xB07A 0xCED5 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULTHIEUTH -0xB081 0xCED6 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULPHIEUPH -0xB082 0xCED7 # HANGUL SYLLABLE KHIEUKH-YAE-RIEULHIEUH -0xB083 0xCED8 # HANGUL SYLLABLE KHIEUKH-YAE-MIEUM -0xB084 0xCED9 # HANGUL SYLLABLE KHIEUKH-YAE-PIEUP -0xB085 0xCEDA # HANGUL SYLLABLE KHIEUKH-YAE-PIEUPSIOS -0xB086 0xCEDB # HANGUL SYLLABLE KHIEUKH-YAE-SIOS -0xB087 0xCEDC # HANGUL SYLLABLE KHIEUKH-YAE-SSANGSIOS -0xB088 0xCEDD # HANGUL SYLLABLE KHIEUKH-YAE-IEUNG -0xB089 0xCEDE # HANGUL SYLLABLE KHIEUKH-YAE-CIEUC -0xB08A 0xCEDF # HANGUL SYLLABLE KHIEUKH-YAE-CHIEUCH -0xB08B 0xCEE0 # HANGUL SYLLABLE KHIEUKH-YAE-KHIEUKH -0xB08C 0xCEE1 # HANGUL SYLLABLE KHIEUKH-YAE-THIEUTH -0xB08D 0xCEE2 # HANGUL SYLLABLE KHIEUKH-YAE-PHIEUPH -0xB08E 0xCEE3 # HANGUL SYLLABLE KHIEUKH-YAE-HIEUH -0xB08F 0xCEE6 # HANGUL SYLLABLE KHIEUKH-EO-SSANGKIYEOK -0xB090 0xCEE7 # HANGUL SYLLABLE KHIEUKH-EO-KIYEOKSIOS -0xB091 0xCEE9 # HANGUL SYLLABLE KHIEUKH-EO-NIEUNCIEUC -0xB092 0xCEEA # HANGUL SYLLABLE KHIEUKH-EO-NIEUNHIEUH -0xB093 0xCEED # HANGUL SYLLABLE KHIEUKH-EO-RIEULKIYEOK -0xB094 0xCEEE # HANGUL SYLLABLE KHIEUKH-EO-RIEULMIEUM -0xB095 0xCEEF # HANGUL SYLLABLE KHIEUKH-EO-RIEULPIEUP -0xB096 0xCEF0 # HANGUL SYLLABLE KHIEUKH-EO-RIEULSIOS -0xB097 0xCEF1 # HANGUL SYLLABLE KHIEUKH-EO-RIEULTHIEUTH -0xB098 0xCEF2 # HANGUL SYLLABLE KHIEUKH-EO-RIEULPHIEUPH -0xB099 0xCEF3 # HANGUL SYLLABLE KHIEUKH-EO-RIEULHIEUH -0xB09A 0xCEF6 # HANGUL SYLLABLE KHIEUKH-EO-PIEUPSIOS -0xB09B 0xCEFA # HANGUL SYLLABLE KHIEUKH-EO-CIEUC -0xB09C 0xCEFB # HANGUL SYLLABLE KHIEUKH-EO-CHIEUCH -0xB09D 0xCEFC # HANGUL SYLLABLE KHIEUKH-EO-KHIEUKH -0xB09E 0xCEFD # HANGUL SYLLABLE KHIEUKH-EO-THIEUTH -0xB09F 0xCEFE # HANGUL SYLLABLE KHIEUKH-EO-PHIEUPH -0xB0A0 0xCEFF # HANGUL SYLLABLE KHIEUKH-EO-HIEUH -0xB0A1 0xAC00 # HANGUL SYLLABLE KIYEOK-A -0xB0A2 0xAC01 # HANGUL SYLLABLE KIYEOK-A-KIYEOK -0xB0A3 0xAC04 # HANGUL SYLLABLE KIYEOK-A-NIEUN -0xB0A4 0xAC07 # HANGUL SYLLABLE KIYEOK-A-TIKEUT -0xB0A5 0xAC08 # HANGUL SYLLABLE KIYEOK-A-RIEUL -0xB0A6 0xAC09 # HANGUL SYLLABLE KIYEOK-A-RIEULKIYEOK -0xB0A7 0xAC0A # HANGUL SYLLABLE KIYEOK-A-RIEULMIEUM -0xB0A8 0xAC10 # HANGUL SYLLABLE KIYEOK-A-MIEUM -0xB0A9 0xAC11 # HANGUL SYLLABLE KIYEOK-A-PIEUP -0xB0AA 0xAC12 # HANGUL SYLLABLE KIYEOK-A-PIEUPSIOS -0xB0AB 0xAC13 # HANGUL SYLLABLE KIYEOK-A-SIOS -0xB0AC 0xAC14 # HANGUL SYLLABLE KIYEOK-A-SSANGSIOS -0xB0AD 0xAC15 # HANGUL SYLLABLE KIYEOK-A-IEUNG -0xB0AE 0xAC16 # HANGUL SYLLABLE KIYEOK-A-CIEUC -0xB0AF 0xAC17 # HANGUL SYLLABLE KIYEOK-A-CHIEUCH -0xB0B0 0xAC19 # HANGUL SYLLABLE KIYEOK-A-THIEUTH -0xB0B1 0xAC1A # HANGUL SYLLABLE KIYEOK-A-PHIEUPH -0xB0B2 0xAC1B # HANGUL SYLLABLE KIYEOK-A-HIEUH -0xB0B3 0xAC1C # HANGUL SYLLABLE KIYEOK-AE -0xB0B4 0xAC1D # HANGUL SYLLABLE KIYEOK-AE-KIYEOK -0xB0B5 0xAC20 # HANGUL SYLLABLE KIYEOK-AE-NIEUN -0xB0B6 0xAC24 # HANGUL SYLLABLE KIYEOK-AE-RIEUL -0xB0B7 0xAC2C # HANGUL SYLLABLE KIYEOK-AE-MIEUM -0xB0B8 0xAC2D # HANGUL SYLLABLE KIYEOK-AE-PIEUP -0xB0B9 0xAC2F # HANGUL SYLLABLE KIYEOK-AE-SIOS -0xB0BA 0xAC30 # HANGUL SYLLABLE KIYEOK-AE-SSANGSIOS -0xB0BB 0xAC31 # HANGUL SYLLABLE KIYEOK-AE-IEUNG -0xB0BC 0xAC38 # HANGUL SYLLABLE KIYEOK-YA -0xB0BD 0xAC39 # HANGUL SYLLABLE KIYEOK-YA-KIYEOK -0xB0BE 0xAC3C # HANGUL SYLLABLE KIYEOK-YA-NIEUN -0xB0BF 0xAC40 # HANGUL SYLLABLE KIYEOK-YA-RIEUL -0xB0C0 0xAC4B # HANGUL SYLLABLE KIYEOK-YA-SIOS -0xB0C1 0xAC4D # HANGUL SYLLABLE KIYEOK-YA-IEUNG -0xB0C2 0xAC54 # HANGUL SYLLABLE KIYEOK-YAE -0xB0C3 0xAC58 # HANGUL SYLLABLE KIYEOK-YAE-NIEUN -0xB0C4 0xAC5C # HANGUL SYLLABLE KIYEOK-YAE-RIEUL -0xB0C5 0xAC70 # HANGUL SYLLABLE KIYEOK-EO -0xB0C6 0xAC71 # HANGUL SYLLABLE KIYEOK-EO-KIYEOK -0xB0C7 0xAC74 # HANGUL SYLLABLE KIYEOK-EO-NIEUN -0xB0C8 0xAC77 # HANGUL SYLLABLE KIYEOK-EO-TIKEUT -0xB0C9 0xAC78 # HANGUL SYLLABLE KIYEOK-EO-RIEUL -0xB0CA 0xAC7A # HANGUL SYLLABLE KIYEOK-EO-RIEULMIEUM -0xB0CB 0xAC80 # HANGUL SYLLABLE KIYEOK-EO-MIEUM -0xB0CC 0xAC81 # HANGUL SYLLABLE KIYEOK-EO-PIEUP -0xB0CD 0xAC83 # HANGUL SYLLABLE KIYEOK-EO-SIOS -0xB0CE 0xAC84 # HANGUL SYLLABLE KIYEOK-EO-SSANGSIOS -0xB0CF 0xAC85 # HANGUL SYLLABLE KIYEOK-EO-IEUNG -0xB0D0 0xAC86 # HANGUL SYLLABLE KIYEOK-EO-CIEUC -0xB0D1 0xAC89 # HANGUL SYLLABLE KIYEOK-EO-THIEUTH -0xB0D2 0xAC8A # HANGUL SYLLABLE KIYEOK-EO-PHIEUPH -0xB0D3 0xAC8B # HANGUL SYLLABLE KIYEOK-EO-HIEUH -0xB0D4 0xAC8C # HANGUL SYLLABLE KIYEOK-E -0xB0D5 0xAC90 # HANGUL SYLLABLE KIYEOK-E-NIEUN -0xB0D6 0xAC94 # HANGUL SYLLABLE KIYEOK-E-RIEUL -0xB0D7 0xAC9C # HANGUL SYLLABLE KIYEOK-E-MIEUM -0xB0D8 0xAC9D # HANGUL SYLLABLE KIYEOK-E-PIEUP -0xB0D9 0xAC9F # HANGUL SYLLABLE KIYEOK-E-SIOS -0xB0DA 0xACA0 # HANGUL SYLLABLE KIYEOK-E-SSANGSIOS -0xB0DB 0xACA1 # HANGUL SYLLABLE KIYEOK-E-IEUNG -0xB0DC 0xACA8 # HANGUL SYLLABLE KIYEOK-YEO -0xB0DD 0xACA9 # HANGUL SYLLABLE KIYEOK-YEO-KIYEOK -0xB0DE 0xACAA # HANGUL SYLLABLE KIYEOK-YEO-SSANGKIYEOK -0xB0DF 0xACAC # HANGUL SYLLABLE KIYEOK-YEO-NIEUN -0xB0E0 0xACAF # HANGUL SYLLABLE KIYEOK-YEO-TIKEUT -0xB0E1 0xACB0 # HANGUL SYLLABLE KIYEOK-YEO-RIEUL -0xB0E2 0xACB8 # HANGUL SYLLABLE KIYEOK-YEO-MIEUM -0xB0E3 0xACB9 # HANGUL SYLLABLE KIYEOK-YEO-PIEUP -0xB0E4 0xACBB # HANGUL SYLLABLE KIYEOK-YEO-SIOS -0xB0E5 0xACBC # HANGUL SYLLABLE KIYEOK-YEO-SSANGSIOS -0xB0E6 0xACBD # HANGUL SYLLABLE KIYEOK-YEO-IEUNG -0xB0E7 0xACC1 # HANGUL SYLLABLE KIYEOK-YEO-THIEUTH -0xB0E8 0xACC4 # HANGUL SYLLABLE KIYEOK-YE -0xB0E9 0xACC8 # HANGUL SYLLABLE KIYEOK-YE-NIEUN -0xB0EA 0xACCC # HANGUL SYLLABLE KIYEOK-YE-RIEUL -0xB0EB 0xACD5 # HANGUL SYLLABLE KIYEOK-YE-PIEUP -0xB0EC 0xACD7 # HANGUL SYLLABLE KIYEOK-YE-SIOS -0xB0ED 0xACE0 # HANGUL SYLLABLE KIYEOK-O -0xB0EE 0xACE1 # HANGUL SYLLABLE KIYEOK-O-KIYEOK -0xB0EF 0xACE4 # HANGUL SYLLABLE KIYEOK-O-NIEUN -0xB0F0 0xACE7 # HANGUL SYLLABLE KIYEOK-O-TIKEUT -0xB0F1 0xACE8 # HANGUL SYLLABLE KIYEOK-O-RIEUL -0xB0F2 0xACEA # HANGUL SYLLABLE KIYEOK-O-RIEULMIEUM -0xB0F3 0xACEC # HANGUL SYLLABLE KIYEOK-O-RIEULSIOS -0xB0F4 0xACEF # HANGUL SYLLABLE KIYEOK-O-RIEULHIEUH -0xB0F5 0xACF0 # HANGUL SYLLABLE KIYEOK-O-MIEUM -0xB0F6 0xACF1 # HANGUL SYLLABLE KIYEOK-O-PIEUP -0xB0F7 0xACF3 # HANGUL SYLLABLE KIYEOK-O-SIOS -0xB0F8 0xACF5 # HANGUL SYLLABLE KIYEOK-O-IEUNG -0xB0F9 0xACF6 # HANGUL SYLLABLE KIYEOK-O-CIEUC -0xB0FA 0xACFC # HANGUL SYLLABLE KIYEOK-WA -0xB0FB 0xACFD # HANGUL SYLLABLE KIYEOK-WA-KIYEOK -0xB0FC 0xAD00 # HANGUL SYLLABLE KIYEOK-WA-NIEUN -0xB0FD 0xAD04 # HANGUL SYLLABLE KIYEOK-WA-RIEUL -0xB0FE 0xAD06 # HANGUL SYLLABLE KIYEOK-WA-RIEULMIEUM -0xB141 0xCF02 # HANGUL SYLLABLE KHIEUKH-E-SSANGKIYEOK -0xB142 0xCF03 # HANGUL SYLLABLE KHIEUKH-E-KIYEOKSIOS -0xB143 0xCF05 # HANGUL SYLLABLE KHIEUKH-E-NIEUNCIEUC -0xB144 0xCF06 # HANGUL SYLLABLE KHIEUKH-E-NIEUNHIEUH -0xB145 0xCF07 # HANGUL SYLLABLE KHIEUKH-E-TIKEUT -0xB146 0xCF09 # HANGUL SYLLABLE KHIEUKH-E-RIEULKIYEOK -0xB147 0xCF0A # HANGUL SYLLABLE KHIEUKH-E-RIEULMIEUM -0xB148 0xCF0B # HANGUL SYLLABLE KHIEUKH-E-RIEULPIEUP -0xB149 0xCF0C # HANGUL SYLLABLE KHIEUKH-E-RIEULSIOS -0xB14A 0xCF0D # HANGUL SYLLABLE KHIEUKH-E-RIEULTHIEUTH -0xB14B 0xCF0E # HANGUL SYLLABLE KHIEUKH-E-RIEULPHIEUPH -0xB14C 0xCF0F # HANGUL SYLLABLE KHIEUKH-E-RIEULHIEUH -0xB14D 0xCF12 # HANGUL SYLLABLE KHIEUKH-E-PIEUPSIOS -0xB14E 0xCF14 # HANGUL SYLLABLE KHIEUKH-E-SSANGSIOS -0xB14F 0xCF16 # HANGUL SYLLABLE KHIEUKH-E-CIEUC -0xB150 0xCF17 # HANGUL SYLLABLE KHIEUKH-E-CHIEUCH -0xB151 0xCF18 # HANGUL SYLLABLE KHIEUKH-E-KHIEUKH -0xB152 0xCF19 # HANGUL SYLLABLE KHIEUKH-E-THIEUTH -0xB153 0xCF1A # HANGUL SYLLABLE KHIEUKH-E-PHIEUPH -0xB154 0xCF1B # HANGUL SYLLABLE KHIEUKH-E-HIEUH -0xB155 0xCF1D # HANGUL SYLLABLE KHIEUKH-YEO-KIYEOK -0xB156 0xCF1E # HANGUL SYLLABLE KHIEUKH-YEO-SSANGKIYEOK -0xB157 0xCF1F # HANGUL SYLLABLE KHIEUKH-YEO-KIYEOKSIOS -0xB158 0xCF21 # HANGUL SYLLABLE KHIEUKH-YEO-NIEUNCIEUC -0xB159 0xCF22 # HANGUL SYLLABLE KHIEUKH-YEO-NIEUNHIEUH -0xB15A 0xCF23 # HANGUL SYLLABLE KHIEUKH-YEO-TIKEUT -0xB161 0xCF25 # HANGUL SYLLABLE KHIEUKH-YEO-RIEULKIYEOK -0xB162 0xCF26 # HANGUL SYLLABLE KHIEUKH-YEO-RIEULMIEUM -0xB163 0xCF27 # HANGUL SYLLABLE KHIEUKH-YEO-RIEULPIEUP -0xB164 0xCF28 # HANGUL SYLLABLE KHIEUKH-YEO-RIEULSIOS -0xB165 0xCF29 # HANGUL SYLLABLE KHIEUKH-YEO-RIEULTHIEUTH -0xB166 0xCF2A # HANGUL SYLLABLE KHIEUKH-YEO-RIEULPHIEUPH -0xB167 0xCF2B # HANGUL SYLLABLE KHIEUKH-YEO-RIEULHIEUH -0xB168 0xCF2E # HANGUL SYLLABLE KHIEUKH-YEO-PIEUPSIOS -0xB169 0xCF32 # HANGUL SYLLABLE KHIEUKH-YEO-CIEUC -0xB16A 0xCF33 # HANGUL SYLLABLE KHIEUKH-YEO-CHIEUCH -0xB16B 0xCF34 # HANGUL SYLLABLE KHIEUKH-YEO-KHIEUKH -0xB16C 0xCF35 # HANGUL SYLLABLE KHIEUKH-YEO-THIEUTH -0xB16D 0xCF36 # HANGUL SYLLABLE KHIEUKH-YEO-PHIEUPH -0xB16E 0xCF37 # HANGUL SYLLABLE KHIEUKH-YEO-HIEUH -0xB16F 0xCF39 # HANGUL SYLLABLE KHIEUKH-YE-KIYEOK -0xB170 0xCF3A # HANGUL SYLLABLE KHIEUKH-YE-SSANGKIYEOK -0xB171 0xCF3B # HANGUL SYLLABLE KHIEUKH-YE-KIYEOKSIOS -0xB172 0xCF3C # HANGUL SYLLABLE KHIEUKH-YE-NIEUN -0xB173 0xCF3D # HANGUL SYLLABLE KHIEUKH-YE-NIEUNCIEUC -0xB174 0xCF3E # HANGUL SYLLABLE KHIEUKH-YE-NIEUNHIEUH -0xB175 0xCF3F # HANGUL SYLLABLE KHIEUKH-YE-TIKEUT -0xB176 0xCF40 # HANGUL SYLLABLE KHIEUKH-YE-RIEUL -0xB177 0xCF41 # HANGUL SYLLABLE KHIEUKH-YE-RIEULKIYEOK -0xB178 0xCF42 # HANGUL SYLLABLE KHIEUKH-YE-RIEULMIEUM -0xB179 0xCF43 # HANGUL SYLLABLE KHIEUKH-YE-RIEULPIEUP -0xB17A 0xCF44 # HANGUL SYLLABLE KHIEUKH-YE-RIEULSIOS -0xB181 0xCF45 # HANGUL SYLLABLE KHIEUKH-YE-RIEULTHIEUTH -0xB182 0xCF46 # HANGUL SYLLABLE KHIEUKH-YE-RIEULPHIEUPH -0xB183 0xCF47 # HANGUL SYLLABLE KHIEUKH-YE-RIEULHIEUH -0xB184 0xCF48 # HANGUL SYLLABLE KHIEUKH-YE-MIEUM -0xB185 0xCF49 # HANGUL SYLLABLE KHIEUKH-YE-PIEUP -0xB186 0xCF4A # HANGUL SYLLABLE KHIEUKH-YE-PIEUPSIOS -0xB187 0xCF4B # HANGUL SYLLABLE KHIEUKH-YE-SIOS -0xB188 0xCF4C # HANGUL SYLLABLE KHIEUKH-YE-SSANGSIOS -0xB189 0xCF4D # HANGUL SYLLABLE KHIEUKH-YE-IEUNG -0xB18A 0xCF4E # HANGUL SYLLABLE KHIEUKH-YE-CIEUC -0xB18B 0xCF4F # HANGUL SYLLABLE KHIEUKH-YE-CHIEUCH -0xB18C 0xCF50 # HANGUL SYLLABLE KHIEUKH-YE-KHIEUKH -0xB18D 0xCF51 # HANGUL SYLLABLE KHIEUKH-YE-THIEUTH -0xB18E 0xCF52 # HANGUL SYLLABLE KHIEUKH-YE-PHIEUPH -0xB18F 0xCF53 # HANGUL SYLLABLE KHIEUKH-YE-HIEUH -0xB190 0xCF56 # HANGUL SYLLABLE KHIEUKH-O-SSANGKIYEOK -0xB191 0xCF57 # HANGUL SYLLABLE KHIEUKH-O-KIYEOKSIOS -0xB192 0xCF59 # HANGUL SYLLABLE KHIEUKH-O-NIEUNCIEUC -0xB193 0xCF5A # HANGUL SYLLABLE KHIEUKH-O-NIEUNHIEUH -0xB194 0xCF5B # HANGUL SYLLABLE KHIEUKH-O-TIKEUT -0xB195 0xCF5D # HANGUL SYLLABLE KHIEUKH-O-RIEULKIYEOK -0xB196 0xCF5E # HANGUL SYLLABLE KHIEUKH-O-RIEULMIEUM -0xB197 0xCF5F # HANGUL SYLLABLE KHIEUKH-O-RIEULPIEUP -0xB198 0xCF60 # HANGUL SYLLABLE KHIEUKH-O-RIEULSIOS -0xB199 0xCF61 # HANGUL SYLLABLE KHIEUKH-O-RIEULTHIEUTH -0xB19A 0xCF62 # HANGUL SYLLABLE KHIEUKH-O-RIEULPHIEUPH -0xB19B 0xCF63 # HANGUL SYLLABLE KHIEUKH-O-RIEULHIEUH -0xB19C 0xCF66 # HANGUL SYLLABLE KHIEUKH-O-PIEUPSIOS -0xB19D 0xCF68 # HANGUL SYLLABLE KHIEUKH-O-SSANGSIOS -0xB19E 0xCF6A # HANGUL SYLLABLE KHIEUKH-O-CIEUC -0xB19F 0xCF6B # HANGUL SYLLABLE KHIEUKH-O-CHIEUCH -0xB1A0 0xCF6C # HANGUL SYLLABLE KHIEUKH-O-KHIEUKH -0xB1A1 0xAD0C # HANGUL SYLLABLE KIYEOK-WA-MIEUM -0xB1A2 0xAD0D # HANGUL SYLLABLE KIYEOK-WA-PIEUP -0xB1A3 0xAD0F # HANGUL SYLLABLE KIYEOK-WA-SIOS -0xB1A4 0xAD11 # HANGUL SYLLABLE KIYEOK-WA-IEUNG -0xB1A5 0xAD18 # HANGUL SYLLABLE KIYEOK-WAE -0xB1A6 0xAD1C # HANGUL SYLLABLE KIYEOK-WAE-NIEUN -0xB1A7 0xAD20 # HANGUL SYLLABLE KIYEOK-WAE-RIEUL -0xB1A8 0xAD29 # HANGUL SYLLABLE KIYEOK-WAE-PIEUP -0xB1A9 0xAD2C # HANGUL SYLLABLE KIYEOK-WAE-SSANGSIOS -0xB1AA 0xAD2D # HANGUL SYLLABLE KIYEOK-WAE-IEUNG -0xB1AB 0xAD34 # HANGUL SYLLABLE KIYEOK-OE -0xB1AC 0xAD35 # HANGUL SYLLABLE KIYEOK-OE-KIYEOK -0xB1AD 0xAD38 # HANGUL SYLLABLE KIYEOK-OE-NIEUN -0xB1AE 0xAD3C # HANGUL SYLLABLE KIYEOK-OE-RIEUL -0xB1AF 0xAD44 # HANGUL SYLLABLE KIYEOK-OE-MIEUM -0xB1B0 0xAD45 # HANGUL SYLLABLE KIYEOK-OE-PIEUP -0xB1B1 0xAD47 # HANGUL SYLLABLE KIYEOK-OE-SIOS -0xB1B2 0xAD49 # HANGUL SYLLABLE KIYEOK-OE-IEUNG -0xB1B3 0xAD50 # HANGUL SYLLABLE KIYEOK-YO -0xB1B4 0xAD54 # HANGUL SYLLABLE KIYEOK-YO-NIEUN -0xB1B5 0xAD58 # HANGUL SYLLABLE KIYEOK-YO-RIEUL -0xB1B6 0xAD61 # HANGUL SYLLABLE KIYEOK-YO-PIEUP -0xB1B7 0xAD63 # HANGUL SYLLABLE KIYEOK-YO-SIOS -0xB1B8 0xAD6C # HANGUL SYLLABLE KIYEOK-U -0xB1B9 0xAD6D # HANGUL SYLLABLE KIYEOK-U-KIYEOK -0xB1BA 0xAD70 # HANGUL SYLLABLE KIYEOK-U-NIEUN -0xB1BB 0xAD73 # HANGUL SYLLABLE KIYEOK-U-TIKEUT -0xB1BC 0xAD74 # HANGUL SYLLABLE KIYEOK-U-RIEUL -0xB1BD 0xAD75 # HANGUL SYLLABLE KIYEOK-U-RIEULKIYEOK -0xB1BE 0xAD76 # HANGUL SYLLABLE KIYEOK-U-RIEULMIEUM -0xB1BF 0xAD7B # HANGUL SYLLABLE KIYEOK-U-RIEULHIEUH -0xB1C0 0xAD7C # HANGUL SYLLABLE KIYEOK-U-MIEUM -0xB1C1 0xAD7D # HANGUL SYLLABLE KIYEOK-U-PIEUP -0xB1C2 0xAD7F # HANGUL SYLLABLE KIYEOK-U-SIOS -0xB1C3 0xAD81 # HANGUL SYLLABLE KIYEOK-U-IEUNG -0xB1C4 0xAD82 # HANGUL SYLLABLE KIYEOK-U-CIEUC -0xB1C5 0xAD88 # HANGUL SYLLABLE KIYEOK-WEO -0xB1C6 0xAD89 # HANGUL SYLLABLE KIYEOK-WEO-KIYEOK -0xB1C7 0xAD8C # HANGUL SYLLABLE KIYEOK-WEO-NIEUN -0xB1C8 0xAD90 # HANGUL SYLLABLE KIYEOK-WEO-RIEUL -0xB1C9 0xAD9C # HANGUL SYLLABLE KIYEOK-WEO-SSANGSIOS -0xB1CA 0xAD9D # HANGUL SYLLABLE KIYEOK-WEO-IEUNG -0xB1CB 0xADA4 # HANGUL SYLLABLE KIYEOK-WE -0xB1CC 0xADB7 # HANGUL SYLLABLE KIYEOK-WE-SIOS -0xB1CD 0xADC0 # HANGUL SYLLABLE KIYEOK-WI -0xB1CE 0xADC1 # HANGUL SYLLABLE KIYEOK-WI-KIYEOK -0xB1CF 0xADC4 # HANGUL SYLLABLE KIYEOK-WI-NIEUN -0xB1D0 0xADC8 # HANGUL SYLLABLE KIYEOK-WI-RIEUL -0xB1D1 0xADD0 # HANGUL SYLLABLE KIYEOK-WI-MIEUM -0xB1D2 0xADD1 # HANGUL SYLLABLE KIYEOK-WI-PIEUP -0xB1D3 0xADD3 # HANGUL SYLLABLE KIYEOK-WI-SIOS -0xB1D4 0xADDC # HANGUL SYLLABLE KIYEOK-YU -0xB1D5 0xADE0 # HANGUL SYLLABLE KIYEOK-YU-NIEUN -0xB1D6 0xADE4 # HANGUL SYLLABLE KIYEOK-YU-RIEUL -0xB1D7 0xADF8 # HANGUL SYLLABLE KIYEOK-EU -0xB1D8 0xADF9 # HANGUL SYLLABLE KIYEOK-EU-KIYEOK -0xB1D9 0xADFC # HANGUL SYLLABLE KIYEOK-EU-NIEUN -0xB1DA 0xADFF # HANGUL SYLLABLE KIYEOK-EU-TIKEUT -0xB1DB 0xAE00 # HANGUL SYLLABLE KIYEOK-EU-RIEUL -0xB1DC 0xAE01 # HANGUL SYLLABLE KIYEOK-EU-RIEULKIYEOK -0xB1DD 0xAE08 # HANGUL SYLLABLE KIYEOK-EU-MIEUM -0xB1DE 0xAE09 # HANGUL SYLLABLE KIYEOK-EU-PIEUP -0xB1DF 0xAE0B # HANGUL SYLLABLE KIYEOK-EU-SIOS -0xB1E0 0xAE0D # HANGUL SYLLABLE KIYEOK-EU-IEUNG -0xB1E1 0xAE14 # HANGUL SYLLABLE KIYEOK-YI -0xB1E2 0xAE30 # HANGUL SYLLABLE KIYEOK-I -0xB1E3 0xAE31 # HANGUL SYLLABLE KIYEOK-I-KIYEOK -0xB1E4 0xAE34 # HANGUL SYLLABLE KIYEOK-I-NIEUN -0xB1E5 0xAE37 # HANGUL SYLLABLE KIYEOK-I-TIKEUT -0xB1E6 0xAE38 # HANGUL SYLLABLE KIYEOK-I-RIEUL -0xB1E7 0xAE3A # HANGUL SYLLABLE KIYEOK-I-RIEULMIEUM -0xB1E8 0xAE40 # HANGUL SYLLABLE KIYEOK-I-MIEUM -0xB1E9 0xAE41 # HANGUL SYLLABLE KIYEOK-I-PIEUP -0xB1EA 0xAE43 # HANGUL SYLLABLE KIYEOK-I-SIOS -0xB1EB 0xAE45 # HANGUL SYLLABLE KIYEOK-I-IEUNG -0xB1EC 0xAE46 # HANGUL SYLLABLE KIYEOK-I-CIEUC -0xB1ED 0xAE4A # HANGUL SYLLABLE KIYEOK-I-PHIEUPH -0xB1EE 0xAE4C # HANGUL SYLLABLE SSANGKIYEOK-A -0xB1EF 0xAE4D # HANGUL SYLLABLE SSANGKIYEOK-A-KIYEOK -0xB1F0 0xAE4E # HANGUL SYLLABLE SSANGKIYEOK-A-SSANGKIYEOK -0xB1F1 0xAE50 # HANGUL SYLLABLE SSANGKIYEOK-A-NIEUN -0xB1F2 0xAE54 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEUL -0xB1F3 0xAE56 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULMIEUM -0xB1F4 0xAE5C # HANGUL SYLLABLE SSANGKIYEOK-A-MIEUM -0xB1F5 0xAE5D # HANGUL SYLLABLE SSANGKIYEOK-A-PIEUP -0xB1F6 0xAE5F # HANGUL SYLLABLE SSANGKIYEOK-A-SIOS -0xB1F7 0xAE60 # HANGUL SYLLABLE SSANGKIYEOK-A-SSANGSIOS -0xB1F8 0xAE61 # HANGUL SYLLABLE SSANGKIYEOK-A-IEUNG -0xB1F9 0xAE65 # HANGUL SYLLABLE SSANGKIYEOK-A-THIEUTH -0xB1FA 0xAE68 # HANGUL SYLLABLE SSANGKIYEOK-AE -0xB1FB 0xAE69 # HANGUL SYLLABLE SSANGKIYEOK-AE-KIYEOK -0xB1FC 0xAE6C # HANGUL SYLLABLE SSANGKIYEOK-AE-NIEUN -0xB1FD 0xAE70 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEUL -0xB1FE 0xAE78 # HANGUL SYLLABLE SSANGKIYEOK-AE-MIEUM -0xB241 0xCF6D # HANGUL SYLLABLE KHIEUKH-O-THIEUTH -0xB242 0xCF6E # HANGUL SYLLABLE KHIEUKH-O-PHIEUPH -0xB243 0xCF6F # HANGUL SYLLABLE KHIEUKH-O-HIEUH -0xB244 0xCF72 # HANGUL SYLLABLE KHIEUKH-WA-SSANGKIYEOK -0xB245 0xCF73 # HANGUL SYLLABLE KHIEUKH-WA-KIYEOKSIOS -0xB246 0xCF75 # HANGUL SYLLABLE KHIEUKH-WA-NIEUNCIEUC -0xB247 0xCF76 # HANGUL SYLLABLE KHIEUKH-WA-NIEUNHIEUH -0xB248 0xCF77 # HANGUL SYLLABLE KHIEUKH-WA-TIKEUT -0xB249 0xCF79 # HANGUL SYLLABLE KHIEUKH-WA-RIEULKIYEOK -0xB24A 0xCF7A # HANGUL SYLLABLE KHIEUKH-WA-RIEULMIEUM -0xB24B 0xCF7B # HANGUL SYLLABLE KHIEUKH-WA-RIEULPIEUP -0xB24C 0xCF7C # HANGUL SYLLABLE KHIEUKH-WA-RIEULSIOS -0xB24D 0xCF7D # HANGUL SYLLABLE KHIEUKH-WA-RIEULTHIEUTH -0xB24E 0xCF7E # HANGUL SYLLABLE KHIEUKH-WA-RIEULPHIEUPH -0xB24F 0xCF7F # HANGUL SYLLABLE KHIEUKH-WA-RIEULHIEUH -0xB250 0xCF81 # HANGUL SYLLABLE KHIEUKH-WA-PIEUP -0xB251 0xCF82 # HANGUL SYLLABLE KHIEUKH-WA-PIEUPSIOS -0xB252 0xCF83 # HANGUL SYLLABLE KHIEUKH-WA-SIOS -0xB253 0xCF84 # HANGUL SYLLABLE KHIEUKH-WA-SSANGSIOS -0xB254 0xCF86 # HANGUL SYLLABLE KHIEUKH-WA-CIEUC -0xB255 0xCF87 # HANGUL SYLLABLE KHIEUKH-WA-CHIEUCH -0xB256 0xCF88 # HANGUL SYLLABLE KHIEUKH-WA-KHIEUKH -0xB257 0xCF89 # HANGUL SYLLABLE KHIEUKH-WA-THIEUTH -0xB258 0xCF8A # HANGUL SYLLABLE KHIEUKH-WA-PHIEUPH -0xB259 0xCF8B # HANGUL SYLLABLE KHIEUKH-WA-HIEUH -0xB25A 0xCF8D # HANGUL SYLLABLE KHIEUKH-WAE-KIYEOK -0xB261 0xCF8E # HANGUL SYLLABLE KHIEUKH-WAE-SSANGKIYEOK -0xB262 0xCF8F # HANGUL SYLLABLE KHIEUKH-WAE-KIYEOKSIOS -0xB263 0xCF90 # HANGUL SYLLABLE KHIEUKH-WAE-NIEUN -0xB264 0xCF91 # HANGUL SYLLABLE KHIEUKH-WAE-NIEUNCIEUC -0xB265 0xCF92 # HANGUL SYLLABLE KHIEUKH-WAE-NIEUNHIEUH -0xB266 0xCF93 # HANGUL SYLLABLE KHIEUKH-WAE-TIKEUT -0xB267 0xCF94 # HANGUL SYLLABLE KHIEUKH-WAE-RIEUL -0xB268 0xCF95 # HANGUL SYLLABLE KHIEUKH-WAE-RIEULKIYEOK -0xB269 0xCF96 # HANGUL SYLLABLE KHIEUKH-WAE-RIEULMIEUM -0xB26A 0xCF97 # HANGUL SYLLABLE KHIEUKH-WAE-RIEULPIEUP -0xB26B 0xCF98 # HANGUL SYLLABLE KHIEUKH-WAE-RIEULSIOS -0xB26C 0xCF99 # HANGUL SYLLABLE KHIEUKH-WAE-RIEULTHIEUTH -0xB26D 0xCF9A # HANGUL SYLLABLE KHIEUKH-WAE-RIEULPHIEUPH -0xB26E 0xCF9B # HANGUL SYLLABLE KHIEUKH-WAE-RIEULHIEUH -0xB26F 0xCF9C # HANGUL SYLLABLE KHIEUKH-WAE-MIEUM -0xB270 0xCF9D # HANGUL SYLLABLE KHIEUKH-WAE-PIEUP -0xB271 0xCF9E # HANGUL SYLLABLE KHIEUKH-WAE-PIEUPSIOS -0xB272 0xCF9F # HANGUL SYLLABLE KHIEUKH-WAE-SIOS -0xB273 0xCFA0 # HANGUL SYLLABLE KHIEUKH-WAE-SSANGSIOS -0xB274 0xCFA2 # HANGUL SYLLABLE KHIEUKH-WAE-CIEUC -0xB275 0xCFA3 # HANGUL SYLLABLE KHIEUKH-WAE-CHIEUCH -0xB276 0xCFA4 # HANGUL SYLLABLE KHIEUKH-WAE-KHIEUKH -0xB277 0xCFA5 # HANGUL SYLLABLE KHIEUKH-WAE-THIEUTH -0xB278 0xCFA6 # HANGUL SYLLABLE KHIEUKH-WAE-PHIEUPH -0xB279 0xCFA7 # HANGUL SYLLABLE KHIEUKH-WAE-HIEUH -0xB27A 0xCFA9 # HANGUL SYLLABLE KHIEUKH-OE-KIYEOK -0xB281 0xCFAA # HANGUL SYLLABLE KHIEUKH-OE-SSANGKIYEOK -0xB282 0xCFAB # HANGUL SYLLABLE KHIEUKH-OE-KIYEOKSIOS -0xB283 0xCFAC # HANGUL SYLLABLE KHIEUKH-OE-NIEUN -0xB284 0xCFAD # HANGUL SYLLABLE KHIEUKH-OE-NIEUNCIEUC -0xB285 0xCFAE # HANGUL SYLLABLE KHIEUKH-OE-NIEUNHIEUH -0xB286 0xCFAF # HANGUL SYLLABLE KHIEUKH-OE-TIKEUT -0xB287 0xCFB1 # HANGUL SYLLABLE KHIEUKH-OE-RIEULKIYEOK -0xB288 0xCFB2 # HANGUL SYLLABLE KHIEUKH-OE-RIEULMIEUM -0xB289 0xCFB3 # HANGUL SYLLABLE KHIEUKH-OE-RIEULPIEUP -0xB28A 0xCFB4 # HANGUL SYLLABLE KHIEUKH-OE-RIEULSIOS -0xB28B 0xCFB5 # HANGUL SYLLABLE KHIEUKH-OE-RIEULTHIEUTH -0xB28C 0xCFB6 # HANGUL SYLLABLE KHIEUKH-OE-RIEULPHIEUPH -0xB28D 0xCFB7 # HANGUL SYLLABLE KHIEUKH-OE-RIEULHIEUH -0xB28E 0xCFB8 # HANGUL SYLLABLE KHIEUKH-OE-MIEUM -0xB28F 0xCFB9 # HANGUL SYLLABLE KHIEUKH-OE-PIEUP -0xB290 0xCFBA # HANGUL SYLLABLE KHIEUKH-OE-PIEUPSIOS -0xB291 0xCFBB # HANGUL SYLLABLE KHIEUKH-OE-SIOS -0xB292 0xCFBC # HANGUL SYLLABLE KHIEUKH-OE-SSANGSIOS -0xB293 0xCFBD # HANGUL SYLLABLE KHIEUKH-OE-IEUNG -0xB294 0xCFBE # HANGUL SYLLABLE KHIEUKH-OE-CIEUC -0xB295 0xCFBF # HANGUL SYLLABLE KHIEUKH-OE-CHIEUCH -0xB296 0xCFC0 # HANGUL SYLLABLE KHIEUKH-OE-KHIEUKH -0xB297 0xCFC1 # HANGUL SYLLABLE KHIEUKH-OE-THIEUTH -0xB298 0xCFC2 # HANGUL SYLLABLE KHIEUKH-OE-PHIEUPH -0xB299 0xCFC3 # HANGUL SYLLABLE KHIEUKH-OE-HIEUH -0xB29A 0xCFC5 # HANGUL SYLLABLE KHIEUKH-YO-KIYEOK -0xB29B 0xCFC6 # HANGUL SYLLABLE KHIEUKH-YO-SSANGKIYEOK -0xB29C 0xCFC7 # HANGUL SYLLABLE KHIEUKH-YO-KIYEOKSIOS -0xB29D 0xCFC8 # HANGUL SYLLABLE KHIEUKH-YO-NIEUN -0xB29E 0xCFC9 # HANGUL SYLLABLE KHIEUKH-YO-NIEUNCIEUC -0xB29F 0xCFCA # HANGUL SYLLABLE KHIEUKH-YO-NIEUNHIEUH -0xB2A0 0xCFCB # HANGUL SYLLABLE KHIEUKH-YO-TIKEUT -0xB2A1 0xAE79 # HANGUL SYLLABLE SSANGKIYEOK-AE-PIEUP -0xB2A2 0xAE7B # HANGUL SYLLABLE SSANGKIYEOK-AE-SIOS -0xB2A3 0xAE7C # HANGUL SYLLABLE SSANGKIYEOK-AE-SSANGSIOS -0xB2A4 0xAE7D # HANGUL SYLLABLE SSANGKIYEOK-AE-IEUNG -0xB2A5 0xAE84 # HANGUL SYLLABLE SSANGKIYEOK-YA -0xB2A6 0xAE85 # HANGUL SYLLABLE SSANGKIYEOK-YA-KIYEOK -0xB2A7 0xAE8C # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEUL -0xB2A8 0xAEBC # HANGUL SYLLABLE SSANGKIYEOK-EO -0xB2A9 0xAEBD # HANGUL SYLLABLE SSANGKIYEOK-EO-KIYEOK -0xB2AA 0xAEBE # HANGUL SYLLABLE SSANGKIYEOK-EO-SSANGKIYEOK -0xB2AB 0xAEC0 # HANGUL SYLLABLE SSANGKIYEOK-EO-NIEUN -0xB2AC 0xAEC4 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEUL -0xB2AD 0xAECC # HANGUL SYLLABLE SSANGKIYEOK-EO-MIEUM -0xB2AE 0xAECD # HANGUL SYLLABLE SSANGKIYEOK-EO-PIEUP -0xB2AF 0xAECF # HANGUL SYLLABLE SSANGKIYEOK-EO-SIOS -0xB2B0 0xAED0 # HANGUL SYLLABLE SSANGKIYEOK-EO-SSANGSIOS -0xB2B1 0xAED1 # HANGUL SYLLABLE SSANGKIYEOK-EO-IEUNG -0xB2B2 0xAED8 # HANGUL SYLLABLE SSANGKIYEOK-E -0xB2B3 0xAED9 # HANGUL SYLLABLE SSANGKIYEOK-E-KIYEOK -0xB2B4 0xAEDC # HANGUL SYLLABLE SSANGKIYEOK-E-NIEUN -0xB2B5 0xAEE8 # HANGUL SYLLABLE SSANGKIYEOK-E-MIEUM -0xB2B6 0xAEEB # HANGUL SYLLABLE SSANGKIYEOK-E-SIOS -0xB2B7 0xAEED # HANGUL SYLLABLE SSANGKIYEOK-E-IEUNG -0xB2B8 0xAEF4 # HANGUL SYLLABLE SSANGKIYEOK-YEO -0xB2B9 0xAEF8 # HANGUL SYLLABLE SSANGKIYEOK-YEO-NIEUN -0xB2BA 0xAEFC # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEUL -0xB2BB 0xAF07 # HANGUL SYLLABLE SSANGKIYEOK-YEO-SIOS -0xB2BC 0xAF08 # HANGUL SYLLABLE SSANGKIYEOK-YEO-SSANGSIOS -0xB2BD 0xAF0D # HANGUL SYLLABLE SSANGKIYEOK-YEO-THIEUTH -0xB2BE 0xAF10 # HANGUL SYLLABLE SSANGKIYEOK-YE -0xB2BF 0xAF2C # HANGUL SYLLABLE SSANGKIYEOK-O -0xB2C0 0xAF2D # HANGUL SYLLABLE SSANGKIYEOK-O-KIYEOK -0xB2C1 0xAF30 # HANGUL SYLLABLE SSANGKIYEOK-O-NIEUN -0xB2C2 0xAF32 # HANGUL SYLLABLE SSANGKIYEOK-O-NIEUNHIEUH -0xB2C3 0xAF34 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEUL -0xB2C4 0xAF3C # HANGUL SYLLABLE SSANGKIYEOK-O-MIEUM -0xB2C5 0xAF3D # HANGUL SYLLABLE SSANGKIYEOK-O-PIEUP -0xB2C6 0xAF3F # HANGUL SYLLABLE SSANGKIYEOK-O-SIOS -0xB2C7 0xAF41 # HANGUL SYLLABLE SSANGKIYEOK-O-IEUNG -0xB2C8 0xAF42 # HANGUL SYLLABLE SSANGKIYEOK-O-CIEUC -0xB2C9 0xAF43 # HANGUL SYLLABLE SSANGKIYEOK-O-CHIEUCH -0xB2CA 0xAF48 # HANGUL SYLLABLE SSANGKIYEOK-WA -0xB2CB 0xAF49 # HANGUL SYLLABLE SSANGKIYEOK-WA-KIYEOK -0xB2CC 0xAF50 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEUL -0xB2CD 0xAF5C # HANGUL SYLLABLE SSANGKIYEOK-WA-SSANGSIOS -0xB2CE 0xAF5D # HANGUL SYLLABLE SSANGKIYEOK-WA-IEUNG -0xB2CF 0xAF64 # HANGUL SYLLABLE SSANGKIYEOK-WAE -0xB2D0 0xAF65 # HANGUL SYLLABLE SSANGKIYEOK-WAE-KIYEOK -0xB2D1 0xAF79 # HANGUL SYLLABLE SSANGKIYEOK-WAE-IEUNG -0xB2D2 0xAF80 # HANGUL SYLLABLE SSANGKIYEOK-OE -0xB2D3 0xAF84 # HANGUL SYLLABLE SSANGKIYEOK-OE-NIEUN -0xB2D4 0xAF88 # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEUL -0xB2D5 0xAF90 # HANGUL SYLLABLE SSANGKIYEOK-OE-MIEUM -0xB2D6 0xAF91 # HANGUL SYLLABLE SSANGKIYEOK-OE-PIEUP -0xB2D7 0xAF95 # HANGUL SYLLABLE SSANGKIYEOK-OE-IEUNG -0xB2D8 0xAF9C # HANGUL SYLLABLE SSANGKIYEOK-YO -0xB2D9 0xAFB8 # HANGUL SYLLABLE SSANGKIYEOK-U -0xB2DA 0xAFB9 # HANGUL SYLLABLE SSANGKIYEOK-U-KIYEOK -0xB2DB 0xAFBC # HANGUL SYLLABLE SSANGKIYEOK-U-NIEUN -0xB2DC 0xAFC0 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEUL -0xB2DD 0xAFC7 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULHIEUH -0xB2DE 0xAFC8 # HANGUL SYLLABLE SSANGKIYEOK-U-MIEUM -0xB2DF 0xAFC9 # HANGUL SYLLABLE SSANGKIYEOK-U-PIEUP -0xB2E0 0xAFCB # HANGUL SYLLABLE SSANGKIYEOK-U-SIOS -0xB2E1 0xAFCD # HANGUL SYLLABLE SSANGKIYEOK-U-IEUNG -0xB2E2 0xAFCE # HANGUL SYLLABLE SSANGKIYEOK-U-CIEUC -0xB2E3 0xAFD4 # HANGUL SYLLABLE SSANGKIYEOK-WEO -0xB2E4 0xAFDC # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEUL -0xB2E5 0xAFE8 # HANGUL SYLLABLE SSANGKIYEOK-WEO-SSANGSIOS -0xB2E6 0xAFE9 # HANGUL SYLLABLE SSANGKIYEOK-WEO-IEUNG -0xB2E7 0xAFF0 # HANGUL SYLLABLE SSANGKIYEOK-WE -0xB2E8 0xAFF1 # HANGUL SYLLABLE SSANGKIYEOK-WE-KIYEOK -0xB2E9 0xAFF4 # HANGUL SYLLABLE SSANGKIYEOK-WE-NIEUN -0xB2EA 0xAFF8 # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEUL -0xB2EB 0xB000 # HANGUL SYLLABLE SSANGKIYEOK-WE-MIEUM -0xB2EC 0xB001 # HANGUL SYLLABLE SSANGKIYEOK-WE-PIEUP -0xB2ED 0xB004 # HANGUL SYLLABLE SSANGKIYEOK-WE-SSANGSIOS -0xB2EE 0xB00C # HANGUL SYLLABLE SSANGKIYEOK-WI -0xB2EF 0xB010 # HANGUL SYLLABLE SSANGKIYEOK-WI-NIEUN -0xB2F0 0xB014 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEUL -0xB2F1 0xB01C # HANGUL SYLLABLE SSANGKIYEOK-WI-MIEUM -0xB2F2 0xB01D # HANGUL SYLLABLE SSANGKIYEOK-WI-PIEUP -0xB2F3 0xB028 # HANGUL SYLLABLE SSANGKIYEOK-YU -0xB2F4 0xB044 # HANGUL SYLLABLE SSANGKIYEOK-EU -0xB2F5 0xB045 # HANGUL SYLLABLE SSANGKIYEOK-EU-KIYEOK -0xB2F6 0xB048 # HANGUL SYLLABLE SSANGKIYEOK-EU-NIEUN -0xB2F7 0xB04A # HANGUL SYLLABLE SSANGKIYEOK-EU-NIEUNHIEUH -0xB2F8 0xB04C # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEUL -0xB2F9 0xB04E # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULMIEUM -0xB2FA 0xB053 # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULHIEUH -0xB2FB 0xB054 # HANGUL SYLLABLE SSANGKIYEOK-EU-MIEUM -0xB2FC 0xB055 # HANGUL SYLLABLE SSANGKIYEOK-EU-PIEUP -0xB2FD 0xB057 # HANGUL SYLLABLE SSANGKIYEOK-EU-SIOS -0xB2FE 0xB059 # HANGUL SYLLABLE SSANGKIYEOK-EU-IEUNG -0xB341 0xCFCC # HANGUL SYLLABLE KHIEUKH-YO-RIEUL -0xB342 0xCFCD # HANGUL SYLLABLE KHIEUKH-YO-RIEULKIYEOK -0xB343 0xCFCE # HANGUL SYLLABLE KHIEUKH-YO-RIEULMIEUM -0xB344 0xCFCF # HANGUL SYLLABLE KHIEUKH-YO-RIEULPIEUP -0xB345 0xCFD0 # HANGUL SYLLABLE KHIEUKH-YO-RIEULSIOS -0xB346 0xCFD1 # HANGUL SYLLABLE KHIEUKH-YO-RIEULTHIEUTH -0xB347 0xCFD2 # HANGUL SYLLABLE KHIEUKH-YO-RIEULPHIEUPH -0xB348 0xCFD3 # HANGUL SYLLABLE KHIEUKH-YO-RIEULHIEUH -0xB349 0xCFD4 # HANGUL SYLLABLE KHIEUKH-YO-MIEUM -0xB34A 0xCFD5 # HANGUL SYLLABLE KHIEUKH-YO-PIEUP -0xB34B 0xCFD6 # HANGUL SYLLABLE KHIEUKH-YO-PIEUPSIOS -0xB34C 0xCFD7 # HANGUL SYLLABLE KHIEUKH-YO-SIOS -0xB34D 0xCFD8 # HANGUL SYLLABLE KHIEUKH-YO-SSANGSIOS -0xB34E 0xCFD9 # HANGUL SYLLABLE KHIEUKH-YO-IEUNG -0xB34F 0xCFDA # HANGUL SYLLABLE KHIEUKH-YO-CIEUC -0xB350 0xCFDB # HANGUL SYLLABLE KHIEUKH-YO-CHIEUCH -0xB351 0xCFDC # HANGUL SYLLABLE KHIEUKH-YO-KHIEUKH -0xB352 0xCFDD # HANGUL SYLLABLE KHIEUKH-YO-THIEUTH -0xB353 0xCFDE # HANGUL SYLLABLE KHIEUKH-YO-PHIEUPH -0xB354 0xCFDF # HANGUL SYLLABLE KHIEUKH-YO-HIEUH -0xB355 0xCFE2 # HANGUL SYLLABLE KHIEUKH-U-SSANGKIYEOK -0xB356 0xCFE3 # HANGUL SYLLABLE KHIEUKH-U-KIYEOKSIOS -0xB357 0xCFE5 # HANGUL SYLLABLE KHIEUKH-U-NIEUNCIEUC -0xB358 0xCFE6 # HANGUL SYLLABLE KHIEUKH-U-NIEUNHIEUH -0xB359 0xCFE7 # HANGUL SYLLABLE KHIEUKH-U-TIKEUT -0xB35A 0xCFE9 # HANGUL SYLLABLE KHIEUKH-U-RIEULKIYEOK -0xB361 0xCFEA # HANGUL SYLLABLE KHIEUKH-U-RIEULMIEUM -0xB362 0xCFEB # HANGUL SYLLABLE KHIEUKH-U-RIEULPIEUP -0xB363 0xCFEC # HANGUL SYLLABLE KHIEUKH-U-RIEULSIOS -0xB364 0xCFED # HANGUL SYLLABLE KHIEUKH-U-RIEULTHIEUTH -0xB365 0xCFEE # HANGUL SYLLABLE KHIEUKH-U-RIEULPHIEUPH -0xB366 0xCFEF # HANGUL SYLLABLE KHIEUKH-U-RIEULHIEUH -0xB367 0xCFF2 # HANGUL SYLLABLE KHIEUKH-U-PIEUPSIOS -0xB368 0xCFF4 # HANGUL SYLLABLE KHIEUKH-U-SSANGSIOS -0xB369 0xCFF6 # HANGUL SYLLABLE KHIEUKH-U-CIEUC -0xB36A 0xCFF7 # HANGUL SYLLABLE KHIEUKH-U-CHIEUCH -0xB36B 0xCFF8 # HANGUL SYLLABLE KHIEUKH-U-KHIEUKH -0xB36C 0xCFF9 # HANGUL SYLLABLE KHIEUKH-U-THIEUTH -0xB36D 0xCFFA # HANGUL SYLLABLE KHIEUKH-U-PHIEUPH -0xB36E 0xCFFB # HANGUL SYLLABLE KHIEUKH-U-HIEUH -0xB36F 0xCFFD # HANGUL SYLLABLE KHIEUKH-WEO-KIYEOK -0xB370 0xCFFE # HANGUL SYLLABLE KHIEUKH-WEO-SSANGKIYEOK -0xB371 0xCFFF # HANGUL SYLLABLE KHIEUKH-WEO-KIYEOKSIOS -0xB372 0xD001 # HANGUL SYLLABLE KHIEUKH-WEO-NIEUNCIEUC -0xB373 0xD002 # HANGUL SYLLABLE KHIEUKH-WEO-NIEUNHIEUH -0xB374 0xD003 # HANGUL SYLLABLE KHIEUKH-WEO-TIKEUT -0xB375 0xD005 # HANGUL SYLLABLE KHIEUKH-WEO-RIEULKIYEOK -0xB376 0xD006 # HANGUL SYLLABLE KHIEUKH-WEO-RIEULMIEUM -0xB377 0xD007 # HANGUL SYLLABLE KHIEUKH-WEO-RIEULPIEUP -0xB378 0xD008 # HANGUL SYLLABLE KHIEUKH-WEO-RIEULSIOS -0xB379 0xD009 # HANGUL SYLLABLE KHIEUKH-WEO-RIEULTHIEUTH -0xB37A 0xD00A # HANGUL SYLLABLE KHIEUKH-WEO-RIEULPHIEUPH -0xB381 0xD00B # HANGUL SYLLABLE KHIEUKH-WEO-RIEULHIEUH -0xB382 0xD00C # HANGUL SYLLABLE KHIEUKH-WEO-MIEUM -0xB383 0xD00D # HANGUL SYLLABLE KHIEUKH-WEO-PIEUP -0xB384 0xD00E # HANGUL SYLLABLE KHIEUKH-WEO-PIEUPSIOS -0xB385 0xD00F # HANGUL SYLLABLE KHIEUKH-WEO-SIOS -0xB386 0xD010 # HANGUL SYLLABLE KHIEUKH-WEO-SSANGSIOS -0xB387 0xD012 # HANGUL SYLLABLE KHIEUKH-WEO-CIEUC -0xB388 0xD013 # HANGUL SYLLABLE KHIEUKH-WEO-CHIEUCH -0xB389 0xD014 # HANGUL SYLLABLE KHIEUKH-WEO-KHIEUKH -0xB38A 0xD015 # HANGUL SYLLABLE KHIEUKH-WEO-THIEUTH -0xB38B 0xD016 # HANGUL SYLLABLE KHIEUKH-WEO-PHIEUPH -0xB38C 0xD017 # HANGUL SYLLABLE KHIEUKH-WEO-HIEUH -0xB38D 0xD019 # HANGUL SYLLABLE KHIEUKH-WE-KIYEOK -0xB38E 0xD01A # HANGUL SYLLABLE KHIEUKH-WE-SSANGKIYEOK -0xB38F 0xD01B # HANGUL SYLLABLE KHIEUKH-WE-KIYEOKSIOS -0xB390 0xD01C # HANGUL SYLLABLE KHIEUKH-WE-NIEUN -0xB391 0xD01D # HANGUL SYLLABLE KHIEUKH-WE-NIEUNCIEUC -0xB392 0xD01E # HANGUL SYLLABLE KHIEUKH-WE-NIEUNHIEUH -0xB393 0xD01F # HANGUL SYLLABLE KHIEUKH-WE-TIKEUT -0xB394 0xD020 # HANGUL SYLLABLE KHIEUKH-WE-RIEUL -0xB395 0xD021 # HANGUL SYLLABLE KHIEUKH-WE-RIEULKIYEOK -0xB396 0xD022 # HANGUL SYLLABLE KHIEUKH-WE-RIEULMIEUM -0xB397 0xD023 # HANGUL SYLLABLE KHIEUKH-WE-RIEULPIEUP -0xB398 0xD024 # HANGUL SYLLABLE KHIEUKH-WE-RIEULSIOS -0xB399 0xD025 # HANGUL SYLLABLE KHIEUKH-WE-RIEULTHIEUTH -0xB39A 0xD026 # HANGUL SYLLABLE KHIEUKH-WE-RIEULPHIEUPH -0xB39B 0xD027 # HANGUL SYLLABLE KHIEUKH-WE-RIEULHIEUH -0xB39C 0xD028 # HANGUL SYLLABLE KHIEUKH-WE-MIEUM -0xB39D 0xD029 # HANGUL SYLLABLE KHIEUKH-WE-PIEUP -0xB39E 0xD02A # HANGUL SYLLABLE KHIEUKH-WE-PIEUPSIOS -0xB39F 0xD02B # HANGUL SYLLABLE KHIEUKH-WE-SIOS -0xB3A0 0xD02C # HANGUL SYLLABLE KHIEUKH-WE-SSANGSIOS -0xB3A1 0xB05D # HANGUL SYLLABLE SSANGKIYEOK-EU-THIEUTH -0xB3A2 0xB07C # HANGUL SYLLABLE SSANGKIYEOK-I -0xB3A3 0xB07D # HANGUL SYLLABLE SSANGKIYEOK-I-KIYEOK -0xB3A4 0xB080 # HANGUL SYLLABLE SSANGKIYEOK-I-NIEUN -0xB3A5 0xB084 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEUL -0xB3A6 0xB08C # HANGUL SYLLABLE SSANGKIYEOK-I-MIEUM -0xB3A7 0xB08D # HANGUL SYLLABLE SSANGKIYEOK-I-PIEUP -0xB3A8 0xB08F # HANGUL SYLLABLE SSANGKIYEOK-I-SIOS -0xB3A9 0xB091 # HANGUL SYLLABLE SSANGKIYEOK-I-IEUNG -0xB3AA 0xB098 # HANGUL SYLLABLE NIEUN-A -0xB3AB 0xB099 # HANGUL SYLLABLE NIEUN-A-KIYEOK -0xB3AC 0xB09A # HANGUL SYLLABLE NIEUN-A-SSANGKIYEOK -0xB3AD 0xB09C # HANGUL SYLLABLE NIEUN-A-NIEUN -0xB3AE 0xB09F # HANGUL SYLLABLE NIEUN-A-TIKEUT -0xB3AF 0xB0A0 # HANGUL SYLLABLE NIEUN-A-RIEUL -0xB3B0 0xB0A1 # HANGUL SYLLABLE NIEUN-A-RIEULKIYEOK -0xB3B1 0xB0A2 # HANGUL SYLLABLE NIEUN-A-RIEULMIEUM -0xB3B2 0xB0A8 # HANGUL SYLLABLE NIEUN-A-MIEUM -0xB3B3 0xB0A9 # HANGUL SYLLABLE NIEUN-A-PIEUP -0xB3B4 0xB0AB # HANGUL SYLLABLE NIEUN-A-SIOS -0xB3B5 0xB0AC # HANGUL SYLLABLE NIEUN-A-SSANGSIOS -0xB3B6 0xB0AD # HANGUL SYLLABLE NIEUN-A-IEUNG -0xB3B7 0xB0AE # HANGUL SYLLABLE NIEUN-A-CIEUC -0xB3B8 0xB0AF # HANGUL SYLLABLE NIEUN-A-CHIEUCH -0xB3B9 0xB0B1 # HANGUL SYLLABLE NIEUN-A-THIEUTH -0xB3BA 0xB0B3 # HANGUL SYLLABLE NIEUN-A-HIEUH -0xB3BB 0xB0B4 # HANGUL SYLLABLE NIEUN-AE -0xB3BC 0xB0B5 # HANGUL SYLLABLE NIEUN-AE-KIYEOK -0xB3BD 0xB0B8 # HANGUL SYLLABLE NIEUN-AE-NIEUN -0xB3BE 0xB0BC # HANGUL SYLLABLE NIEUN-AE-RIEUL -0xB3BF 0xB0C4 # HANGUL SYLLABLE NIEUN-AE-MIEUM -0xB3C0 0xB0C5 # HANGUL SYLLABLE NIEUN-AE-PIEUP -0xB3C1 0xB0C7 # HANGUL SYLLABLE NIEUN-AE-SIOS -0xB3C2 0xB0C8 # HANGUL SYLLABLE NIEUN-AE-SSANGSIOS -0xB3C3 0xB0C9 # HANGUL SYLLABLE NIEUN-AE-IEUNG -0xB3C4 0xB0D0 # HANGUL SYLLABLE NIEUN-YA -0xB3C5 0xB0D1 # HANGUL SYLLABLE NIEUN-YA-KIYEOK -0xB3C6 0xB0D4 # HANGUL SYLLABLE NIEUN-YA-NIEUN -0xB3C7 0xB0D8 # HANGUL SYLLABLE NIEUN-YA-RIEUL -0xB3C8 0xB0E0 # HANGUL SYLLABLE NIEUN-YA-MIEUM -0xB3C9 0xB0E5 # HANGUL SYLLABLE NIEUN-YA-IEUNG -0xB3CA 0xB108 # HANGUL SYLLABLE NIEUN-EO -0xB3CB 0xB109 # HANGUL SYLLABLE NIEUN-EO-KIYEOK -0xB3CC 0xB10B # HANGUL SYLLABLE NIEUN-EO-KIYEOKSIOS -0xB3CD 0xB10C # HANGUL SYLLABLE NIEUN-EO-NIEUN -0xB3CE 0xB110 # HANGUL SYLLABLE NIEUN-EO-RIEUL -0xB3CF 0xB112 # HANGUL SYLLABLE NIEUN-EO-RIEULMIEUM -0xB3D0 0xB113 # HANGUL SYLLABLE NIEUN-EO-RIEULPIEUP -0xB3D1 0xB118 # HANGUL SYLLABLE NIEUN-EO-MIEUM -0xB3D2 0xB119 # HANGUL SYLLABLE NIEUN-EO-PIEUP -0xB3D3 0xB11B # HANGUL SYLLABLE NIEUN-EO-SIOS -0xB3D4 0xB11C # HANGUL SYLLABLE NIEUN-EO-SSANGSIOS -0xB3D5 0xB11D # HANGUL SYLLABLE NIEUN-EO-IEUNG -0xB3D6 0xB123 # HANGUL SYLLABLE NIEUN-EO-HIEUH -0xB3D7 0xB124 # HANGUL SYLLABLE NIEUN-E -0xB3D8 0xB125 # HANGUL SYLLABLE NIEUN-E-KIYEOK -0xB3D9 0xB128 # HANGUL SYLLABLE NIEUN-E-NIEUN -0xB3DA 0xB12C # HANGUL SYLLABLE NIEUN-E-RIEUL -0xB3DB 0xB134 # HANGUL SYLLABLE NIEUN-E-MIEUM -0xB3DC 0xB135 # HANGUL SYLLABLE NIEUN-E-PIEUP -0xB3DD 0xB137 # HANGUL SYLLABLE NIEUN-E-SIOS -0xB3DE 0xB138 # HANGUL SYLLABLE NIEUN-E-SSANGSIOS -0xB3DF 0xB139 # HANGUL SYLLABLE NIEUN-E-IEUNG -0xB3E0 0xB140 # HANGUL SYLLABLE NIEUN-YEO -0xB3E1 0xB141 # HANGUL SYLLABLE NIEUN-YEO-KIYEOK -0xB3E2 0xB144 # HANGUL SYLLABLE NIEUN-YEO-NIEUN -0xB3E3 0xB148 # HANGUL SYLLABLE NIEUN-YEO-RIEUL -0xB3E4 0xB150 # HANGUL SYLLABLE NIEUN-YEO-MIEUM -0xB3E5 0xB151 # HANGUL SYLLABLE NIEUN-YEO-PIEUP -0xB3E6 0xB154 # HANGUL SYLLABLE NIEUN-YEO-SSANGSIOS -0xB3E7 0xB155 # HANGUL SYLLABLE NIEUN-YEO-IEUNG -0xB3E8 0xB158 # HANGUL SYLLABLE NIEUN-YEO-KHIEUKH -0xB3E9 0xB15C # HANGUL SYLLABLE NIEUN-YE -0xB3EA 0xB160 # HANGUL SYLLABLE NIEUN-YE-NIEUN -0xB3EB 0xB178 # HANGUL SYLLABLE NIEUN-O -0xB3EC 0xB179 # HANGUL SYLLABLE NIEUN-O-KIYEOK -0xB3ED 0xB17C # HANGUL SYLLABLE NIEUN-O-NIEUN -0xB3EE 0xB180 # HANGUL SYLLABLE NIEUN-O-RIEUL -0xB3EF 0xB182 # HANGUL SYLLABLE NIEUN-O-RIEULMIEUM -0xB3F0 0xB188 # HANGUL SYLLABLE NIEUN-O-MIEUM -0xB3F1 0xB189 # HANGUL SYLLABLE NIEUN-O-PIEUP -0xB3F2 0xB18B # HANGUL SYLLABLE NIEUN-O-SIOS -0xB3F3 0xB18D # HANGUL SYLLABLE NIEUN-O-IEUNG -0xB3F4 0xB192 # HANGUL SYLLABLE NIEUN-O-PHIEUPH -0xB3F5 0xB193 # HANGUL SYLLABLE NIEUN-O-HIEUH -0xB3F6 0xB194 # HANGUL SYLLABLE NIEUN-WA -0xB3F7 0xB198 # HANGUL SYLLABLE NIEUN-WA-NIEUN -0xB3F8 0xB19C # HANGUL SYLLABLE NIEUN-WA-RIEUL -0xB3F9 0xB1A8 # HANGUL SYLLABLE NIEUN-WA-SSANGSIOS -0xB3FA 0xB1CC # HANGUL SYLLABLE NIEUN-OE -0xB3FB 0xB1D0 # HANGUL SYLLABLE NIEUN-OE-NIEUN -0xB3FC 0xB1D4 # HANGUL SYLLABLE NIEUN-OE-RIEUL -0xB3FD 0xB1DC # HANGUL SYLLABLE NIEUN-OE-MIEUM -0xB3FE 0xB1DD # HANGUL SYLLABLE NIEUN-OE-PIEUP -0xB441 0xD02E # HANGUL SYLLABLE KHIEUKH-WE-CIEUC -0xB442 0xD02F # HANGUL SYLLABLE KHIEUKH-WE-CHIEUCH -0xB443 0xD030 # HANGUL SYLLABLE KHIEUKH-WE-KHIEUKH -0xB444 0xD031 # HANGUL SYLLABLE KHIEUKH-WE-THIEUTH -0xB445 0xD032 # HANGUL SYLLABLE KHIEUKH-WE-PHIEUPH -0xB446 0xD033 # HANGUL SYLLABLE KHIEUKH-WE-HIEUH -0xB447 0xD036 # HANGUL SYLLABLE KHIEUKH-WI-SSANGKIYEOK -0xB448 0xD037 # HANGUL SYLLABLE KHIEUKH-WI-KIYEOKSIOS -0xB449 0xD039 # HANGUL SYLLABLE KHIEUKH-WI-NIEUNCIEUC -0xB44A 0xD03A # HANGUL SYLLABLE KHIEUKH-WI-NIEUNHIEUH -0xB44B 0xD03B # HANGUL SYLLABLE KHIEUKH-WI-TIKEUT -0xB44C 0xD03D # HANGUL SYLLABLE KHIEUKH-WI-RIEULKIYEOK -0xB44D 0xD03E # HANGUL SYLLABLE KHIEUKH-WI-RIEULMIEUM -0xB44E 0xD03F # HANGUL SYLLABLE KHIEUKH-WI-RIEULPIEUP -0xB44F 0xD040 # HANGUL SYLLABLE KHIEUKH-WI-RIEULSIOS -0xB450 0xD041 # HANGUL SYLLABLE KHIEUKH-WI-RIEULTHIEUTH -0xB451 0xD042 # HANGUL SYLLABLE KHIEUKH-WI-RIEULPHIEUPH -0xB452 0xD043 # HANGUL SYLLABLE KHIEUKH-WI-RIEULHIEUH -0xB453 0xD046 # HANGUL SYLLABLE KHIEUKH-WI-PIEUPSIOS -0xB454 0xD048 # HANGUL SYLLABLE KHIEUKH-WI-SSANGSIOS -0xB455 0xD04A # HANGUL SYLLABLE KHIEUKH-WI-CIEUC -0xB456 0xD04B # HANGUL SYLLABLE KHIEUKH-WI-CHIEUCH -0xB457 0xD04C # HANGUL SYLLABLE KHIEUKH-WI-KHIEUKH -0xB458 0xD04D # HANGUL SYLLABLE KHIEUKH-WI-THIEUTH -0xB459 0xD04E # HANGUL SYLLABLE KHIEUKH-WI-PHIEUPH -0xB45A 0xD04F # HANGUL SYLLABLE KHIEUKH-WI-HIEUH -0xB461 0xD051 # HANGUL SYLLABLE KHIEUKH-YU-KIYEOK -0xB462 0xD052 # HANGUL SYLLABLE KHIEUKH-YU-SSANGKIYEOK -0xB463 0xD053 # HANGUL SYLLABLE KHIEUKH-YU-KIYEOKSIOS -0xB464 0xD055 # HANGUL SYLLABLE KHIEUKH-YU-NIEUNCIEUC -0xB465 0xD056 # HANGUL SYLLABLE KHIEUKH-YU-NIEUNHIEUH -0xB466 0xD057 # HANGUL SYLLABLE KHIEUKH-YU-TIKEUT -0xB467 0xD059 # HANGUL SYLLABLE KHIEUKH-YU-RIEULKIYEOK -0xB468 0xD05A # HANGUL SYLLABLE KHIEUKH-YU-RIEULMIEUM -0xB469 0xD05B # HANGUL SYLLABLE KHIEUKH-YU-RIEULPIEUP -0xB46A 0xD05C # HANGUL SYLLABLE KHIEUKH-YU-RIEULSIOS -0xB46B 0xD05D # HANGUL SYLLABLE KHIEUKH-YU-RIEULTHIEUTH -0xB46C 0xD05E # HANGUL SYLLABLE KHIEUKH-YU-RIEULPHIEUPH -0xB46D 0xD05F # HANGUL SYLLABLE KHIEUKH-YU-RIEULHIEUH -0xB46E 0xD061 # HANGUL SYLLABLE KHIEUKH-YU-PIEUP -0xB46F 0xD062 # HANGUL SYLLABLE KHIEUKH-YU-PIEUPSIOS -0xB470 0xD063 # HANGUL SYLLABLE KHIEUKH-YU-SIOS -0xB471 0xD064 # HANGUL SYLLABLE KHIEUKH-YU-SSANGSIOS -0xB472 0xD065 # HANGUL SYLLABLE KHIEUKH-YU-IEUNG -0xB473 0xD066 # HANGUL SYLLABLE KHIEUKH-YU-CIEUC -0xB474 0xD067 # HANGUL SYLLABLE KHIEUKH-YU-CHIEUCH -0xB475 0xD068 # HANGUL SYLLABLE KHIEUKH-YU-KHIEUKH -0xB476 0xD069 # HANGUL SYLLABLE KHIEUKH-YU-THIEUTH -0xB477 0xD06A # HANGUL SYLLABLE KHIEUKH-YU-PHIEUPH -0xB478 0xD06B # HANGUL SYLLABLE KHIEUKH-YU-HIEUH -0xB479 0xD06E # HANGUL SYLLABLE KHIEUKH-EU-SSANGKIYEOK -0xB47A 0xD06F # HANGUL SYLLABLE KHIEUKH-EU-KIYEOKSIOS -0xB481 0xD071 # HANGUL SYLLABLE KHIEUKH-EU-NIEUNCIEUC -0xB482 0xD072 # HANGUL SYLLABLE KHIEUKH-EU-NIEUNHIEUH -0xB483 0xD073 # HANGUL SYLLABLE KHIEUKH-EU-TIKEUT -0xB484 0xD075 # HANGUL SYLLABLE KHIEUKH-EU-RIEULKIYEOK -0xB485 0xD076 # HANGUL SYLLABLE KHIEUKH-EU-RIEULMIEUM -0xB486 0xD077 # HANGUL SYLLABLE KHIEUKH-EU-RIEULPIEUP -0xB487 0xD078 # HANGUL SYLLABLE KHIEUKH-EU-RIEULSIOS -0xB488 0xD079 # HANGUL SYLLABLE KHIEUKH-EU-RIEULTHIEUTH -0xB489 0xD07A # HANGUL SYLLABLE KHIEUKH-EU-RIEULPHIEUPH -0xB48A 0xD07B # HANGUL SYLLABLE KHIEUKH-EU-RIEULHIEUH -0xB48B 0xD07E # HANGUL SYLLABLE KHIEUKH-EU-PIEUPSIOS -0xB48C 0xD07F # HANGUL SYLLABLE KHIEUKH-EU-SIOS -0xB48D 0xD080 # HANGUL SYLLABLE KHIEUKH-EU-SSANGSIOS -0xB48E 0xD082 # HANGUL SYLLABLE KHIEUKH-EU-CIEUC -0xB48F 0xD083 # HANGUL SYLLABLE KHIEUKH-EU-CHIEUCH -0xB490 0xD084 # HANGUL SYLLABLE KHIEUKH-EU-KHIEUKH -0xB491 0xD085 # HANGUL SYLLABLE KHIEUKH-EU-THIEUTH -0xB492 0xD086 # HANGUL SYLLABLE KHIEUKH-EU-PHIEUPH -0xB493 0xD087 # HANGUL SYLLABLE KHIEUKH-EU-HIEUH -0xB494 0xD088 # HANGUL SYLLABLE KHIEUKH-YI -0xB495 0xD089 # HANGUL SYLLABLE KHIEUKH-YI-KIYEOK -0xB496 0xD08A # HANGUL SYLLABLE KHIEUKH-YI-SSANGKIYEOK -0xB497 0xD08B # HANGUL SYLLABLE KHIEUKH-YI-KIYEOKSIOS -0xB498 0xD08C # HANGUL SYLLABLE KHIEUKH-YI-NIEUN -0xB499 0xD08D # HANGUL SYLLABLE KHIEUKH-YI-NIEUNCIEUC -0xB49A 0xD08E # HANGUL SYLLABLE KHIEUKH-YI-NIEUNHIEUH -0xB49B 0xD08F # HANGUL SYLLABLE KHIEUKH-YI-TIKEUT -0xB49C 0xD090 # HANGUL SYLLABLE KHIEUKH-YI-RIEUL -0xB49D 0xD091 # HANGUL SYLLABLE KHIEUKH-YI-RIEULKIYEOK -0xB49E 0xD092 # HANGUL SYLLABLE KHIEUKH-YI-RIEULMIEUM -0xB49F 0xD093 # HANGUL SYLLABLE KHIEUKH-YI-RIEULPIEUP -0xB4A0 0xD094 # HANGUL SYLLABLE KHIEUKH-YI-RIEULSIOS -0xB4A1 0xB1DF # HANGUL SYLLABLE NIEUN-OE-SIOS -0xB4A2 0xB1E8 # HANGUL SYLLABLE NIEUN-YO -0xB4A3 0xB1E9 # HANGUL SYLLABLE NIEUN-YO-KIYEOK -0xB4A4 0xB1EC # HANGUL SYLLABLE NIEUN-YO-NIEUN -0xB4A5 0xB1F0 # HANGUL SYLLABLE NIEUN-YO-RIEUL -0xB4A6 0xB1F9 # HANGUL SYLLABLE NIEUN-YO-PIEUP -0xB4A7 0xB1FB # HANGUL SYLLABLE NIEUN-YO-SIOS -0xB4A8 0xB1FD # HANGUL SYLLABLE NIEUN-YO-IEUNG -0xB4A9 0xB204 # HANGUL SYLLABLE NIEUN-U -0xB4AA 0xB205 # HANGUL SYLLABLE NIEUN-U-KIYEOK -0xB4AB 0xB208 # HANGUL SYLLABLE NIEUN-U-NIEUN -0xB4AC 0xB20B # HANGUL SYLLABLE NIEUN-U-TIKEUT -0xB4AD 0xB20C # HANGUL SYLLABLE NIEUN-U-RIEUL -0xB4AE 0xB214 # HANGUL SYLLABLE NIEUN-U-MIEUM -0xB4AF 0xB215 # HANGUL SYLLABLE NIEUN-U-PIEUP -0xB4B0 0xB217 # HANGUL SYLLABLE NIEUN-U-SIOS -0xB4B1 0xB219 # HANGUL SYLLABLE NIEUN-U-IEUNG -0xB4B2 0xB220 # HANGUL SYLLABLE NIEUN-WEO -0xB4B3 0xB234 # HANGUL SYLLABLE NIEUN-WEO-SSANGSIOS -0xB4B4 0xB23C # HANGUL SYLLABLE NIEUN-WE -0xB4B5 0xB258 # HANGUL SYLLABLE NIEUN-WI -0xB4B6 0xB25C # HANGUL SYLLABLE NIEUN-WI-NIEUN -0xB4B7 0xB260 # HANGUL SYLLABLE NIEUN-WI-RIEUL -0xB4B8 0xB268 # HANGUL SYLLABLE NIEUN-WI-MIEUM -0xB4B9 0xB269 # HANGUL SYLLABLE NIEUN-WI-PIEUP -0xB4BA 0xB274 # HANGUL SYLLABLE NIEUN-YU -0xB4BB 0xB275 # HANGUL SYLLABLE NIEUN-YU-KIYEOK -0xB4BC 0xB27C # HANGUL SYLLABLE NIEUN-YU-RIEUL -0xB4BD 0xB284 # HANGUL SYLLABLE NIEUN-YU-MIEUM -0xB4BE 0xB285 # HANGUL SYLLABLE NIEUN-YU-PIEUP -0xB4BF 0xB289 # HANGUL SYLLABLE NIEUN-YU-IEUNG -0xB4C0 0xB290 # HANGUL SYLLABLE NIEUN-EU -0xB4C1 0xB291 # HANGUL SYLLABLE NIEUN-EU-KIYEOK -0xB4C2 0xB294 # HANGUL SYLLABLE NIEUN-EU-NIEUN -0xB4C3 0xB298 # HANGUL SYLLABLE NIEUN-EU-RIEUL -0xB4C4 0xB299 # HANGUL SYLLABLE NIEUN-EU-RIEULKIYEOK -0xB4C5 0xB29A # HANGUL SYLLABLE NIEUN-EU-RIEULMIEUM -0xB4C6 0xB2A0 # HANGUL SYLLABLE NIEUN-EU-MIEUM -0xB4C7 0xB2A1 # HANGUL SYLLABLE NIEUN-EU-PIEUP -0xB4C8 0xB2A3 # HANGUL SYLLABLE NIEUN-EU-SIOS -0xB4C9 0xB2A5 # HANGUL SYLLABLE NIEUN-EU-IEUNG -0xB4CA 0xB2A6 # HANGUL SYLLABLE NIEUN-EU-CIEUC -0xB4CB 0xB2AA # HANGUL SYLLABLE NIEUN-EU-PHIEUPH -0xB4CC 0xB2AC # HANGUL SYLLABLE NIEUN-YI -0xB4CD 0xB2B0 # HANGUL SYLLABLE NIEUN-YI-NIEUN -0xB4CE 0xB2B4 # HANGUL SYLLABLE NIEUN-YI-RIEUL -0xB4CF 0xB2C8 # HANGUL SYLLABLE NIEUN-I -0xB4D0 0xB2C9 # HANGUL SYLLABLE NIEUN-I-KIYEOK -0xB4D1 0xB2CC # HANGUL SYLLABLE NIEUN-I-NIEUN -0xB4D2 0xB2D0 # HANGUL SYLLABLE NIEUN-I-RIEUL -0xB4D3 0xB2D2 # HANGUL SYLLABLE NIEUN-I-RIEULMIEUM-<3/22/95> -0xB4D4 0xB2D8 # HANGUL SYLLABLE NIEUN-I-MIEUM -0xB4D5 0xB2D9 # HANGUL SYLLABLE NIEUN-I-PIEUP -0xB4D6 0xB2DB # HANGUL SYLLABLE NIEUN-I-SIOS -0xB4D7 0xB2DD # HANGUL SYLLABLE NIEUN-I-IEUNG -0xB4D8 0xB2E2 # HANGUL SYLLABLE NIEUN-I-PHIEUPH -0xB4D9 0xB2E4 # HANGUL SYLLABLE TIKEUT-A -0xB4DA 0xB2E5 # HANGUL SYLLABLE TIKEUT-A-KIYEOK -0xB4DB 0xB2E6 # HANGUL SYLLABLE TIKEUT-A-SSANGKIYEOK -0xB4DC 0xB2E8 # HANGUL SYLLABLE TIKEUT-A-NIEUN -0xB4DD 0xB2EB # HANGUL SYLLABLE TIKEUT-A-TIKEUT -0xB4DE 0xB2EC # HANGUL SYLLABLE TIKEUT-A-RIEUL -0xB4DF 0xB2ED # HANGUL SYLLABLE TIKEUT-A-RIEULKIYEOK -0xB4E0 0xB2EE # HANGUL SYLLABLE TIKEUT-A-RIEULMIEUM -0xB4E1 0xB2EF # HANGUL SYLLABLE TIKEUT-A-RIEULPIEUP -0xB4E2 0xB2F3 # HANGUL SYLLABLE TIKEUT-A-RIEULHIEUH -0xB4E3 0xB2F4 # HANGUL SYLLABLE TIKEUT-A-MIEUM -0xB4E4 0xB2F5 # HANGUL SYLLABLE TIKEUT-A-PIEUP -0xB4E5 0xB2F7 # HANGUL SYLLABLE TIKEUT-A-SIOS -0xB4E6 0xB2F8 # HANGUL SYLLABLE TIKEUT-A-SSANGSIOS -0xB4E7 0xB2F9 # HANGUL SYLLABLE TIKEUT-A-IEUNG -0xB4E8 0xB2FA # HANGUL SYLLABLE TIKEUT-A-CIEUC -0xB4E9 0xB2FB # HANGUL SYLLABLE TIKEUT-A-CHIEUCH -0xB4EA 0xB2FF # HANGUL SYLLABLE TIKEUT-A-HIEUH -0xB4EB 0xB300 # HANGUL SYLLABLE TIKEUT-AE -0xB4EC 0xB301 # HANGUL SYLLABLE TIKEUT-AE-KIYEOK -0xB4ED 0xB304 # HANGUL SYLLABLE TIKEUT-AE-NIEUN -0xB4EE 0xB308 # HANGUL SYLLABLE TIKEUT-AE-RIEUL -0xB4EF 0xB310 # HANGUL SYLLABLE TIKEUT-AE-MIEUM -0xB4F0 0xB311 # HANGUL SYLLABLE TIKEUT-AE-PIEUP -0xB4F1 0xB313 # HANGUL SYLLABLE TIKEUT-AE-SIOS -0xB4F2 0xB314 # HANGUL SYLLABLE TIKEUT-AE-SSANGSIOS -0xB4F3 0xB315 # HANGUL SYLLABLE TIKEUT-AE-IEUNG -0xB4F4 0xB31C # HANGUL SYLLABLE TIKEUT-YA -0xB4F5 0xB354 # HANGUL SYLLABLE TIKEUT-EO -0xB4F6 0xB355 # HANGUL SYLLABLE TIKEUT-EO-KIYEOK -0xB4F7 0xB356 # HANGUL SYLLABLE TIKEUT-EO-SSANGKIYEOK -0xB4F8 0xB358 # HANGUL SYLLABLE TIKEUT-EO-NIEUN -0xB4F9 0xB35B # HANGUL SYLLABLE TIKEUT-EO-TIKEUT -0xB4FA 0xB35C # HANGUL SYLLABLE TIKEUT-EO-RIEUL -0xB4FB 0xB35E # HANGUL SYLLABLE TIKEUT-EO-RIEULMIEUM -0xB4FC 0xB35F # HANGUL SYLLABLE TIKEUT-EO-RIEULPIEUP -0xB4FD 0xB364 # HANGUL SYLLABLE TIKEUT-EO-MIEUM -0xB4FE 0xB365 # HANGUL SYLLABLE TIKEUT-EO-PIEUP -0xB541 0xD095 # HANGUL SYLLABLE KHIEUKH-YI-RIEULTHIEUTH -0xB542 0xD096 # HANGUL SYLLABLE KHIEUKH-YI-RIEULPHIEUPH -0xB543 0xD097 # HANGUL SYLLABLE KHIEUKH-YI-RIEULHIEUH -0xB544 0xD098 # HANGUL SYLLABLE KHIEUKH-YI-MIEUM -0xB545 0xD099 # HANGUL SYLLABLE KHIEUKH-YI-PIEUP -0xB546 0xD09A # HANGUL SYLLABLE KHIEUKH-YI-PIEUPSIOS -0xB547 0xD09B # HANGUL SYLLABLE KHIEUKH-YI-SIOS -0xB548 0xD09C # HANGUL SYLLABLE KHIEUKH-YI-SSANGSIOS -0xB549 0xD09D # HANGUL SYLLABLE KHIEUKH-YI-IEUNG -0xB54A 0xD09E # HANGUL SYLLABLE KHIEUKH-YI-CIEUC -0xB54B 0xD09F # HANGUL SYLLABLE KHIEUKH-YI-CHIEUCH -0xB54C 0xD0A0 # HANGUL SYLLABLE KHIEUKH-YI-KHIEUKH -0xB54D 0xD0A1 # HANGUL SYLLABLE KHIEUKH-YI-THIEUTH -0xB54E 0xD0A2 # HANGUL SYLLABLE KHIEUKH-YI-PHIEUPH -0xB54F 0xD0A3 # HANGUL SYLLABLE KHIEUKH-YI-HIEUH -0xB550 0xD0A6 # HANGUL SYLLABLE KHIEUKH-I-SSANGKIYEOK -0xB551 0xD0A7 # HANGUL SYLLABLE KHIEUKH-I-KIYEOKSIOS -0xB552 0xD0A9 # HANGUL SYLLABLE KHIEUKH-I-NIEUNCIEUC -0xB553 0xD0AA # HANGUL SYLLABLE KHIEUKH-I-NIEUNHIEUH -0xB554 0xD0AB # HANGUL SYLLABLE KHIEUKH-I-TIKEUT -0xB555 0xD0AD # HANGUL SYLLABLE KHIEUKH-I-RIEULKIYEOK -0xB556 0xD0AE # HANGUL SYLLABLE KHIEUKH-I-RIEULMIEUM -0xB557 0xD0AF # HANGUL SYLLABLE KHIEUKH-I-RIEULPIEUP -0xB558 0xD0B0 # HANGUL SYLLABLE KHIEUKH-I-RIEULSIOS -0xB559 0xD0B1 # HANGUL SYLLABLE KHIEUKH-I-RIEULTHIEUTH -0xB55A 0xD0B2 # HANGUL SYLLABLE KHIEUKH-I-RIEULPHIEUPH -0xB561 0xD0B3 # HANGUL SYLLABLE KHIEUKH-I-RIEULHIEUH -0xB562 0xD0B6 # HANGUL SYLLABLE KHIEUKH-I-PIEUPSIOS -0xB563 0xD0B8 # HANGUL SYLLABLE KHIEUKH-I-SSANGSIOS -0xB564 0xD0BA # HANGUL SYLLABLE KHIEUKH-I-CIEUC -0xB565 0xD0BB # HANGUL SYLLABLE KHIEUKH-I-CHIEUCH -0xB566 0xD0BC # HANGUL SYLLABLE KHIEUKH-I-KHIEUKH -0xB567 0xD0BD # HANGUL SYLLABLE KHIEUKH-I-THIEUTH -0xB568 0xD0BE # HANGUL SYLLABLE KHIEUKH-I-PHIEUPH -0xB569 0xD0BF # HANGUL SYLLABLE KHIEUKH-I-HIEUH -0xB56A 0xD0C2 # HANGUL SYLLABLE THIEUTH-A-SSANGKIYEOK -0xB56B 0xD0C3 # HANGUL SYLLABLE THIEUTH-A-KIYEOKSIOS -0xB56C 0xD0C5 # HANGUL SYLLABLE THIEUTH-A-NIEUNCIEUC -0xB56D 0xD0C6 # HANGUL SYLLABLE THIEUTH-A-NIEUNHIEUH -0xB56E 0xD0C7 # HANGUL SYLLABLE THIEUTH-A-TIKEUT -0xB56F 0xD0CA # HANGUL SYLLABLE THIEUTH-A-RIEULMIEUM -0xB570 0xD0CB # HANGUL SYLLABLE THIEUTH-A-RIEULPIEUP -0xB571 0xD0CC # HANGUL SYLLABLE THIEUTH-A-RIEULSIOS -0xB572 0xD0CD # HANGUL SYLLABLE THIEUTH-A-RIEULTHIEUTH -0xB573 0xD0CE # HANGUL SYLLABLE THIEUTH-A-RIEULPHIEUPH -0xB574 0xD0CF # HANGUL SYLLABLE THIEUTH-A-RIEULHIEUH -0xB575 0xD0D2 # HANGUL SYLLABLE THIEUTH-A-PIEUPSIOS -0xB576 0xD0D6 # HANGUL SYLLABLE THIEUTH-A-CIEUC -0xB577 0xD0D7 # HANGUL SYLLABLE THIEUTH-A-CHIEUCH -0xB578 0xD0D8 # HANGUL SYLLABLE THIEUTH-A-KHIEUKH -0xB579 0xD0D9 # HANGUL SYLLABLE THIEUTH-A-THIEUTH -0xB57A 0xD0DA # HANGUL SYLLABLE THIEUTH-A-PHIEUPH -0xB581 0xD0DB # HANGUL SYLLABLE THIEUTH-A-HIEUH -0xB582 0xD0DE # HANGUL SYLLABLE THIEUTH-AE-SSANGKIYEOK -0xB583 0xD0DF # HANGUL SYLLABLE THIEUTH-AE-KIYEOKSIOS -0xB584 0xD0E1 # HANGUL SYLLABLE THIEUTH-AE-NIEUNCIEUC -0xB585 0xD0E2 # HANGUL SYLLABLE THIEUTH-AE-NIEUNHIEUH -0xB586 0xD0E3 # HANGUL SYLLABLE THIEUTH-AE-TIKEUT -0xB587 0xD0E5 # HANGUL SYLLABLE THIEUTH-AE-RIEULKIYEOK -0xB588 0xD0E6 # HANGUL SYLLABLE THIEUTH-AE-RIEULMIEUM -0xB589 0xD0E7 # HANGUL SYLLABLE THIEUTH-AE-RIEULPIEUP -0xB58A 0xD0E8 # HANGUL SYLLABLE THIEUTH-AE-RIEULSIOS -0xB58B 0xD0E9 # HANGUL SYLLABLE THIEUTH-AE-RIEULTHIEUTH -0xB58C 0xD0EA # HANGUL SYLLABLE THIEUTH-AE-RIEULPHIEUPH -0xB58D 0xD0EB # HANGUL SYLLABLE THIEUTH-AE-RIEULHIEUH -0xB58E 0xD0EE # HANGUL SYLLABLE THIEUTH-AE-PIEUPSIOS -0xB58F 0xD0F2 # HANGUL SYLLABLE THIEUTH-AE-CIEUC -0xB590 0xD0F3 # HANGUL SYLLABLE THIEUTH-AE-CHIEUCH -0xB591 0xD0F4 # HANGUL SYLLABLE THIEUTH-AE-KHIEUKH -0xB592 0xD0F5 # HANGUL SYLLABLE THIEUTH-AE-THIEUTH -0xB593 0xD0F6 # HANGUL SYLLABLE THIEUTH-AE-PHIEUPH -0xB594 0xD0F7 # HANGUL SYLLABLE THIEUTH-AE-HIEUH -0xB595 0xD0F9 # HANGUL SYLLABLE THIEUTH-YA-KIYEOK -0xB596 0xD0FA # HANGUL SYLLABLE THIEUTH-YA-SSANGKIYEOK -0xB597 0xD0FB # HANGUL SYLLABLE THIEUTH-YA-KIYEOKSIOS -0xB598 0xD0FC # HANGUL SYLLABLE THIEUTH-YA-NIEUN -0xB599 0xD0FD # HANGUL SYLLABLE THIEUTH-YA-NIEUNCIEUC -0xB59A 0xD0FE # HANGUL SYLLABLE THIEUTH-YA-NIEUNHIEUH -0xB59B 0xD0FF # HANGUL SYLLABLE THIEUTH-YA-TIKEUT -0xB59C 0xD100 # HANGUL SYLLABLE THIEUTH-YA-RIEUL -0xB59D 0xD101 # HANGUL SYLLABLE THIEUTH-YA-RIEULKIYEOK -0xB59E 0xD102 # HANGUL SYLLABLE THIEUTH-YA-RIEULMIEUM -0xB59F 0xD103 # HANGUL SYLLABLE THIEUTH-YA-RIEULPIEUP -0xB5A0 0xD104 # HANGUL SYLLABLE THIEUTH-YA-RIEULSIOS -0xB5A1 0xB367 # HANGUL SYLLABLE TIKEUT-EO-SIOS -0xB5A2 0xB369 # HANGUL SYLLABLE TIKEUT-EO-IEUNG -0xB5A3 0xB36B # HANGUL SYLLABLE TIKEUT-EO-CHIEUCH -0xB5A4 0xB36E # HANGUL SYLLABLE TIKEUT-EO-PHIEUPH -0xB5A5 0xB370 # HANGUL SYLLABLE TIKEUT-E -0xB5A6 0xB371 # HANGUL SYLLABLE TIKEUT-E-KIYEOK -0xB5A7 0xB374 # HANGUL SYLLABLE TIKEUT-E-NIEUN -0xB5A8 0xB378 # HANGUL SYLLABLE TIKEUT-E-RIEUL -0xB5A9 0xB380 # HANGUL SYLLABLE TIKEUT-E-MIEUM -0xB5AA 0xB381 # HANGUL SYLLABLE TIKEUT-E-PIEUP -0xB5AB 0xB383 # HANGUL SYLLABLE TIKEUT-E-SIOS -0xB5AC 0xB384 # HANGUL SYLLABLE TIKEUT-E-SSANGSIOS -0xB5AD 0xB385 # HANGUL SYLLABLE TIKEUT-E-IEUNG -0xB5AE 0xB38C # HANGUL SYLLABLE TIKEUT-YEO -0xB5AF 0xB390 # HANGUL SYLLABLE TIKEUT-YEO-NIEUN -0xB5B0 0xB394 # HANGUL SYLLABLE TIKEUT-YEO-RIEUL -0xB5B1 0xB3A0 # HANGUL SYLLABLE TIKEUT-YEO-SSANGSIOS -0xB5B2 0xB3A1 # HANGUL SYLLABLE TIKEUT-YEO-IEUNG -0xB5B3 0xB3A8 # HANGUL SYLLABLE TIKEUT-YE -0xB5B4 0xB3AC # HANGUL SYLLABLE TIKEUT-YE-NIEUN -0xB5B5 0xB3C4 # HANGUL SYLLABLE TIKEUT-O -0xB5B6 0xB3C5 # HANGUL SYLLABLE TIKEUT-O-KIYEOK -0xB5B7 0xB3C8 # HANGUL SYLLABLE TIKEUT-O-NIEUN -0xB5B8 0xB3CB # HANGUL SYLLABLE TIKEUT-O-TIKEUT -0xB5B9 0xB3CC # HANGUL SYLLABLE TIKEUT-O-RIEUL -0xB5BA 0xB3CE # HANGUL SYLLABLE TIKEUT-O-RIEULMIEUM -0xB5BB 0xB3D0 # HANGUL SYLLABLE TIKEUT-O-RIEULSIOS -0xB5BC 0xB3D4 # HANGUL SYLLABLE TIKEUT-O-MIEUM -0xB5BD 0xB3D5 # HANGUL SYLLABLE TIKEUT-O-PIEUP -0xB5BE 0xB3D7 # HANGUL SYLLABLE TIKEUT-O-SIOS -0xB5BF 0xB3D9 # HANGUL SYLLABLE TIKEUT-O-IEUNG -0xB5C0 0xB3DB # HANGUL SYLLABLE TIKEUT-O-CHIEUCH -0xB5C1 0xB3DD # HANGUL SYLLABLE TIKEUT-O-THIEUTH -0xB5C2 0xB3E0 # HANGUL SYLLABLE TIKEUT-WA -0xB5C3 0xB3E4 # HANGUL SYLLABLE TIKEUT-WA-NIEUN -0xB5C4 0xB3E8 # HANGUL SYLLABLE TIKEUT-WA-RIEUL -0xB5C5 0xB3FC # HANGUL SYLLABLE TIKEUT-WAE -0xB5C6 0xB410 # HANGUL SYLLABLE TIKEUT-WAE-SSANGSIOS -0xB5C7 0xB418 # HANGUL SYLLABLE TIKEUT-OE -0xB5C8 0xB41C # HANGUL SYLLABLE TIKEUT-OE-NIEUN -0xB5C9 0xB420 # HANGUL SYLLABLE TIKEUT-OE-RIEUL -0xB5CA 0xB428 # HANGUL SYLLABLE TIKEUT-OE-MIEUM -0xB5CB 0xB429 # HANGUL SYLLABLE TIKEUT-OE-PIEUP -0xB5CC 0xB42B # HANGUL SYLLABLE TIKEUT-OE-SIOS -0xB5CD 0xB434 # HANGUL SYLLABLE TIKEUT-YO -0xB5CE 0xB450 # HANGUL SYLLABLE TIKEUT-U -0xB5CF 0xB451 # HANGUL SYLLABLE TIKEUT-U-KIYEOK -0xB5D0 0xB454 # HANGUL SYLLABLE TIKEUT-U-NIEUN -0xB5D1 0xB458 # HANGUL SYLLABLE TIKEUT-U-RIEUL -0xB5D2 0xB460 # HANGUL SYLLABLE TIKEUT-U-MIEUM -0xB5D3 0xB461 # HANGUL SYLLABLE TIKEUT-U-PIEUP -0xB5D4 0xB463 # HANGUL SYLLABLE TIKEUT-U-SIOS -0xB5D5 0xB465 # HANGUL SYLLABLE TIKEUT-U-IEUNG -0xB5D6 0xB46C # HANGUL SYLLABLE TIKEUT-WEO -0xB5D7 0xB480 # HANGUL SYLLABLE TIKEUT-WEO-SSANGSIOS -0xB5D8 0xB488 # HANGUL SYLLABLE TIKEUT-WE -0xB5D9 0xB49D # HANGUL SYLLABLE TIKEUT-WE-IEUNG -0xB5DA 0xB4A4 # HANGUL SYLLABLE TIKEUT-WI -0xB5DB 0xB4A8 # HANGUL SYLLABLE TIKEUT-WI-NIEUN -0xB5DC 0xB4AC # HANGUL SYLLABLE TIKEUT-WI-RIEUL -0xB5DD 0xB4B5 # HANGUL SYLLABLE TIKEUT-WI-PIEUP -0xB5DE 0xB4B7 # HANGUL SYLLABLE TIKEUT-WI-SIOS -0xB5DF 0xB4B9 # HANGUL SYLLABLE TIKEUT-WI-IEUNG -0xB5E0 0xB4C0 # HANGUL SYLLABLE TIKEUT-YU -0xB5E1 0xB4C4 # HANGUL SYLLABLE TIKEUT-YU-NIEUN -0xB5E2 0xB4C8 # HANGUL SYLLABLE TIKEUT-YU-RIEUL -0xB5E3 0xB4D0 # HANGUL SYLLABLE TIKEUT-YU-MIEUM -0xB5E4 0xB4D5 # HANGUL SYLLABLE TIKEUT-YU-IEUNG -0xB5E5 0xB4DC # HANGUL SYLLABLE TIKEUT-EU -0xB5E6 0xB4DD # HANGUL SYLLABLE TIKEUT-EU-KIYEOK -0xB5E7 0xB4E0 # HANGUL SYLLABLE TIKEUT-EU-NIEUN -0xB5E8 0xB4E3 # HANGUL SYLLABLE TIKEUT-EU-TIKEUT -0xB5E9 0xB4E4 # HANGUL SYLLABLE TIKEUT-EU-RIEUL -0xB5EA 0xB4E6 # HANGUL SYLLABLE TIKEUT-EU-RIEULMIEUM -0xB5EB 0xB4EC # HANGUL SYLLABLE TIKEUT-EU-MIEUM -0xB5EC 0xB4ED # HANGUL SYLLABLE TIKEUT-EU-PIEUP -0xB5ED 0xB4EF # HANGUL SYLLABLE TIKEUT-EU-SIOS -0xB5EE 0xB4F1 # HANGUL SYLLABLE TIKEUT-EU-IEUNG -0xB5EF 0xB4F8 # HANGUL SYLLABLE TIKEUT-YI -0xB5F0 0xB514 # HANGUL SYLLABLE TIKEUT-I -0xB5F1 0xB515 # HANGUL SYLLABLE TIKEUT-I-KIYEOK -0xB5F2 0xB518 # HANGUL SYLLABLE TIKEUT-I-NIEUN -0xB5F3 0xB51B # HANGUL SYLLABLE TIKEUT-I-TIKEUT -0xB5F4 0xB51C # HANGUL SYLLABLE TIKEUT-I-RIEUL -0xB5F5 0xB524 # HANGUL SYLLABLE TIKEUT-I-MIEUM -0xB5F6 0xB525 # HANGUL SYLLABLE TIKEUT-I-PIEUP -0xB5F7 0xB527 # HANGUL SYLLABLE TIKEUT-I-SIOS -0xB5F8 0xB528 # HANGUL SYLLABLE TIKEUT-I-SSANGSIOS -0xB5F9 0xB529 # HANGUL SYLLABLE TIKEUT-I-IEUNG -0xB5FA 0xB52A # HANGUL SYLLABLE TIKEUT-I-CIEUC -0xB5FB 0xB530 # HANGUL SYLLABLE SSANGTIKEUT-A -0xB5FC 0xB531 # HANGUL SYLLABLE SSANGTIKEUT-A-KIYEOK -0xB5FD 0xB534 # HANGUL SYLLABLE SSANGTIKEUT-A-NIEUN -0xB5FE 0xB538 # HANGUL SYLLABLE SSANGTIKEUT-A-RIEUL -0xB641 0xD105 # HANGUL SYLLABLE THIEUTH-YA-RIEULTHIEUTH -0xB642 0xD106 # HANGUL SYLLABLE THIEUTH-YA-RIEULPHIEUPH -0xB643 0xD107 # HANGUL SYLLABLE THIEUTH-YA-RIEULHIEUH -0xB644 0xD108 # HANGUL SYLLABLE THIEUTH-YA-MIEUM -0xB645 0xD109 # HANGUL SYLLABLE THIEUTH-YA-PIEUP -0xB646 0xD10A # HANGUL SYLLABLE THIEUTH-YA-PIEUPSIOS -0xB647 0xD10B # HANGUL SYLLABLE THIEUTH-YA-SIOS -0xB648 0xD10C # HANGUL SYLLABLE THIEUTH-YA-SSANGSIOS -0xB649 0xD10E # HANGUL SYLLABLE THIEUTH-YA-CIEUC -0xB64A 0xD10F # HANGUL SYLLABLE THIEUTH-YA-CHIEUCH -0xB64B 0xD110 # HANGUL SYLLABLE THIEUTH-YA-KHIEUKH -0xB64C 0xD111 # HANGUL SYLLABLE THIEUTH-YA-THIEUTH -0xB64D 0xD112 # HANGUL SYLLABLE THIEUTH-YA-PHIEUPH -0xB64E 0xD113 # HANGUL SYLLABLE THIEUTH-YA-HIEUH -0xB64F 0xD114 # HANGUL SYLLABLE THIEUTH-YAE -0xB650 0xD115 # HANGUL SYLLABLE THIEUTH-YAE-KIYEOK -0xB651 0xD116 # HANGUL SYLLABLE THIEUTH-YAE-SSANGKIYEOK -0xB652 0xD117 # HANGUL SYLLABLE THIEUTH-YAE-KIYEOKSIOS -0xB653 0xD118 # HANGUL SYLLABLE THIEUTH-YAE-NIEUN -0xB654 0xD119 # HANGUL SYLLABLE THIEUTH-YAE-NIEUNCIEUC -0xB655 0xD11A # HANGUL SYLLABLE THIEUTH-YAE-NIEUNHIEUH -0xB656 0xD11B # HANGUL SYLLABLE THIEUTH-YAE-TIKEUT -0xB657 0xD11C # HANGUL SYLLABLE THIEUTH-YAE-RIEUL -0xB658 0xD11D # HANGUL SYLLABLE THIEUTH-YAE-RIEULKIYEOK -0xB659 0xD11E # HANGUL SYLLABLE THIEUTH-YAE-RIEULMIEUM -0xB65A 0xD11F # HANGUL SYLLABLE THIEUTH-YAE-RIEULPIEUP -0xB661 0xD120 # HANGUL SYLLABLE THIEUTH-YAE-RIEULSIOS -0xB662 0xD121 # HANGUL SYLLABLE THIEUTH-YAE-RIEULTHIEUTH -0xB663 0xD122 # HANGUL SYLLABLE THIEUTH-YAE-RIEULPHIEUPH -0xB664 0xD123 # HANGUL SYLLABLE THIEUTH-YAE-RIEULHIEUH -0xB665 0xD124 # HANGUL SYLLABLE THIEUTH-YAE-MIEUM -0xB666 0xD125 # HANGUL SYLLABLE THIEUTH-YAE-PIEUP -0xB667 0xD126 # HANGUL SYLLABLE THIEUTH-YAE-PIEUPSIOS -0xB668 0xD127 # HANGUL SYLLABLE THIEUTH-YAE-SIOS -0xB669 0xD128 # HANGUL SYLLABLE THIEUTH-YAE-SSANGSIOS -0xB66A 0xD129 # HANGUL SYLLABLE THIEUTH-YAE-IEUNG -0xB66B 0xD12A # HANGUL SYLLABLE THIEUTH-YAE-CIEUC -0xB66C 0xD12B # HANGUL SYLLABLE THIEUTH-YAE-CHIEUCH -0xB66D 0xD12C # HANGUL SYLLABLE THIEUTH-YAE-KHIEUKH -0xB66E 0xD12D # HANGUL SYLLABLE THIEUTH-YAE-THIEUTH -0xB66F 0xD12E # HANGUL SYLLABLE THIEUTH-YAE-PHIEUPH -0xB670 0xD12F # HANGUL SYLLABLE THIEUTH-YAE-HIEUH -0xB671 0xD132 # HANGUL SYLLABLE THIEUTH-EO-SSANGKIYEOK -0xB672 0xD133 # HANGUL SYLLABLE THIEUTH-EO-KIYEOKSIOS -0xB673 0xD135 # HANGUL SYLLABLE THIEUTH-EO-NIEUNCIEUC -0xB674 0xD136 # HANGUL SYLLABLE THIEUTH-EO-NIEUNHIEUH -0xB675 0xD137 # HANGUL SYLLABLE THIEUTH-EO-TIKEUT -0xB676 0xD139 # HANGUL SYLLABLE THIEUTH-EO-RIEULKIYEOK -0xB677 0xD13B # HANGUL SYLLABLE THIEUTH-EO-RIEULPIEUP -0xB678 0xD13C # HANGUL SYLLABLE THIEUTH-EO-RIEULSIOS -0xB679 0xD13D # HANGUL SYLLABLE THIEUTH-EO-RIEULTHIEUTH -0xB67A 0xD13E # HANGUL SYLLABLE THIEUTH-EO-RIEULPHIEUPH -0xB681 0xD13F # HANGUL SYLLABLE THIEUTH-EO-RIEULHIEUH -0xB682 0xD142 # HANGUL SYLLABLE THIEUTH-EO-PIEUPSIOS -0xB683 0xD146 # HANGUL SYLLABLE THIEUTH-EO-CIEUC -0xB684 0xD147 # HANGUL SYLLABLE THIEUTH-EO-CHIEUCH -0xB685 0xD148 # HANGUL SYLLABLE THIEUTH-EO-KHIEUKH -0xB686 0xD149 # HANGUL SYLLABLE THIEUTH-EO-THIEUTH -0xB687 0xD14A # HANGUL SYLLABLE THIEUTH-EO-PHIEUPH -0xB688 0xD14B # HANGUL SYLLABLE THIEUTH-EO-HIEUH -0xB689 0xD14E # HANGUL SYLLABLE THIEUTH-E-SSANGKIYEOK -0xB68A 0xD14F # HANGUL SYLLABLE THIEUTH-E-KIYEOKSIOS -0xB68B 0xD151 # HANGUL SYLLABLE THIEUTH-E-NIEUNCIEUC -0xB68C 0xD152 # HANGUL SYLLABLE THIEUTH-E-NIEUNHIEUH -0xB68D 0xD153 # HANGUL SYLLABLE THIEUTH-E-TIKEUT -0xB68E 0xD155 # HANGUL SYLLABLE THIEUTH-E-RIEULKIYEOK -0xB68F 0xD156 # HANGUL SYLLABLE THIEUTH-E-RIEULMIEUM -0xB690 0xD157 # HANGUL SYLLABLE THIEUTH-E-RIEULPIEUP -0xB691 0xD158 # HANGUL SYLLABLE THIEUTH-E-RIEULSIOS -0xB692 0xD159 # HANGUL SYLLABLE THIEUTH-E-RIEULTHIEUTH -0xB693 0xD15A # HANGUL SYLLABLE THIEUTH-E-RIEULPHIEUPH -0xB694 0xD15B # HANGUL SYLLABLE THIEUTH-E-RIEULHIEUH -0xB695 0xD15E # HANGUL SYLLABLE THIEUTH-E-PIEUPSIOS -0xB696 0xD160 # HANGUL SYLLABLE THIEUTH-E-SSANGSIOS -0xB697 0xD162 # HANGUL SYLLABLE THIEUTH-E-CIEUC -0xB698 0xD163 # HANGUL SYLLABLE THIEUTH-E-CHIEUCH -0xB699 0xD164 # HANGUL SYLLABLE THIEUTH-E-KHIEUKH -0xB69A 0xD165 # HANGUL SYLLABLE THIEUTH-E-THIEUTH -0xB69B 0xD166 # HANGUL SYLLABLE THIEUTH-E-PHIEUPH -0xB69C 0xD167 # HANGUL SYLLABLE THIEUTH-E-HIEUH -0xB69D 0xD169 # HANGUL SYLLABLE THIEUTH-YEO-KIYEOK -0xB69E 0xD16A # HANGUL SYLLABLE THIEUTH-YEO-SSANGKIYEOK -0xB69F 0xD16B # HANGUL SYLLABLE THIEUTH-YEO-KIYEOKSIOS -0xB6A0 0xD16D # HANGUL SYLLABLE THIEUTH-YEO-NIEUNCIEUC -0xB6A1 0xB540 # HANGUL SYLLABLE SSANGTIKEUT-A-MIEUM -0xB6A2 0xB541 # HANGUL SYLLABLE SSANGTIKEUT-A-PIEUP -0xB6A3 0xB543 # HANGUL SYLLABLE SSANGTIKEUT-A-SIOS -0xB6A4 0xB544 # HANGUL SYLLABLE SSANGTIKEUT-A-SSANGSIOS -0xB6A5 0xB545 # HANGUL SYLLABLE SSANGTIKEUT-A-IEUNG -0xB6A6 0xB54B # HANGUL SYLLABLE SSANGTIKEUT-A-HIEUH -0xB6A7 0xB54C # HANGUL SYLLABLE SSANGTIKEUT-AE -0xB6A8 0xB54D # HANGUL SYLLABLE SSANGTIKEUT-AE-KIYEOK -0xB6A9 0xB550 # HANGUL SYLLABLE SSANGTIKEUT-AE-NIEUN -0xB6AA 0xB554 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEUL -0xB6AB 0xB55C # HANGUL SYLLABLE SSANGTIKEUT-AE-MIEUM -0xB6AC 0xB55D # HANGUL SYLLABLE SSANGTIKEUT-AE-PIEUP -0xB6AD 0xB55F # HANGUL SYLLABLE SSANGTIKEUT-AE-SIOS -0xB6AE 0xB560 # HANGUL SYLLABLE SSANGTIKEUT-AE-SSANGSIOS -0xB6AF 0xB561 # HANGUL SYLLABLE SSANGTIKEUT-AE-IEUNG -0xB6B0 0xB5A0 # HANGUL SYLLABLE SSANGTIKEUT-EO -0xB6B1 0xB5A1 # HANGUL SYLLABLE SSANGTIKEUT-EO-KIYEOK -0xB6B2 0xB5A4 # HANGUL SYLLABLE SSANGTIKEUT-EO-NIEUN -0xB6B3 0xB5A8 # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEUL -0xB6B4 0xB5AA # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULMIEUM -0xB6B5 0xB5AB # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULPIEUP -0xB6B6 0xB5B0 # HANGUL SYLLABLE SSANGTIKEUT-EO-MIEUM -0xB6B7 0xB5B1 # HANGUL SYLLABLE SSANGTIKEUT-EO-PIEUP -0xB6B8 0xB5B3 # HANGUL SYLLABLE SSANGTIKEUT-EO-SIOS -0xB6B9 0xB5B4 # HANGUL SYLLABLE SSANGTIKEUT-EO-SSANGSIOS -0xB6BA 0xB5B5 # HANGUL SYLLABLE SSANGTIKEUT-EO-IEUNG -0xB6BB 0xB5BB # HANGUL SYLLABLE SSANGTIKEUT-EO-HIEUH -0xB6BC 0xB5BC # HANGUL SYLLABLE SSANGTIKEUT-E -0xB6BD 0xB5BD # HANGUL SYLLABLE SSANGTIKEUT-E-KIYEOK -0xB6BE 0xB5C0 # HANGUL SYLLABLE SSANGTIKEUT-E-NIEUN -0xB6BF 0xB5C4 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEUL -0xB6C0 0xB5CC # HANGUL SYLLABLE SSANGTIKEUT-E-MIEUM -0xB6C1 0xB5CD # HANGUL SYLLABLE SSANGTIKEUT-E-PIEUP -0xB6C2 0xB5CF # HANGUL SYLLABLE SSANGTIKEUT-E-SIOS -0xB6C3 0xB5D0 # HANGUL SYLLABLE SSANGTIKEUT-E-SSANGSIOS -0xB6C4 0xB5D1 # HANGUL SYLLABLE SSANGTIKEUT-E-IEUNG -0xB6C5 0xB5D8 # HANGUL SYLLABLE SSANGTIKEUT-YEO -0xB6C6 0xB5EC # HANGUL SYLLABLE SSANGTIKEUT-YEO-SSANGSIOS -0xB6C7 0xB610 # HANGUL SYLLABLE SSANGTIKEUT-O -0xB6C8 0xB611 # HANGUL SYLLABLE SSANGTIKEUT-O-KIYEOK -0xB6C9 0xB614 # HANGUL SYLLABLE SSANGTIKEUT-O-NIEUN -0xB6CA 0xB618 # HANGUL SYLLABLE SSANGTIKEUT-O-RIEUL -0xB6CB 0xB625 # HANGUL SYLLABLE SSANGTIKEUT-O-IEUNG -0xB6CC 0xB62C # HANGUL SYLLABLE SSANGTIKEUT-WA -0xB6CD 0xB634 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEUL -0xB6CE 0xB648 # HANGUL SYLLABLE SSANGTIKEUT-WAE -0xB6CF 0xB664 # HANGUL SYLLABLE SSANGTIKEUT-OE -0xB6D0 0xB668 # HANGUL SYLLABLE SSANGTIKEUT-OE-NIEUN -0xB6D1 0xB69C # HANGUL SYLLABLE SSANGTIKEUT-U -0xB6D2 0xB69D # HANGUL SYLLABLE SSANGTIKEUT-U-KIYEOK -0xB6D3 0xB6A0 # HANGUL SYLLABLE SSANGTIKEUT-U-NIEUN -0xB6D4 0xB6A4 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEUL -0xB6D5 0xB6AB # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULHIEUH -0xB6D6 0xB6AC # HANGUL SYLLABLE SSANGTIKEUT-U-MIEUM -0xB6D7 0xB6B1 # HANGUL SYLLABLE SSANGTIKEUT-U-IEUNG -0xB6D8 0xB6D4 # HANGUL SYLLABLE SSANGTIKEUT-WE -0xB6D9 0xB6F0 # HANGUL SYLLABLE SSANGTIKEUT-WI -0xB6DA 0xB6F4 # HANGUL SYLLABLE SSANGTIKEUT-WI-NIEUN -0xB6DB 0xB6F8 # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEUL -0xB6DC 0xB700 # HANGUL SYLLABLE SSANGTIKEUT-WI-MIEUM -0xB6DD 0xB701 # HANGUL SYLLABLE SSANGTIKEUT-WI-PIEUP -0xB6DE 0xB705 # HANGUL SYLLABLE SSANGTIKEUT-WI-IEUNG -0xB6DF 0xB728 # HANGUL SYLLABLE SSANGTIKEUT-EU -0xB6E0 0xB729 # HANGUL SYLLABLE SSANGTIKEUT-EU-KIYEOK -0xB6E1 0xB72C # HANGUL SYLLABLE SSANGTIKEUT-EU-NIEUN -0xB6E2 0xB72F # HANGUL SYLLABLE SSANGTIKEUT-EU-TIKEUT -0xB6E3 0xB730 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEUL -0xB6E4 0xB738 # HANGUL SYLLABLE SSANGTIKEUT-EU-MIEUM -0xB6E5 0xB739 # HANGUL SYLLABLE SSANGTIKEUT-EU-PIEUP -0xB6E6 0xB73B # HANGUL SYLLABLE SSANGTIKEUT-EU-SIOS -0xB6E7 0xB744 # HANGUL SYLLABLE SSANGTIKEUT-YI -0xB6E8 0xB748 # HANGUL SYLLABLE SSANGTIKEUT-YI-NIEUN -0xB6E9 0xB74C # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEUL -0xB6EA 0xB754 # HANGUL SYLLABLE SSANGTIKEUT-YI-MIEUM -0xB6EB 0xB755 # HANGUL SYLLABLE SSANGTIKEUT-YI-PIEUP -0xB6EC 0xB760 # HANGUL SYLLABLE SSANGTIKEUT-I -0xB6ED 0xB764 # HANGUL SYLLABLE SSANGTIKEUT-I-NIEUN -0xB6EE 0xB768 # HANGUL SYLLABLE SSANGTIKEUT-I-RIEUL -0xB6EF 0xB770 # HANGUL SYLLABLE SSANGTIKEUT-I-MIEUM -0xB6F0 0xB771 # HANGUL SYLLABLE SSANGTIKEUT-I-PIEUP -0xB6F1 0xB773 # HANGUL SYLLABLE SSANGTIKEUT-I-SIOS -0xB6F2 0xB775 # HANGUL SYLLABLE SSANGTIKEUT-I-IEUNG -0xB6F3 0xB77C # HANGUL SYLLABLE RIEUL-A -0xB6F4 0xB77D # HANGUL SYLLABLE RIEUL-A-KIYEOK -0xB6F5 0xB780 # HANGUL SYLLABLE RIEUL-A-NIEUN -0xB6F6 0xB784 # HANGUL SYLLABLE RIEUL-A-RIEUL -0xB6F7 0xB78C # HANGUL SYLLABLE RIEUL-A-MIEUM -0xB6F8 0xB78D # HANGUL SYLLABLE RIEUL-A-PIEUP -0xB6F9 0xB78F # HANGUL SYLLABLE RIEUL-A-SIOS -0xB6FA 0xB790 # HANGUL SYLLABLE RIEUL-A-SSANGSIOS -0xB6FB 0xB791 # HANGUL SYLLABLE RIEUL-A-IEUNG -0xB6FC 0xB792 # HANGUL SYLLABLE RIEUL-A-CIEUC -0xB6FD 0xB796 # HANGUL SYLLABLE RIEUL-A-PHIEUPH -0xB6FE 0xB797 # HANGUL SYLLABLE RIEUL-A-HIEUH -0xB741 0xD16E # HANGUL SYLLABLE THIEUTH-YEO-NIEUNHIEUH -0xB742 0xD16F # HANGUL SYLLABLE THIEUTH-YEO-TIKEUT -0xB743 0xD170 # HANGUL SYLLABLE THIEUTH-YEO-RIEUL -0xB744 0xD171 # HANGUL SYLLABLE THIEUTH-YEO-RIEULKIYEOK -0xB745 0xD172 # HANGUL SYLLABLE THIEUTH-YEO-RIEULMIEUM -0xB746 0xD173 # HANGUL SYLLABLE THIEUTH-YEO-RIEULPIEUP -0xB747 0xD174 # HANGUL SYLLABLE THIEUTH-YEO-RIEULSIOS -0xB748 0xD175 # HANGUL SYLLABLE THIEUTH-YEO-RIEULTHIEUTH -0xB749 0xD176 # HANGUL SYLLABLE THIEUTH-YEO-RIEULPHIEUPH -0xB74A 0xD177 # HANGUL SYLLABLE THIEUTH-YEO-RIEULHIEUH -0xB74B 0xD178 # HANGUL SYLLABLE THIEUTH-YEO-MIEUM -0xB74C 0xD179 # HANGUL SYLLABLE THIEUTH-YEO-PIEUP -0xB74D 0xD17A # HANGUL SYLLABLE THIEUTH-YEO-PIEUPSIOS -0xB74E 0xD17B # HANGUL SYLLABLE THIEUTH-YEO-SIOS -0xB74F 0xD17D # HANGUL SYLLABLE THIEUTH-YEO-IEUNG -0xB750 0xD17E # HANGUL SYLLABLE THIEUTH-YEO-CIEUC -0xB751 0xD17F # HANGUL SYLLABLE THIEUTH-YEO-CHIEUCH -0xB752 0xD180 # HANGUL SYLLABLE THIEUTH-YEO-KHIEUKH -0xB753 0xD181 # HANGUL SYLLABLE THIEUTH-YEO-THIEUTH -0xB754 0xD182 # HANGUL SYLLABLE THIEUTH-YEO-PHIEUPH -0xB755 0xD183 # HANGUL SYLLABLE THIEUTH-YEO-HIEUH -0xB756 0xD185 # HANGUL SYLLABLE THIEUTH-YE-KIYEOK -0xB757 0xD186 # HANGUL SYLLABLE THIEUTH-YE-SSANGKIYEOK -0xB758 0xD187 # HANGUL SYLLABLE THIEUTH-YE-KIYEOKSIOS -0xB759 0xD189 # HANGUL SYLLABLE THIEUTH-YE-NIEUNCIEUC -0xB75A 0xD18A # HANGUL SYLLABLE THIEUTH-YE-NIEUNHIEUH -0xB761 0xD18B # HANGUL SYLLABLE THIEUTH-YE-TIKEUT -0xB762 0xD18C # HANGUL SYLLABLE THIEUTH-YE-RIEUL -0xB763 0xD18D # HANGUL SYLLABLE THIEUTH-YE-RIEULKIYEOK -0xB764 0xD18E # HANGUL SYLLABLE THIEUTH-YE-RIEULMIEUM -0xB765 0xD18F # HANGUL SYLLABLE THIEUTH-YE-RIEULPIEUP -0xB766 0xD190 # HANGUL SYLLABLE THIEUTH-YE-RIEULSIOS -0xB767 0xD191 # HANGUL SYLLABLE THIEUTH-YE-RIEULTHIEUTH -0xB768 0xD192 # HANGUL SYLLABLE THIEUTH-YE-RIEULPHIEUPH -0xB769 0xD193 # HANGUL SYLLABLE THIEUTH-YE-RIEULHIEUH -0xB76A 0xD194 # HANGUL SYLLABLE THIEUTH-YE-MIEUM -0xB76B 0xD195 # HANGUL SYLLABLE THIEUTH-YE-PIEUP -0xB76C 0xD196 # HANGUL SYLLABLE THIEUTH-YE-PIEUPSIOS -0xB76D 0xD197 # HANGUL SYLLABLE THIEUTH-YE-SIOS -0xB76E 0xD198 # HANGUL SYLLABLE THIEUTH-YE-SSANGSIOS -0xB76F 0xD199 # HANGUL SYLLABLE THIEUTH-YE-IEUNG -0xB770 0xD19A # HANGUL SYLLABLE THIEUTH-YE-CIEUC -0xB771 0xD19B # HANGUL SYLLABLE THIEUTH-YE-CHIEUCH -0xB772 0xD19C # HANGUL SYLLABLE THIEUTH-YE-KHIEUKH -0xB773 0xD19D # HANGUL SYLLABLE THIEUTH-YE-THIEUTH -0xB774 0xD19E # HANGUL SYLLABLE THIEUTH-YE-PHIEUPH -0xB775 0xD19F # HANGUL SYLLABLE THIEUTH-YE-HIEUH -0xB776 0xD1A2 # HANGUL SYLLABLE THIEUTH-O-SSANGKIYEOK -0xB777 0xD1A3 # HANGUL SYLLABLE THIEUTH-O-KIYEOKSIOS -0xB778 0xD1A5 # HANGUL SYLLABLE THIEUTH-O-NIEUNCIEUC -0xB779 0xD1A6 # HANGUL SYLLABLE THIEUTH-O-NIEUNHIEUH -0xB77A 0xD1A7 # HANGUL SYLLABLE THIEUTH-O-TIKEUT -0xB781 0xD1A9 # HANGUL SYLLABLE THIEUTH-O-RIEULKIYEOK -0xB782 0xD1AA # HANGUL SYLLABLE THIEUTH-O-RIEULMIEUM -0xB783 0xD1AB # HANGUL SYLLABLE THIEUTH-O-RIEULPIEUP -0xB784 0xD1AC # HANGUL SYLLABLE THIEUTH-O-RIEULSIOS -0xB785 0xD1AD # HANGUL SYLLABLE THIEUTH-O-RIEULTHIEUTH -0xB786 0xD1AE # HANGUL SYLLABLE THIEUTH-O-RIEULPHIEUPH -0xB787 0xD1AF # HANGUL SYLLABLE THIEUTH-O-RIEULHIEUH -0xB788 0xD1B2 # HANGUL SYLLABLE THIEUTH-O-PIEUPSIOS -0xB789 0xD1B4 # HANGUL SYLLABLE THIEUTH-O-SSANGSIOS -0xB78A 0xD1B6 # HANGUL SYLLABLE THIEUTH-O-CIEUC -0xB78B 0xD1B7 # HANGUL SYLLABLE THIEUTH-O-CHIEUCH -0xB78C 0xD1B8 # HANGUL SYLLABLE THIEUTH-O-KHIEUKH -0xB78D 0xD1B9 # HANGUL SYLLABLE THIEUTH-O-THIEUTH -0xB78E 0xD1BB # HANGUL SYLLABLE THIEUTH-O-HIEUH -0xB78F 0xD1BD # HANGUL SYLLABLE THIEUTH-WA-KIYEOK -0xB790 0xD1BE # HANGUL SYLLABLE THIEUTH-WA-SSANGKIYEOK -0xB791 0xD1BF # HANGUL SYLLABLE THIEUTH-WA-KIYEOKSIOS -0xB792 0xD1C1 # HANGUL SYLLABLE THIEUTH-WA-NIEUNCIEUC -0xB793 0xD1C2 # HANGUL SYLLABLE THIEUTH-WA-NIEUNHIEUH -0xB794 0xD1C3 # HANGUL SYLLABLE THIEUTH-WA-TIKEUT -0xB795 0xD1C4 # HANGUL SYLLABLE THIEUTH-WA-RIEUL -0xB796 0xD1C5 # HANGUL SYLLABLE THIEUTH-WA-RIEULKIYEOK -0xB797 0xD1C6 # HANGUL SYLLABLE THIEUTH-WA-RIEULMIEUM -0xB798 0xD1C7 # HANGUL SYLLABLE THIEUTH-WA-RIEULPIEUP -0xB799 0xD1C8 # HANGUL SYLLABLE THIEUTH-WA-RIEULSIOS -0xB79A 0xD1C9 # HANGUL SYLLABLE THIEUTH-WA-RIEULTHIEUTH -0xB79B 0xD1CA # HANGUL SYLLABLE THIEUTH-WA-RIEULPHIEUPH -0xB79C 0xD1CB # HANGUL SYLLABLE THIEUTH-WA-RIEULHIEUH -0xB79D 0xD1CC # HANGUL SYLLABLE THIEUTH-WA-MIEUM -0xB79E 0xD1CD # HANGUL SYLLABLE THIEUTH-WA-PIEUP -0xB79F 0xD1CE # HANGUL SYLLABLE THIEUTH-WA-PIEUPSIOS -0xB7A0 0xD1CF # HANGUL SYLLABLE THIEUTH-WA-SIOS -0xB7A1 0xB798 # HANGUL SYLLABLE RIEUL-AE -0xB7A2 0xB799 # HANGUL SYLLABLE RIEUL-AE-KIYEOK -0xB7A3 0xB79C # HANGUL SYLLABLE RIEUL-AE-NIEUN -0xB7A4 0xB7A0 # HANGUL SYLLABLE RIEUL-AE-RIEUL -0xB7A5 0xB7A8 # HANGUL SYLLABLE RIEUL-AE-MIEUM -0xB7A6 0xB7A9 # HANGUL SYLLABLE RIEUL-AE-PIEUP -0xB7A7 0xB7AB # HANGUL SYLLABLE RIEUL-AE-SIOS -0xB7A8 0xB7AC # HANGUL SYLLABLE RIEUL-AE-SSANGSIOS -0xB7A9 0xB7AD # HANGUL SYLLABLE RIEUL-AE-IEUNG -0xB7AA 0xB7B4 # HANGUL SYLLABLE RIEUL-YA -0xB7AB 0xB7B5 # HANGUL SYLLABLE RIEUL-YA-KIYEOK -0xB7AC 0xB7B8 # HANGUL SYLLABLE RIEUL-YA-NIEUN -0xB7AD 0xB7C7 # HANGUL SYLLABLE RIEUL-YA-SIOS -0xB7AE 0xB7C9 # HANGUL SYLLABLE RIEUL-YA-IEUNG -0xB7AF 0xB7EC # HANGUL SYLLABLE RIEUL-EO -0xB7B0 0xB7ED # HANGUL SYLLABLE RIEUL-EO-KIYEOK -0xB7B1 0xB7F0 # HANGUL SYLLABLE RIEUL-EO-NIEUN -0xB7B2 0xB7F4 # HANGUL SYLLABLE RIEUL-EO-RIEUL -0xB7B3 0xB7FC # HANGUL SYLLABLE RIEUL-EO-MIEUM -0xB7B4 0xB7FD # HANGUL SYLLABLE RIEUL-EO-PIEUP -0xB7B5 0xB7FF # HANGUL SYLLABLE RIEUL-EO-SIOS -0xB7B6 0xB800 # HANGUL SYLLABLE RIEUL-EO-SSANGSIOS -0xB7B7 0xB801 # HANGUL SYLLABLE RIEUL-EO-IEUNG -0xB7B8 0xB807 # HANGUL SYLLABLE RIEUL-EO-HIEUH -0xB7B9 0xB808 # HANGUL SYLLABLE RIEUL-E -0xB7BA 0xB809 # HANGUL SYLLABLE RIEUL-E-KIYEOK -0xB7BB 0xB80C # HANGUL SYLLABLE RIEUL-E-NIEUN -0xB7BC 0xB810 # HANGUL SYLLABLE RIEUL-E-RIEUL -0xB7BD 0xB818 # HANGUL SYLLABLE RIEUL-E-MIEUM -0xB7BE 0xB819 # HANGUL SYLLABLE RIEUL-E-PIEUP -0xB7BF 0xB81B # HANGUL SYLLABLE RIEUL-E-SIOS -0xB7C0 0xB81D # HANGUL SYLLABLE RIEUL-E-IEUNG -0xB7C1 0xB824 # HANGUL SYLLABLE RIEUL-YEO -0xB7C2 0xB825 # HANGUL SYLLABLE RIEUL-YEO-KIYEOK -0xB7C3 0xB828 # HANGUL SYLLABLE RIEUL-YEO-NIEUN -0xB7C4 0xB82C # HANGUL SYLLABLE RIEUL-YEO-RIEUL -0xB7C5 0xB834 # HANGUL SYLLABLE RIEUL-YEO-MIEUM -0xB7C6 0xB835 # HANGUL SYLLABLE RIEUL-YEO-PIEUP -0xB7C7 0xB837 # HANGUL SYLLABLE RIEUL-YEO-SIOS -0xB7C8 0xB838 # HANGUL SYLLABLE RIEUL-YEO-SSANGSIOS -0xB7C9 0xB839 # HANGUL SYLLABLE RIEUL-YEO-IEUNG -0xB7CA 0xB840 # HANGUL SYLLABLE RIEUL-YE -0xB7CB 0xB844 # HANGUL SYLLABLE RIEUL-YE-NIEUN -0xB7CC 0xB851 # HANGUL SYLLABLE RIEUL-YE-PIEUP -0xB7CD 0xB853 # HANGUL SYLLABLE RIEUL-YE-SIOS -0xB7CE 0xB85C # HANGUL SYLLABLE RIEUL-O -0xB7CF 0xB85D # HANGUL SYLLABLE RIEUL-O-KIYEOK -0xB7D0 0xB860 # HANGUL SYLLABLE RIEUL-O-NIEUN -0xB7D1 0xB864 # HANGUL SYLLABLE RIEUL-O-RIEUL -0xB7D2 0xB86C # HANGUL SYLLABLE RIEUL-O-MIEUM -0xB7D3 0xB86D # HANGUL SYLLABLE RIEUL-O-PIEUP -0xB7D4 0xB86F # HANGUL SYLLABLE RIEUL-O-SIOS -0xB7D5 0xB871 # HANGUL SYLLABLE RIEUL-O-IEUNG -0xB7D6 0xB878 # HANGUL SYLLABLE RIEUL-WA -0xB7D7 0xB87C # HANGUL SYLLABLE RIEUL-WA-NIEUN -0xB7D8 0xB88D # HANGUL SYLLABLE RIEUL-WA-IEUNG -0xB7D9 0xB8A8 # HANGUL SYLLABLE RIEUL-WAE-SSANGSIOS -0xB7DA 0xB8B0 # HANGUL SYLLABLE RIEUL-OE -0xB7DB 0xB8B4 # HANGUL SYLLABLE RIEUL-OE-NIEUN -0xB7DC 0xB8B8 # HANGUL SYLLABLE RIEUL-OE-RIEUL -0xB7DD 0xB8C0 # HANGUL SYLLABLE RIEUL-OE-MIEUM -0xB7DE 0xB8C1 # HANGUL SYLLABLE RIEUL-OE-PIEUP -0xB7DF 0xB8C3 # HANGUL SYLLABLE RIEUL-OE-SIOS -0xB7E0 0xB8C5 # HANGUL SYLLABLE RIEUL-OE-IEUNG -0xB7E1 0xB8CC # HANGUL SYLLABLE RIEUL-YO -0xB7E2 0xB8D0 # HANGUL SYLLABLE RIEUL-YO-NIEUN -0xB7E3 0xB8D4 # HANGUL SYLLABLE RIEUL-YO-RIEUL -0xB7E4 0xB8DD # HANGUL SYLLABLE RIEUL-YO-PIEUP -0xB7E5 0xB8DF # HANGUL SYLLABLE RIEUL-YO-SIOS -0xB7E6 0xB8E1 # HANGUL SYLLABLE RIEUL-YO-IEUNG -0xB7E7 0xB8E8 # HANGUL SYLLABLE RIEUL-U -0xB7E8 0xB8E9 # HANGUL SYLLABLE RIEUL-U-KIYEOK -0xB7E9 0xB8EC # HANGUL SYLLABLE RIEUL-U-NIEUN -0xB7EA 0xB8F0 # HANGUL SYLLABLE RIEUL-U-RIEUL -0xB7EB 0xB8F8 # HANGUL SYLLABLE RIEUL-U-MIEUM -0xB7EC 0xB8F9 # HANGUL SYLLABLE RIEUL-U-PIEUP -0xB7ED 0xB8FB # HANGUL SYLLABLE RIEUL-U-SIOS -0xB7EE 0xB8FD # HANGUL SYLLABLE RIEUL-U-IEUNG -0xB7EF 0xB904 # HANGUL SYLLABLE RIEUL-WEO -0xB7F0 0xB918 # HANGUL SYLLABLE RIEUL-WEO-SSANGSIOS -0xB7F1 0xB920 # HANGUL SYLLABLE RIEUL-WE -0xB7F2 0xB93C # HANGUL SYLLABLE RIEUL-WI -0xB7F3 0xB93D # HANGUL SYLLABLE RIEUL-WI-KIYEOK -0xB7F4 0xB940 # HANGUL SYLLABLE RIEUL-WI-NIEUN -0xB7F5 0xB944 # HANGUL SYLLABLE RIEUL-WI-RIEUL -0xB7F6 0xB94C # HANGUL SYLLABLE RIEUL-WI-MIEUM -0xB7F7 0xB94F # HANGUL SYLLABLE RIEUL-WI-SIOS -0xB7F8 0xB951 # HANGUL SYLLABLE RIEUL-WI-IEUNG -0xB7F9 0xB958 # HANGUL SYLLABLE RIEUL-YU -0xB7FA 0xB959 # HANGUL SYLLABLE RIEUL-YU-KIYEOK -0xB7FB 0xB95C # HANGUL SYLLABLE RIEUL-YU-NIEUN -0xB7FC 0xB960 # HANGUL SYLLABLE RIEUL-YU-RIEUL -0xB7FD 0xB968 # HANGUL SYLLABLE RIEUL-YU-MIEUM -0xB7FE 0xB969 # HANGUL SYLLABLE RIEUL-YU-PIEUP -0xB841 0xD1D0 # HANGUL SYLLABLE THIEUTH-WA-SSANGSIOS -0xB842 0xD1D1 # HANGUL SYLLABLE THIEUTH-WA-IEUNG -0xB843 0xD1D2 # HANGUL SYLLABLE THIEUTH-WA-CIEUC -0xB844 0xD1D3 # HANGUL SYLLABLE THIEUTH-WA-CHIEUCH -0xB845 0xD1D4 # HANGUL SYLLABLE THIEUTH-WA-KHIEUKH -0xB846 0xD1D5 # HANGUL SYLLABLE THIEUTH-WA-THIEUTH -0xB847 0xD1D6 # HANGUL SYLLABLE THIEUTH-WA-PHIEUPH -0xB848 0xD1D7 # HANGUL SYLLABLE THIEUTH-WA-HIEUH -0xB849 0xD1D9 # HANGUL SYLLABLE THIEUTH-WAE-KIYEOK -0xB84A 0xD1DA # HANGUL SYLLABLE THIEUTH-WAE-SSANGKIYEOK -0xB84B 0xD1DB # HANGUL SYLLABLE THIEUTH-WAE-KIYEOKSIOS -0xB84C 0xD1DC # HANGUL SYLLABLE THIEUTH-WAE-NIEUN -0xB84D 0xD1DD # HANGUL SYLLABLE THIEUTH-WAE-NIEUNCIEUC -0xB84E 0xD1DE # HANGUL SYLLABLE THIEUTH-WAE-NIEUNHIEUH -0xB84F 0xD1DF # HANGUL SYLLABLE THIEUTH-WAE-TIKEUT -0xB850 0xD1E0 # HANGUL SYLLABLE THIEUTH-WAE-RIEUL -0xB851 0xD1E1 # HANGUL SYLLABLE THIEUTH-WAE-RIEULKIYEOK -0xB852 0xD1E2 # HANGUL SYLLABLE THIEUTH-WAE-RIEULMIEUM -0xB853 0xD1E3 # HANGUL SYLLABLE THIEUTH-WAE-RIEULPIEUP -0xB854 0xD1E4 # HANGUL SYLLABLE THIEUTH-WAE-RIEULSIOS -0xB855 0xD1E5 # HANGUL SYLLABLE THIEUTH-WAE-RIEULTHIEUTH -0xB856 0xD1E6 # HANGUL SYLLABLE THIEUTH-WAE-RIEULPHIEUPH -0xB857 0xD1E7 # HANGUL SYLLABLE THIEUTH-WAE-RIEULHIEUH -0xB858 0xD1E8 # HANGUL SYLLABLE THIEUTH-WAE-MIEUM -0xB859 0xD1E9 # HANGUL SYLLABLE THIEUTH-WAE-PIEUP -0xB85A 0xD1EA # HANGUL SYLLABLE THIEUTH-WAE-PIEUPSIOS -0xB861 0xD1EB # HANGUL SYLLABLE THIEUTH-WAE-SIOS -0xB862 0xD1EC # HANGUL SYLLABLE THIEUTH-WAE-SSANGSIOS -0xB863 0xD1ED # HANGUL SYLLABLE THIEUTH-WAE-IEUNG -0xB864 0xD1EE # HANGUL SYLLABLE THIEUTH-WAE-CIEUC -0xB865 0xD1EF # HANGUL SYLLABLE THIEUTH-WAE-CHIEUCH -0xB866 0xD1F0 # HANGUL SYLLABLE THIEUTH-WAE-KHIEUKH -0xB867 0xD1F1 # HANGUL SYLLABLE THIEUTH-WAE-THIEUTH -0xB868 0xD1F2 # HANGUL SYLLABLE THIEUTH-WAE-PHIEUPH -0xB869 0xD1F3 # HANGUL SYLLABLE THIEUTH-WAE-HIEUH -0xB86A 0xD1F5 # HANGUL SYLLABLE THIEUTH-OE-KIYEOK -0xB86B 0xD1F6 # HANGUL SYLLABLE THIEUTH-OE-SSANGKIYEOK -0xB86C 0xD1F7 # HANGUL SYLLABLE THIEUTH-OE-KIYEOKSIOS -0xB86D 0xD1F9 # HANGUL SYLLABLE THIEUTH-OE-NIEUNCIEUC -0xB86E 0xD1FA # HANGUL SYLLABLE THIEUTH-OE-NIEUNHIEUH -0xB86F 0xD1FB # HANGUL SYLLABLE THIEUTH-OE-TIKEUT -0xB870 0xD1FC # HANGUL SYLLABLE THIEUTH-OE-RIEUL -0xB871 0xD1FD # HANGUL SYLLABLE THIEUTH-OE-RIEULKIYEOK -0xB872 0xD1FE # HANGUL SYLLABLE THIEUTH-OE-RIEULMIEUM -0xB873 0xD1FF # HANGUL SYLLABLE THIEUTH-OE-RIEULPIEUP -0xB874 0xD200 # HANGUL SYLLABLE THIEUTH-OE-RIEULSIOS -0xB875 0xD201 # HANGUL SYLLABLE THIEUTH-OE-RIEULTHIEUTH -0xB876 0xD202 # HANGUL SYLLABLE THIEUTH-OE-RIEULPHIEUPH -0xB877 0xD203 # HANGUL SYLLABLE THIEUTH-OE-RIEULHIEUH -0xB878 0xD204 # HANGUL SYLLABLE THIEUTH-OE-MIEUM -0xB879 0xD205 # HANGUL SYLLABLE THIEUTH-OE-PIEUP -0xB87A 0xD206 # HANGUL SYLLABLE THIEUTH-OE-PIEUPSIOS -0xB881 0xD208 # HANGUL SYLLABLE THIEUTH-OE-SSANGSIOS -0xB882 0xD20A # HANGUL SYLLABLE THIEUTH-OE-CIEUC -0xB883 0xD20B # HANGUL SYLLABLE THIEUTH-OE-CHIEUCH -0xB884 0xD20C # HANGUL SYLLABLE THIEUTH-OE-KHIEUKH -0xB885 0xD20D # HANGUL SYLLABLE THIEUTH-OE-THIEUTH -0xB886 0xD20E # HANGUL SYLLABLE THIEUTH-OE-PHIEUPH -0xB887 0xD20F # HANGUL SYLLABLE THIEUTH-OE-HIEUH -0xB888 0xD211 # HANGUL SYLLABLE THIEUTH-YO-KIYEOK -0xB889 0xD212 # HANGUL SYLLABLE THIEUTH-YO-SSANGKIYEOK -0xB88A 0xD213 # HANGUL SYLLABLE THIEUTH-YO-KIYEOKSIOS -0xB88B 0xD214 # HANGUL SYLLABLE THIEUTH-YO-NIEUN -0xB88C 0xD215 # HANGUL SYLLABLE THIEUTH-YO-NIEUNCIEUC -0xB88D 0xD216 # HANGUL SYLLABLE THIEUTH-YO-NIEUNHIEUH -0xB88E 0xD217 # HANGUL SYLLABLE THIEUTH-YO-TIKEUT -0xB88F 0xD218 # HANGUL SYLLABLE THIEUTH-YO-RIEUL -0xB890 0xD219 # HANGUL SYLLABLE THIEUTH-YO-RIEULKIYEOK -0xB891 0xD21A # HANGUL SYLLABLE THIEUTH-YO-RIEULMIEUM -0xB892 0xD21B # HANGUL SYLLABLE THIEUTH-YO-RIEULPIEUP -0xB893 0xD21C # HANGUL SYLLABLE THIEUTH-YO-RIEULSIOS -0xB894 0xD21D # HANGUL SYLLABLE THIEUTH-YO-RIEULTHIEUTH -0xB895 0xD21E # HANGUL SYLLABLE THIEUTH-YO-RIEULPHIEUPH -0xB896 0xD21F # HANGUL SYLLABLE THIEUTH-YO-RIEULHIEUH -0xB897 0xD220 # HANGUL SYLLABLE THIEUTH-YO-MIEUM -0xB898 0xD221 # HANGUL SYLLABLE THIEUTH-YO-PIEUP -0xB899 0xD222 # HANGUL SYLLABLE THIEUTH-YO-PIEUPSIOS -0xB89A 0xD223 # HANGUL SYLLABLE THIEUTH-YO-SIOS -0xB89B 0xD224 # HANGUL SYLLABLE THIEUTH-YO-SSANGSIOS -0xB89C 0xD225 # HANGUL SYLLABLE THIEUTH-YO-IEUNG -0xB89D 0xD226 # HANGUL SYLLABLE THIEUTH-YO-CIEUC -0xB89E 0xD227 # HANGUL SYLLABLE THIEUTH-YO-CHIEUCH -0xB89F 0xD228 # HANGUL SYLLABLE THIEUTH-YO-KHIEUKH -0xB8A0 0xD229 # HANGUL SYLLABLE THIEUTH-YO-THIEUTH -0xB8A1 0xB96B # HANGUL SYLLABLE RIEUL-YU-SIOS -0xB8A2 0xB96D # HANGUL SYLLABLE RIEUL-YU-IEUNG -0xB8A3 0xB974 # HANGUL SYLLABLE RIEUL-EU -0xB8A4 0xB975 # HANGUL SYLLABLE RIEUL-EU-KIYEOK -0xB8A5 0xB978 # HANGUL SYLLABLE RIEUL-EU-NIEUN -0xB8A6 0xB97C # HANGUL SYLLABLE RIEUL-EU-RIEUL -0xB8A7 0xB984 # HANGUL SYLLABLE RIEUL-EU-MIEUM -0xB8A8 0xB985 # HANGUL SYLLABLE RIEUL-EU-PIEUP -0xB8A9 0xB987 # HANGUL SYLLABLE RIEUL-EU-SIOS -0xB8AA 0xB989 # HANGUL SYLLABLE RIEUL-EU-IEUNG -0xB8AB 0xB98A # HANGUL SYLLABLE RIEUL-EU-CIEUC -0xB8AC 0xB98D # HANGUL SYLLABLE RIEUL-EU-THIEUTH -0xB8AD 0xB98E # HANGUL SYLLABLE RIEUL-EU-PHIEUPH -0xB8AE 0xB9AC # HANGUL SYLLABLE RIEUL-I -0xB8AF 0xB9AD # HANGUL SYLLABLE RIEUL-I-KIYEOK -0xB8B0 0xB9B0 # HANGUL SYLLABLE RIEUL-I-NIEUN -0xB8B1 0xB9B4 # HANGUL SYLLABLE RIEUL-I-RIEUL -0xB8B2 0xB9BC # HANGUL SYLLABLE RIEUL-I-MIEUM -0xB8B3 0xB9BD # HANGUL SYLLABLE RIEUL-I-PIEUP -0xB8B4 0xB9BF # HANGUL SYLLABLE RIEUL-I-SIOS -0xB8B5 0xB9C1 # HANGUL SYLLABLE RIEUL-I-IEUNG -0xB8B6 0xB9C8 # HANGUL SYLLABLE MIEUM-A -0xB8B7 0xB9C9 # HANGUL SYLLABLE MIEUM-A-KIYEOK -0xB8B8 0xB9CC # HANGUL SYLLABLE MIEUM-A-NIEUN -0xB8B9 0xB9CE # HANGUL SYLLABLE MIEUM-A-NIEUNHIEUH -0xB8BA 0xB9CF # HANGUL SYLLABLE MIEUM-A-TIKEUT -0xB8BB 0xB9D0 # HANGUL SYLLABLE MIEUM-A-RIEUL -0xB8BC 0xB9D1 # HANGUL SYLLABLE MIEUM-A-RIEULKIYEOK -0xB8BD 0xB9D2 # HANGUL SYLLABLE MIEUM-A-RIEULMIEUM -0xB8BE 0xB9D8 # HANGUL SYLLABLE MIEUM-A-MIEUM -0xB8BF 0xB9D9 # HANGUL SYLLABLE MIEUM-A-PIEUP -0xB8C0 0xB9DB # HANGUL SYLLABLE MIEUM-A-SIOS -0xB8C1 0xB9DD # HANGUL SYLLABLE MIEUM-A-IEUNG -0xB8C2 0xB9DE # HANGUL SYLLABLE MIEUM-A-CIEUC -0xB8C3 0xB9E1 # HANGUL SYLLABLE MIEUM-A-THIEUTH -0xB8C4 0xB9E3 # HANGUL SYLLABLE MIEUM-A-HIEUH -0xB8C5 0xB9E4 # HANGUL SYLLABLE MIEUM-AE -0xB8C6 0xB9E5 # HANGUL SYLLABLE MIEUM-AE-KIYEOK -0xB8C7 0xB9E8 # HANGUL SYLLABLE MIEUM-AE-NIEUN -0xB8C8 0xB9EC # HANGUL SYLLABLE MIEUM-AE-RIEUL -0xB8C9 0xB9F4 # HANGUL SYLLABLE MIEUM-AE-MIEUM -0xB8CA 0xB9F5 # HANGUL SYLLABLE MIEUM-AE-PIEUP -0xB8CB 0xB9F7 # HANGUL SYLLABLE MIEUM-AE-SIOS -0xB8CC 0xB9F8 # HANGUL SYLLABLE MIEUM-AE-SSANGSIOS -0xB8CD 0xB9F9 # HANGUL SYLLABLE MIEUM-AE-IEUNG -0xB8CE 0xB9FA # HANGUL SYLLABLE MIEUM-AE-CIEUC -0xB8CF 0xBA00 # HANGUL SYLLABLE MIEUM-YA -0xB8D0 0xBA01 # HANGUL SYLLABLE MIEUM-YA-KIYEOK -0xB8D1 0xBA08 # HANGUL SYLLABLE MIEUM-YA-RIEUL -0xB8D2 0xBA15 # HANGUL SYLLABLE MIEUM-YA-IEUNG -0xB8D3 0xBA38 # HANGUL SYLLABLE MIEUM-EO -0xB8D4 0xBA39 # HANGUL SYLLABLE MIEUM-EO-KIYEOK -0xB8D5 0xBA3C # HANGUL SYLLABLE MIEUM-EO-NIEUN -0xB8D6 0xBA40 # HANGUL SYLLABLE MIEUM-EO-RIEUL -0xB8D7 0xBA42 # HANGUL SYLLABLE MIEUM-EO-RIEULMIEUM -0xB8D8 0xBA48 # HANGUL SYLLABLE MIEUM-EO-MIEUM -0xB8D9 0xBA49 # HANGUL SYLLABLE MIEUM-EO-PIEUP -0xB8DA 0xBA4B # HANGUL SYLLABLE MIEUM-EO-SIOS -0xB8DB 0xBA4D # HANGUL SYLLABLE MIEUM-EO-IEUNG -0xB8DC 0xBA4E # HANGUL SYLLABLE MIEUM-EO-CIEUC -0xB8DD 0xBA53 # HANGUL SYLLABLE MIEUM-EO-HIEUH -0xB8DE 0xBA54 # HANGUL SYLLABLE MIEUM-E -0xB8DF 0xBA55 # HANGUL SYLLABLE MIEUM-E-KIYEOK -0xB8E0 0xBA58 # HANGUL SYLLABLE MIEUM-E-NIEUN -0xB8E1 0xBA5C # HANGUL SYLLABLE MIEUM-E-RIEUL -0xB8E2 0xBA64 # HANGUL SYLLABLE MIEUM-E-MIEUM -0xB8E3 0xBA65 # HANGUL SYLLABLE MIEUM-E-PIEUP -0xB8E4 0xBA67 # HANGUL SYLLABLE MIEUM-E-SIOS -0xB8E5 0xBA68 # HANGUL SYLLABLE MIEUM-E-SSANGSIOS -0xB8E6 0xBA69 # HANGUL SYLLABLE MIEUM-E-IEUNG -0xB8E7 0xBA70 # HANGUL SYLLABLE MIEUM-YEO -0xB8E8 0xBA71 # HANGUL SYLLABLE MIEUM-YEO-KIYEOK -0xB8E9 0xBA74 # HANGUL SYLLABLE MIEUM-YEO-NIEUN -0xB8EA 0xBA78 # HANGUL SYLLABLE MIEUM-YEO-RIEUL -0xB8EB 0xBA83 # HANGUL SYLLABLE MIEUM-YEO-SIOS -0xB8EC 0xBA84 # HANGUL SYLLABLE MIEUM-YEO-SSANGSIOS -0xB8ED 0xBA85 # HANGUL SYLLABLE MIEUM-YEO-IEUNG -0xB8EE 0xBA87 # HANGUL SYLLABLE MIEUM-YEO-CHIEUCH -0xB8EF 0xBA8C # HANGUL SYLLABLE MIEUM-YE -0xB8F0 0xBAA8 # HANGUL SYLLABLE MIEUM-O -0xB8F1 0xBAA9 # HANGUL SYLLABLE MIEUM-O-KIYEOK -0xB8F2 0xBAAB # HANGUL SYLLABLE MIEUM-O-KIYEOKSIOS -0xB8F3 0xBAAC # HANGUL SYLLABLE MIEUM-O-NIEUN -0xB8F4 0xBAB0 # HANGUL SYLLABLE MIEUM-O-RIEUL -0xB8F5 0xBAB2 # HANGUL SYLLABLE MIEUM-O-RIEULMIEUM -0xB8F6 0xBAB8 # HANGUL SYLLABLE MIEUM-O-MIEUM -0xB8F7 0xBAB9 # HANGUL SYLLABLE MIEUM-O-PIEUP -0xB8F8 0xBABB # HANGUL SYLLABLE MIEUM-O-SIOS -0xB8F9 0xBABD # HANGUL SYLLABLE MIEUM-O-IEUNG -0xB8FA 0xBAC4 # HANGUL SYLLABLE MIEUM-WA -0xB8FB 0xBAC8 # HANGUL SYLLABLE MIEUM-WA-NIEUN -0xB8FC 0xBAD8 # HANGUL SYLLABLE MIEUM-WA-SSANGSIOS -0xB8FD 0xBAD9 # HANGUL SYLLABLE MIEUM-WA-IEUNG -0xB8FE 0xBAFC # HANGUL SYLLABLE MIEUM-OE -0xB941 0xD22A # HANGUL SYLLABLE THIEUTH-YO-PHIEUPH -0xB942 0xD22B # HANGUL SYLLABLE THIEUTH-YO-HIEUH -0xB943 0xD22E # HANGUL SYLLABLE THIEUTH-U-SSANGKIYEOK -0xB944 0xD22F # HANGUL SYLLABLE THIEUTH-U-KIYEOKSIOS -0xB945 0xD231 # HANGUL SYLLABLE THIEUTH-U-NIEUNCIEUC -0xB946 0xD232 # HANGUL SYLLABLE THIEUTH-U-NIEUNHIEUH -0xB947 0xD233 # HANGUL SYLLABLE THIEUTH-U-TIKEUT -0xB948 0xD235 # HANGUL SYLLABLE THIEUTH-U-RIEULKIYEOK -0xB949 0xD236 # HANGUL SYLLABLE THIEUTH-U-RIEULMIEUM -0xB94A 0xD237 # HANGUL SYLLABLE THIEUTH-U-RIEULPIEUP -0xB94B 0xD238 # HANGUL SYLLABLE THIEUTH-U-RIEULSIOS -0xB94C 0xD239 # HANGUL SYLLABLE THIEUTH-U-RIEULTHIEUTH -0xB94D 0xD23A # HANGUL SYLLABLE THIEUTH-U-RIEULPHIEUPH -0xB94E 0xD23B # HANGUL SYLLABLE THIEUTH-U-RIEULHIEUH -0xB94F 0xD23E # HANGUL SYLLABLE THIEUTH-U-PIEUPSIOS -0xB950 0xD240 # HANGUL SYLLABLE THIEUTH-U-SSANGSIOS -0xB951 0xD242 # HANGUL SYLLABLE THIEUTH-U-CIEUC -0xB952 0xD243 # HANGUL SYLLABLE THIEUTH-U-CHIEUCH -0xB953 0xD244 # HANGUL SYLLABLE THIEUTH-U-KHIEUKH -0xB954 0xD245 # HANGUL SYLLABLE THIEUTH-U-THIEUTH -0xB955 0xD246 # HANGUL SYLLABLE THIEUTH-U-PHIEUPH -0xB956 0xD247 # HANGUL SYLLABLE THIEUTH-U-HIEUH -0xB957 0xD249 # HANGUL SYLLABLE THIEUTH-WEO-KIYEOK -0xB958 0xD24A # HANGUL SYLLABLE THIEUTH-WEO-SSANGKIYEOK -0xB959 0xD24B # HANGUL SYLLABLE THIEUTH-WEO-KIYEOKSIOS -0xB95A 0xD24C # HANGUL SYLLABLE THIEUTH-WEO-NIEUN -0xB961 0xD24D # HANGUL SYLLABLE THIEUTH-WEO-NIEUNCIEUC -0xB962 0xD24E # HANGUL SYLLABLE THIEUTH-WEO-NIEUNHIEUH -0xB963 0xD24F # HANGUL SYLLABLE THIEUTH-WEO-TIKEUT -0xB964 0xD250 # HANGUL SYLLABLE THIEUTH-WEO-RIEUL -0xB965 0xD251 # HANGUL SYLLABLE THIEUTH-WEO-RIEULKIYEOK -0xB966 0xD252 # HANGUL SYLLABLE THIEUTH-WEO-RIEULMIEUM -0xB967 0xD253 # HANGUL SYLLABLE THIEUTH-WEO-RIEULPIEUP -0xB968 0xD254 # HANGUL SYLLABLE THIEUTH-WEO-RIEULSIOS -0xB969 0xD255 # HANGUL SYLLABLE THIEUTH-WEO-RIEULTHIEUTH -0xB96A 0xD256 # HANGUL SYLLABLE THIEUTH-WEO-RIEULPHIEUPH -0xB96B 0xD257 # HANGUL SYLLABLE THIEUTH-WEO-RIEULHIEUH -0xB96C 0xD258 # HANGUL SYLLABLE THIEUTH-WEO-MIEUM -0xB96D 0xD259 # HANGUL SYLLABLE THIEUTH-WEO-PIEUP -0xB96E 0xD25A # HANGUL SYLLABLE THIEUTH-WEO-PIEUPSIOS -0xB96F 0xD25B # HANGUL SYLLABLE THIEUTH-WEO-SIOS -0xB970 0xD25D # HANGUL SYLLABLE THIEUTH-WEO-IEUNG -0xB971 0xD25E # HANGUL SYLLABLE THIEUTH-WEO-CIEUC -0xB972 0xD25F # HANGUL SYLLABLE THIEUTH-WEO-CHIEUCH -0xB973 0xD260 # HANGUL SYLLABLE THIEUTH-WEO-KHIEUKH -0xB974 0xD261 # HANGUL SYLLABLE THIEUTH-WEO-THIEUTH -0xB975 0xD262 # HANGUL SYLLABLE THIEUTH-WEO-PHIEUPH -0xB976 0xD263 # HANGUL SYLLABLE THIEUTH-WEO-HIEUH -0xB977 0xD265 # HANGUL SYLLABLE THIEUTH-WE-KIYEOK -0xB978 0xD266 # HANGUL SYLLABLE THIEUTH-WE-SSANGKIYEOK -0xB979 0xD267 # HANGUL SYLLABLE THIEUTH-WE-KIYEOKSIOS -0xB97A 0xD268 # HANGUL SYLLABLE THIEUTH-WE-NIEUN -0xB981 0xD269 # HANGUL SYLLABLE THIEUTH-WE-NIEUNCIEUC -0xB982 0xD26A # HANGUL SYLLABLE THIEUTH-WE-NIEUNHIEUH -0xB983 0xD26B # HANGUL SYLLABLE THIEUTH-WE-TIKEUT -0xB984 0xD26C # HANGUL SYLLABLE THIEUTH-WE-RIEUL -0xB985 0xD26D # HANGUL SYLLABLE THIEUTH-WE-RIEULKIYEOK -0xB986 0xD26E # HANGUL SYLLABLE THIEUTH-WE-RIEULMIEUM -0xB987 0xD26F # HANGUL SYLLABLE THIEUTH-WE-RIEULPIEUP -0xB988 0xD270 # HANGUL SYLLABLE THIEUTH-WE-RIEULSIOS -0xB989 0xD271 # HANGUL SYLLABLE THIEUTH-WE-RIEULTHIEUTH -0xB98A 0xD272 # HANGUL SYLLABLE THIEUTH-WE-RIEULPHIEUPH -0xB98B 0xD273 # HANGUL SYLLABLE THIEUTH-WE-RIEULHIEUH -0xB98C 0xD274 # HANGUL SYLLABLE THIEUTH-WE-MIEUM -0xB98D 0xD275 # HANGUL SYLLABLE THIEUTH-WE-PIEUP -0xB98E 0xD276 # HANGUL SYLLABLE THIEUTH-WE-PIEUPSIOS -0xB98F 0xD277 # HANGUL SYLLABLE THIEUTH-WE-SIOS -0xB990 0xD278 # HANGUL SYLLABLE THIEUTH-WE-SSANGSIOS -0xB991 0xD279 # HANGUL SYLLABLE THIEUTH-WE-IEUNG -0xB992 0xD27A # HANGUL SYLLABLE THIEUTH-WE-CIEUC -0xB993 0xD27B # HANGUL SYLLABLE THIEUTH-WE-CHIEUCH -0xB994 0xD27C # HANGUL SYLLABLE THIEUTH-WE-KHIEUKH -0xB995 0xD27D # HANGUL SYLLABLE THIEUTH-WE-THIEUTH -0xB996 0xD27E # HANGUL SYLLABLE THIEUTH-WE-PHIEUPH -0xB997 0xD27F # HANGUL SYLLABLE THIEUTH-WE-HIEUH -0xB998 0xD282 # HANGUL SYLLABLE THIEUTH-WI-SSANGKIYEOK -0xB999 0xD283 # HANGUL SYLLABLE THIEUTH-WI-KIYEOKSIOS -0xB99A 0xD285 # HANGUL SYLLABLE THIEUTH-WI-NIEUNCIEUC -0xB99B 0xD286 # HANGUL SYLLABLE THIEUTH-WI-NIEUNHIEUH -0xB99C 0xD287 # HANGUL SYLLABLE THIEUTH-WI-TIKEUT -0xB99D 0xD289 # HANGUL SYLLABLE THIEUTH-WI-RIEULKIYEOK -0xB99E 0xD28A # HANGUL SYLLABLE THIEUTH-WI-RIEULMIEUM -0xB99F 0xD28B # HANGUL SYLLABLE THIEUTH-WI-RIEULPIEUP -0xB9A0 0xD28C # HANGUL SYLLABLE THIEUTH-WI-RIEULSIOS -0xB9A1 0xBB00 # HANGUL SYLLABLE MIEUM-OE-NIEUN -0xB9A2 0xBB04 # HANGUL SYLLABLE MIEUM-OE-RIEUL -0xB9A3 0xBB0D # HANGUL SYLLABLE MIEUM-OE-PIEUP -0xB9A4 0xBB0F # HANGUL SYLLABLE MIEUM-OE-SIOS -0xB9A5 0xBB11 # HANGUL SYLLABLE MIEUM-OE-IEUNG -0xB9A6 0xBB18 # HANGUL SYLLABLE MIEUM-YO -0xB9A7 0xBB1C # HANGUL SYLLABLE MIEUM-YO-NIEUN -0xB9A8 0xBB20 # HANGUL SYLLABLE MIEUM-YO-RIEUL -0xB9A9 0xBB29 # HANGUL SYLLABLE MIEUM-YO-PIEUP -0xB9AA 0xBB2B # HANGUL SYLLABLE MIEUM-YO-SIOS -0xB9AB 0xBB34 # HANGUL SYLLABLE MIEUM-U -0xB9AC 0xBB35 # HANGUL SYLLABLE MIEUM-U-KIYEOK -0xB9AD 0xBB36 # HANGUL SYLLABLE MIEUM-U-SSANGKIYEOK -0xB9AE 0xBB38 # HANGUL SYLLABLE MIEUM-U-NIEUN -0xB9AF 0xBB3B # HANGUL SYLLABLE MIEUM-U-TIKEUT -0xB9B0 0xBB3C # HANGUL SYLLABLE MIEUM-U-RIEUL -0xB9B1 0xBB3D # HANGUL SYLLABLE MIEUM-U-RIEULKIYEOK -0xB9B2 0xBB3E # HANGUL SYLLABLE MIEUM-U-RIEULMIEUM -0xB9B3 0xBB44 # HANGUL SYLLABLE MIEUM-U-MIEUM -0xB9B4 0xBB45 # HANGUL SYLLABLE MIEUM-U-PIEUP -0xB9B5 0xBB47 # HANGUL SYLLABLE MIEUM-U-SIOS -0xB9B6 0xBB49 # HANGUL SYLLABLE MIEUM-U-IEUNG -0xB9B7 0xBB4D # HANGUL SYLLABLE MIEUM-U-THIEUTH -0xB9B8 0xBB4F # HANGUL SYLLABLE MIEUM-U-HIEUH -0xB9B9 0xBB50 # HANGUL SYLLABLE MIEUM-WEO -0xB9BA 0xBB54 # HANGUL SYLLABLE MIEUM-WEO-NIEUN -0xB9BB 0xBB58 # HANGUL SYLLABLE MIEUM-WEO-RIEUL -0xB9BC 0xBB61 # HANGUL SYLLABLE MIEUM-WEO-PIEUP -0xB9BD 0xBB63 # HANGUL SYLLABLE MIEUM-WEO-SIOS -0xB9BE 0xBB6C # HANGUL SYLLABLE MIEUM-WE -0xB9BF 0xBB88 # HANGUL SYLLABLE MIEUM-WI -0xB9C0 0xBB8C # HANGUL SYLLABLE MIEUM-WI-NIEUN -0xB9C1 0xBB90 # HANGUL SYLLABLE MIEUM-WI-RIEUL -0xB9C2 0xBBA4 # HANGUL SYLLABLE MIEUM-YU -0xB9C3 0xBBA8 # HANGUL SYLLABLE MIEUM-YU-NIEUN -0xB9C4 0xBBAC # HANGUL SYLLABLE MIEUM-YU-RIEUL -0xB9C5 0xBBB4 # HANGUL SYLLABLE MIEUM-YU-MIEUM -0xB9C6 0xBBB7 # HANGUL SYLLABLE MIEUM-YU-SIOS -0xB9C7 0xBBC0 # HANGUL SYLLABLE MIEUM-EU -0xB9C8 0xBBC4 # HANGUL SYLLABLE MIEUM-EU-NIEUN -0xB9C9 0xBBC8 # HANGUL SYLLABLE MIEUM-EU-RIEUL -0xB9CA 0xBBD0 # HANGUL SYLLABLE MIEUM-EU-MIEUM -0xB9CB 0xBBD3 # HANGUL SYLLABLE MIEUM-EU-SIOS -0xB9CC 0xBBF8 # HANGUL SYLLABLE MIEUM-I -0xB9CD 0xBBF9 # HANGUL SYLLABLE MIEUM-I-KIYEOK -0xB9CE 0xBBFC # HANGUL SYLLABLE MIEUM-I-NIEUN -0xB9CF 0xBBFF # HANGUL SYLLABLE MIEUM-I-TIKEUT -0xB9D0 0xBC00 # HANGUL SYLLABLE MIEUM-I-RIEUL -0xB9D1 0xBC02 # HANGUL SYLLABLE MIEUM-I-RIEULMIEUM -0xB9D2 0xBC08 # HANGUL SYLLABLE MIEUM-I-MIEUM -0xB9D3 0xBC09 # HANGUL SYLLABLE MIEUM-I-PIEUP -0xB9D4 0xBC0B # HANGUL SYLLABLE MIEUM-I-SIOS -0xB9D5 0xBC0C # HANGUL SYLLABLE MIEUM-I-SSANGSIOS -0xB9D6 0xBC0D # HANGUL SYLLABLE MIEUM-I-IEUNG -0xB9D7 0xBC0F # HANGUL SYLLABLE MIEUM-I-CHIEUCH -0xB9D8 0xBC11 # HANGUL SYLLABLE MIEUM-I-THIEUTH -0xB9D9 0xBC14 # HANGUL SYLLABLE PIEUP-A -0xB9DA 0xBC15 # HANGUL SYLLABLE PIEUP-A-KIYEOK -0xB9DB 0xBC16 # HANGUL SYLLABLE PIEUP-A-SSANGKIYEOK -0xB9DC 0xBC17 # HANGUL SYLLABLE PIEUP-A-KIYEOKSIOS -0xB9DD 0xBC18 # HANGUL SYLLABLE PIEUP-A-NIEUN -0xB9DE 0xBC1B # HANGUL SYLLABLE PIEUP-A-TIKEUT -0xB9DF 0xBC1C # HANGUL SYLLABLE PIEUP-A-RIEUL -0xB9E0 0xBC1D # HANGUL SYLLABLE PIEUP-A-RIEULKIYEOK -0xB9E1 0xBC1E # HANGUL SYLLABLE PIEUP-A-RIEULMIEUM -0xB9E2 0xBC1F # HANGUL SYLLABLE PIEUP-A-RIEULPIEUP -0xB9E3 0xBC24 # HANGUL SYLLABLE PIEUP-A-MIEUM -0xB9E4 0xBC25 # HANGUL SYLLABLE PIEUP-A-PIEUP -0xB9E5 0xBC27 # HANGUL SYLLABLE PIEUP-A-SIOS -0xB9E6 0xBC29 # HANGUL SYLLABLE PIEUP-A-IEUNG -0xB9E7 0xBC2D # HANGUL SYLLABLE PIEUP-A-THIEUTH -0xB9E8 0xBC30 # HANGUL SYLLABLE PIEUP-AE -0xB9E9 0xBC31 # HANGUL SYLLABLE PIEUP-AE-KIYEOK -0xB9EA 0xBC34 # HANGUL SYLLABLE PIEUP-AE-NIEUN -0xB9EB 0xBC38 # HANGUL SYLLABLE PIEUP-AE-RIEUL -0xB9EC 0xBC40 # HANGUL SYLLABLE PIEUP-AE-MIEUM -0xB9ED 0xBC41 # HANGUL SYLLABLE PIEUP-AE-PIEUP -0xB9EE 0xBC43 # HANGUL SYLLABLE PIEUP-AE-SIOS -0xB9EF 0xBC44 # HANGUL SYLLABLE PIEUP-AE-SSANGSIOS -0xB9F0 0xBC45 # HANGUL SYLLABLE PIEUP-AE-IEUNG -0xB9F1 0xBC49 # HANGUL SYLLABLE PIEUP-AE-THIEUTH -0xB9F2 0xBC4C # HANGUL SYLLABLE PIEUP-YA -0xB9F3 0xBC4D # HANGUL SYLLABLE PIEUP-YA-KIYEOK -0xB9F4 0xBC50 # HANGUL SYLLABLE PIEUP-YA-NIEUN -0xB9F5 0xBC5D # HANGUL SYLLABLE PIEUP-YA-PIEUP -0xB9F6 0xBC84 # HANGUL SYLLABLE PIEUP-EO -0xB9F7 0xBC85 # HANGUL SYLLABLE PIEUP-EO-KIYEOK -0xB9F8 0xBC88 # HANGUL SYLLABLE PIEUP-EO-NIEUN -0xB9F9 0xBC8B # HANGUL SYLLABLE PIEUP-EO-TIKEUT -0xB9FA 0xBC8C # HANGUL SYLLABLE PIEUP-EO-RIEUL -0xB9FB 0xBC8E # HANGUL SYLLABLE PIEUP-EO-RIEULMIEUM -0xB9FC 0xBC94 # HANGUL SYLLABLE PIEUP-EO-MIEUM -0xB9FD 0xBC95 # HANGUL SYLLABLE PIEUP-EO-PIEUP -0xB9FE 0xBC97 # HANGUL SYLLABLE PIEUP-EO-SIOS -0xBA41 0xD28D # HANGUL SYLLABLE THIEUTH-WI-RIEULTHIEUTH -0xBA42 0xD28E # HANGUL SYLLABLE THIEUTH-WI-RIEULPHIEUPH -0xBA43 0xD28F # HANGUL SYLLABLE THIEUTH-WI-RIEULHIEUH -0xBA44 0xD292 # HANGUL SYLLABLE THIEUTH-WI-PIEUPSIOS -0xBA45 0xD293 # HANGUL SYLLABLE THIEUTH-WI-SIOS -0xBA46 0xD294 # HANGUL SYLLABLE THIEUTH-WI-SSANGSIOS -0xBA47 0xD296 # HANGUL SYLLABLE THIEUTH-WI-CIEUC -0xBA48 0xD297 # HANGUL SYLLABLE THIEUTH-WI-CHIEUCH -0xBA49 0xD298 # HANGUL SYLLABLE THIEUTH-WI-KHIEUKH -0xBA4A 0xD299 # HANGUL SYLLABLE THIEUTH-WI-THIEUTH -0xBA4B 0xD29A # HANGUL SYLLABLE THIEUTH-WI-PHIEUPH -0xBA4C 0xD29B # HANGUL SYLLABLE THIEUTH-WI-HIEUH -0xBA4D 0xD29D # HANGUL SYLLABLE THIEUTH-YU-KIYEOK -0xBA4E 0xD29E # HANGUL SYLLABLE THIEUTH-YU-SSANGKIYEOK -0xBA4F 0xD29F # HANGUL SYLLABLE THIEUTH-YU-KIYEOKSIOS -0xBA50 0xD2A1 # HANGUL SYLLABLE THIEUTH-YU-NIEUNCIEUC -0xBA51 0xD2A2 # HANGUL SYLLABLE THIEUTH-YU-NIEUNHIEUH -0xBA52 0xD2A3 # HANGUL SYLLABLE THIEUTH-YU-TIKEUT -0xBA53 0xD2A5 # HANGUL SYLLABLE THIEUTH-YU-RIEULKIYEOK -0xBA54 0xD2A6 # HANGUL SYLLABLE THIEUTH-YU-RIEULMIEUM -0xBA55 0xD2A7 # HANGUL SYLLABLE THIEUTH-YU-RIEULPIEUP -0xBA56 0xD2A8 # HANGUL SYLLABLE THIEUTH-YU-RIEULSIOS -0xBA57 0xD2A9 # HANGUL SYLLABLE THIEUTH-YU-RIEULTHIEUTH -0xBA58 0xD2AA # HANGUL SYLLABLE THIEUTH-YU-RIEULPHIEUPH -0xBA59 0xD2AB # HANGUL SYLLABLE THIEUTH-YU-RIEULHIEUH -0xBA5A 0xD2AD # HANGUL SYLLABLE THIEUTH-YU-PIEUP -0xBA61 0xD2AE # HANGUL SYLLABLE THIEUTH-YU-PIEUPSIOS -0xBA62 0xD2AF # HANGUL SYLLABLE THIEUTH-YU-SIOS -0xBA63 0xD2B0 # HANGUL SYLLABLE THIEUTH-YU-SSANGSIOS -0xBA64 0xD2B2 # HANGUL SYLLABLE THIEUTH-YU-CIEUC -0xBA65 0xD2B3 # HANGUL SYLLABLE THIEUTH-YU-CHIEUCH -0xBA66 0xD2B4 # HANGUL SYLLABLE THIEUTH-YU-KHIEUKH -0xBA67 0xD2B5 # HANGUL SYLLABLE THIEUTH-YU-THIEUTH -0xBA68 0xD2B6 # HANGUL SYLLABLE THIEUTH-YU-PHIEUPH -0xBA69 0xD2B7 # HANGUL SYLLABLE THIEUTH-YU-HIEUH -0xBA6A 0xD2BA # HANGUL SYLLABLE THIEUTH-EU-SSANGKIYEOK -0xBA6B 0xD2BB # HANGUL SYLLABLE THIEUTH-EU-KIYEOKSIOS -0xBA6C 0xD2BD # HANGUL SYLLABLE THIEUTH-EU-NIEUNCIEUC -0xBA6D 0xD2BE # HANGUL SYLLABLE THIEUTH-EU-NIEUNHIEUH -0xBA6E 0xD2C1 # HANGUL SYLLABLE THIEUTH-EU-RIEULKIYEOK -0xBA6F 0xD2C3 # HANGUL SYLLABLE THIEUTH-EU-RIEULPIEUP -0xBA70 0xD2C4 # HANGUL SYLLABLE THIEUTH-EU-RIEULSIOS -0xBA71 0xD2C5 # HANGUL SYLLABLE THIEUTH-EU-RIEULTHIEUTH -0xBA72 0xD2C6 # HANGUL SYLLABLE THIEUTH-EU-RIEULPHIEUPH -0xBA73 0xD2C7 # HANGUL SYLLABLE THIEUTH-EU-RIEULHIEUH -0xBA74 0xD2CA # HANGUL SYLLABLE THIEUTH-EU-PIEUPSIOS -0xBA75 0xD2CC # HANGUL SYLLABLE THIEUTH-EU-SSANGSIOS -0xBA76 0xD2CD # HANGUL SYLLABLE THIEUTH-EU-IEUNG -0xBA77 0xD2CE # HANGUL SYLLABLE THIEUTH-EU-CIEUC -0xBA78 0xD2CF # HANGUL SYLLABLE THIEUTH-EU-CHIEUCH -0xBA79 0xD2D0 # HANGUL SYLLABLE THIEUTH-EU-KHIEUKH -0xBA7A 0xD2D1 # HANGUL SYLLABLE THIEUTH-EU-THIEUTH -0xBA81 0xD2D2 # HANGUL SYLLABLE THIEUTH-EU-PHIEUPH -0xBA82 0xD2D3 # HANGUL SYLLABLE THIEUTH-EU-HIEUH -0xBA83 0xD2D5 # HANGUL SYLLABLE THIEUTH-YI-KIYEOK -0xBA84 0xD2D6 # HANGUL SYLLABLE THIEUTH-YI-SSANGKIYEOK -0xBA85 0xD2D7 # HANGUL SYLLABLE THIEUTH-YI-KIYEOKSIOS -0xBA86 0xD2D9 # HANGUL SYLLABLE THIEUTH-YI-NIEUNCIEUC -0xBA87 0xD2DA # HANGUL SYLLABLE THIEUTH-YI-NIEUNHIEUH -0xBA88 0xD2DB # HANGUL SYLLABLE THIEUTH-YI-TIKEUT -0xBA89 0xD2DD # HANGUL SYLLABLE THIEUTH-YI-RIEULKIYEOK -0xBA8A 0xD2DE # HANGUL SYLLABLE THIEUTH-YI-RIEULMIEUM -0xBA8B 0xD2DF # HANGUL SYLLABLE THIEUTH-YI-RIEULPIEUP -0xBA8C 0xD2E0 # HANGUL SYLLABLE THIEUTH-YI-RIEULSIOS -0xBA8D 0xD2E1 # HANGUL SYLLABLE THIEUTH-YI-RIEULTHIEUTH -0xBA8E 0xD2E2 # HANGUL SYLLABLE THIEUTH-YI-RIEULPHIEUPH -0xBA8F 0xD2E3 # HANGUL SYLLABLE THIEUTH-YI-RIEULHIEUH -0xBA90 0xD2E6 # HANGUL SYLLABLE THIEUTH-YI-PIEUPSIOS -0xBA91 0xD2E7 # HANGUL SYLLABLE THIEUTH-YI-SIOS -0xBA92 0xD2E8 # HANGUL SYLLABLE THIEUTH-YI-SSANGSIOS -0xBA93 0xD2E9 # HANGUL SYLLABLE THIEUTH-YI-IEUNG -0xBA94 0xD2EA # HANGUL SYLLABLE THIEUTH-YI-CIEUC -0xBA95 0xD2EB # HANGUL SYLLABLE THIEUTH-YI-CHIEUCH -0xBA96 0xD2EC # HANGUL SYLLABLE THIEUTH-YI-KHIEUKH -0xBA97 0xD2ED # HANGUL SYLLABLE THIEUTH-YI-THIEUTH -0xBA98 0xD2EE # HANGUL SYLLABLE THIEUTH-YI-PHIEUPH -0xBA99 0xD2EF # HANGUL SYLLABLE THIEUTH-YI-HIEUH -0xBA9A 0xD2F2 # HANGUL SYLLABLE THIEUTH-I-SSANGKIYEOK -0xBA9B 0xD2F3 # HANGUL SYLLABLE THIEUTH-I-KIYEOKSIOS -0xBA9C 0xD2F5 # HANGUL SYLLABLE THIEUTH-I-NIEUNCIEUC -0xBA9D 0xD2F6 # HANGUL SYLLABLE THIEUTH-I-NIEUNHIEUH -0xBA9E 0xD2F7 # HANGUL SYLLABLE THIEUTH-I-TIKEUT -0xBA9F 0xD2F9 # HANGUL SYLLABLE THIEUTH-I-RIEULKIYEOK -0xBAA0 0xD2FA # HANGUL SYLLABLE THIEUTH-I-RIEULMIEUM -0xBAA1 0xBC99 # HANGUL SYLLABLE PIEUP-EO-IEUNG -0xBAA2 0xBC9A # HANGUL SYLLABLE PIEUP-EO-CIEUC -0xBAA3 0xBCA0 # HANGUL SYLLABLE PIEUP-E -0xBAA4 0xBCA1 # HANGUL SYLLABLE PIEUP-E-KIYEOK -0xBAA5 0xBCA4 # HANGUL SYLLABLE PIEUP-E-NIEUN -0xBAA6 0xBCA7 # HANGUL SYLLABLE PIEUP-E-TIKEUT -0xBAA7 0xBCA8 # HANGUL SYLLABLE PIEUP-E-RIEUL -0xBAA8 0xBCB0 # HANGUL SYLLABLE PIEUP-E-MIEUM -0xBAA9 0xBCB1 # HANGUL SYLLABLE PIEUP-E-PIEUP -0xBAAA 0xBCB3 # HANGUL SYLLABLE PIEUP-E-SIOS -0xBAAB 0xBCB4 # HANGUL SYLLABLE PIEUP-E-SSANGSIOS -0xBAAC 0xBCB5 # HANGUL SYLLABLE PIEUP-E-IEUNG -0xBAAD 0xBCBC # HANGUL SYLLABLE PIEUP-YEO -0xBAAE 0xBCBD # HANGUL SYLLABLE PIEUP-YEO-KIYEOK -0xBAAF 0xBCC0 # HANGUL SYLLABLE PIEUP-YEO-NIEUN -0xBAB0 0xBCC4 # HANGUL SYLLABLE PIEUP-YEO-RIEUL -0xBAB1 0xBCCD # HANGUL SYLLABLE PIEUP-YEO-PIEUP -0xBAB2 0xBCCF # HANGUL SYLLABLE PIEUP-YEO-SIOS -0xBAB3 0xBCD0 # HANGUL SYLLABLE PIEUP-YEO-SSANGSIOS -0xBAB4 0xBCD1 # HANGUL SYLLABLE PIEUP-YEO-IEUNG -0xBAB5 0xBCD5 # HANGUL SYLLABLE PIEUP-YEO-THIEUTH -0xBAB6 0xBCD8 # HANGUL SYLLABLE PIEUP-YE -0xBAB7 0xBCDC # HANGUL SYLLABLE PIEUP-YE-NIEUN -0xBAB8 0xBCF4 # HANGUL SYLLABLE PIEUP-O -0xBAB9 0xBCF5 # HANGUL SYLLABLE PIEUP-O-KIYEOK -0xBABA 0xBCF6 # HANGUL SYLLABLE PIEUP-O-SSANGKIYEOK -0xBABB 0xBCF8 # HANGUL SYLLABLE PIEUP-O-NIEUN -0xBABC 0xBCFC # HANGUL SYLLABLE PIEUP-O-RIEUL -0xBABD 0xBD04 # HANGUL SYLLABLE PIEUP-O-MIEUM -0xBABE 0xBD05 # HANGUL SYLLABLE PIEUP-O-PIEUP -0xBABF 0xBD07 # HANGUL SYLLABLE PIEUP-O-SIOS -0xBAC0 0xBD09 # HANGUL SYLLABLE PIEUP-O-IEUNG -0xBAC1 0xBD10 # HANGUL SYLLABLE PIEUP-WA -0xBAC2 0xBD14 # HANGUL SYLLABLE PIEUP-WA-NIEUN -0xBAC3 0xBD24 # HANGUL SYLLABLE PIEUP-WA-SSANGSIOS -0xBAC4 0xBD2C # HANGUL SYLLABLE PIEUP-WAE -0xBAC5 0xBD40 # HANGUL SYLLABLE PIEUP-WAE-SSANGSIOS -0xBAC6 0xBD48 # HANGUL SYLLABLE PIEUP-OE -0xBAC7 0xBD49 # HANGUL SYLLABLE PIEUP-OE-KIYEOK -0xBAC8 0xBD4C # HANGUL SYLLABLE PIEUP-OE-NIEUN -0xBAC9 0xBD50 # HANGUL SYLLABLE PIEUP-OE-RIEUL -0xBACA 0xBD58 # HANGUL SYLLABLE PIEUP-OE-MIEUM -0xBACB 0xBD59 # HANGUL SYLLABLE PIEUP-OE-PIEUP -0xBACC 0xBD64 # HANGUL SYLLABLE PIEUP-YO -0xBACD 0xBD68 # HANGUL SYLLABLE PIEUP-YO-NIEUN -0xBACE 0xBD80 # HANGUL SYLLABLE PIEUP-U -0xBACF 0xBD81 # HANGUL SYLLABLE PIEUP-U-KIYEOK -0xBAD0 0xBD84 # HANGUL SYLLABLE PIEUP-U-NIEUN -0xBAD1 0xBD87 # HANGUL SYLLABLE PIEUP-U-TIKEUT -0xBAD2 0xBD88 # HANGUL SYLLABLE PIEUP-U-RIEUL -0xBAD3 0xBD89 # HANGUL SYLLABLE PIEUP-U-RIEULKIYEOK -0xBAD4 0xBD8A # HANGUL SYLLABLE PIEUP-U-RIEULMIEUM -0xBAD5 0xBD90 # HANGUL SYLLABLE PIEUP-U-MIEUM -0xBAD6 0xBD91 # HANGUL SYLLABLE PIEUP-U-PIEUP -0xBAD7 0xBD93 # HANGUL SYLLABLE PIEUP-U-SIOS -0xBAD8 0xBD95 # HANGUL SYLLABLE PIEUP-U-IEUNG -0xBAD9 0xBD99 # HANGUL SYLLABLE PIEUP-U-THIEUTH -0xBADA 0xBD9A # HANGUL SYLLABLE PIEUP-U-PHIEUPH -0xBADB 0xBD9C # HANGUL SYLLABLE PIEUP-WEO -0xBADC 0xBDA4 # HANGUL SYLLABLE PIEUP-WEO-RIEUL -0xBADD 0xBDB0 # HANGUL SYLLABLE PIEUP-WEO-SSANGSIOS -0xBADE 0xBDB8 # HANGUL SYLLABLE PIEUP-WE -0xBADF 0xBDD4 # HANGUL SYLLABLE PIEUP-WI -0xBAE0 0xBDD5 # HANGUL SYLLABLE PIEUP-WI-KIYEOK -0xBAE1 0xBDD8 # HANGUL SYLLABLE PIEUP-WI-NIEUN -0xBAE2 0xBDDC # HANGUL SYLLABLE PIEUP-WI-RIEUL -0xBAE3 0xBDE9 # HANGUL SYLLABLE PIEUP-WI-IEUNG -0xBAE4 0xBDF0 # HANGUL SYLLABLE PIEUP-YU -0xBAE5 0xBDF4 # HANGUL SYLLABLE PIEUP-YU-NIEUN -0xBAE6 0xBDF8 # HANGUL SYLLABLE PIEUP-YU-RIEUL -0xBAE7 0xBE00 # HANGUL SYLLABLE PIEUP-YU-MIEUM -0xBAE8 0xBE03 # HANGUL SYLLABLE PIEUP-YU-SIOS -0xBAE9 0xBE05 # HANGUL SYLLABLE PIEUP-YU-IEUNG -0xBAEA 0xBE0C # HANGUL SYLLABLE PIEUP-EU -0xBAEB 0xBE0D # HANGUL SYLLABLE PIEUP-EU-KIYEOK -0xBAEC 0xBE10 # HANGUL SYLLABLE PIEUP-EU-NIEUN -0xBAED 0xBE14 # HANGUL SYLLABLE PIEUP-EU-RIEUL -0xBAEE 0xBE1C # HANGUL SYLLABLE PIEUP-EU-MIEUM -0xBAEF 0xBE1D # HANGUL SYLLABLE PIEUP-EU-PIEUP -0xBAF0 0xBE1F # HANGUL SYLLABLE PIEUP-EU-SIOS -0xBAF1 0xBE44 # HANGUL SYLLABLE PIEUP-I -0xBAF2 0xBE45 # HANGUL SYLLABLE PIEUP-I-KIYEOK -0xBAF3 0xBE48 # HANGUL SYLLABLE PIEUP-I-NIEUN -0xBAF4 0xBE4C # HANGUL SYLLABLE PIEUP-I-RIEUL -0xBAF5 0xBE4E # HANGUL SYLLABLE PIEUP-I-RIEULMIEUM -0xBAF6 0xBE54 # HANGUL SYLLABLE PIEUP-I-MIEUM -0xBAF7 0xBE55 # HANGUL SYLLABLE PIEUP-I-PIEUP -0xBAF8 0xBE57 # HANGUL SYLLABLE PIEUP-I-SIOS -0xBAF9 0xBE59 # HANGUL SYLLABLE PIEUP-I-IEUNG -0xBAFA 0xBE5A # HANGUL SYLLABLE PIEUP-I-CIEUC -0xBAFB 0xBE5B # HANGUL SYLLABLE PIEUP-I-CHIEUCH -0xBAFC 0xBE60 # HANGUL SYLLABLE SSANGPIEUP-A -0xBAFD 0xBE61 # HANGUL SYLLABLE SSANGPIEUP-A-KIYEOK -0xBAFE 0xBE64 # HANGUL SYLLABLE SSANGPIEUP-A-NIEUN -0xBB41 0xD2FB # HANGUL SYLLABLE THIEUTH-I-RIEULPIEUP -0xBB42 0xD2FC # HANGUL SYLLABLE THIEUTH-I-RIEULSIOS -0xBB43 0xD2FD # HANGUL SYLLABLE THIEUTH-I-RIEULTHIEUTH -0xBB44 0xD2FE # HANGUL SYLLABLE THIEUTH-I-RIEULPHIEUPH -0xBB45 0xD2FF # HANGUL SYLLABLE THIEUTH-I-RIEULHIEUH -0xBB46 0xD302 # HANGUL SYLLABLE THIEUTH-I-PIEUPSIOS -0xBB47 0xD304 # HANGUL SYLLABLE THIEUTH-I-SSANGSIOS -0xBB48 0xD306 # HANGUL SYLLABLE THIEUTH-I-CIEUC -0xBB49 0xD307 # HANGUL SYLLABLE THIEUTH-I-CHIEUCH -0xBB4A 0xD308 # HANGUL SYLLABLE THIEUTH-I-KHIEUKH -0xBB4B 0xD309 # HANGUL SYLLABLE THIEUTH-I-THIEUTH -0xBB4C 0xD30A # HANGUL SYLLABLE THIEUTH-I-PHIEUPH -0xBB4D 0xD30B # HANGUL SYLLABLE THIEUTH-I-HIEUH -0xBB4E 0xD30F # HANGUL SYLLABLE PHIEUPH-A-KIYEOKSIOS -0xBB4F 0xD311 # HANGUL SYLLABLE PHIEUPH-A-NIEUNCIEUC -0xBB50 0xD312 # HANGUL SYLLABLE PHIEUPH-A-NIEUNHIEUH -0xBB51 0xD313 # HANGUL SYLLABLE PHIEUPH-A-TIKEUT -0xBB52 0xD315 # HANGUL SYLLABLE PHIEUPH-A-RIEULKIYEOK -0xBB53 0xD317 # HANGUL SYLLABLE PHIEUPH-A-RIEULPIEUP -0xBB54 0xD318 # HANGUL SYLLABLE PHIEUPH-A-RIEULSIOS -0xBB55 0xD319 # HANGUL SYLLABLE PHIEUPH-A-RIEULTHIEUTH -0xBB56 0xD31A # HANGUL SYLLABLE PHIEUPH-A-RIEULPHIEUPH -0xBB57 0xD31B # HANGUL SYLLABLE PHIEUPH-A-RIEULHIEUH -0xBB58 0xD31E # HANGUL SYLLABLE PHIEUPH-A-PIEUPSIOS -0xBB59 0xD322 # HANGUL SYLLABLE PHIEUPH-A-CIEUC -0xBB5A 0xD323 # HANGUL SYLLABLE PHIEUPH-A-CHIEUCH -0xBB61 0xD324 # HANGUL SYLLABLE PHIEUPH-A-KHIEUKH -0xBB62 0xD326 # HANGUL SYLLABLE PHIEUPH-A-PHIEUPH -0xBB63 0xD327 # HANGUL SYLLABLE PHIEUPH-A-HIEUH -0xBB64 0xD32A # HANGUL SYLLABLE PHIEUPH-AE-SSANGKIYEOK -0xBB65 0xD32B # HANGUL SYLLABLE PHIEUPH-AE-KIYEOKSIOS -0xBB66 0xD32D # HANGUL SYLLABLE PHIEUPH-AE-NIEUNCIEUC -0xBB67 0xD32E # HANGUL SYLLABLE PHIEUPH-AE-NIEUNHIEUH -0xBB68 0xD32F # HANGUL SYLLABLE PHIEUPH-AE-TIKEUT -0xBB69 0xD331 # HANGUL SYLLABLE PHIEUPH-AE-RIEULKIYEOK -0xBB6A 0xD332 # HANGUL SYLLABLE PHIEUPH-AE-RIEULMIEUM -0xBB6B 0xD333 # HANGUL SYLLABLE PHIEUPH-AE-RIEULPIEUP -0xBB6C 0xD334 # HANGUL SYLLABLE PHIEUPH-AE-RIEULSIOS -0xBB6D 0xD335 # HANGUL SYLLABLE PHIEUPH-AE-RIEULTHIEUTH -0xBB6E 0xD336 # HANGUL SYLLABLE PHIEUPH-AE-RIEULPHIEUPH -0xBB6F 0xD337 # HANGUL SYLLABLE PHIEUPH-AE-RIEULHIEUH -0xBB70 0xD33A # HANGUL SYLLABLE PHIEUPH-AE-PIEUPSIOS -0xBB71 0xD33E # HANGUL SYLLABLE PHIEUPH-AE-CIEUC -0xBB72 0xD33F # HANGUL SYLLABLE PHIEUPH-AE-CHIEUCH -0xBB73 0xD340 # HANGUL SYLLABLE PHIEUPH-AE-KHIEUKH -0xBB74 0xD341 # HANGUL SYLLABLE PHIEUPH-AE-THIEUTH -0xBB75 0xD342 # HANGUL SYLLABLE PHIEUPH-AE-PHIEUPH -0xBB76 0xD343 # HANGUL SYLLABLE PHIEUPH-AE-HIEUH -0xBB77 0xD346 # HANGUL SYLLABLE PHIEUPH-YA-SSANGKIYEOK -0xBB78 0xD347 # HANGUL SYLLABLE PHIEUPH-YA-KIYEOKSIOS -0xBB79 0xD348 # HANGUL SYLLABLE PHIEUPH-YA-NIEUN -0xBB7A 0xD349 # HANGUL SYLLABLE PHIEUPH-YA-NIEUNCIEUC -0xBB81 0xD34A # HANGUL SYLLABLE PHIEUPH-YA-NIEUNHIEUH -0xBB82 0xD34B # HANGUL SYLLABLE PHIEUPH-YA-TIKEUT -0xBB83 0xD34C # HANGUL SYLLABLE PHIEUPH-YA-RIEUL -0xBB84 0xD34D # HANGUL SYLLABLE PHIEUPH-YA-RIEULKIYEOK -0xBB85 0xD34E # HANGUL SYLLABLE PHIEUPH-YA-RIEULMIEUM -0xBB86 0xD34F # HANGUL SYLLABLE PHIEUPH-YA-RIEULPIEUP -0xBB87 0xD350 # HANGUL SYLLABLE PHIEUPH-YA-RIEULSIOS -0xBB88 0xD351 # HANGUL SYLLABLE PHIEUPH-YA-RIEULTHIEUTH -0xBB89 0xD352 # HANGUL SYLLABLE PHIEUPH-YA-RIEULPHIEUPH -0xBB8A 0xD353 # HANGUL SYLLABLE PHIEUPH-YA-RIEULHIEUH -0xBB8B 0xD354 # HANGUL SYLLABLE PHIEUPH-YA-MIEUM -0xBB8C 0xD355 # HANGUL SYLLABLE PHIEUPH-YA-PIEUP -0xBB8D 0xD356 # HANGUL SYLLABLE PHIEUPH-YA-PIEUPSIOS -0xBB8E 0xD357 # HANGUL SYLLABLE PHIEUPH-YA-SIOS -0xBB8F 0xD358 # HANGUL SYLLABLE PHIEUPH-YA-SSANGSIOS -0xBB90 0xD359 # HANGUL SYLLABLE PHIEUPH-YA-IEUNG -0xBB91 0xD35A # HANGUL SYLLABLE PHIEUPH-YA-CIEUC -0xBB92 0xD35B # HANGUL SYLLABLE PHIEUPH-YA-CHIEUCH -0xBB93 0xD35C # HANGUL SYLLABLE PHIEUPH-YA-KHIEUKH -0xBB94 0xD35D # HANGUL SYLLABLE PHIEUPH-YA-THIEUTH -0xBB95 0xD35E # HANGUL SYLLABLE PHIEUPH-YA-PHIEUPH -0xBB96 0xD35F # HANGUL SYLLABLE PHIEUPH-YA-HIEUH -0xBB97 0xD360 # HANGUL SYLLABLE PHIEUPH-YAE -0xBB98 0xD361 # HANGUL SYLLABLE PHIEUPH-YAE-KIYEOK -0xBB99 0xD362 # HANGUL SYLLABLE PHIEUPH-YAE-SSANGKIYEOK -0xBB9A 0xD363 # HANGUL SYLLABLE PHIEUPH-YAE-KIYEOKSIOS -0xBB9B 0xD364 # HANGUL SYLLABLE PHIEUPH-YAE-NIEUN -0xBB9C 0xD365 # HANGUL SYLLABLE PHIEUPH-YAE-NIEUNCIEUC -0xBB9D 0xD366 # HANGUL SYLLABLE PHIEUPH-YAE-NIEUNHIEUH -0xBB9E 0xD367 # HANGUL SYLLABLE PHIEUPH-YAE-TIKEUT -0xBB9F 0xD368 # HANGUL SYLLABLE PHIEUPH-YAE-RIEUL -0xBBA0 0xD369 # HANGUL SYLLABLE PHIEUPH-YAE-RIEULKIYEOK -0xBBA1 0xBE68 # HANGUL SYLLABLE SSANGPIEUP-A-RIEUL -0xBBA2 0xBE6A # HANGUL SYLLABLE SSANGPIEUP-A-RIEULMIEUM -0xBBA3 0xBE70 # HANGUL SYLLABLE SSANGPIEUP-A-MIEUM -0xBBA4 0xBE71 # HANGUL SYLLABLE SSANGPIEUP-A-PIEUP -0xBBA5 0xBE73 # HANGUL SYLLABLE SSANGPIEUP-A-SIOS -0xBBA6 0xBE74 # HANGUL SYLLABLE SSANGPIEUP-A-SSANGSIOS -0xBBA7 0xBE75 # HANGUL SYLLABLE SSANGPIEUP-A-IEUNG -0xBBA8 0xBE7B # HANGUL SYLLABLE SSANGPIEUP-A-HIEUH -0xBBA9 0xBE7C # HANGUL SYLLABLE SSANGPIEUP-AE -0xBBAA 0xBE7D # HANGUL SYLLABLE SSANGPIEUP-AE-KIYEOK -0xBBAB 0xBE80 # HANGUL SYLLABLE SSANGPIEUP-AE-NIEUN -0xBBAC 0xBE84 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEUL -0xBBAD 0xBE8C # HANGUL SYLLABLE SSANGPIEUP-AE-MIEUM -0xBBAE 0xBE8D # HANGUL SYLLABLE SSANGPIEUP-AE-PIEUP -0xBBAF 0xBE8F # HANGUL SYLLABLE SSANGPIEUP-AE-SIOS -0xBBB0 0xBE90 # HANGUL SYLLABLE SSANGPIEUP-AE-SSANGSIOS -0xBBB1 0xBE91 # HANGUL SYLLABLE SSANGPIEUP-AE-IEUNG -0xBBB2 0xBE98 # HANGUL SYLLABLE SSANGPIEUP-YA -0xBBB3 0xBE99 # HANGUL SYLLABLE SSANGPIEUP-YA-KIYEOK -0xBBB4 0xBEA8 # HANGUL SYLLABLE SSANGPIEUP-YA-MIEUM -0xBBB5 0xBED0 # HANGUL SYLLABLE SSANGPIEUP-EO -0xBBB6 0xBED1 # HANGUL SYLLABLE SSANGPIEUP-EO-KIYEOK -0xBBB7 0xBED4 # HANGUL SYLLABLE SSANGPIEUP-EO-NIEUN -0xBBB8 0xBED7 # HANGUL SYLLABLE SSANGPIEUP-EO-TIKEUT -0xBBB9 0xBED8 # HANGUL SYLLABLE SSANGPIEUP-EO-RIEUL -0xBBBA 0xBEE0 # HANGUL SYLLABLE SSANGPIEUP-EO-MIEUM -0xBBBB 0xBEE3 # HANGUL SYLLABLE SSANGPIEUP-EO-SIOS -0xBBBC 0xBEE4 # HANGUL SYLLABLE SSANGPIEUP-EO-SSANGSIOS -0xBBBD 0xBEE5 # HANGUL SYLLABLE SSANGPIEUP-EO-IEUNG -0xBBBE 0xBEEC # HANGUL SYLLABLE SSANGPIEUP-E -0xBBBF 0xBF01 # HANGUL SYLLABLE SSANGPIEUP-E-IEUNG -0xBBC0 0xBF08 # HANGUL SYLLABLE SSANGPIEUP-YEO -0xBBC1 0xBF09 # HANGUL SYLLABLE SSANGPIEUP-YEO-KIYEOK -0xBBC2 0xBF18 # HANGUL SYLLABLE SSANGPIEUP-YEO-MIEUM -0xBBC3 0xBF19 # HANGUL SYLLABLE SSANGPIEUP-YEO-PIEUP -0xBBC4 0xBF1B # HANGUL SYLLABLE SSANGPIEUP-YEO-SIOS -0xBBC5 0xBF1C # HANGUL SYLLABLE SSANGPIEUP-YEO-SSANGSIOS -0xBBC6 0xBF1D # HANGUL SYLLABLE SSANGPIEUP-YEO-IEUNG -0xBBC7 0xBF40 # HANGUL SYLLABLE SSANGPIEUP-O -0xBBC8 0xBF41 # HANGUL SYLLABLE SSANGPIEUP-O-KIYEOK -0xBBC9 0xBF44 # HANGUL SYLLABLE SSANGPIEUP-O-NIEUN -0xBBCA 0xBF48 # HANGUL SYLLABLE SSANGPIEUP-O-RIEUL -0xBBCB 0xBF50 # HANGUL SYLLABLE SSANGPIEUP-O-MIEUM -0xBBCC 0xBF51 # HANGUL SYLLABLE SSANGPIEUP-O-PIEUP -0xBBCD 0xBF55 # HANGUL SYLLABLE SSANGPIEUP-O-IEUNG -0xBBCE 0xBF94 # HANGUL SYLLABLE SSANGPIEUP-OE -0xBBCF 0xBFB0 # HANGUL SYLLABLE SSANGPIEUP-YO -0xBBD0 0xBFC5 # HANGUL SYLLABLE SSANGPIEUP-YO-IEUNG -0xBBD1 0xBFCC # HANGUL SYLLABLE SSANGPIEUP-U -0xBBD2 0xBFCD # HANGUL SYLLABLE SSANGPIEUP-U-KIYEOK -0xBBD3 0xBFD0 # HANGUL SYLLABLE SSANGPIEUP-U-NIEUN -0xBBD4 0xBFD4 # HANGUL SYLLABLE SSANGPIEUP-U-RIEUL -0xBBD5 0xBFDC # HANGUL SYLLABLE SSANGPIEUP-U-MIEUM -0xBBD6 0xBFDF # HANGUL SYLLABLE SSANGPIEUP-U-SIOS -0xBBD7 0xBFE1 # HANGUL SYLLABLE SSANGPIEUP-U-IEUNG -0xBBD8 0xC03C # HANGUL SYLLABLE SSANGPIEUP-YU -0xBBD9 0xC051 # HANGUL SYLLABLE SSANGPIEUP-YU-IEUNG -0xBBDA 0xC058 # HANGUL SYLLABLE SSANGPIEUP-EU -0xBBDB 0xC05C # HANGUL SYLLABLE SSANGPIEUP-EU-NIEUN -0xBBDC 0xC060 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEUL -0xBBDD 0xC068 # HANGUL SYLLABLE SSANGPIEUP-EU-MIEUM -0xBBDE 0xC069 # HANGUL SYLLABLE SSANGPIEUP-EU-PIEUP -0xBBDF 0xC090 # HANGUL SYLLABLE SSANGPIEUP-I -0xBBE0 0xC091 # HANGUL SYLLABLE SSANGPIEUP-I-KIYEOK -0xBBE1 0xC094 # HANGUL SYLLABLE SSANGPIEUP-I-NIEUN -0xBBE2 0xC098 # HANGUL SYLLABLE SSANGPIEUP-I-RIEUL -0xBBE3 0xC0A0 # HANGUL SYLLABLE SSANGPIEUP-I-MIEUM -0xBBE4 0xC0A1 # HANGUL SYLLABLE SSANGPIEUP-I-PIEUP -0xBBE5 0xC0A3 # HANGUL SYLLABLE SSANGPIEUP-I-SIOS -0xBBE6 0xC0A5 # HANGUL SYLLABLE SSANGPIEUP-I-IEUNG -0xBBE7 0xC0AC # HANGUL SYLLABLE SIOS-A -0xBBE8 0xC0AD # HANGUL SYLLABLE SIOS-A-KIYEOK -0xBBE9 0xC0AF # HANGUL SYLLABLE SIOS-A-KIYEOKSIOS -0xBBEA 0xC0B0 # HANGUL SYLLABLE SIOS-A-NIEUN -0xBBEB 0xC0B3 # HANGUL SYLLABLE SIOS-A-TIKEUT -0xBBEC 0xC0B4 # HANGUL SYLLABLE SIOS-A-RIEUL -0xBBED 0xC0B5 # HANGUL SYLLABLE SIOS-A-RIEULKIYEOK -0xBBEE 0xC0B6 # HANGUL SYLLABLE SIOS-A-RIEULMIEUM -0xBBEF 0xC0BC # HANGUL SYLLABLE SIOS-A-MIEUM -0xBBF0 0xC0BD # HANGUL SYLLABLE SIOS-A-PIEUP -0xBBF1 0xC0BF # HANGUL SYLLABLE SIOS-A-SIOS -0xBBF2 0xC0C0 # HANGUL SYLLABLE SIOS-A-SSANGSIOS -0xBBF3 0xC0C1 # HANGUL SYLLABLE SIOS-A-IEUNG -0xBBF4 0xC0C5 # HANGUL SYLLABLE SIOS-A-THIEUTH -0xBBF5 0xC0C8 # HANGUL SYLLABLE SIOS-AE -0xBBF6 0xC0C9 # HANGUL SYLLABLE SIOS-AE-KIYEOK -0xBBF7 0xC0CC # HANGUL SYLLABLE SIOS-AE-NIEUN -0xBBF8 0xC0D0 # HANGUL SYLLABLE SIOS-AE-RIEUL -0xBBF9 0xC0D8 # HANGUL SYLLABLE SIOS-AE-MIEUM -0xBBFA 0xC0D9 # HANGUL SYLLABLE SIOS-AE-PIEUP -0xBBFB 0xC0DB # HANGUL SYLLABLE SIOS-AE-SIOS -0xBBFC 0xC0DC # HANGUL SYLLABLE SIOS-AE-SSANGSIOS -0xBBFD 0xC0DD # HANGUL SYLLABLE SIOS-AE-IEUNG -0xBBFE 0xC0E4 # HANGUL SYLLABLE SIOS-YA -0xBC41 0xD36A # HANGUL SYLLABLE PHIEUPH-YAE-RIEULMIEUM -0xBC42 0xD36B # HANGUL SYLLABLE PHIEUPH-YAE-RIEULPIEUP -0xBC43 0xD36C # HANGUL SYLLABLE PHIEUPH-YAE-RIEULSIOS -0xBC44 0xD36D # HANGUL SYLLABLE PHIEUPH-YAE-RIEULTHIEUTH -0xBC45 0xD36E # HANGUL SYLLABLE PHIEUPH-YAE-RIEULPHIEUPH -0xBC46 0xD36F # HANGUL SYLLABLE PHIEUPH-YAE-RIEULHIEUH -0xBC47 0xD370 # HANGUL SYLLABLE PHIEUPH-YAE-MIEUM -0xBC48 0xD371 # HANGUL SYLLABLE PHIEUPH-YAE-PIEUP -0xBC49 0xD372 # HANGUL SYLLABLE PHIEUPH-YAE-PIEUPSIOS -0xBC4A 0xD373 # HANGUL SYLLABLE PHIEUPH-YAE-SIOS -0xBC4B 0xD374 # HANGUL SYLLABLE PHIEUPH-YAE-SSANGSIOS -0xBC4C 0xD375 # HANGUL SYLLABLE PHIEUPH-YAE-IEUNG -0xBC4D 0xD376 # HANGUL SYLLABLE PHIEUPH-YAE-CIEUC -0xBC4E 0xD377 # HANGUL SYLLABLE PHIEUPH-YAE-CHIEUCH -0xBC4F 0xD378 # HANGUL SYLLABLE PHIEUPH-YAE-KHIEUKH -0xBC50 0xD379 # HANGUL SYLLABLE PHIEUPH-YAE-THIEUTH -0xBC51 0xD37A # HANGUL SYLLABLE PHIEUPH-YAE-PHIEUPH -0xBC52 0xD37B # HANGUL SYLLABLE PHIEUPH-YAE-HIEUH -0xBC53 0xD37E # HANGUL SYLLABLE PHIEUPH-EO-SSANGKIYEOK -0xBC54 0xD37F # HANGUL SYLLABLE PHIEUPH-EO-KIYEOKSIOS -0xBC55 0xD381 # HANGUL SYLLABLE PHIEUPH-EO-NIEUNCIEUC -0xBC56 0xD382 # HANGUL SYLLABLE PHIEUPH-EO-NIEUNHIEUH -0xBC57 0xD383 # HANGUL SYLLABLE PHIEUPH-EO-TIKEUT -0xBC58 0xD385 # HANGUL SYLLABLE PHIEUPH-EO-RIEULKIYEOK -0xBC59 0xD386 # HANGUL SYLLABLE PHIEUPH-EO-RIEULMIEUM -0xBC5A 0xD387 # HANGUL SYLLABLE PHIEUPH-EO-RIEULPIEUP -0xBC61 0xD388 # HANGUL SYLLABLE PHIEUPH-EO-RIEULSIOS -0xBC62 0xD389 # HANGUL SYLLABLE PHIEUPH-EO-RIEULTHIEUTH -0xBC63 0xD38A # HANGUL SYLLABLE PHIEUPH-EO-RIEULPHIEUPH -0xBC64 0xD38B # HANGUL SYLLABLE PHIEUPH-EO-RIEULHIEUH -0xBC65 0xD38E # HANGUL SYLLABLE PHIEUPH-EO-PIEUPSIOS -0xBC66 0xD392 # HANGUL SYLLABLE PHIEUPH-EO-CIEUC -0xBC67 0xD393 # HANGUL SYLLABLE PHIEUPH-EO-CHIEUCH -0xBC68 0xD394 # HANGUL SYLLABLE PHIEUPH-EO-KHIEUKH -0xBC69 0xD395 # HANGUL SYLLABLE PHIEUPH-EO-THIEUTH -0xBC6A 0xD396 # HANGUL SYLLABLE PHIEUPH-EO-PHIEUPH -0xBC6B 0xD397 # HANGUL SYLLABLE PHIEUPH-EO-HIEUH -0xBC6C 0xD39A # HANGUL SYLLABLE PHIEUPH-E-SSANGKIYEOK -0xBC6D 0xD39B # HANGUL SYLLABLE PHIEUPH-E-KIYEOKSIOS -0xBC6E 0xD39D # HANGUL SYLLABLE PHIEUPH-E-NIEUNCIEUC -0xBC6F 0xD39E # HANGUL SYLLABLE PHIEUPH-E-NIEUNHIEUH -0xBC70 0xD39F # HANGUL SYLLABLE PHIEUPH-E-TIKEUT -0xBC71 0xD3A1 # HANGUL SYLLABLE PHIEUPH-E-RIEULKIYEOK -0xBC72 0xD3A2 # HANGUL SYLLABLE PHIEUPH-E-RIEULMIEUM -0xBC73 0xD3A3 # HANGUL SYLLABLE PHIEUPH-E-RIEULPIEUP -0xBC74 0xD3A4 # HANGUL SYLLABLE PHIEUPH-E-RIEULSIOS -0xBC75 0xD3A5 # HANGUL SYLLABLE PHIEUPH-E-RIEULTHIEUTH -0xBC76 0xD3A6 # HANGUL SYLLABLE PHIEUPH-E-RIEULPHIEUPH -0xBC77 0xD3A7 # HANGUL SYLLABLE PHIEUPH-E-RIEULHIEUH -0xBC78 0xD3AA # HANGUL SYLLABLE PHIEUPH-E-PIEUPSIOS -0xBC79 0xD3AC # HANGUL SYLLABLE PHIEUPH-E-SSANGSIOS -0xBC7A 0xD3AE # HANGUL SYLLABLE PHIEUPH-E-CIEUC -0xBC81 0xD3AF # HANGUL SYLLABLE PHIEUPH-E-CHIEUCH -0xBC82 0xD3B0 # HANGUL SYLLABLE PHIEUPH-E-KHIEUKH -0xBC83 0xD3B1 # HANGUL SYLLABLE PHIEUPH-E-THIEUTH -0xBC84 0xD3B2 # HANGUL SYLLABLE PHIEUPH-E-PHIEUPH -0xBC85 0xD3B3 # HANGUL SYLLABLE PHIEUPH-E-HIEUH -0xBC86 0xD3B5 # HANGUL SYLLABLE PHIEUPH-YEO-KIYEOK -0xBC87 0xD3B6 # HANGUL SYLLABLE PHIEUPH-YEO-SSANGKIYEOK -0xBC88 0xD3B7 # HANGUL SYLLABLE PHIEUPH-YEO-KIYEOKSIOS -0xBC89 0xD3B9 # HANGUL SYLLABLE PHIEUPH-YEO-NIEUNCIEUC -0xBC8A 0xD3BA # HANGUL SYLLABLE PHIEUPH-YEO-NIEUNHIEUH -0xBC8B 0xD3BB # HANGUL SYLLABLE PHIEUPH-YEO-TIKEUT -0xBC8C 0xD3BD # HANGUL SYLLABLE PHIEUPH-YEO-RIEULKIYEOK -0xBC8D 0xD3BE # HANGUL SYLLABLE PHIEUPH-YEO-RIEULMIEUM -0xBC8E 0xD3BF # HANGUL SYLLABLE PHIEUPH-YEO-RIEULPIEUP -0xBC8F 0xD3C0 # HANGUL SYLLABLE PHIEUPH-YEO-RIEULSIOS -0xBC90 0xD3C1 # HANGUL SYLLABLE PHIEUPH-YEO-RIEULTHIEUTH -0xBC91 0xD3C2 # HANGUL SYLLABLE PHIEUPH-YEO-RIEULPHIEUPH -0xBC92 0xD3C3 # HANGUL SYLLABLE PHIEUPH-YEO-RIEULHIEUH -0xBC93 0xD3C6 # HANGUL SYLLABLE PHIEUPH-YEO-PIEUPSIOS -0xBC94 0xD3C7 # HANGUL SYLLABLE PHIEUPH-YEO-SIOS -0xBC95 0xD3CA # HANGUL SYLLABLE PHIEUPH-YEO-CIEUC -0xBC96 0xD3CB # HANGUL SYLLABLE PHIEUPH-YEO-CHIEUCH -0xBC97 0xD3CC # HANGUL SYLLABLE PHIEUPH-YEO-KHIEUKH -0xBC98 0xD3CD # HANGUL SYLLABLE PHIEUPH-YEO-THIEUTH -0xBC99 0xD3CE # HANGUL SYLLABLE PHIEUPH-YEO-PHIEUPH -0xBC9A 0xD3CF # HANGUL SYLLABLE PHIEUPH-YEO-HIEUH -0xBC9B 0xD3D1 # HANGUL SYLLABLE PHIEUPH-YE-KIYEOK -0xBC9C 0xD3D2 # HANGUL SYLLABLE PHIEUPH-YE-SSANGKIYEOK -0xBC9D 0xD3D3 # HANGUL SYLLABLE PHIEUPH-YE-KIYEOKSIOS -0xBC9E 0xD3D4 # HANGUL SYLLABLE PHIEUPH-YE-NIEUN -0xBC9F 0xD3D5 # HANGUL SYLLABLE PHIEUPH-YE-NIEUNCIEUC -0xBCA0 0xD3D6 # HANGUL SYLLABLE PHIEUPH-YE-NIEUNHIEUH -0xBCA1 0xC0E5 # HANGUL SYLLABLE SIOS-YA-KIYEOK -0xBCA2 0xC0E8 # HANGUL SYLLABLE SIOS-YA-NIEUN -0xBCA3 0xC0EC # HANGUL SYLLABLE SIOS-YA-RIEUL -0xBCA4 0xC0F4 # HANGUL SYLLABLE SIOS-YA-MIEUM -0xBCA5 0xC0F5 # HANGUL SYLLABLE SIOS-YA-PIEUP -0xBCA6 0xC0F7 # HANGUL SYLLABLE SIOS-YA-SIOS -0xBCA7 0xC0F9 # HANGUL SYLLABLE SIOS-YA-IEUNG -0xBCA8 0xC100 # HANGUL SYLLABLE SIOS-YAE -0xBCA9 0xC104 # HANGUL SYLLABLE SIOS-YAE-NIEUN -0xBCAA 0xC108 # HANGUL SYLLABLE SIOS-YAE-RIEUL -0xBCAB 0xC110 # HANGUL SYLLABLE SIOS-YAE-MIEUM -0xBCAC 0xC115 # HANGUL SYLLABLE SIOS-YAE-IEUNG -0xBCAD 0xC11C # HANGUL SYLLABLE SIOS-EO -0xBCAE 0xC11D # HANGUL SYLLABLE SIOS-EO-KIYEOK -0xBCAF 0xC11E # HANGUL SYLLABLE SIOS-EO-SSANGKIYEOK -0xBCB0 0xC11F # HANGUL SYLLABLE SIOS-EO-KIYEOKSIOS -0xBCB1 0xC120 # HANGUL SYLLABLE SIOS-EO-NIEUN -0xBCB2 0xC123 # HANGUL SYLLABLE SIOS-EO-TIKEUT -0xBCB3 0xC124 # HANGUL SYLLABLE SIOS-EO-RIEUL -0xBCB4 0xC126 # HANGUL SYLLABLE SIOS-EO-RIEULMIEUM -0xBCB5 0xC127 # HANGUL SYLLABLE SIOS-EO-RIEULPIEUP -0xBCB6 0xC12C # HANGUL SYLLABLE SIOS-EO-MIEUM -0xBCB7 0xC12D # HANGUL SYLLABLE SIOS-EO-PIEUP -0xBCB8 0xC12F # HANGUL SYLLABLE SIOS-EO-SIOS -0xBCB9 0xC130 # HANGUL SYLLABLE SIOS-EO-SSANGSIOS -0xBCBA 0xC131 # HANGUL SYLLABLE SIOS-EO-IEUNG -0xBCBB 0xC136 # HANGUL SYLLABLE SIOS-EO-PHIEUPH -0xBCBC 0xC138 # HANGUL SYLLABLE SIOS-E -0xBCBD 0xC139 # HANGUL SYLLABLE SIOS-E-KIYEOK -0xBCBE 0xC13C # HANGUL SYLLABLE SIOS-E-NIEUN -0xBCBF 0xC140 # HANGUL SYLLABLE SIOS-E-RIEUL -0xBCC0 0xC148 # HANGUL SYLLABLE SIOS-E-MIEUM -0xBCC1 0xC149 # HANGUL SYLLABLE SIOS-E-PIEUP -0xBCC2 0xC14B # HANGUL SYLLABLE SIOS-E-SIOS -0xBCC3 0xC14C # HANGUL SYLLABLE SIOS-E-SSANGSIOS -0xBCC4 0xC14D # HANGUL SYLLABLE SIOS-E-IEUNG -0xBCC5 0xC154 # HANGUL SYLLABLE SIOS-YEO -0xBCC6 0xC155 # HANGUL SYLLABLE SIOS-YEO-KIYEOK -0xBCC7 0xC158 # HANGUL SYLLABLE SIOS-YEO-NIEUN -0xBCC8 0xC15C # HANGUL SYLLABLE SIOS-YEO-RIEUL -0xBCC9 0xC164 # HANGUL SYLLABLE SIOS-YEO-MIEUM -0xBCCA 0xC165 # HANGUL SYLLABLE SIOS-YEO-PIEUP -0xBCCB 0xC167 # HANGUL SYLLABLE SIOS-YEO-SIOS -0xBCCC 0xC168 # HANGUL SYLLABLE SIOS-YEO-SSANGSIOS -0xBCCD 0xC169 # HANGUL SYLLABLE SIOS-YEO-IEUNG -0xBCCE 0xC170 # HANGUL SYLLABLE SIOS-YE -0xBCCF 0xC174 # HANGUL SYLLABLE SIOS-YE-NIEUN -0xBCD0 0xC178 # HANGUL SYLLABLE SIOS-YE-RIEUL -0xBCD1 0xC185 # HANGUL SYLLABLE SIOS-YE-IEUNG -0xBCD2 0xC18C # HANGUL SYLLABLE SIOS-O -0xBCD3 0xC18D # HANGUL SYLLABLE SIOS-O-KIYEOK -0xBCD4 0xC18E # HANGUL SYLLABLE SIOS-O-SSANGKIYEOK -0xBCD5 0xC190 # HANGUL SYLLABLE SIOS-O-NIEUN -0xBCD6 0xC194 # HANGUL SYLLABLE SIOS-O-RIEUL -0xBCD7 0xC196 # HANGUL SYLLABLE SIOS-O-RIEULMIEUM -0xBCD8 0xC19C # HANGUL SYLLABLE SIOS-O-MIEUM -0xBCD9 0xC19D # HANGUL SYLLABLE SIOS-O-PIEUP -0xBCDA 0xC19F # HANGUL SYLLABLE SIOS-O-SIOS -0xBCDB 0xC1A1 # HANGUL SYLLABLE SIOS-O-IEUNG -0xBCDC 0xC1A5 # HANGUL SYLLABLE SIOS-O-THIEUTH -0xBCDD 0xC1A8 # HANGUL SYLLABLE SIOS-WA -0xBCDE 0xC1A9 # HANGUL SYLLABLE SIOS-WA-KIYEOK -0xBCDF 0xC1AC # HANGUL SYLLABLE SIOS-WA-NIEUN -0xBCE0 0xC1B0 # HANGUL SYLLABLE SIOS-WA-RIEUL -0xBCE1 0xC1BD # HANGUL SYLLABLE SIOS-WA-IEUNG -0xBCE2 0xC1C4 # HANGUL SYLLABLE SIOS-WAE -0xBCE3 0xC1C8 # HANGUL SYLLABLE SIOS-WAE-NIEUN -0xBCE4 0xC1CC # HANGUL SYLLABLE SIOS-WAE-RIEUL -0xBCE5 0xC1D4 # HANGUL SYLLABLE SIOS-WAE-MIEUM -0xBCE6 0xC1D7 # HANGUL SYLLABLE SIOS-WAE-SIOS -0xBCE7 0xC1D8 # HANGUL SYLLABLE SIOS-WAE-SSANGSIOS -0xBCE8 0xC1E0 # HANGUL SYLLABLE SIOS-OE -0xBCE9 0xC1E4 # HANGUL SYLLABLE SIOS-OE-NIEUN -0xBCEA 0xC1E8 # HANGUL SYLLABLE SIOS-OE-RIEUL -0xBCEB 0xC1F0 # HANGUL SYLLABLE SIOS-OE-MIEUM -0xBCEC 0xC1F1 # HANGUL SYLLABLE SIOS-OE-PIEUP -0xBCED 0xC1F3 # HANGUL SYLLABLE SIOS-OE-SIOS -0xBCEE 0xC1FC # HANGUL SYLLABLE SIOS-YO -0xBCEF 0xC1FD # HANGUL SYLLABLE SIOS-YO-KIYEOK -0xBCF0 0xC200 # HANGUL SYLLABLE SIOS-YO-NIEUN -0xBCF1 0xC204 # HANGUL SYLLABLE SIOS-YO-RIEUL -0xBCF2 0xC20C # HANGUL SYLLABLE SIOS-YO-MIEUM -0xBCF3 0xC20D # HANGUL SYLLABLE SIOS-YO-PIEUP -0xBCF4 0xC20F # HANGUL SYLLABLE SIOS-YO-SIOS -0xBCF5 0xC211 # HANGUL SYLLABLE SIOS-YO-IEUNG -0xBCF6 0xC218 # HANGUL SYLLABLE SIOS-U -0xBCF7 0xC219 # HANGUL SYLLABLE SIOS-U-KIYEOK -0xBCF8 0xC21C # HANGUL SYLLABLE SIOS-U-NIEUN -0xBCF9 0xC21F # HANGUL SYLLABLE SIOS-U-TIKEUT -0xBCFA 0xC220 # HANGUL SYLLABLE SIOS-U-RIEUL -0xBCFB 0xC228 # HANGUL SYLLABLE SIOS-U-MIEUM -0xBCFC 0xC229 # HANGUL SYLLABLE SIOS-U-PIEUP -0xBCFD 0xC22B # HANGUL SYLLABLE SIOS-U-SIOS -0xBCFE 0xC22D # HANGUL SYLLABLE SIOS-U-IEUNG -0xBD41 0xD3D7 # HANGUL SYLLABLE PHIEUPH-YE-TIKEUT -0xBD42 0xD3D9 # HANGUL SYLLABLE PHIEUPH-YE-RIEULKIYEOK -0xBD43 0xD3DA # HANGUL SYLLABLE PHIEUPH-YE-RIEULMIEUM -0xBD44 0xD3DB # HANGUL SYLLABLE PHIEUPH-YE-RIEULPIEUP -0xBD45 0xD3DC # HANGUL SYLLABLE PHIEUPH-YE-RIEULSIOS -0xBD46 0xD3DD # HANGUL SYLLABLE PHIEUPH-YE-RIEULTHIEUTH -0xBD47 0xD3DE # HANGUL SYLLABLE PHIEUPH-YE-RIEULPHIEUPH -0xBD48 0xD3DF # HANGUL SYLLABLE PHIEUPH-YE-RIEULHIEUH -0xBD49 0xD3E0 # HANGUL SYLLABLE PHIEUPH-YE-MIEUM -0xBD4A 0xD3E2 # HANGUL SYLLABLE PHIEUPH-YE-PIEUPSIOS -0xBD4B 0xD3E4 # HANGUL SYLLABLE PHIEUPH-YE-SSANGSIOS -0xBD4C 0xD3E5 # HANGUL SYLLABLE PHIEUPH-YE-IEUNG -0xBD4D 0xD3E6 # HANGUL SYLLABLE PHIEUPH-YE-CIEUC -0xBD4E 0xD3E7 # HANGUL SYLLABLE PHIEUPH-YE-CHIEUCH -0xBD4F 0xD3E8 # HANGUL SYLLABLE PHIEUPH-YE-KHIEUKH -0xBD50 0xD3E9 # HANGUL SYLLABLE PHIEUPH-YE-THIEUTH -0xBD51 0xD3EA # HANGUL SYLLABLE PHIEUPH-YE-PHIEUPH -0xBD52 0xD3EB # HANGUL SYLLABLE PHIEUPH-YE-HIEUH -0xBD53 0xD3EE # HANGUL SYLLABLE PHIEUPH-O-SSANGKIYEOK -0xBD54 0xD3EF # HANGUL SYLLABLE PHIEUPH-O-KIYEOKSIOS -0xBD55 0xD3F1 # HANGUL SYLLABLE PHIEUPH-O-NIEUNCIEUC -0xBD56 0xD3F2 # HANGUL SYLLABLE PHIEUPH-O-NIEUNHIEUH -0xBD57 0xD3F3 # HANGUL SYLLABLE PHIEUPH-O-TIKEUT -0xBD58 0xD3F5 # HANGUL SYLLABLE PHIEUPH-O-RIEULKIYEOK -0xBD59 0xD3F6 # HANGUL SYLLABLE PHIEUPH-O-RIEULMIEUM -0xBD5A 0xD3F7 # HANGUL SYLLABLE PHIEUPH-O-RIEULPIEUP -0xBD61 0xD3F8 # HANGUL SYLLABLE PHIEUPH-O-RIEULSIOS -0xBD62 0xD3F9 # HANGUL SYLLABLE PHIEUPH-O-RIEULTHIEUTH -0xBD63 0xD3FA # HANGUL SYLLABLE PHIEUPH-O-RIEULPHIEUPH -0xBD64 0xD3FB # HANGUL SYLLABLE PHIEUPH-O-RIEULHIEUH -0xBD65 0xD3FE # HANGUL SYLLABLE PHIEUPH-O-PIEUPSIOS -0xBD66 0xD400 # HANGUL SYLLABLE PHIEUPH-O-SSANGSIOS -0xBD67 0xD402 # HANGUL SYLLABLE PHIEUPH-O-CIEUC -0xBD68 0xD403 # HANGUL SYLLABLE PHIEUPH-O-CHIEUCH -0xBD69 0xD404 # HANGUL SYLLABLE PHIEUPH-O-KHIEUKH -0xBD6A 0xD405 # HANGUL SYLLABLE PHIEUPH-O-THIEUTH -0xBD6B 0xD406 # HANGUL SYLLABLE PHIEUPH-O-PHIEUPH -0xBD6C 0xD407 # HANGUL SYLLABLE PHIEUPH-O-HIEUH -0xBD6D 0xD409 # HANGUL SYLLABLE PHIEUPH-WA-KIYEOK -0xBD6E 0xD40A # HANGUL SYLLABLE PHIEUPH-WA-SSANGKIYEOK -0xBD6F 0xD40B # HANGUL SYLLABLE PHIEUPH-WA-KIYEOKSIOS -0xBD70 0xD40C # HANGUL SYLLABLE PHIEUPH-WA-NIEUN -0xBD71 0xD40D # HANGUL SYLLABLE PHIEUPH-WA-NIEUNCIEUC -0xBD72 0xD40E # HANGUL SYLLABLE PHIEUPH-WA-NIEUNHIEUH -0xBD73 0xD40F # HANGUL SYLLABLE PHIEUPH-WA-TIKEUT -0xBD74 0xD410 # HANGUL SYLLABLE PHIEUPH-WA-RIEUL -0xBD75 0xD411 # HANGUL SYLLABLE PHIEUPH-WA-RIEULKIYEOK -0xBD76 0xD412 # HANGUL SYLLABLE PHIEUPH-WA-RIEULMIEUM -0xBD77 0xD413 # HANGUL SYLLABLE PHIEUPH-WA-RIEULPIEUP -0xBD78 0xD414 # HANGUL SYLLABLE PHIEUPH-WA-RIEULSIOS -0xBD79 0xD415 # HANGUL SYLLABLE PHIEUPH-WA-RIEULTHIEUTH -0xBD7A 0xD416 # HANGUL SYLLABLE PHIEUPH-WA-RIEULPHIEUPH -0xBD81 0xD417 # HANGUL SYLLABLE PHIEUPH-WA-RIEULHIEUH -0xBD82 0xD418 # HANGUL SYLLABLE PHIEUPH-WA-MIEUM -0xBD83 0xD419 # HANGUL SYLLABLE PHIEUPH-WA-PIEUP -0xBD84 0xD41A # HANGUL SYLLABLE PHIEUPH-WA-PIEUPSIOS -0xBD85 0xD41B # HANGUL SYLLABLE PHIEUPH-WA-SIOS -0xBD86 0xD41C # HANGUL SYLLABLE PHIEUPH-WA-SSANGSIOS -0xBD87 0xD41E # HANGUL SYLLABLE PHIEUPH-WA-CIEUC -0xBD88 0xD41F # HANGUL SYLLABLE PHIEUPH-WA-CHIEUCH -0xBD89 0xD420 # HANGUL SYLLABLE PHIEUPH-WA-KHIEUKH -0xBD8A 0xD421 # HANGUL SYLLABLE PHIEUPH-WA-THIEUTH -0xBD8B 0xD422 # HANGUL SYLLABLE PHIEUPH-WA-PHIEUPH -0xBD8C 0xD423 # HANGUL SYLLABLE PHIEUPH-WA-HIEUH -0xBD8D 0xD424 # HANGUL SYLLABLE PHIEUPH-WAE -0xBD8E 0xD425 # HANGUL SYLLABLE PHIEUPH-WAE-KIYEOK -0xBD8F 0xD426 # HANGUL SYLLABLE PHIEUPH-WAE-SSANGKIYEOK -0xBD90 0xD427 # HANGUL SYLLABLE PHIEUPH-WAE-KIYEOKSIOS -0xBD91 0xD428 # HANGUL SYLLABLE PHIEUPH-WAE-NIEUN -0xBD92 0xD429 # HANGUL SYLLABLE PHIEUPH-WAE-NIEUNCIEUC -0xBD93 0xD42A # HANGUL SYLLABLE PHIEUPH-WAE-NIEUNHIEUH -0xBD94 0xD42B # HANGUL SYLLABLE PHIEUPH-WAE-TIKEUT -0xBD95 0xD42C # HANGUL SYLLABLE PHIEUPH-WAE-RIEUL -0xBD96 0xD42D # HANGUL SYLLABLE PHIEUPH-WAE-RIEULKIYEOK -0xBD97 0xD42E # HANGUL SYLLABLE PHIEUPH-WAE-RIEULMIEUM -0xBD98 0xD42F # HANGUL SYLLABLE PHIEUPH-WAE-RIEULPIEUP -0xBD99 0xD430 # HANGUL SYLLABLE PHIEUPH-WAE-RIEULSIOS -0xBD9A 0xD431 # HANGUL SYLLABLE PHIEUPH-WAE-RIEULTHIEUTH -0xBD9B 0xD432 # HANGUL SYLLABLE PHIEUPH-WAE-RIEULPHIEUPH -0xBD9C 0xD433 # HANGUL SYLLABLE PHIEUPH-WAE-RIEULHIEUH -0xBD9D 0xD434 # HANGUL SYLLABLE PHIEUPH-WAE-MIEUM -0xBD9E 0xD435 # HANGUL SYLLABLE PHIEUPH-WAE-PIEUP -0xBD9F 0xD436 # HANGUL SYLLABLE PHIEUPH-WAE-PIEUPSIOS -0xBDA0 0xD437 # HANGUL SYLLABLE PHIEUPH-WAE-SIOS -0xBDA1 0xC22F # HANGUL SYLLABLE SIOS-U-CHIEUCH -0xBDA2 0xC231 # HANGUL SYLLABLE SIOS-U-THIEUTH -0xBDA3 0xC232 # HANGUL SYLLABLE SIOS-U-PHIEUPH -0xBDA4 0xC234 # HANGUL SYLLABLE SIOS-WEO -0xBDA5 0xC248 # HANGUL SYLLABLE SIOS-WEO-SSANGSIOS -0xBDA6 0xC250 # HANGUL SYLLABLE SIOS-WE -0xBDA7 0xC251 # HANGUL SYLLABLE SIOS-WE-KIYEOK -0xBDA8 0xC254 # HANGUL SYLLABLE SIOS-WE-NIEUN -0xBDA9 0xC258 # HANGUL SYLLABLE SIOS-WE-RIEUL -0xBDAA 0xC260 # HANGUL SYLLABLE SIOS-WE-MIEUM -0xBDAB 0xC265 # HANGUL SYLLABLE SIOS-WE-IEUNG -0xBDAC 0xC26C # HANGUL SYLLABLE SIOS-WI -0xBDAD 0xC26D # HANGUL SYLLABLE SIOS-WI-KIYEOK -0xBDAE 0xC270 # HANGUL SYLLABLE SIOS-WI-NIEUN -0xBDAF 0xC274 # HANGUL SYLLABLE SIOS-WI-RIEUL -0xBDB0 0xC27C # HANGUL SYLLABLE SIOS-WI-MIEUM -0xBDB1 0xC27D # HANGUL SYLLABLE SIOS-WI-PIEUP -0xBDB2 0xC27F # HANGUL SYLLABLE SIOS-WI-SIOS -0xBDB3 0xC281 # HANGUL SYLLABLE SIOS-WI-IEUNG -0xBDB4 0xC288 # HANGUL SYLLABLE SIOS-YU -0xBDB5 0xC289 # HANGUL SYLLABLE SIOS-YU-KIYEOK -0xBDB6 0xC290 # HANGUL SYLLABLE SIOS-YU-RIEUL -0xBDB7 0xC298 # HANGUL SYLLABLE SIOS-YU-MIEUM -0xBDB8 0xC29B # HANGUL SYLLABLE SIOS-YU-SIOS -0xBDB9 0xC29D # HANGUL SYLLABLE SIOS-YU-IEUNG -0xBDBA 0xC2A4 # HANGUL SYLLABLE SIOS-EU -0xBDBB 0xC2A5 # HANGUL SYLLABLE SIOS-EU-KIYEOK -0xBDBC 0xC2A8 # HANGUL SYLLABLE SIOS-EU-NIEUN -0xBDBD 0xC2AC # HANGUL SYLLABLE SIOS-EU-RIEUL -0xBDBE 0xC2AD # HANGUL SYLLABLE SIOS-EU-RIEULKIYEOK -0xBDBF 0xC2B4 # HANGUL SYLLABLE SIOS-EU-MIEUM -0xBDC0 0xC2B5 # HANGUL SYLLABLE SIOS-EU-PIEUP -0xBDC1 0xC2B7 # HANGUL SYLLABLE SIOS-EU-SIOS -0xBDC2 0xC2B9 # HANGUL SYLLABLE SIOS-EU-IEUNG -0xBDC3 0xC2DC # HANGUL SYLLABLE SIOS-I -0xBDC4 0xC2DD # HANGUL SYLLABLE SIOS-I-KIYEOK -0xBDC5 0xC2E0 # HANGUL SYLLABLE SIOS-I-NIEUN -0xBDC6 0xC2E3 # HANGUL SYLLABLE SIOS-I-TIKEUT -0xBDC7 0xC2E4 # HANGUL SYLLABLE SIOS-I-RIEUL -0xBDC8 0xC2EB # HANGUL SYLLABLE SIOS-I-RIEULHIEUH -0xBDC9 0xC2EC # HANGUL SYLLABLE SIOS-I-MIEUM -0xBDCA 0xC2ED # HANGUL SYLLABLE SIOS-I-PIEUP -0xBDCB 0xC2EF # HANGUL SYLLABLE SIOS-I-SIOS -0xBDCC 0xC2F1 # HANGUL SYLLABLE SIOS-I-IEUNG -0xBDCD 0xC2F6 # HANGUL SYLLABLE SIOS-I-PHIEUPH -0xBDCE 0xC2F8 # HANGUL SYLLABLE SSANGSIOS-A -0xBDCF 0xC2F9 # HANGUL SYLLABLE SSANGSIOS-A-KIYEOK -0xBDD0 0xC2FB # HANGUL SYLLABLE SSANGSIOS-A-KIYEOKSIOS -0xBDD1 0xC2FC # HANGUL SYLLABLE SSANGSIOS-A-NIEUN -0xBDD2 0xC300 # HANGUL SYLLABLE SSANGSIOS-A-RIEUL -0xBDD3 0xC308 # HANGUL SYLLABLE SSANGSIOS-A-MIEUM -0xBDD4 0xC309 # HANGUL SYLLABLE SSANGSIOS-A-PIEUP -0xBDD5 0xC30C # HANGUL SYLLABLE SSANGSIOS-A-SSANGSIOS -0xBDD6 0xC30D # HANGUL SYLLABLE SSANGSIOS-A-IEUNG -0xBDD7 0xC313 # HANGUL SYLLABLE SSANGSIOS-A-HIEUH -0xBDD8 0xC314 # HANGUL SYLLABLE SSANGSIOS-AE -0xBDD9 0xC315 # HANGUL SYLLABLE SSANGSIOS-AE-KIYEOK -0xBDDA 0xC318 # HANGUL SYLLABLE SSANGSIOS-AE-NIEUN -0xBDDB 0xC31C # HANGUL SYLLABLE SSANGSIOS-AE-RIEUL -0xBDDC 0xC324 # HANGUL SYLLABLE SSANGSIOS-AE-MIEUM -0xBDDD 0xC325 # HANGUL SYLLABLE SSANGSIOS-AE-PIEUP -0xBDDE 0xC328 # HANGUL SYLLABLE SSANGSIOS-AE-SSANGSIOS -0xBDDF 0xC329 # HANGUL SYLLABLE SSANGSIOS-AE-IEUNG -0xBDE0 0xC345 # HANGUL SYLLABLE SSANGSIOS-YA-IEUNG -0xBDE1 0xC368 # HANGUL SYLLABLE SSANGSIOS-EO -0xBDE2 0xC369 # HANGUL SYLLABLE SSANGSIOS-EO-KIYEOK -0xBDE3 0xC36C # HANGUL SYLLABLE SSANGSIOS-EO-NIEUN -0xBDE4 0xC370 # HANGUL SYLLABLE SSANGSIOS-EO-RIEUL -0xBDE5 0xC372 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULMIEUM -0xBDE6 0xC378 # HANGUL SYLLABLE SSANGSIOS-EO-MIEUM -0xBDE7 0xC379 # HANGUL SYLLABLE SSANGSIOS-EO-PIEUP -0xBDE8 0xC37C # HANGUL SYLLABLE SSANGSIOS-EO-SSANGSIOS -0xBDE9 0xC37D # HANGUL SYLLABLE SSANGSIOS-EO-IEUNG -0xBDEA 0xC384 # HANGUL SYLLABLE SSANGSIOS-E -0xBDEB 0xC388 # HANGUL SYLLABLE SSANGSIOS-E-NIEUN -0xBDEC 0xC38C # HANGUL SYLLABLE SSANGSIOS-E-RIEUL -0xBDED 0xC3C0 # HANGUL SYLLABLE SSANGSIOS-YE-NIEUN -0xBDEE 0xC3D8 # HANGUL SYLLABLE SSANGSIOS-O -0xBDEF 0xC3D9 # HANGUL SYLLABLE SSANGSIOS-O-KIYEOK -0xBDF0 0xC3DC # HANGUL SYLLABLE SSANGSIOS-O-NIEUN -0xBDF1 0xC3DF # HANGUL SYLLABLE SSANGSIOS-O-TIKEUT -0xBDF2 0xC3E0 # HANGUL SYLLABLE SSANGSIOS-O-RIEUL -0xBDF3 0xC3E2 # HANGUL SYLLABLE SSANGSIOS-O-RIEULMIEUM -0xBDF4 0xC3E8 # HANGUL SYLLABLE SSANGSIOS-O-MIEUM -0xBDF5 0xC3E9 # HANGUL SYLLABLE SSANGSIOS-O-PIEUP -0xBDF6 0xC3ED # HANGUL SYLLABLE SSANGSIOS-O-IEUNG -0xBDF7 0xC3F4 # HANGUL SYLLABLE SSANGSIOS-WA -0xBDF8 0xC3F5 # HANGUL SYLLABLE SSANGSIOS-WA-KIYEOK -0xBDF9 0xC3F8 # HANGUL SYLLABLE SSANGSIOS-WA-NIEUN -0xBDFA 0xC408 # HANGUL SYLLABLE SSANGSIOS-WA-SSANGSIOS -0xBDFB 0xC410 # HANGUL SYLLABLE SSANGSIOS-WAE -0xBDFC 0xC424 # HANGUL SYLLABLE SSANGSIOS-WAE-SSANGSIOS -0xBDFD 0xC42C # HANGUL SYLLABLE SSANGSIOS-OE -0xBDFE 0xC430 # HANGUL SYLLABLE SSANGSIOS-OE-NIEUN -0xBE41 0xD438 # HANGUL SYLLABLE PHIEUPH-WAE-SSANGSIOS -0xBE42 0xD439 # HANGUL SYLLABLE PHIEUPH-WAE-IEUNG -0xBE43 0xD43A # HANGUL SYLLABLE PHIEUPH-WAE-CIEUC -0xBE44 0xD43B # HANGUL SYLLABLE PHIEUPH-WAE-CHIEUCH -0xBE45 0xD43C # HANGUL SYLLABLE PHIEUPH-WAE-KHIEUKH -0xBE46 0xD43D # HANGUL SYLLABLE PHIEUPH-WAE-THIEUTH -0xBE47 0xD43E # HANGUL SYLLABLE PHIEUPH-WAE-PHIEUPH -0xBE48 0xD43F # HANGUL SYLLABLE PHIEUPH-WAE-HIEUH -0xBE49 0xD441 # HANGUL SYLLABLE PHIEUPH-OE-KIYEOK -0xBE4A 0xD442 # HANGUL SYLLABLE PHIEUPH-OE-SSANGKIYEOK -0xBE4B 0xD443 # HANGUL SYLLABLE PHIEUPH-OE-KIYEOKSIOS -0xBE4C 0xD445 # HANGUL SYLLABLE PHIEUPH-OE-NIEUNCIEUC -0xBE4D 0xD446 # HANGUL SYLLABLE PHIEUPH-OE-NIEUNHIEUH -0xBE4E 0xD447 # HANGUL SYLLABLE PHIEUPH-OE-TIKEUT -0xBE4F 0xD448 # HANGUL SYLLABLE PHIEUPH-OE-RIEUL -0xBE50 0xD449 # HANGUL SYLLABLE PHIEUPH-OE-RIEULKIYEOK -0xBE51 0xD44A # HANGUL SYLLABLE PHIEUPH-OE-RIEULMIEUM -0xBE52 0xD44B # HANGUL SYLLABLE PHIEUPH-OE-RIEULPIEUP -0xBE53 0xD44C # HANGUL SYLLABLE PHIEUPH-OE-RIEULSIOS -0xBE54 0xD44D # HANGUL SYLLABLE PHIEUPH-OE-RIEULTHIEUTH -0xBE55 0xD44E # HANGUL SYLLABLE PHIEUPH-OE-RIEULPHIEUPH -0xBE56 0xD44F # HANGUL SYLLABLE PHIEUPH-OE-RIEULHIEUH -0xBE57 0xD450 # HANGUL SYLLABLE PHIEUPH-OE-MIEUM -0xBE58 0xD451 # HANGUL SYLLABLE PHIEUPH-OE-PIEUP -0xBE59 0xD452 # HANGUL SYLLABLE PHIEUPH-OE-PIEUPSIOS -0xBE5A 0xD453 # HANGUL SYLLABLE PHIEUPH-OE-SIOS -0xBE61 0xD454 # HANGUL SYLLABLE PHIEUPH-OE-SSANGSIOS -0xBE62 0xD455 # HANGUL SYLLABLE PHIEUPH-OE-IEUNG -0xBE63 0xD456 # HANGUL SYLLABLE PHIEUPH-OE-CIEUC -0xBE64 0xD457 # HANGUL SYLLABLE PHIEUPH-OE-CHIEUCH -0xBE65 0xD458 # HANGUL SYLLABLE PHIEUPH-OE-KHIEUKH -0xBE66 0xD459 # HANGUL SYLLABLE PHIEUPH-OE-THIEUTH -0xBE67 0xD45A # HANGUL SYLLABLE PHIEUPH-OE-PHIEUPH -0xBE68 0xD45B # HANGUL SYLLABLE PHIEUPH-OE-HIEUH -0xBE69 0xD45D # HANGUL SYLLABLE PHIEUPH-YO-KIYEOK -0xBE6A 0xD45E # HANGUL SYLLABLE PHIEUPH-YO-SSANGKIYEOK -0xBE6B 0xD45F # HANGUL SYLLABLE PHIEUPH-YO-KIYEOKSIOS -0xBE6C 0xD461 # HANGUL SYLLABLE PHIEUPH-YO-NIEUNCIEUC -0xBE6D 0xD462 # HANGUL SYLLABLE PHIEUPH-YO-NIEUNHIEUH -0xBE6E 0xD463 # HANGUL SYLLABLE PHIEUPH-YO-TIKEUT -0xBE6F 0xD465 # HANGUL SYLLABLE PHIEUPH-YO-RIEULKIYEOK -0xBE70 0xD466 # HANGUL SYLLABLE PHIEUPH-YO-RIEULMIEUM -0xBE71 0xD467 # HANGUL SYLLABLE PHIEUPH-YO-RIEULPIEUP -0xBE72 0xD468 # HANGUL SYLLABLE PHIEUPH-YO-RIEULSIOS -0xBE73 0xD469 # HANGUL SYLLABLE PHIEUPH-YO-RIEULTHIEUTH -0xBE74 0xD46A # HANGUL SYLLABLE PHIEUPH-YO-RIEULPHIEUPH -0xBE75 0xD46B # HANGUL SYLLABLE PHIEUPH-YO-RIEULHIEUH -0xBE76 0xD46C # HANGUL SYLLABLE PHIEUPH-YO-MIEUM -0xBE77 0xD46E # HANGUL SYLLABLE PHIEUPH-YO-PIEUPSIOS -0xBE78 0xD470 # HANGUL SYLLABLE PHIEUPH-YO-SSANGSIOS -0xBE79 0xD471 # HANGUL SYLLABLE PHIEUPH-YO-IEUNG -0xBE7A 0xD472 # HANGUL SYLLABLE PHIEUPH-YO-CIEUC -0xBE81 0xD473 # HANGUL SYLLABLE PHIEUPH-YO-CHIEUCH -0xBE82 0xD474 # HANGUL SYLLABLE PHIEUPH-YO-KHIEUKH -0xBE83 0xD475 # HANGUL SYLLABLE PHIEUPH-YO-THIEUTH -0xBE84 0xD476 # HANGUL SYLLABLE PHIEUPH-YO-PHIEUPH -0xBE85 0xD477 # HANGUL SYLLABLE PHIEUPH-YO-HIEUH -0xBE86 0xD47A # HANGUL SYLLABLE PHIEUPH-U-SSANGKIYEOK -0xBE87 0xD47B # HANGUL SYLLABLE PHIEUPH-U-KIYEOKSIOS -0xBE88 0xD47D # HANGUL SYLLABLE PHIEUPH-U-NIEUNCIEUC -0xBE89 0xD47E # HANGUL SYLLABLE PHIEUPH-U-NIEUNHIEUH -0xBE8A 0xD481 # HANGUL SYLLABLE PHIEUPH-U-RIEULKIYEOK -0xBE8B 0xD483 # HANGUL SYLLABLE PHIEUPH-U-RIEULPIEUP -0xBE8C 0xD484 # HANGUL SYLLABLE PHIEUPH-U-RIEULSIOS -0xBE8D 0xD485 # HANGUL SYLLABLE PHIEUPH-U-RIEULTHIEUTH -0xBE8E 0xD486 # HANGUL SYLLABLE PHIEUPH-U-RIEULPHIEUPH -0xBE8F 0xD487 # HANGUL SYLLABLE PHIEUPH-U-RIEULHIEUH -0xBE90 0xD48A # HANGUL SYLLABLE PHIEUPH-U-PIEUPSIOS -0xBE91 0xD48C # HANGUL SYLLABLE PHIEUPH-U-SSANGSIOS -0xBE92 0xD48E # HANGUL SYLLABLE PHIEUPH-U-CIEUC -0xBE93 0xD48F # HANGUL SYLLABLE PHIEUPH-U-CHIEUCH -0xBE94 0xD490 # HANGUL SYLLABLE PHIEUPH-U-KHIEUKH -0xBE95 0xD491 # HANGUL SYLLABLE PHIEUPH-U-THIEUTH -0xBE96 0xD492 # HANGUL SYLLABLE PHIEUPH-U-PHIEUPH -0xBE97 0xD493 # HANGUL SYLLABLE PHIEUPH-U-HIEUH -0xBE98 0xD495 # HANGUL SYLLABLE PHIEUPH-WEO-KIYEOK -0xBE99 0xD496 # HANGUL SYLLABLE PHIEUPH-WEO-SSANGKIYEOK -0xBE9A 0xD497 # HANGUL SYLLABLE PHIEUPH-WEO-KIYEOKSIOS -0xBE9B 0xD498 # HANGUL SYLLABLE PHIEUPH-WEO-NIEUN -0xBE9C 0xD499 # HANGUL SYLLABLE PHIEUPH-WEO-NIEUNCIEUC -0xBE9D 0xD49A # HANGUL SYLLABLE PHIEUPH-WEO-NIEUNHIEUH -0xBE9E 0xD49B # HANGUL SYLLABLE PHIEUPH-WEO-TIKEUT -0xBE9F 0xD49C # HANGUL SYLLABLE PHIEUPH-WEO-RIEUL -0xBEA0 0xD49D # HANGUL SYLLABLE PHIEUPH-WEO-RIEULKIYEOK -0xBEA1 0xC434 # HANGUL SYLLABLE SSANGSIOS-OE-RIEUL -0xBEA2 0xC43C # HANGUL SYLLABLE SSANGSIOS-OE-MIEUM -0xBEA3 0xC43D # HANGUL SYLLABLE SSANGSIOS-OE-PIEUP -0xBEA4 0xC448 # HANGUL SYLLABLE SSANGSIOS-YO -0xBEA5 0xC464 # HANGUL SYLLABLE SSANGSIOS-U -0xBEA6 0xC465 # HANGUL SYLLABLE SSANGSIOS-U-KIYEOK -0xBEA7 0xC468 # HANGUL SYLLABLE SSANGSIOS-U-NIEUN -0xBEA8 0xC46C # HANGUL SYLLABLE SSANGSIOS-U-RIEUL -0xBEA9 0xC474 # HANGUL SYLLABLE SSANGSIOS-U-MIEUM -0xBEAA 0xC475 # HANGUL SYLLABLE SSANGSIOS-U-PIEUP -0xBEAB 0xC479 # HANGUL SYLLABLE SSANGSIOS-U-IEUNG -0xBEAC 0xC480 # HANGUL SYLLABLE SSANGSIOS-WEO -0xBEAD 0xC494 # HANGUL SYLLABLE SSANGSIOS-WEO-SSANGSIOS -0xBEAE 0xC49C # HANGUL SYLLABLE SSANGSIOS-WE -0xBEAF 0xC4B8 # HANGUL SYLLABLE SSANGSIOS-WI -0xBEB0 0xC4BC # HANGUL SYLLABLE SSANGSIOS-WI-NIEUN -0xBEB1 0xC4E9 # HANGUL SYLLABLE SSANGSIOS-YU-IEUNG -0xBEB2 0xC4F0 # HANGUL SYLLABLE SSANGSIOS-EU -0xBEB3 0xC4F1 # HANGUL SYLLABLE SSANGSIOS-EU-KIYEOK -0xBEB4 0xC4F4 # HANGUL SYLLABLE SSANGSIOS-EU-NIEUN -0xBEB5 0xC4F8 # HANGUL SYLLABLE SSANGSIOS-EU-RIEUL -0xBEB6 0xC4FA # HANGUL SYLLABLE SSANGSIOS-EU-RIEULMIEUM -0xBEB7 0xC4FF # HANGUL SYLLABLE SSANGSIOS-EU-RIEULHIEUH -0xBEB8 0xC500 # HANGUL SYLLABLE SSANGSIOS-EU-MIEUM -0xBEB9 0xC501 # HANGUL SYLLABLE SSANGSIOS-EU-PIEUP -0xBEBA 0xC50C # HANGUL SYLLABLE SSANGSIOS-YI -0xBEBB 0xC510 # HANGUL SYLLABLE SSANGSIOS-YI-NIEUN -0xBEBC 0xC514 # HANGUL SYLLABLE SSANGSIOS-YI-RIEUL -0xBEBD 0xC51C # HANGUL SYLLABLE SSANGSIOS-YI-MIEUM -0xBEBE 0xC528 # HANGUL SYLLABLE SSANGSIOS-I -0xBEBF 0xC529 # HANGUL SYLLABLE SSANGSIOS-I-KIYEOK -0xBEC0 0xC52C # HANGUL SYLLABLE SSANGSIOS-I-NIEUN -0xBEC1 0xC530 # HANGUL SYLLABLE SSANGSIOS-I-RIEUL -0xBEC2 0xC538 # HANGUL SYLLABLE SSANGSIOS-I-MIEUM -0xBEC3 0xC539 # HANGUL SYLLABLE SSANGSIOS-I-PIEUP -0xBEC4 0xC53B # HANGUL SYLLABLE SSANGSIOS-I-SIOS -0xBEC5 0xC53D # HANGUL SYLLABLE SSANGSIOS-I-IEUNG -0xBEC6 0xC544 # HANGUL SYLLABLE IEUNG-A -0xBEC7 0xC545 # HANGUL SYLLABLE IEUNG-A-KIYEOK -0xBEC8 0xC548 # HANGUL SYLLABLE IEUNG-A-NIEUN -0xBEC9 0xC549 # HANGUL SYLLABLE IEUNG-A-NIEUNCIEUC -0xBECA 0xC54A # HANGUL SYLLABLE IEUNG-A-NIEUNHIEUH -0xBECB 0xC54C # HANGUL SYLLABLE IEUNG-A-RIEUL -0xBECC 0xC54D # HANGUL SYLLABLE IEUNG-A-RIEULKIYEOK -0xBECD 0xC54E # HANGUL SYLLABLE IEUNG-A-RIEULMIEUM -0xBECE 0xC553 # HANGUL SYLLABLE IEUNG-A-RIEULHIEUH -0xBECF 0xC554 # HANGUL SYLLABLE IEUNG-A-MIEUM -0xBED0 0xC555 # HANGUL SYLLABLE IEUNG-A-PIEUP -0xBED1 0xC557 # HANGUL SYLLABLE IEUNG-A-SIOS -0xBED2 0xC558 # HANGUL SYLLABLE IEUNG-A-SSANGSIOS -0xBED3 0xC559 # HANGUL SYLLABLE IEUNG-A-IEUNG -0xBED4 0xC55D # HANGUL SYLLABLE IEUNG-A-THIEUTH -0xBED5 0xC55E # HANGUL SYLLABLE IEUNG-A-PHIEUPH -0xBED6 0xC560 # HANGUL SYLLABLE IEUNG-AE -0xBED7 0xC561 # HANGUL SYLLABLE IEUNG-AE-KIYEOK -0xBED8 0xC564 # HANGUL SYLLABLE IEUNG-AE-NIEUN -0xBED9 0xC568 # HANGUL SYLLABLE IEUNG-AE-RIEUL -0xBEDA 0xC570 # HANGUL SYLLABLE IEUNG-AE-MIEUM -0xBEDB 0xC571 # HANGUL SYLLABLE IEUNG-AE-PIEUP -0xBEDC 0xC573 # HANGUL SYLLABLE IEUNG-AE-SIOS -0xBEDD 0xC574 # HANGUL SYLLABLE IEUNG-AE-SSANGSIOS -0xBEDE 0xC575 # HANGUL SYLLABLE IEUNG-AE-IEUNG -0xBEDF 0xC57C # HANGUL SYLLABLE IEUNG-YA -0xBEE0 0xC57D # HANGUL SYLLABLE IEUNG-YA-KIYEOK -0xBEE1 0xC580 # HANGUL SYLLABLE IEUNG-YA-NIEUN -0xBEE2 0xC584 # HANGUL SYLLABLE IEUNG-YA-RIEUL -0xBEE3 0xC587 # HANGUL SYLLABLE IEUNG-YA-RIEULPIEUP -0xBEE4 0xC58C # HANGUL SYLLABLE IEUNG-YA-MIEUM -0xBEE5 0xC58D # HANGUL SYLLABLE IEUNG-YA-PIEUP -0xBEE6 0xC58F # HANGUL SYLLABLE IEUNG-YA-SIOS -0xBEE7 0xC591 # HANGUL SYLLABLE IEUNG-YA-IEUNG -0xBEE8 0xC595 # HANGUL SYLLABLE IEUNG-YA-THIEUTH -0xBEE9 0xC597 # HANGUL SYLLABLE IEUNG-YA-HIEUH -0xBEEA 0xC598 # HANGUL SYLLABLE IEUNG-YAE -0xBEEB 0xC59C # HANGUL SYLLABLE IEUNG-YAE-NIEUN -0xBEEC 0xC5A0 # HANGUL SYLLABLE IEUNG-YAE-RIEUL -0xBEED 0xC5A9 # HANGUL SYLLABLE IEUNG-YAE-PIEUP -0xBEEE 0xC5B4 # HANGUL SYLLABLE IEUNG-EO -0xBEEF 0xC5B5 # HANGUL SYLLABLE IEUNG-EO-KIYEOK -0xBEF0 0xC5B8 # HANGUL SYLLABLE IEUNG-EO-NIEUN -0xBEF1 0xC5B9 # HANGUL SYLLABLE IEUNG-EO-NIEUNCIEUC -0xBEF2 0xC5BB # HANGUL SYLLABLE IEUNG-EO-TIKEUT -0xBEF3 0xC5BC # HANGUL SYLLABLE IEUNG-EO-RIEUL -0xBEF4 0xC5BD # HANGUL SYLLABLE IEUNG-EO-RIEULKIYEOK -0xBEF5 0xC5BE # HANGUL SYLLABLE IEUNG-EO-RIEULMIEUM -0xBEF6 0xC5C4 # HANGUL SYLLABLE IEUNG-EO-MIEUM -0xBEF7 0xC5C5 # HANGUL SYLLABLE IEUNG-EO-PIEUP -0xBEF8 0xC5C6 # HANGUL SYLLABLE IEUNG-EO-PIEUPSIOS -0xBEF9 0xC5C7 # HANGUL SYLLABLE IEUNG-EO-SIOS -0xBEFA 0xC5C8 # HANGUL SYLLABLE IEUNG-EO-SSANGSIOS -0xBEFB 0xC5C9 # HANGUL SYLLABLE IEUNG-EO-IEUNG -0xBEFC 0xC5CA # HANGUL SYLLABLE IEUNG-EO-CIEUC -0xBEFD 0xC5CC # HANGUL SYLLABLE IEUNG-EO-KHIEUKH -0xBEFE 0xC5CE # HANGUL SYLLABLE IEUNG-EO-PHIEUPH -0xBF41 0xD49E # HANGUL SYLLABLE PHIEUPH-WEO-RIEULMIEUM -0xBF42 0xD49F # HANGUL SYLLABLE PHIEUPH-WEO-RIEULPIEUP -0xBF43 0xD4A0 # HANGUL SYLLABLE PHIEUPH-WEO-RIEULSIOS -0xBF44 0xD4A1 # HANGUL SYLLABLE PHIEUPH-WEO-RIEULTHIEUTH -0xBF45 0xD4A2 # HANGUL SYLLABLE PHIEUPH-WEO-RIEULPHIEUPH -0xBF46 0xD4A3 # HANGUL SYLLABLE PHIEUPH-WEO-RIEULHIEUH -0xBF47 0xD4A4 # HANGUL SYLLABLE PHIEUPH-WEO-MIEUM -0xBF48 0xD4A5 # HANGUL SYLLABLE PHIEUPH-WEO-PIEUP -0xBF49 0xD4A6 # HANGUL SYLLABLE PHIEUPH-WEO-PIEUPSIOS -0xBF4A 0xD4A7 # HANGUL SYLLABLE PHIEUPH-WEO-SIOS -0xBF4B 0xD4A8 # HANGUL SYLLABLE PHIEUPH-WEO-SSANGSIOS -0xBF4C 0xD4AA # HANGUL SYLLABLE PHIEUPH-WEO-CIEUC -0xBF4D 0xD4AB # HANGUL SYLLABLE PHIEUPH-WEO-CHIEUCH -0xBF4E 0xD4AC # HANGUL SYLLABLE PHIEUPH-WEO-KHIEUKH -0xBF4F 0xD4AD # HANGUL SYLLABLE PHIEUPH-WEO-THIEUTH -0xBF50 0xD4AE # HANGUL SYLLABLE PHIEUPH-WEO-PHIEUPH -0xBF51 0xD4AF # HANGUL SYLLABLE PHIEUPH-WEO-HIEUH -0xBF52 0xD4B0 # HANGUL SYLLABLE PHIEUPH-WE -0xBF53 0xD4B1 # HANGUL SYLLABLE PHIEUPH-WE-KIYEOK -0xBF54 0xD4B2 # HANGUL SYLLABLE PHIEUPH-WE-SSANGKIYEOK -0xBF55 0xD4B3 # HANGUL SYLLABLE PHIEUPH-WE-KIYEOKSIOS -0xBF56 0xD4B4 # HANGUL SYLLABLE PHIEUPH-WE-NIEUN -0xBF57 0xD4B5 # HANGUL SYLLABLE PHIEUPH-WE-NIEUNCIEUC -0xBF58 0xD4B6 # HANGUL SYLLABLE PHIEUPH-WE-NIEUNHIEUH -0xBF59 0xD4B7 # HANGUL SYLLABLE PHIEUPH-WE-TIKEUT -0xBF5A 0xD4B8 # HANGUL SYLLABLE PHIEUPH-WE-RIEUL -0xBF61 0xD4B9 # HANGUL SYLLABLE PHIEUPH-WE-RIEULKIYEOK -0xBF62 0xD4BA # HANGUL SYLLABLE PHIEUPH-WE-RIEULMIEUM -0xBF63 0xD4BB # HANGUL SYLLABLE PHIEUPH-WE-RIEULPIEUP -0xBF64 0xD4BC # HANGUL SYLLABLE PHIEUPH-WE-RIEULSIOS -0xBF65 0xD4BD # HANGUL SYLLABLE PHIEUPH-WE-RIEULTHIEUTH -0xBF66 0xD4BE # HANGUL SYLLABLE PHIEUPH-WE-RIEULPHIEUPH -0xBF67 0xD4BF # HANGUL SYLLABLE PHIEUPH-WE-RIEULHIEUH -0xBF68 0xD4C0 # HANGUL SYLLABLE PHIEUPH-WE-MIEUM -0xBF69 0xD4C1 # HANGUL SYLLABLE PHIEUPH-WE-PIEUP -0xBF6A 0xD4C2 # HANGUL SYLLABLE PHIEUPH-WE-PIEUPSIOS -0xBF6B 0xD4C3 # HANGUL SYLLABLE PHIEUPH-WE-SIOS -0xBF6C 0xD4C4 # HANGUL SYLLABLE PHIEUPH-WE-SSANGSIOS -0xBF6D 0xD4C5 # HANGUL SYLLABLE PHIEUPH-WE-IEUNG -0xBF6E 0xD4C6 # HANGUL SYLLABLE PHIEUPH-WE-CIEUC -0xBF6F 0xD4C7 # HANGUL SYLLABLE PHIEUPH-WE-CHIEUCH -0xBF70 0xD4C8 # HANGUL SYLLABLE PHIEUPH-WE-KHIEUKH -0xBF71 0xD4C9 # HANGUL SYLLABLE PHIEUPH-WE-THIEUTH -0xBF72 0xD4CA # HANGUL SYLLABLE PHIEUPH-WE-PHIEUPH -0xBF73 0xD4CB # HANGUL SYLLABLE PHIEUPH-WE-HIEUH -0xBF74 0xD4CD # HANGUL SYLLABLE PHIEUPH-WI-KIYEOK -0xBF75 0xD4CE # HANGUL SYLLABLE PHIEUPH-WI-SSANGKIYEOK -0xBF76 0xD4CF # HANGUL SYLLABLE PHIEUPH-WI-KIYEOKSIOS -0xBF77 0xD4D1 # HANGUL SYLLABLE PHIEUPH-WI-NIEUNCIEUC -0xBF78 0xD4D2 # HANGUL SYLLABLE PHIEUPH-WI-NIEUNHIEUH -0xBF79 0xD4D3 # HANGUL SYLLABLE PHIEUPH-WI-TIKEUT -0xBF7A 0xD4D5 # HANGUL SYLLABLE PHIEUPH-WI-RIEULKIYEOK -0xBF81 0xD4D6 # HANGUL SYLLABLE PHIEUPH-WI-RIEULMIEUM -0xBF82 0xD4D7 # HANGUL SYLLABLE PHIEUPH-WI-RIEULPIEUP -0xBF83 0xD4D8 # HANGUL SYLLABLE PHIEUPH-WI-RIEULSIOS -0xBF84 0xD4D9 # HANGUL SYLLABLE PHIEUPH-WI-RIEULTHIEUTH -0xBF85 0xD4DA # HANGUL SYLLABLE PHIEUPH-WI-RIEULPHIEUPH -0xBF86 0xD4DB # HANGUL SYLLABLE PHIEUPH-WI-RIEULHIEUH -0xBF87 0xD4DD # HANGUL SYLLABLE PHIEUPH-WI-PIEUP -0xBF88 0xD4DE # HANGUL SYLLABLE PHIEUPH-WI-PIEUPSIOS -0xBF89 0xD4E0 # HANGUL SYLLABLE PHIEUPH-WI-SSANGSIOS -0xBF8A 0xD4E1 # HANGUL SYLLABLE PHIEUPH-WI-IEUNG -0xBF8B 0xD4E2 # HANGUL SYLLABLE PHIEUPH-WI-CIEUC -0xBF8C 0xD4E3 # HANGUL SYLLABLE PHIEUPH-WI-CHIEUCH -0xBF8D 0xD4E4 # HANGUL SYLLABLE PHIEUPH-WI-KHIEUKH -0xBF8E 0xD4E5 # HANGUL SYLLABLE PHIEUPH-WI-THIEUTH -0xBF8F 0xD4E6 # HANGUL SYLLABLE PHIEUPH-WI-PHIEUPH -0xBF90 0xD4E7 # HANGUL SYLLABLE PHIEUPH-WI-HIEUH -0xBF91 0xD4E9 # HANGUL SYLLABLE PHIEUPH-YU-KIYEOK -0xBF92 0xD4EA # HANGUL SYLLABLE PHIEUPH-YU-SSANGKIYEOK -0xBF93 0xD4EB # HANGUL SYLLABLE PHIEUPH-YU-KIYEOKSIOS -0xBF94 0xD4ED # HANGUL SYLLABLE PHIEUPH-YU-NIEUNCIEUC -0xBF95 0xD4EE # HANGUL SYLLABLE PHIEUPH-YU-NIEUNHIEUH -0xBF96 0xD4EF # HANGUL SYLLABLE PHIEUPH-YU-TIKEUT -0xBF97 0xD4F1 # HANGUL SYLLABLE PHIEUPH-YU-RIEULKIYEOK -0xBF98 0xD4F2 # HANGUL SYLLABLE PHIEUPH-YU-RIEULMIEUM -0xBF99 0xD4F3 # HANGUL SYLLABLE PHIEUPH-YU-RIEULPIEUP -0xBF9A 0xD4F4 # HANGUL SYLLABLE PHIEUPH-YU-RIEULSIOS -0xBF9B 0xD4F5 # HANGUL SYLLABLE PHIEUPH-YU-RIEULTHIEUTH -0xBF9C 0xD4F6 # HANGUL SYLLABLE PHIEUPH-YU-RIEULPHIEUPH -0xBF9D 0xD4F7 # HANGUL SYLLABLE PHIEUPH-YU-RIEULHIEUH -0xBF9E 0xD4F9 # HANGUL SYLLABLE PHIEUPH-YU-PIEUP -0xBF9F 0xD4FA # HANGUL SYLLABLE PHIEUPH-YU-PIEUPSIOS -0xBFA0 0xD4FC # HANGUL SYLLABLE PHIEUPH-YU-SSANGSIOS -0xBFA1 0xC5D0 # HANGUL SYLLABLE IEUNG-E -0xBFA2 0xC5D1 # HANGUL SYLLABLE IEUNG-E-KIYEOK -0xBFA3 0xC5D4 # HANGUL SYLLABLE IEUNG-E-NIEUN -0xBFA4 0xC5D8 # HANGUL SYLLABLE IEUNG-E-RIEUL -0xBFA5 0xC5E0 # HANGUL SYLLABLE IEUNG-E-MIEUM -0xBFA6 0xC5E1 # HANGUL SYLLABLE IEUNG-E-PIEUP -0xBFA7 0xC5E3 # HANGUL SYLLABLE IEUNG-E-SIOS -0xBFA8 0xC5E5 # HANGUL SYLLABLE IEUNG-E-IEUNG -0xBFA9 0xC5EC # HANGUL SYLLABLE IEUNG-YEO -0xBFAA 0xC5ED # HANGUL SYLLABLE IEUNG-YEO-KIYEOK -0xBFAB 0xC5EE # HANGUL SYLLABLE IEUNG-YEO-SSANGKIYEOK -0xBFAC 0xC5F0 # HANGUL SYLLABLE IEUNG-YEO-NIEUN -0xBFAD 0xC5F4 # HANGUL SYLLABLE IEUNG-YEO-RIEUL -0xBFAE 0xC5F6 # HANGUL SYLLABLE IEUNG-YEO-RIEULMIEUM -0xBFAF 0xC5F7 # HANGUL SYLLABLE IEUNG-YEO-RIEULPIEUP -0xBFB0 0xC5FC # HANGUL SYLLABLE IEUNG-YEO-MIEUM -0xBFB1 0xC5FD # HANGUL SYLLABLE IEUNG-YEO-PIEUP -0xBFB2 0xC5FE # HANGUL SYLLABLE IEUNG-YEO-PIEUPSIOS -0xBFB3 0xC5FF # HANGUL SYLLABLE IEUNG-YEO-SIOS -0xBFB4 0xC600 # HANGUL SYLLABLE IEUNG-YEO-SSANGSIOS -0xBFB5 0xC601 # HANGUL SYLLABLE IEUNG-YEO-IEUNG -0xBFB6 0xC605 # HANGUL SYLLABLE IEUNG-YEO-THIEUTH -0xBFB7 0xC606 # HANGUL SYLLABLE IEUNG-YEO-PHIEUPH -0xBFB8 0xC607 # HANGUL SYLLABLE IEUNG-YEO-HIEUH -0xBFB9 0xC608 # HANGUL SYLLABLE IEUNG-YE -0xBFBA 0xC60C # HANGUL SYLLABLE IEUNG-YE-NIEUN -0xBFBB 0xC610 # HANGUL SYLLABLE IEUNG-YE-RIEUL -0xBFBC 0xC618 # HANGUL SYLLABLE IEUNG-YE-MIEUM -0xBFBD 0xC619 # HANGUL SYLLABLE IEUNG-YE-PIEUP -0xBFBE 0xC61B # HANGUL SYLLABLE IEUNG-YE-SIOS -0xBFBF 0xC61C # HANGUL SYLLABLE IEUNG-YE-SSANGSIOS -0xBFC0 0xC624 # HANGUL SYLLABLE IEUNG-O -0xBFC1 0xC625 # HANGUL SYLLABLE IEUNG-O-KIYEOK -0xBFC2 0xC628 # HANGUL SYLLABLE IEUNG-O-NIEUN -0xBFC3 0xC62C # HANGUL SYLLABLE IEUNG-O-RIEUL -0xBFC4 0xC62D # HANGUL SYLLABLE IEUNG-O-RIEULKIYEOK -0xBFC5 0xC62E # HANGUL SYLLABLE IEUNG-O-RIEULMIEUM -0xBFC6 0xC630 # HANGUL SYLLABLE IEUNG-O-RIEULSIOS -0xBFC7 0xC633 # HANGUL SYLLABLE IEUNG-O-RIEULHIEUH -0xBFC8 0xC634 # HANGUL SYLLABLE IEUNG-O-MIEUM -0xBFC9 0xC635 # HANGUL SYLLABLE IEUNG-O-PIEUP -0xBFCA 0xC637 # HANGUL SYLLABLE IEUNG-O-SIOS -0xBFCB 0xC639 # HANGUL SYLLABLE IEUNG-O-IEUNG -0xBFCC 0xC63B # HANGUL SYLLABLE IEUNG-O-CHIEUCH -0xBFCD 0xC640 # HANGUL SYLLABLE IEUNG-WA -0xBFCE 0xC641 # HANGUL SYLLABLE IEUNG-WA-KIYEOK -0xBFCF 0xC644 # HANGUL SYLLABLE IEUNG-WA-NIEUN -0xBFD0 0xC648 # HANGUL SYLLABLE IEUNG-WA-RIEUL -0xBFD1 0xC650 # HANGUL SYLLABLE IEUNG-WA-MIEUM -0xBFD2 0xC651 # HANGUL SYLLABLE IEUNG-WA-PIEUP -0xBFD3 0xC653 # HANGUL SYLLABLE IEUNG-WA-SIOS -0xBFD4 0xC654 # HANGUL SYLLABLE IEUNG-WA-SSANGSIOS -0xBFD5 0xC655 # HANGUL SYLLABLE IEUNG-WA-IEUNG -0xBFD6 0xC65C # HANGUL SYLLABLE IEUNG-WAE -0xBFD7 0xC65D # HANGUL SYLLABLE IEUNG-WAE-KIYEOK -0xBFD8 0xC660 # HANGUL SYLLABLE IEUNG-WAE-NIEUN -0xBFD9 0xC66C # HANGUL SYLLABLE IEUNG-WAE-MIEUM -0xBFDA 0xC66F # HANGUL SYLLABLE IEUNG-WAE-SIOS -0xBFDB 0xC671 # HANGUL SYLLABLE IEUNG-WAE-IEUNG -0xBFDC 0xC678 # HANGUL SYLLABLE IEUNG-OE -0xBFDD 0xC679 # HANGUL SYLLABLE IEUNG-OE-KIYEOK -0xBFDE 0xC67C # HANGUL SYLLABLE IEUNG-OE-NIEUN -0xBFDF 0xC680 # HANGUL SYLLABLE IEUNG-OE-RIEUL -0xBFE0 0xC688 # HANGUL SYLLABLE IEUNG-OE-MIEUM -0xBFE1 0xC689 # HANGUL SYLLABLE IEUNG-OE-PIEUP -0xBFE2 0xC68B # HANGUL SYLLABLE IEUNG-OE-SIOS -0xBFE3 0xC68D # HANGUL SYLLABLE IEUNG-OE-IEUNG -0xBFE4 0xC694 # HANGUL SYLLABLE IEUNG-YO -0xBFE5 0xC695 # HANGUL SYLLABLE IEUNG-YO-KIYEOK -0xBFE6 0xC698 # HANGUL SYLLABLE IEUNG-YO-NIEUN -0xBFE7 0xC69C # HANGUL SYLLABLE IEUNG-YO-RIEUL -0xBFE8 0xC6A4 # HANGUL SYLLABLE IEUNG-YO-MIEUM -0xBFE9 0xC6A5 # HANGUL SYLLABLE IEUNG-YO-PIEUP -0xBFEA 0xC6A7 # HANGUL SYLLABLE IEUNG-YO-SIOS -0xBFEB 0xC6A9 # HANGUL SYLLABLE IEUNG-YO-IEUNG -0xBFEC 0xC6B0 # HANGUL SYLLABLE IEUNG-U -0xBFED 0xC6B1 # HANGUL SYLLABLE IEUNG-U-KIYEOK -0xBFEE 0xC6B4 # HANGUL SYLLABLE IEUNG-U-NIEUN -0xBFEF 0xC6B8 # HANGUL SYLLABLE IEUNG-U-RIEUL -0xBFF0 0xC6B9 # HANGUL SYLLABLE IEUNG-U-RIEULKIYEOK -0xBFF1 0xC6BA # HANGUL SYLLABLE IEUNG-U-RIEULMIEUM -0xBFF2 0xC6C0 # HANGUL SYLLABLE IEUNG-U-MIEUM -0xBFF3 0xC6C1 # HANGUL SYLLABLE IEUNG-U-PIEUP -0xBFF4 0xC6C3 # HANGUL SYLLABLE IEUNG-U-SIOS -0xBFF5 0xC6C5 # HANGUL SYLLABLE IEUNG-U-IEUNG -0xBFF6 0xC6CC # HANGUL SYLLABLE IEUNG-WEO -0xBFF7 0xC6CD # HANGUL SYLLABLE IEUNG-WEO-KIYEOK -0xBFF8 0xC6D0 # HANGUL SYLLABLE IEUNG-WEO-NIEUN -0xBFF9 0xC6D4 # HANGUL SYLLABLE IEUNG-WEO-RIEUL -0xBFFA 0xC6DC # HANGUL SYLLABLE IEUNG-WEO-MIEUM -0xBFFB 0xC6DD # HANGUL SYLLABLE IEUNG-WEO-PIEUP -0xBFFC 0xC6E0 # HANGUL SYLLABLE IEUNG-WEO-SSANGSIOS -0xBFFD 0xC6E1 # HANGUL SYLLABLE IEUNG-WEO-IEUNG -0xBFFE 0xC6E8 # HANGUL SYLLABLE IEUNG-WE -0xC041 0xD4FE # HANGUL SYLLABLE PHIEUPH-YU-CIEUC -0xC042 0xD4FF # HANGUL SYLLABLE PHIEUPH-YU-CHIEUCH -0xC043 0xD500 # HANGUL SYLLABLE PHIEUPH-YU-KHIEUKH -0xC044 0xD501 # HANGUL SYLLABLE PHIEUPH-YU-THIEUTH -0xC045 0xD502 # HANGUL SYLLABLE PHIEUPH-YU-PHIEUPH -0xC046 0xD503 # HANGUL SYLLABLE PHIEUPH-YU-HIEUH -0xC047 0xD505 # HANGUL SYLLABLE PHIEUPH-EU-KIYEOK -0xC048 0xD506 # HANGUL SYLLABLE PHIEUPH-EU-SSANGKIYEOK -0xC049 0xD507 # HANGUL SYLLABLE PHIEUPH-EU-KIYEOKSIOS -0xC04A 0xD509 # HANGUL SYLLABLE PHIEUPH-EU-NIEUNCIEUC -0xC04B 0xD50A # HANGUL SYLLABLE PHIEUPH-EU-NIEUNHIEUH -0xC04C 0xD50B # HANGUL SYLLABLE PHIEUPH-EU-TIKEUT -0xC04D 0xD50D # HANGUL SYLLABLE PHIEUPH-EU-RIEULKIYEOK -0xC04E 0xD50E # HANGUL SYLLABLE PHIEUPH-EU-RIEULMIEUM -0xC04F 0xD50F # HANGUL SYLLABLE PHIEUPH-EU-RIEULPIEUP -0xC050 0xD510 # HANGUL SYLLABLE PHIEUPH-EU-RIEULSIOS -0xC051 0xD511 # HANGUL SYLLABLE PHIEUPH-EU-RIEULTHIEUTH -0xC052 0xD512 # HANGUL SYLLABLE PHIEUPH-EU-RIEULPHIEUPH -0xC053 0xD513 # HANGUL SYLLABLE PHIEUPH-EU-RIEULHIEUH -0xC054 0xD516 # HANGUL SYLLABLE PHIEUPH-EU-PIEUPSIOS -0xC055 0xD518 # HANGUL SYLLABLE PHIEUPH-EU-SSANGSIOS -0xC056 0xD519 # HANGUL SYLLABLE PHIEUPH-EU-IEUNG -0xC057 0xD51A # HANGUL SYLLABLE PHIEUPH-EU-CIEUC -0xC058 0xD51B # HANGUL SYLLABLE PHIEUPH-EU-CHIEUCH -0xC059 0xD51C # HANGUL SYLLABLE PHIEUPH-EU-KHIEUKH -0xC05A 0xD51D # HANGUL SYLLABLE PHIEUPH-EU-THIEUTH -0xC061 0xD51E # HANGUL SYLLABLE PHIEUPH-EU-PHIEUPH -0xC062 0xD51F # HANGUL SYLLABLE PHIEUPH-EU-HIEUH -0xC063 0xD520 # HANGUL SYLLABLE PHIEUPH-YI -0xC064 0xD521 # HANGUL SYLLABLE PHIEUPH-YI-KIYEOK -0xC065 0xD522 # HANGUL SYLLABLE PHIEUPH-YI-SSANGKIYEOK -0xC066 0xD523 # HANGUL SYLLABLE PHIEUPH-YI-KIYEOKSIOS -0xC067 0xD524 # HANGUL SYLLABLE PHIEUPH-YI-NIEUN -0xC068 0xD525 # HANGUL SYLLABLE PHIEUPH-YI-NIEUNCIEUC -0xC069 0xD526 # HANGUL SYLLABLE PHIEUPH-YI-NIEUNHIEUH -0xC06A 0xD527 # HANGUL SYLLABLE PHIEUPH-YI-TIKEUT -0xC06B 0xD528 # HANGUL SYLLABLE PHIEUPH-YI-RIEUL -0xC06C 0xD529 # HANGUL SYLLABLE PHIEUPH-YI-RIEULKIYEOK -0xC06D 0xD52A # HANGUL SYLLABLE PHIEUPH-YI-RIEULMIEUM -0xC06E 0xD52B # HANGUL SYLLABLE PHIEUPH-YI-RIEULPIEUP -0xC06F 0xD52C # HANGUL SYLLABLE PHIEUPH-YI-RIEULSIOS -0xC070 0xD52D # HANGUL SYLLABLE PHIEUPH-YI-RIEULTHIEUTH -0xC071 0xD52E # HANGUL SYLLABLE PHIEUPH-YI-RIEULPHIEUPH -0xC072 0xD52F # HANGUL SYLLABLE PHIEUPH-YI-RIEULHIEUH -0xC073 0xD530 # HANGUL SYLLABLE PHIEUPH-YI-MIEUM -0xC074 0xD531 # HANGUL SYLLABLE PHIEUPH-YI-PIEUP -0xC075 0xD532 # HANGUL SYLLABLE PHIEUPH-YI-PIEUPSIOS -0xC076 0xD533 # HANGUL SYLLABLE PHIEUPH-YI-SIOS -0xC077 0xD534 # HANGUL SYLLABLE PHIEUPH-YI-SSANGSIOS -0xC078 0xD535 # HANGUL SYLLABLE PHIEUPH-YI-IEUNG -0xC079 0xD536 # HANGUL SYLLABLE PHIEUPH-YI-CIEUC -0xC07A 0xD537 # HANGUL SYLLABLE PHIEUPH-YI-CHIEUCH -0xC081 0xD538 # HANGUL SYLLABLE PHIEUPH-YI-KHIEUKH -0xC082 0xD539 # HANGUL SYLLABLE PHIEUPH-YI-THIEUTH -0xC083 0xD53A # HANGUL SYLLABLE PHIEUPH-YI-PHIEUPH -0xC084 0xD53B # HANGUL SYLLABLE PHIEUPH-YI-HIEUH -0xC085 0xD53E # HANGUL SYLLABLE PHIEUPH-I-SSANGKIYEOK -0xC086 0xD53F # HANGUL SYLLABLE PHIEUPH-I-KIYEOKSIOS -0xC087 0xD541 # HANGUL SYLLABLE PHIEUPH-I-NIEUNCIEUC -0xC088 0xD542 # HANGUL SYLLABLE PHIEUPH-I-NIEUNHIEUH -0xC089 0xD543 # HANGUL SYLLABLE PHIEUPH-I-TIKEUT -0xC08A 0xD545 # HANGUL SYLLABLE PHIEUPH-I-RIEULKIYEOK -0xC08B 0xD546 # HANGUL SYLLABLE PHIEUPH-I-RIEULMIEUM -0xC08C 0xD547 # HANGUL SYLLABLE PHIEUPH-I-RIEULPIEUP -0xC08D 0xD548 # HANGUL SYLLABLE PHIEUPH-I-RIEULSIOS -0xC08E 0xD549 # HANGUL SYLLABLE PHIEUPH-I-RIEULTHIEUTH -0xC08F 0xD54A # HANGUL SYLLABLE PHIEUPH-I-RIEULPHIEUPH -0xC090 0xD54B # HANGUL SYLLABLE PHIEUPH-I-RIEULHIEUH -0xC091 0xD54E # HANGUL SYLLABLE PHIEUPH-I-PIEUPSIOS -0xC092 0xD550 # HANGUL SYLLABLE PHIEUPH-I-SSANGSIOS -0xC093 0xD552 # HANGUL SYLLABLE PHIEUPH-I-CIEUC -0xC094 0xD553 # HANGUL SYLLABLE PHIEUPH-I-CHIEUCH -0xC095 0xD554 # HANGUL SYLLABLE PHIEUPH-I-KHIEUKH -0xC096 0xD555 # HANGUL SYLLABLE PHIEUPH-I-THIEUTH -0xC097 0xD556 # HANGUL SYLLABLE PHIEUPH-I-PHIEUPH -0xC098 0xD557 # HANGUL SYLLABLE PHIEUPH-I-HIEUH -0xC099 0xD55A # HANGUL SYLLABLE HIEUH-A-SSANGKIYEOK -0xC09A 0xD55B # HANGUL SYLLABLE HIEUH-A-KIYEOKSIOS -0xC09B 0xD55D # HANGUL SYLLABLE HIEUH-A-NIEUNCIEUC -0xC09C 0xD55E # HANGUL SYLLABLE HIEUH-A-NIEUNHIEUH -0xC09D 0xD55F # HANGUL SYLLABLE HIEUH-A-TIKEUT -0xC09E 0xD561 # HANGUL SYLLABLE HIEUH-A-RIEULKIYEOK -0xC09F 0xD562 # HANGUL SYLLABLE HIEUH-A-RIEULMIEUM -0xC0A0 0xD563 # HANGUL SYLLABLE HIEUH-A-RIEULPIEUP -0xC0A1 0xC6E9 # HANGUL SYLLABLE IEUNG-WE-KIYEOK -0xC0A2 0xC6EC # HANGUL SYLLABLE IEUNG-WE-NIEUN -0xC0A3 0xC6F0 # HANGUL SYLLABLE IEUNG-WE-RIEUL -0xC0A4 0xC6F8 # HANGUL SYLLABLE IEUNG-WE-MIEUM -0xC0A5 0xC6F9 # HANGUL SYLLABLE IEUNG-WE-PIEUP -0xC0A6 0xC6FD # HANGUL SYLLABLE IEUNG-WE-IEUNG -0xC0A7 0xC704 # HANGUL SYLLABLE IEUNG-WI -0xC0A8 0xC705 # HANGUL SYLLABLE IEUNG-WI-KIYEOK -0xC0A9 0xC708 # HANGUL SYLLABLE IEUNG-WI-NIEUN -0xC0AA 0xC70C # HANGUL SYLLABLE IEUNG-WI-RIEUL -0xC0AB 0xC714 # HANGUL SYLLABLE IEUNG-WI-MIEUM -0xC0AC 0xC715 # HANGUL SYLLABLE IEUNG-WI-PIEUP -0xC0AD 0xC717 # HANGUL SYLLABLE IEUNG-WI-SIOS -0xC0AE 0xC719 # HANGUL SYLLABLE IEUNG-WI-IEUNG -0xC0AF 0xC720 # HANGUL SYLLABLE IEUNG-YU -0xC0B0 0xC721 # HANGUL SYLLABLE IEUNG-YU-KIYEOK -0xC0B1 0xC724 # HANGUL SYLLABLE IEUNG-YU-NIEUN -0xC0B2 0xC728 # HANGUL SYLLABLE IEUNG-YU-RIEUL -0xC0B3 0xC730 # HANGUL SYLLABLE IEUNG-YU-MIEUM -0xC0B4 0xC731 # HANGUL SYLLABLE IEUNG-YU-PIEUP -0xC0B5 0xC733 # HANGUL SYLLABLE IEUNG-YU-SIOS -0xC0B6 0xC735 # HANGUL SYLLABLE IEUNG-YU-IEUNG -0xC0B7 0xC737 # HANGUL SYLLABLE IEUNG-YU-CHIEUCH -0xC0B8 0xC73C # HANGUL SYLLABLE IEUNG-EU -0xC0B9 0xC73D # HANGUL SYLLABLE IEUNG-EU-KIYEOK -0xC0BA 0xC740 # HANGUL SYLLABLE IEUNG-EU-NIEUN -0xC0BB 0xC744 # HANGUL SYLLABLE IEUNG-EU-RIEUL -0xC0BC 0xC74A # HANGUL SYLLABLE IEUNG-EU-RIEULPHIEUPH -0xC0BD 0xC74C # HANGUL SYLLABLE IEUNG-EU-MIEUM -0xC0BE 0xC74D # HANGUL SYLLABLE IEUNG-EU-PIEUP -0xC0BF 0xC74F # HANGUL SYLLABLE IEUNG-EU-SIOS -0xC0C0 0xC751 # HANGUL SYLLABLE IEUNG-EU-IEUNG -0xC0C1 0xC752 # HANGUL SYLLABLE IEUNG-EU-CIEUC -0xC0C2 0xC753 # HANGUL SYLLABLE IEUNG-EU-CHIEUCH -0xC0C3 0xC754 # HANGUL SYLLABLE IEUNG-EU-KHIEUKH -0xC0C4 0xC755 # HANGUL SYLLABLE IEUNG-EU-THIEUTH -0xC0C5 0xC756 # HANGUL SYLLABLE IEUNG-EU-PHIEUPH -0xC0C6 0xC757 # HANGUL SYLLABLE IEUNG-EU-HIEUH -0xC0C7 0xC758 # HANGUL SYLLABLE IEUNG-YI -0xC0C8 0xC75C # HANGUL SYLLABLE IEUNG-YI-NIEUN -0xC0C9 0xC760 # HANGUL SYLLABLE IEUNG-YI-RIEUL -0xC0CA 0xC768 # HANGUL SYLLABLE IEUNG-YI-MIEUM -0xC0CB 0xC76B # HANGUL SYLLABLE IEUNG-YI-SIOS -0xC0CC 0xC774 # HANGUL SYLLABLE IEUNG-I -0xC0CD 0xC775 # HANGUL SYLLABLE IEUNG-I-KIYEOK -0xC0CE 0xC778 # HANGUL SYLLABLE IEUNG-I-NIEUN -0xC0CF 0xC77C # HANGUL SYLLABLE IEUNG-I-RIEUL -0xC0D0 0xC77D # HANGUL SYLLABLE IEUNG-I-RIEULKIYEOK -0xC0D1 0xC77E # HANGUL SYLLABLE IEUNG-I-RIEULMIEUM -0xC0D2 0xC783 # HANGUL SYLLABLE IEUNG-I-RIEULHIEUH -0xC0D3 0xC784 # HANGUL SYLLABLE IEUNG-I-MIEUM -0xC0D4 0xC785 # HANGUL SYLLABLE IEUNG-I-PIEUP -0xC0D5 0xC787 # HANGUL SYLLABLE IEUNG-I-SIOS -0xC0D6 0xC788 # HANGUL SYLLABLE IEUNG-I-SSANGSIOS -0xC0D7 0xC789 # HANGUL SYLLABLE IEUNG-I-IEUNG -0xC0D8 0xC78A # HANGUL SYLLABLE IEUNG-I-CIEUC -0xC0D9 0xC78E # HANGUL SYLLABLE IEUNG-I-PHIEUPH -0xC0DA 0xC790 # HANGUL SYLLABLE CIEUC-A -0xC0DB 0xC791 # HANGUL SYLLABLE CIEUC-A-KIYEOK -0xC0DC 0xC794 # HANGUL SYLLABLE CIEUC-A-NIEUN -0xC0DD 0xC796 # HANGUL SYLLABLE CIEUC-A-NIEUNHIEUH -0xC0DE 0xC797 # HANGUL SYLLABLE CIEUC-A-TIKEUT -0xC0DF 0xC798 # HANGUL SYLLABLE CIEUC-A-RIEUL -0xC0E0 0xC79A # HANGUL SYLLABLE CIEUC-A-RIEULMIEUM -0xC0E1 0xC7A0 # HANGUL SYLLABLE CIEUC-A-MIEUM -0xC0E2 0xC7A1 # HANGUL SYLLABLE CIEUC-A-PIEUP -0xC0E3 0xC7A3 # HANGUL SYLLABLE CIEUC-A-SIOS -0xC0E4 0xC7A4 # HANGUL SYLLABLE CIEUC-A-SSANGSIOS -0xC0E5 0xC7A5 # HANGUL SYLLABLE CIEUC-A-IEUNG -0xC0E6 0xC7A6 # HANGUL SYLLABLE CIEUC-A-CIEUC -0xC0E7 0xC7AC # HANGUL SYLLABLE CIEUC-AE -0xC0E8 0xC7AD # HANGUL SYLLABLE CIEUC-AE-KIYEOK -0xC0E9 0xC7B0 # HANGUL SYLLABLE CIEUC-AE-NIEUN -0xC0EA 0xC7B4 # HANGUL SYLLABLE CIEUC-AE-RIEUL -0xC0EB 0xC7BC # HANGUL SYLLABLE CIEUC-AE-MIEUM -0xC0EC 0xC7BD # HANGUL SYLLABLE CIEUC-AE-PIEUP -0xC0ED 0xC7BF # HANGUL SYLLABLE CIEUC-AE-SIOS -0xC0EE 0xC7C0 # HANGUL SYLLABLE CIEUC-AE-SSANGSIOS -0xC0EF 0xC7C1 # HANGUL SYLLABLE CIEUC-AE-IEUNG -0xC0F0 0xC7C8 # HANGUL SYLLABLE CIEUC-YA -0xC0F1 0xC7C9 # HANGUL SYLLABLE CIEUC-YA-KIYEOK -0xC0F2 0xC7CC # HANGUL SYLLABLE CIEUC-YA-NIEUN -0xC0F3 0xC7CE # HANGUL SYLLABLE CIEUC-YA-NIEUNHIEUH -0xC0F4 0xC7D0 # HANGUL SYLLABLE CIEUC-YA-RIEUL -0xC0F5 0xC7D8 # HANGUL SYLLABLE CIEUC-YA-MIEUM -0xC0F6 0xC7DD # HANGUL SYLLABLE CIEUC-YA-IEUNG -0xC0F7 0xC7E4 # HANGUL SYLLABLE CIEUC-YAE -0xC0F8 0xC7E8 # HANGUL SYLLABLE CIEUC-YAE-NIEUN -0xC0F9 0xC7EC # HANGUL SYLLABLE CIEUC-YAE-RIEUL -0xC0FA 0xC800 # HANGUL SYLLABLE CIEUC-EO -0xC0FB 0xC801 # HANGUL SYLLABLE CIEUC-EO-KIYEOK -0xC0FC 0xC804 # HANGUL SYLLABLE CIEUC-EO-NIEUN -0xC0FD 0xC808 # HANGUL SYLLABLE CIEUC-EO-RIEUL -0xC0FE 0xC80A # HANGUL SYLLABLE CIEUC-EO-RIEULMIEUM -0xC141 0xD564 # HANGUL SYLLABLE HIEUH-A-RIEULSIOS -0xC142 0xD566 # HANGUL SYLLABLE HIEUH-A-RIEULPHIEUPH -0xC143 0xD567 # HANGUL SYLLABLE HIEUH-A-RIEULHIEUH -0xC144 0xD56A # HANGUL SYLLABLE HIEUH-A-PIEUPSIOS -0xC145 0xD56C # HANGUL SYLLABLE HIEUH-A-SSANGSIOS -0xC146 0xD56E # HANGUL SYLLABLE HIEUH-A-CIEUC -0xC147 0xD56F # HANGUL SYLLABLE HIEUH-A-CHIEUCH -0xC148 0xD570 # HANGUL SYLLABLE HIEUH-A-KHIEUKH -0xC149 0xD571 # HANGUL SYLLABLE HIEUH-A-THIEUTH -0xC14A 0xD572 # HANGUL SYLLABLE HIEUH-A-PHIEUPH -0xC14B 0xD573 # HANGUL SYLLABLE HIEUH-A-HIEUH -0xC14C 0xD576 # HANGUL SYLLABLE HIEUH-AE-SSANGKIYEOK -0xC14D 0xD577 # HANGUL SYLLABLE HIEUH-AE-KIYEOKSIOS -0xC14E 0xD579 # HANGUL SYLLABLE HIEUH-AE-NIEUNCIEUC -0xC14F 0xD57A # HANGUL SYLLABLE HIEUH-AE-NIEUNHIEUH -0xC150 0xD57B # HANGUL SYLLABLE HIEUH-AE-TIKEUT -0xC151 0xD57D # HANGUL SYLLABLE HIEUH-AE-RIEULKIYEOK -0xC152 0xD57E # HANGUL SYLLABLE HIEUH-AE-RIEULMIEUM -0xC153 0xD57F # HANGUL SYLLABLE HIEUH-AE-RIEULPIEUP -0xC154 0xD580 # HANGUL SYLLABLE HIEUH-AE-RIEULSIOS -0xC155 0xD581 # HANGUL SYLLABLE HIEUH-AE-RIEULTHIEUTH -0xC156 0xD582 # HANGUL SYLLABLE HIEUH-AE-RIEULPHIEUPH -0xC157 0xD583 # HANGUL SYLLABLE HIEUH-AE-RIEULHIEUH -0xC158 0xD586 # HANGUL SYLLABLE HIEUH-AE-PIEUPSIOS -0xC159 0xD58A # HANGUL SYLLABLE HIEUH-AE-CIEUC -0xC15A 0xD58B # HANGUL SYLLABLE HIEUH-AE-CHIEUCH -0xC161 0xD58C # HANGUL SYLLABLE HIEUH-AE-KHIEUKH -0xC162 0xD58D # HANGUL SYLLABLE HIEUH-AE-THIEUTH -0xC163 0xD58E # HANGUL SYLLABLE HIEUH-AE-PHIEUPH -0xC164 0xD58F # HANGUL SYLLABLE HIEUH-AE-HIEUH -0xC165 0xD591 # HANGUL SYLLABLE HIEUH-YA-KIYEOK -0xC166 0xD592 # HANGUL SYLLABLE HIEUH-YA-SSANGKIYEOK -0xC167 0xD593 # HANGUL SYLLABLE HIEUH-YA-KIYEOKSIOS -0xC168 0xD594 # HANGUL SYLLABLE HIEUH-YA-NIEUN -0xC169 0xD595 # HANGUL SYLLABLE HIEUH-YA-NIEUNCIEUC -0xC16A 0xD596 # HANGUL SYLLABLE HIEUH-YA-NIEUNHIEUH -0xC16B 0xD597 # HANGUL SYLLABLE HIEUH-YA-TIKEUT -0xC16C 0xD598 # HANGUL SYLLABLE HIEUH-YA-RIEUL -0xC16D 0xD599 # HANGUL SYLLABLE HIEUH-YA-RIEULKIYEOK -0xC16E 0xD59A # HANGUL SYLLABLE HIEUH-YA-RIEULMIEUM -0xC16F 0xD59B # HANGUL SYLLABLE HIEUH-YA-RIEULPIEUP -0xC170 0xD59C # HANGUL SYLLABLE HIEUH-YA-RIEULSIOS -0xC171 0xD59D # HANGUL SYLLABLE HIEUH-YA-RIEULTHIEUTH -0xC172 0xD59E # HANGUL SYLLABLE HIEUH-YA-RIEULPHIEUPH -0xC173 0xD59F # HANGUL SYLLABLE HIEUH-YA-RIEULHIEUH -0xC174 0xD5A0 # HANGUL SYLLABLE HIEUH-YA-MIEUM -0xC175 0xD5A1 # HANGUL SYLLABLE HIEUH-YA-PIEUP -0xC176 0xD5A2 # HANGUL SYLLABLE HIEUH-YA-PIEUPSIOS -0xC177 0xD5A3 # HANGUL SYLLABLE HIEUH-YA-SIOS -0xC178 0xD5A4 # HANGUL SYLLABLE HIEUH-YA-SSANGSIOS -0xC179 0xD5A6 # HANGUL SYLLABLE HIEUH-YA-CIEUC -0xC17A 0xD5A7 # HANGUL SYLLABLE HIEUH-YA-CHIEUCH -0xC181 0xD5A8 # HANGUL SYLLABLE HIEUH-YA-KHIEUKH -0xC182 0xD5A9 # HANGUL SYLLABLE HIEUH-YA-THIEUTH -0xC183 0xD5AA # HANGUL SYLLABLE HIEUH-YA-PHIEUPH -0xC184 0xD5AB # HANGUL SYLLABLE HIEUH-YA-HIEUH -0xC185 0xD5AC # HANGUL SYLLABLE HIEUH-YAE -0xC186 0xD5AD # HANGUL SYLLABLE HIEUH-YAE-KIYEOK -0xC187 0xD5AE # HANGUL SYLLABLE HIEUH-YAE-SSANGKIYEOK -0xC188 0xD5AF # HANGUL SYLLABLE HIEUH-YAE-KIYEOKSIOS -0xC189 0xD5B0 # HANGUL SYLLABLE HIEUH-YAE-NIEUN -0xC18A 0xD5B1 # HANGUL SYLLABLE HIEUH-YAE-NIEUNCIEUC -0xC18B 0xD5B2 # HANGUL SYLLABLE HIEUH-YAE-NIEUNHIEUH -0xC18C 0xD5B3 # HANGUL SYLLABLE HIEUH-YAE-TIKEUT -0xC18D 0xD5B4 # HANGUL SYLLABLE HIEUH-YAE-RIEUL -0xC18E 0xD5B5 # HANGUL SYLLABLE HIEUH-YAE-RIEULKIYEOK -0xC18F 0xD5B6 # HANGUL SYLLABLE HIEUH-YAE-RIEULMIEUM -0xC190 0xD5B7 # HANGUL SYLLABLE HIEUH-YAE-RIEULPIEUP -0xC191 0xD5B8 # HANGUL SYLLABLE HIEUH-YAE-RIEULSIOS -0xC192 0xD5B9 # HANGUL SYLLABLE HIEUH-YAE-RIEULTHIEUTH -0xC193 0xD5BA # HANGUL SYLLABLE HIEUH-YAE-RIEULPHIEUPH -0xC194 0xD5BB # HANGUL SYLLABLE HIEUH-YAE-RIEULHIEUH -0xC195 0xD5BC # HANGUL SYLLABLE HIEUH-YAE-MIEUM -0xC196 0xD5BD # HANGUL SYLLABLE HIEUH-YAE-PIEUP -0xC197 0xD5BE # HANGUL SYLLABLE HIEUH-YAE-PIEUPSIOS -0xC198 0xD5BF # HANGUL SYLLABLE HIEUH-YAE-SIOS -0xC199 0xD5C0 # HANGUL SYLLABLE HIEUH-YAE-SSANGSIOS -0xC19A 0xD5C1 # HANGUL SYLLABLE HIEUH-YAE-IEUNG -0xC19B 0xD5C2 # HANGUL SYLLABLE HIEUH-YAE-CIEUC -0xC19C 0xD5C3 # HANGUL SYLLABLE HIEUH-YAE-CHIEUCH -0xC19D 0xD5C4 # HANGUL SYLLABLE HIEUH-YAE-KHIEUKH -0xC19E 0xD5C5 # HANGUL SYLLABLE HIEUH-YAE-THIEUTH -0xC19F 0xD5C6 # HANGUL SYLLABLE HIEUH-YAE-PHIEUPH -0xC1A0 0xD5C7 # HANGUL SYLLABLE HIEUH-YAE-HIEUH -0xC1A1 0xC810 # HANGUL SYLLABLE CIEUC-EO-MIEUM -0xC1A2 0xC811 # HANGUL SYLLABLE CIEUC-EO-PIEUP -0xC1A3 0xC813 # HANGUL SYLLABLE CIEUC-EO-SIOS -0xC1A4 0xC815 # HANGUL SYLLABLE CIEUC-EO-IEUNG -0xC1A5 0xC816 # HANGUL SYLLABLE CIEUC-EO-CIEUC -0xC1A6 0xC81C # HANGUL SYLLABLE CIEUC-E -0xC1A7 0xC81D # HANGUL SYLLABLE CIEUC-E-KIYEOK -0xC1A8 0xC820 # HANGUL SYLLABLE CIEUC-E-NIEUN -0xC1A9 0xC824 # HANGUL SYLLABLE CIEUC-E-RIEUL -0xC1AA 0xC82C # HANGUL SYLLABLE CIEUC-E-MIEUM -0xC1AB 0xC82D # HANGUL SYLLABLE CIEUC-E-PIEUP -0xC1AC 0xC82F # HANGUL SYLLABLE CIEUC-E-SIOS -0xC1AD 0xC831 # HANGUL SYLLABLE CIEUC-E-IEUNG -0xC1AE 0xC838 # HANGUL SYLLABLE CIEUC-YEO -0xC1AF 0xC83C # HANGUL SYLLABLE CIEUC-YEO-NIEUN -0xC1B0 0xC840 # HANGUL SYLLABLE CIEUC-YEO-RIEUL -0xC1B1 0xC848 # HANGUL SYLLABLE CIEUC-YEO-MIEUM -0xC1B2 0xC849 # HANGUL SYLLABLE CIEUC-YEO-PIEUP -0xC1B3 0xC84C # HANGUL SYLLABLE CIEUC-YEO-SSANGSIOS -0xC1B4 0xC84D # HANGUL SYLLABLE CIEUC-YEO-IEUNG -0xC1B5 0xC854 # HANGUL SYLLABLE CIEUC-YE -0xC1B6 0xC870 # HANGUL SYLLABLE CIEUC-O -0xC1B7 0xC871 # HANGUL SYLLABLE CIEUC-O-KIYEOK -0xC1B8 0xC874 # HANGUL SYLLABLE CIEUC-O-NIEUN -0xC1B9 0xC878 # HANGUL SYLLABLE CIEUC-O-RIEUL -0xC1BA 0xC87A # HANGUL SYLLABLE CIEUC-O-RIEULMIEUM -0xC1BB 0xC880 # HANGUL SYLLABLE CIEUC-O-MIEUM -0xC1BC 0xC881 # HANGUL SYLLABLE CIEUC-O-PIEUP -0xC1BD 0xC883 # HANGUL SYLLABLE CIEUC-O-SIOS -0xC1BE 0xC885 # HANGUL SYLLABLE CIEUC-O-IEUNG -0xC1BF 0xC886 # HANGUL SYLLABLE CIEUC-O-CIEUC -0xC1C0 0xC887 # HANGUL SYLLABLE CIEUC-O-CHIEUCH -0xC1C1 0xC88B # HANGUL SYLLABLE CIEUC-O-HIEUH -0xC1C2 0xC88C # HANGUL SYLLABLE CIEUC-WA -0xC1C3 0xC88D # HANGUL SYLLABLE CIEUC-WA-KIYEOK -0xC1C4 0xC894 # HANGUL SYLLABLE CIEUC-WA-RIEUL -0xC1C5 0xC89D # HANGUL SYLLABLE CIEUC-WA-PIEUP -0xC1C6 0xC89F # HANGUL SYLLABLE CIEUC-WA-SIOS -0xC1C7 0xC8A1 # HANGUL SYLLABLE CIEUC-WA-IEUNG -0xC1C8 0xC8A8 # HANGUL SYLLABLE CIEUC-WAE -0xC1C9 0xC8BC # HANGUL SYLLABLE CIEUC-WAE-SSANGSIOS -0xC1CA 0xC8BD # HANGUL SYLLABLE CIEUC-WAE-IEUNG -0xC1CB 0xC8C4 # HANGUL SYLLABLE CIEUC-OE -0xC1CC 0xC8C8 # HANGUL SYLLABLE CIEUC-OE-NIEUN -0xC1CD 0xC8CC # HANGUL SYLLABLE CIEUC-OE-RIEUL -0xC1CE 0xC8D4 # HANGUL SYLLABLE CIEUC-OE-MIEUM -0xC1CF 0xC8D5 # HANGUL SYLLABLE CIEUC-OE-PIEUP -0xC1D0 0xC8D7 # HANGUL SYLLABLE CIEUC-OE-SIOS -0xC1D1 0xC8D9 # HANGUL SYLLABLE CIEUC-OE-IEUNG -0xC1D2 0xC8E0 # HANGUL SYLLABLE CIEUC-YO -0xC1D3 0xC8E1 # HANGUL SYLLABLE CIEUC-YO-KIYEOK -0xC1D4 0xC8E4 # HANGUL SYLLABLE CIEUC-YO-NIEUN -0xC1D5 0xC8F5 # HANGUL SYLLABLE CIEUC-YO-IEUNG -0xC1D6 0xC8FC # HANGUL SYLLABLE CIEUC-U -0xC1D7 0xC8FD # HANGUL SYLLABLE CIEUC-U-KIYEOK -0xC1D8 0xC900 # HANGUL SYLLABLE CIEUC-U-NIEUN -0xC1D9 0xC904 # HANGUL SYLLABLE CIEUC-U-RIEUL -0xC1DA 0xC905 # HANGUL SYLLABLE CIEUC-U-RIEULKIYEOK -0xC1DB 0xC906 # HANGUL SYLLABLE CIEUC-U-RIEULMIEUM -0xC1DC 0xC90C # HANGUL SYLLABLE CIEUC-U-MIEUM -0xC1DD 0xC90D # HANGUL SYLLABLE CIEUC-U-PIEUP -0xC1DE 0xC90F # HANGUL SYLLABLE CIEUC-U-SIOS -0xC1DF 0xC911 # HANGUL SYLLABLE CIEUC-U-IEUNG -0xC1E0 0xC918 # HANGUL SYLLABLE CIEUC-WEO -0xC1E1 0xC92C # HANGUL SYLLABLE CIEUC-WEO-SSANGSIOS -0xC1E2 0xC934 # HANGUL SYLLABLE CIEUC-WE -0xC1E3 0xC950 # HANGUL SYLLABLE CIEUC-WI -0xC1E4 0xC951 # HANGUL SYLLABLE CIEUC-WI-KIYEOK -0xC1E5 0xC954 # HANGUL SYLLABLE CIEUC-WI-NIEUN -0xC1E6 0xC958 # HANGUL SYLLABLE CIEUC-WI-RIEUL -0xC1E7 0xC960 # HANGUL SYLLABLE CIEUC-WI-MIEUM -0xC1E8 0xC961 # HANGUL SYLLABLE CIEUC-WI-PIEUP -0xC1E9 0xC963 # HANGUL SYLLABLE CIEUC-WI-SIOS -0xC1EA 0xC96C # HANGUL SYLLABLE CIEUC-YU -0xC1EB 0xC970 # HANGUL SYLLABLE CIEUC-YU-NIEUN -0xC1EC 0xC974 # HANGUL SYLLABLE CIEUC-YU-RIEUL -0xC1ED 0xC97C # HANGUL SYLLABLE CIEUC-YU-MIEUM -0xC1EE 0xC988 # HANGUL SYLLABLE CIEUC-EU -0xC1EF 0xC989 # HANGUL SYLLABLE CIEUC-EU-KIYEOK -0xC1F0 0xC98C # HANGUL SYLLABLE CIEUC-EU-NIEUN -0xC1F1 0xC990 # HANGUL SYLLABLE CIEUC-EU-RIEUL -0xC1F2 0xC998 # HANGUL SYLLABLE CIEUC-EU-MIEUM -0xC1F3 0xC999 # HANGUL SYLLABLE CIEUC-EU-PIEUP -0xC1F4 0xC99B # HANGUL SYLLABLE CIEUC-EU-SIOS -0xC1F5 0xC99D # HANGUL SYLLABLE CIEUC-EU-IEUNG -0xC1F6 0xC9C0 # HANGUL SYLLABLE CIEUC-I -0xC1F7 0xC9C1 # HANGUL SYLLABLE CIEUC-I-KIYEOK -0xC1F8 0xC9C4 # HANGUL SYLLABLE CIEUC-I-NIEUN -0xC1F9 0xC9C7 # HANGUL SYLLABLE CIEUC-I-TIKEUT -0xC1FA 0xC9C8 # HANGUL SYLLABLE CIEUC-I-RIEUL -0xC1FB 0xC9CA # HANGUL SYLLABLE CIEUC-I-RIEULMIEUM -0xC1FC 0xC9D0 # HANGUL SYLLABLE CIEUC-I-MIEUM -0xC1FD 0xC9D1 # HANGUL SYLLABLE CIEUC-I-PIEUP -0xC1FE 0xC9D3 # HANGUL SYLLABLE CIEUC-I-SIOS -0xC241 0xD5CA # HANGUL SYLLABLE HIEUH-EO-SSANGKIYEOK -0xC242 0xD5CB # HANGUL SYLLABLE HIEUH-EO-KIYEOKSIOS -0xC243 0xD5CD # HANGUL SYLLABLE HIEUH-EO-NIEUNCIEUC -0xC244 0xD5CE # HANGUL SYLLABLE HIEUH-EO-NIEUNHIEUH -0xC245 0xD5CF # HANGUL SYLLABLE HIEUH-EO-TIKEUT -0xC246 0xD5D1 # HANGUL SYLLABLE HIEUH-EO-RIEULKIYEOK -0xC247 0xD5D3 # HANGUL SYLLABLE HIEUH-EO-RIEULPIEUP -0xC248 0xD5D4 # HANGUL SYLLABLE HIEUH-EO-RIEULSIOS -0xC249 0xD5D5 # HANGUL SYLLABLE HIEUH-EO-RIEULTHIEUTH -0xC24A 0xD5D6 # HANGUL SYLLABLE HIEUH-EO-RIEULPHIEUPH -0xC24B 0xD5D7 # HANGUL SYLLABLE HIEUH-EO-RIEULHIEUH -0xC24C 0xD5DA # HANGUL SYLLABLE HIEUH-EO-PIEUPSIOS -0xC24D 0xD5DC # HANGUL SYLLABLE HIEUH-EO-SSANGSIOS -0xC24E 0xD5DE # HANGUL SYLLABLE HIEUH-EO-CIEUC -0xC24F 0xD5DF # HANGUL SYLLABLE HIEUH-EO-CHIEUCH -0xC250 0xD5E0 # HANGUL SYLLABLE HIEUH-EO-KHIEUKH -0xC251 0xD5E1 # HANGUL SYLLABLE HIEUH-EO-THIEUTH -0xC252 0xD5E2 # HANGUL SYLLABLE HIEUH-EO-PHIEUPH -0xC253 0xD5E3 # HANGUL SYLLABLE HIEUH-EO-HIEUH -0xC254 0xD5E6 # HANGUL SYLLABLE HIEUH-E-SSANGKIYEOK -0xC255 0xD5E7 # HANGUL SYLLABLE HIEUH-E-KIYEOKSIOS -0xC256 0xD5E9 # HANGUL SYLLABLE HIEUH-E-NIEUNCIEUC -0xC257 0xD5EA # HANGUL SYLLABLE HIEUH-E-NIEUNHIEUH -0xC258 0xD5EB # HANGUL SYLLABLE HIEUH-E-TIKEUT -0xC259 0xD5ED # HANGUL SYLLABLE HIEUH-E-RIEULKIYEOK -0xC25A 0xD5EE # HANGUL SYLLABLE HIEUH-E-RIEULMIEUM -0xC261 0xD5EF # HANGUL SYLLABLE HIEUH-E-RIEULPIEUP -0xC262 0xD5F0 # HANGUL SYLLABLE HIEUH-E-RIEULSIOS -0xC263 0xD5F1 # HANGUL SYLLABLE HIEUH-E-RIEULTHIEUTH -0xC264 0xD5F2 # HANGUL SYLLABLE HIEUH-E-RIEULPHIEUPH -0xC265 0xD5F3 # HANGUL SYLLABLE HIEUH-E-RIEULHIEUH -0xC266 0xD5F6 # HANGUL SYLLABLE HIEUH-E-PIEUPSIOS -0xC267 0xD5F8 # HANGUL SYLLABLE HIEUH-E-SSANGSIOS -0xC268 0xD5FA # HANGUL SYLLABLE HIEUH-E-CIEUC -0xC269 0xD5FB # HANGUL SYLLABLE HIEUH-E-CHIEUCH -0xC26A 0xD5FC # HANGUL SYLLABLE HIEUH-E-KHIEUKH -0xC26B 0xD5FD # HANGUL SYLLABLE HIEUH-E-THIEUTH -0xC26C 0xD5FE # HANGUL SYLLABLE HIEUH-E-PHIEUPH -0xC26D 0xD5FF # HANGUL SYLLABLE HIEUH-E-HIEUH -0xC26E 0xD602 # HANGUL SYLLABLE HIEUH-YEO-SSANGKIYEOK -0xC26F 0xD603 # HANGUL SYLLABLE HIEUH-YEO-KIYEOKSIOS -0xC270 0xD605 # HANGUL SYLLABLE HIEUH-YEO-NIEUNCIEUC -0xC271 0xD606 # HANGUL SYLLABLE HIEUH-YEO-NIEUNHIEUH -0xC272 0xD607 # HANGUL SYLLABLE HIEUH-YEO-TIKEUT -0xC273 0xD609 # HANGUL SYLLABLE HIEUH-YEO-RIEULKIYEOK -0xC274 0xD60A # HANGUL SYLLABLE HIEUH-YEO-RIEULMIEUM -0xC275 0xD60B # HANGUL SYLLABLE HIEUH-YEO-RIEULPIEUP -0xC276 0xD60C # HANGUL SYLLABLE HIEUH-YEO-RIEULSIOS -0xC277 0xD60D # HANGUL SYLLABLE HIEUH-YEO-RIEULTHIEUTH -0xC278 0xD60E # HANGUL SYLLABLE HIEUH-YEO-RIEULPHIEUPH -0xC279 0xD60F # HANGUL SYLLABLE HIEUH-YEO-RIEULHIEUH -0xC27A 0xD612 # HANGUL SYLLABLE HIEUH-YEO-PIEUPSIOS -0xC281 0xD616 # HANGUL SYLLABLE HIEUH-YEO-CIEUC -0xC282 0xD617 # HANGUL SYLLABLE HIEUH-YEO-CHIEUCH -0xC283 0xD618 # HANGUL SYLLABLE HIEUH-YEO-KHIEUKH -0xC284 0xD619 # HANGUL SYLLABLE HIEUH-YEO-THIEUTH -0xC285 0xD61A # HANGUL SYLLABLE HIEUH-YEO-PHIEUPH -0xC286 0xD61B # HANGUL SYLLABLE HIEUH-YEO-HIEUH -0xC287 0xD61D # HANGUL SYLLABLE HIEUH-YE-KIYEOK -0xC288 0xD61E # HANGUL SYLLABLE HIEUH-YE-SSANGKIYEOK -0xC289 0xD61F # HANGUL SYLLABLE HIEUH-YE-KIYEOKSIOS -0xC28A 0xD621 # HANGUL SYLLABLE HIEUH-YE-NIEUNCIEUC -0xC28B 0xD622 # HANGUL SYLLABLE HIEUH-YE-NIEUNHIEUH -0xC28C 0xD623 # HANGUL SYLLABLE HIEUH-YE-TIKEUT -0xC28D 0xD625 # HANGUL SYLLABLE HIEUH-YE-RIEULKIYEOK -0xC28E 0xD626 # HANGUL SYLLABLE HIEUH-YE-RIEULMIEUM -0xC28F 0xD627 # HANGUL SYLLABLE HIEUH-YE-RIEULPIEUP -0xC290 0xD628 # HANGUL SYLLABLE HIEUH-YE-RIEULSIOS -0xC291 0xD629 # HANGUL SYLLABLE HIEUH-YE-RIEULTHIEUTH -0xC292 0xD62A # HANGUL SYLLABLE HIEUH-YE-RIEULPHIEUPH -0xC293 0xD62B # HANGUL SYLLABLE HIEUH-YE-RIEULHIEUH -0xC294 0xD62C # HANGUL SYLLABLE HIEUH-YE-MIEUM -0xC295 0xD62E # HANGUL SYLLABLE HIEUH-YE-PIEUPSIOS -0xC296 0xD62F # HANGUL SYLLABLE HIEUH-YE-SIOS -0xC297 0xD630 # HANGUL SYLLABLE HIEUH-YE-SSANGSIOS -0xC298 0xD631 # HANGUL SYLLABLE HIEUH-YE-IEUNG -0xC299 0xD632 # HANGUL SYLLABLE HIEUH-YE-CIEUC -0xC29A 0xD633 # HANGUL SYLLABLE HIEUH-YE-CHIEUCH -0xC29B 0xD634 # HANGUL SYLLABLE HIEUH-YE-KHIEUKH -0xC29C 0xD635 # HANGUL SYLLABLE HIEUH-YE-THIEUTH -0xC29D 0xD636 # HANGUL SYLLABLE HIEUH-YE-PHIEUPH -0xC29E 0xD637 # HANGUL SYLLABLE HIEUH-YE-HIEUH -0xC29F 0xD63A # HANGUL SYLLABLE HIEUH-O-SSANGKIYEOK -0xC2A0 0xD63B # HANGUL SYLLABLE HIEUH-O-KIYEOKSIOS -0xC2A1 0xC9D5 # HANGUL SYLLABLE CIEUC-I-IEUNG -0xC2A2 0xC9D6 # HANGUL SYLLABLE CIEUC-I-CIEUC -0xC2A3 0xC9D9 # HANGUL SYLLABLE CIEUC-I-THIEUTH -0xC2A4 0xC9DA # HANGUL SYLLABLE CIEUC-I-PHIEUPH -0xC2A5 0xC9DC # HANGUL SYLLABLE SSANGCIEUC-A -0xC2A6 0xC9DD # HANGUL SYLLABLE SSANGCIEUC-A-KIYEOK -0xC2A7 0xC9E0 # HANGUL SYLLABLE SSANGCIEUC-A-NIEUN -0xC2A8 0xC9E2 # HANGUL SYLLABLE SSANGCIEUC-A-NIEUNHIEUH -0xC2A9 0xC9E4 # HANGUL SYLLABLE SSANGCIEUC-A-RIEUL -0xC2AA 0xC9E7 # HANGUL SYLLABLE SSANGCIEUC-A-RIEULPIEUP -0xC2AB 0xC9EC # HANGUL SYLLABLE SSANGCIEUC-A-MIEUM -0xC2AC 0xC9ED # HANGUL SYLLABLE SSANGCIEUC-A-PIEUP -0xC2AD 0xC9EF # HANGUL SYLLABLE SSANGCIEUC-A-SIOS -0xC2AE 0xC9F0 # HANGUL SYLLABLE SSANGCIEUC-A-SSANGSIOS -0xC2AF 0xC9F1 # HANGUL SYLLABLE SSANGCIEUC-A-IEUNG -0xC2B0 0xC9F8 # HANGUL SYLLABLE SSANGCIEUC-AE -0xC2B1 0xC9F9 # HANGUL SYLLABLE SSANGCIEUC-AE-KIYEOK -0xC2B2 0xC9FC # HANGUL SYLLABLE SSANGCIEUC-AE-NIEUN -0xC2B3 0xCA00 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEUL -0xC2B4 0xCA08 # HANGUL SYLLABLE SSANGCIEUC-AE-MIEUM -0xC2B5 0xCA09 # HANGUL SYLLABLE SSANGCIEUC-AE-PIEUP -0xC2B6 0xCA0B # HANGUL SYLLABLE SSANGCIEUC-AE-SIOS -0xC2B7 0xCA0C # HANGUL SYLLABLE SSANGCIEUC-AE-SSANGSIOS -0xC2B8 0xCA0D # HANGUL SYLLABLE SSANGCIEUC-AE-IEUNG -0xC2B9 0xCA14 # HANGUL SYLLABLE SSANGCIEUC-YA -0xC2BA 0xCA18 # HANGUL SYLLABLE SSANGCIEUC-YA-NIEUN -0xC2BB 0xCA29 # HANGUL SYLLABLE SSANGCIEUC-YA-IEUNG -0xC2BC 0xCA4C # HANGUL SYLLABLE SSANGCIEUC-EO -0xC2BD 0xCA4D # HANGUL SYLLABLE SSANGCIEUC-EO-KIYEOK -0xC2BE 0xCA50 # HANGUL SYLLABLE SSANGCIEUC-EO-NIEUN -0xC2BF 0xCA54 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEUL -0xC2C0 0xCA5C # HANGUL SYLLABLE SSANGCIEUC-EO-MIEUM -0xC2C1 0xCA5D # HANGUL SYLLABLE SSANGCIEUC-EO-PIEUP -0xC2C2 0xCA5F # HANGUL SYLLABLE SSANGCIEUC-EO-SIOS -0xC2C3 0xCA60 # HANGUL SYLLABLE SSANGCIEUC-EO-SSANGSIOS -0xC2C4 0xCA61 # HANGUL SYLLABLE SSANGCIEUC-EO-IEUNG -0xC2C5 0xCA68 # HANGUL SYLLABLE SSANGCIEUC-E -0xC2C6 0xCA7D # HANGUL SYLLABLE SSANGCIEUC-E-IEUNG -0xC2C7 0xCA84 # HANGUL SYLLABLE SSANGCIEUC-YEO -0xC2C8 0xCA98 # HANGUL SYLLABLE SSANGCIEUC-YEO-SSANGSIOS -0xC2C9 0xCABC # HANGUL SYLLABLE SSANGCIEUC-O -0xC2CA 0xCABD # HANGUL SYLLABLE SSANGCIEUC-O-KIYEOK -0xC2CB 0xCAC0 # HANGUL SYLLABLE SSANGCIEUC-O-NIEUN -0xC2CC 0xCAC4 # HANGUL SYLLABLE SSANGCIEUC-O-RIEUL -0xC2CD 0xCACC # HANGUL SYLLABLE SSANGCIEUC-O-MIEUM -0xC2CE 0xCACD # HANGUL SYLLABLE SSANGCIEUC-O-PIEUP -0xC2CF 0xCACF # HANGUL SYLLABLE SSANGCIEUC-O-SIOS -0xC2D0 0xCAD1 # HANGUL SYLLABLE SSANGCIEUC-O-IEUNG -0xC2D1 0xCAD3 # HANGUL SYLLABLE SSANGCIEUC-O-CHIEUCH -0xC2D2 0xCAD8 # HANGUL SYLLABLE SSANGCIEUC-WA -0xC2D3 0xCAD9 # HANGUL SYLLABLE SSANGCIEUC-WA-KIYEOK -0xC2D4 0xCAE0 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEUL -0xC2D5 0xCAEC # HANGUL SYLLABLE SSANGCIEUC-WA-SSANGSIOS -0xC2D6 0xCAF4 # HANGUL SYLLABLE SSANGCIEUC-WAE -0xC2D7 0xCB08 # HANGUL SYLLABLE SSANGCIEUC-WAE-SSANGSIOS -0xC2D8 0xCB10 # HANGUL SYLLABLE SSANGCIEUC-OE -0xC2D9 0xCB14 # HANGUL SYLLABLE SSANGCIEUC-OE-NIEUN -0xC2DA 0xCB18 # HANGUL SYLLABLE SSANGCIEUC-OE-RIEUL -0xC2DB 0xCB20 # HANGUL SYLLABLE SSANGCIEUC-OE-MIEUM -0xC2DC 0xCB21 # HANGUL SYLLABLE SSANGCIEUC-OE-PIEUP -0xC2DD 0xCB41 # HANGUL SYLLABLE SSANGCIEUC-YO-IEUNG -0xC2DE 0xCB48 # HANGUL SYLLABLE SSANGCIEUC-U -0xC2DF 0xCB49 # HANGUL SYLLABLE SSANGCIEUC-U-KIYEOK -0xC2E0 0xCB4C # HANGUL SYLLABLE SSANGCIEUC-U-NIEUN -0xC2E1 0xCB50 # HANGUL SYLLABLE SSANGCIEUC-U-RIEUL -0xC2E2 0xCB58 # HANGUL SYLLABLE SSANGCIEUC-U-MIEUM -0xC2E3 0xCB59 # HANGUL SYLLABLE SSANGCIEUC-U-PIEUP -0xC2E4 0xCB5D # HANGUL SYLLABLE SSANGCIEUC-U-IEUNG -0xC2E5 0xCB64 # HANGUL SYLLABLE SSANGCIEUC-WEO -0xC2E6 0xCB78 # HANGUL SYLLABLE SSANGCIEUC-WEO-SSANGSIOS -0xC2E7 0xCB79 # HANGUL SYLLABLE SSANGCIEUC-WEO-IEUNG -0xC2E8 0xCB9C # HANGUL SYLLABLE SSANGCIEUC-WI -0xC2E9 0xCBB8 # HANGUL SYLLABLE SSANGCIEUC-YU -0xC2EA 0xCBD4 # HANGUL SYLLABLE SSANGCIEUC-EU -0xC2EB 0xCBE4 # HANGUL SYLLABLE SSANGCIEUC-EU-MIEUM -0xC2EC 0xCBE7 # HANGUL SYLLABLE SSANGCIEUC-EU-SIOS -0xC2ED 0xCBE9 # HANGUL SYLLABLE SSANGCIEUC-EU-IEUNG -0xC2EE 0xCC0C # HANGUL SYLLABLE SSANGCIEUC-I -0xC2EF 0xCC0D # HANGUL SYLLABLE SSANGCIEUC-I-KIYEOK -0xC2F0 0xCC10 # HANGUL SYLLABLE SSANGCIEUC-I-NIEUN -0xC2F1 0xCC14 # HANGUL SYLLABLE SSANGCIEUC-I-RIEUL -0xC2F2 0xCC1C # HANGUL SYLLABLE SSANGCIEUC-I-MIEUM -0xC2F3 0xCC1D # HANGUL SYLLABLE SSANGCIEUC-I-PIEUP -0xC2F4 0xCC21 # HANGUL SYLLABLE SSANGCIEUC-I-IEUNG -0xC2F5 0xCC22 # HANGUL SYLLABLE SSANGCIEUC-I-CIEUC -0xC2F6 0xCC27 # HANGUL SYLLABLE SSANGCIEUC-I-HIEUH -0xC2F7 0xCC28 # HANGUL SYLLABLE CHIEUCH-A -0xC2F8 0xCC29 # HANGUL SYLLABLE CHIEUCH-A-KIYEOK -0xC2F9 0xCC2C # HANGUL SYLLABLE CHIEUCH-A-NIEUN -0xC2FA 0xCC2E # HANGUL SYLLABLE CHIEUCH-A-NIEUNHIEUH -0xC2FB 0xCC30 # HANGUL SYLLABLE CHIEUCH-A-RIEUL -0xC2FC 0xCC38 # HANGUL SYLLABLE CHIEUCH-A-MIEUM -0xC2FD 0xCC39 # HANGUL SYLLABLE CHIEUCH-A-PIEUP -0xC2FE 0xCC3B # HANGUL SYLLABLE CHIEUCH-A-SIOS -0xC341 0xD63D # HANGUL SYLLABLE HIEUH-O-NIEUNCIEUC -0xC342 0xD63E # HANGUL SYLLABLE HIEUH-O-NIEUNHIEUH -0xC343 0xD63F # HANGUL SYLLABLE HIEUH-O-TIKEUT -0xC344 0xD641 # HANGUL SYLLABLE HIEUH-O-RIEULKIYEOK -0xC345 0xD642 # HANGUL SYLLABLE HIEUH-O-RIEULMIEUM -0xC346 0xD643 # HANGUL SYLLABLE HIEUH-O-RIEULPIEUP -0xC347 0xD644 # HANGUL SYLLABLE HIEUH-O-RIEULSIOS -0xC348 0xD646 # HANGUL SYLLABLE HIEUH-O-RIEULPHIEUPH -0xC349 0xD647 # HANGUL SYLLABLE HIEUH-O-RIEULHIEUH -0xC34A 0xD64A # HANGUL SYLLABLE HIEUH-O-PIEUPSIOS -0xC34B 0xD64C # HANGUL SYLLABLE HIEUH-O-SSANGSIOS -0xC34C 0xD64E # HANGUL SYLLABLE HIEUH-O-CIEUC -0xC34D 0xD64F # HANGUL SYLLABLE HIEUH-O-CHIEUCH -0xC34E 0xD650 # HANGUL SYLLABLE HIEUH-O-KHIEUKH -0xC34F 0xD652 # HANGUL SYLLABLE HIEUH-O-PHIEUPH -0xC350 0xD653 # HANGUL SYLLABLE HIEUH-O-HIEUH -0xC351 0xD656 # HANGUL SYLLABLE HIEUH-WA-SSANGKIYEOK -0xC352 0xD657 # HANGUL SYLLABLE HIEUH-WA-KIYEOKSIOS -0xC353 0xD659 # HANGUL SYLLABLE HIEUH-WA-NIEUNCIEUC -0xC354 0xD65A # HANGUL SYLLABLE HIEUH-WA-NIEUNHIEUH -0xC355 0xD65B # HANGUL SYLLABLE HIEUH-WA-TIKEUT -0xC356 0xD65D # HANGUL SYLLABLE HIEUH-WA-RIEULKIYEOK -0xC357 0xD65E # HANGUL SYLLABLE HIEUH-WA-RIEULMIEUM -0xC358 0xD65F # HANGUL SYLLABLE HIEUH-WA-RIEULPIEUP -0xC359 0xD660 # HANGUL SYLLABLE HIEUH-WA-RIEULSIOS -0xC35A 0xD661 # HANGUL SYLLABLE HIEUH-WA-RIEULTHIEUTH -0xC361 0xD662 # HANGUL SYLLABLE HIEUH-WA-RIEULPHIEUPH -0xC362 0xD663 # HANGUL SYLLABLE HIEUH-WA-RIEULHIEUH -0xC363 0xD664 # HANGUL SYLLABLE HIEUH-WA-MIEUM -0xC364 0xD665 # HANGUL SYLLABLE HIEUH-WA-PIEUP -0xC365 0xD666 # HANGUL SYLLABLE HIEUH-WA-PIEUPSIOS -0xC366 0xD668 # HANGUL SYLLABLE HIEUH-WA-SSANGSIOS -0xC367 0xD66A # HANGUL SYLLABLE HIEUH-WA-CIEUC -0xC368 0xD66B # HANGUL SYLLABLE HIEUH-WA-CHIEUCH -0xC369 0xD66C # HANGUL SYLLABLE HIEUH-WA-KHIEUKH -0xC36A 0xD66D # HANGUL SYLLABLE HIEUH-WA-THIEUTH -0xC36B 0xD66E # HANGUL SYLLABLE HIEUH-WA-PHIEUPH -0xC36C 0xD66F # HANGUL SYLLABLE HIEUH-WA-HIEUH -0xC36D 0xD672 # HANGUL SYLLABLE HIEUH-WAE-SSANGKIYEOK -0xC36E 0xD673 # HANGUL SYLLABLE HIEUH-WAE-KIYEOKSIOS -0xC36F 0xD675 # HANGUL SYLLABLE HIEUH-WAE-NIEUNCIEUC -0xC370 0xD676 # HANGUL SYLLABLE HIEUH-WAE-NIEUNHIEUH -0xC371 0xD677 # HANGUL SYLLABLE HIEUH-WAE-TIKEUT -0xC372 0xD678 # HANGUL SYLLABLE HIEUH-WAE-RIEUL -0xC373 0xD679 # HANGUL SYLLABLE HIEUH-WAE-RIEULKIYEOK -0xC374 0xD67A # HANGUL SYLLABLE HIEUH-WAE-RIEULMIEUM -0xC375 0xD67B # HANGUL SYLLABLE HIEUH-WAE-RIEULPIEUP -0xC376 0xD67C # HANGUL SYLLABLE HIEUH-WAE-RIEULSIOS -0xC377 0xD67D # HANGUL SYLLABLE HIEUH-WAE-RIEULTHIEUTH -0xC378 0xD67E # HANGUL SYLLABLE HIEUH-WAE-RIEULPHIEUPH -0xC379 0xD67F # HANGUL SYLLABLE HIEUH-WAE-RIEULHIEUH -0xC37A 0xD680 # HANGUL SYLLABLE HIEUH-WAE-MIEUM -0xC381 0xD681 # HANGUL SYLLABLE HIEUH-WAE-PIEUP -0xC382 0xD682 # HANGUL SYLLABLE HIEUH-WAE-PIEUPSIOS -0xC383 0xD684 # HANGUL SYLLABLE HIEUH-WAE-SSANGSIOS -0xC384 0xD686 # HANGUL SYLLABLE HIEUH-WAE-CIEUC -0xC385 0xD687 # HANGUL SYLLABLE HIEUH-WAE-CHIEUCH -0xC386 0xD688 # HANGUL SYLLABLE HIEUH-WAE-KHIEUKH -0xC387 0xD689 # HANGUL SYLLABLE HIEUH-WAE-THIEUTH -0xC388 0xD68A # HANGUL SYLLABLE HIEUH-WAE-PHIEUPH -0xC389 0xD68B # HANGUL SYLLABLE HIEUH-WAE-HIEUH -0xC38A 0xD68E # HANGUL SYLLABLE HIEUH-OE-SSANGKIYEOK -0xC38B 0xD68F # HANGUL SYLLABLE HIEUH-OE-KIYEOKSIOS -0xC38C 0xD691 # HANGUL SYLLABLE HIEUH-OE-NIEUNCIEUC -0xC38D 0xD692 # HANGUL SYLLABLE HIEUH-OE-NIEUNHIEUH -0xC38E 0xD693 # HANGUL SYLLABLE HIEUH-OE-TIKEUT -0xC38F 0xD695 # HANGUL SYLLABLE HIEUH-OE-RIEULKIYEOK -0xC390 0xD696 # HANGUL SYLLABLE HIEUH-OE-RIEULMIEUM -0xC391 0xD697 # HANGUL SYLLABLE HIEUH-OE-RIEULPIEUP -0xC392 0xD698 # HANGUL SYLLABLE HIEUH-OE-RIEULSIOS -0xC393 0xD699 # HANGUL SYLLABLE HIEUH-OE-RIEULTHIEUTH -0xC394 0xD69A # HANGUL SYLLABLE HIEUH-OE-RIEULPHIEUPH -0xC395 0xD69B # HANGUL SYLLABLE HIEUH-OE-RIEULHIEUH -0xC396 0xD69C # HANGUL SYLLABLE HIEUH-OE-MIEUM -0xC397 0xD69E # HANGUL SYLLABLE HIEUH-OE-PIEUPSIOS -0xC398 0xD6A0 # HANGUL SYLLABLE HIEUH-OE-SSANGSIOS -0xC399 0xD6A2 # HANGUL SYLLABLE HIEUH-OE-CIEUC -0xC39A 0xD6A3 # HANGUL SYLLABLE HIEUH-OE-CHIEUCH -0xC39B 0xD6A4 # HANGUL SYLLABLE HIEUH-OE-KHIEUKH -0xC39C 0xD6A5 # HANGUL SYLLABLE HIEUH-OE-THIEUTH -0xC39D 0xD6A6 # HANGUL SYLLABLE HIEUH-OE-PHIEUPH -0xC39E 0xD6A7 # HANGUL SYLLABLE HIEUH-OE-HIEUH -0xC39F 0xD6A9 # HANGUL SYLLABLE HIEUH-YO-KIYEOK -0xC3A0 0xD6AA # HANGUL SYLLABLE HIEUH-YO-SSANGKIYEOK -0xC3A1 0xCC3C # HANGUL SYLLABLE CHIEUCH-A-SSANGSIOS -0xC3A2 0xCC3D # HANGUL SYLLABLE CHIEUCH-A-IEUNG -0xC3A3 0xCC3E # HANGUL SYLLABLE CHIEUCH-A-CIEUC -0xC3A4 0xCC44 # HANGUL SYLLABLE CHIEUCH-AE -0xC3A5 0xCC45 # HANGUL SYLLABLE CHIEUCH-AE-KIYEOK -0xC3A6 0xCC48 # HANGUL SYLLABLE CHIEUCH-AE-NIEUN -0xC3A7 0xCC4C # HANGUL SYLLABLE CHIEUCH-AE-RIEUL -0xC3A8 0xCC54 # HANGUL SYLLABLE CHIEUCH-AE-MIEUM -0xC3A9 0xCC55 # HANGUL SYLLABLE CHIEUCH-AE-PIEUP -0xC3AA 0xCC57 # HANGUL SYLLABLE CHIEUCH-AE-SIOS -0xC3AB 0xCC58 # HANGUL SYLLABLE CHIEUCH-AE-SSANGSIOS -0xC3AC 0xCC59 # HANGUL SYLLABLE CHIEUCH-AE-IEUNG -0xC3AD 0xCC60 # HANGUL SYLLABLE CHIEUCH-YA -0xC3AE 0xCC64 # HANGUL SYLLABLE CHIEUCH-YA-NIEUN -0xC3AF 0xCC66 # HANGUL SYLLABLE CHIEUCH-YA-NIEUNHIEUH -0xC3B0 0xCC68 # HANGUL SYLLABLE CHIEUCH-YA-RIEUL -0xC3B1 0xCC70 # HANGUL SYLLABLE CHIEUCH-YA-MIEUM -0xC3B2 0xCC75 # HANGUL SYLLABLE CHIEUCH-YA-IEUNG -0xC3B3 0xCC98 # HANGUL SYLLABLE CHIEUCH-EO -0xC3B4 0xCC99 # HANGUL SYLLABLE CHIEUCH-EO-KIYEOK -0xC3B5 0xCC9C # HANGUL SYLLABLE CHIEUCH-EO-NIEUN -0xC3B6 0xCCA0 # HANGUL SYLLABLE CHIEUCH-EO-RIEUL -0xC3B7 0xCCA8 # HANGUL SYLLABLE CHIEUCH-EO-MIEUM -0xC3B8 0xCCA9 # HANGUL SYLLABLE CHIEUCH-EO-PIEUP -0xC3B9 0xCCAB # HANGUL SYLLABLE CHIEUCH-EO-SIOS -0xC3BA 0xCCAC # HANGUL SYLLABLE CHIEUCH-EO-SSANGSIOS -0xC3BB 0xCCAD # HANGUL SYLLABLE CHIEUCH-EO-IEUNG -0xC3BC 0xCCB4 # HANGUL SYLLABLE CHIEUCH-E -0xC3BD 0xCCB5 # HANGUL SYLLABLE CHIEUCH-E-KIYEOK -0xC3BE 0xCCB8 # HANGUL SYLLABLE CHIEUCH-E-NIEUN -0xC3BF 0xCCBC # HANGUL SYLLABLE CHIEUCH-E-RIEUL -0xC3C0 0xCCC4 # HANGUL SYLLABLE CHIEUCH-E-MIEUM -0xC3C1 0xCCC5 # HANGUL SYLLABLE CHIEUCH-E-PIEUP -0xC3C2 0xCCC7 # HANGUL SYLLABLE CHIEUCH-E-SIOS -0xC3C3 0xCCC9 # HANGUL SYLLABLE CHIEUCH-E-IEUNG -0xC3C4 0xCCD0 # HANGUL SYLLABLE CHIEUCH-YEO -0xC3C5 0xCCD4 # HANGUL SYLLABLE CHIEUCH-YEO-NIEUN -0xC3C6 0xCCE4 # HANGUL SYLLABLE CHIEUCH-YEO-SSANGSIOS -0xC3C7 0xCCEC # HANGUL SYLLABLE CHIEUCH-YE -0xC3C8 0xCCF0 # HANGUL SYLLABLE CHIEUCH-YE-NIEUN -0xC3C9 0xCD01 # HANGUL SYLLABLE CHIEUCH-YE-IEUNG -0xC3CA 0xCD08 # HANGUL SYLLABLE CHIEUCH-O -0xC3CB 0xCD09 # HANGUL SYLLABLE CHIEUCH-O-KIYEOK -0xC3CC 0xCD0C # HANGUL SYLLABLE CHIEUCH-O-NIEUN -0xC3CD 0xCD10 # HANGUL SYLLABLE CHIEUCH-O-RIEUL -0xC3CE 0xCD18 # HANGUL SYLLABLE CHIEUCH-O-MIEUM -0xC3CF 0xCD19 # HANGUL SYLLABLE CHIEUCH-O-PIEUP -0xC3D0 0xCD1B # HANGUL SYLLABLE CHIEUCH-O-SIOS -0xC3D1 0xCD1D # HANGUL SYLLABLE CHIEUCH-O-IEUNG -0xC3D2 0xCD24 # HANGUL SYLLABLE CHIEUCH-WA -0xC3D3 0xCD28 # HANGUL SYLLABLE CHIEUCH-WA-NIEUN -0xC3D4 0xCD2C # HANGUL SYLLABLE CHIEUCH-WA-RIEUL -0xC3D5 0xCD39 # HANGUL SYLLABLE CHIEUCH-WA-IEUNG -0xC3D6 0xCD5C # HANGUL SYLLABLE CHIEUCH-OE -0xC3D7 0xCD60 # HANGUL SYLLABLE CHIEUCH-OE-NIEUN -0xC3D8 0xCD64 # HANGUL SYLLABLE CHIEUCH-OE-RIEUL -0xC3D9 0xCD6C # HANGUL SYLLABLE CHIEUCH-OE-MIEUM -0xC3DA 0xCD6D # HANGUL SYLLABLE CHIEUCH-OE-PIEUP -0xC3DB 0xCD6F # HANGUL SYLLABLE CHIEUCH-OE-SIOS -0xC3DC 0xCD71 # HANGUL SYLLABLE CHIEUCH-OE-IEUNG -0xC3DD 0xCD78 # HANGUL SYLLABLE CHIEUCH-YO -0xC3DE 0xCD88 # HANGUL SYLLABLE CHIEUCH-YO-MIEUM -0xC3DF 0xCD94 # HANGUL SYLLABLE CHIEUCH-U -0xC3E0 0xCD95 # HANGUL SYLLABLE CHIEUCH-U-KIYEOK -0xC3E1 0xCD98 # HANGUL SYLLABLE CHIEUCH-U-NIEUN -0xC3E2 0xCD9C # HANGUL SYLLABLE CHIEUCH-U-RIEUL -0xC3E3 0xCDA4 # HANGUL SYLLABLE CHIEUCH-U-MIEUM -0xC3E4 0xCDA5 # HANGUL SYLLABLE CHIEUCH-U-PIEUP -0xC3E5 0xCDA7 # HANGUL SYLLABLE CHIEUCH-U-SIOS -0xC3E6 0xCDA9 # HANGUL SYLLABLE CHIEUCH-U-IEUNG -0xC3E7 0xCDB0 # HANGUL SYLLABLE CHIEUCH-WEO -0xC3E8 0xCDC4 # HANGUL SYLLABLE CHIEUCH-WEO-SSANGSIOS -0xC3E9 0xCDCC # HANGUL SYLLABLE CHIEUCH-WE -0xC3EA 0xCDD0 # HANGUL SYLLABLE CHIEUCH-WE-NIEUN -0xC3EB 0xCDE8 # HANGUL SYLLABLE CHIEUCH-WI -0xC3EC 0xCDEC # HANGUL SYLLABLE CHIEUCH-WI-NIEUN -0xC3ED 0xCDF0 # HANGUL SYLLABLE CHIEUCH-WI-RIEUL -0xC3EE 0xCDF8 # HANGUL SYLLABLE CHIEUCH-WI-MIEUM -0xC3EF 0xCDF9 # HANGUL SYLLABLE CHIEUCH-WI-PIEUP -0xC3F0 0xCDFB # HANGUL SYLLABLE CHIEUCH-WI-SIOS -0xC3F1 0xCDFD # HANGUL SYLLABLE CHIEUCH-WI-IEUNG -0xC3F2 0xCE04 # HANGUL SYLLABLE CHIEUCH-YU -0xC3F3 0xCE08 # HANGUL SYLLABLE CHIEUCH-YU-NIEUN -0xC3F4 0xCE0C # HANGUL SYLLABLE CHIEUCH-YU-RIEUL -0xC3F5 0xCE14 # HANGUL SYLLABLE CHIEUCH-YU-MIEUM -0xC3F6 0xCE19 # HANGUL SYLLABLE CHIEUCH-YU-IEUNG -0xC3F7 0xCE20 # HANGUL SYLLABLE CHIEUCH-EU -0xC3F8 0xCE21 # HANGUL SYLLABLE CHIEUCH-EU-KIYEOK -0xC3F9 0xCE24 # HANGUL SYLLABLE CHIEUCH-EU-NIEUN -0xC3FA 0xCE28 # HANGUL SYLLABLE CHIEUCH-EU-RIEUL -0xC3FB 0xCE30 # HANGUL SYLLABLE CHIEUCH-EU-MIEUM -0xC3FC 0xCE31 # HANGUL SYLLABLE CHIEUCH-EU-PIEUP -0xC3FD 0xCE33 # HANGUL SYLLABLE CHIEUCH-EU-SIOS -0xC3FE 0xCE35 # HANGUL SYLLABLE CHIEUCH-EU-IEUNG -0xC441 0xD6AB # HANGUL SYLLABLE HIEUH-YO-KIYEOKSIOS -0xC442 0xD6AD # HANGUL SYLLABLE HIEUH-YO-NIEUNCIEUC -0xC443 0xD6AE # HANGUL SYLLABLE HIEUH-YO-NIEUNHIEUH -0xC444 0xD6AF # HANGUL SYLLABLE HIEUH-YO-TIKEUT -0xC445 0xD6B1 # HANGUL SYLLABLE HIEUH-YO-RIEULKIYEOK -0xC446 0xD6B2 # HANGUL SYLLABLE HIEUH-YO-RIEULMIEUM -0xC447 0xD6B3 # HANGUL SYLLABLE HIEUH-YO-RIEULPIEUP -0xC448 0xD6B4 # HANGUL SYLLABLE HIEUH-YO-RIEULSIOS -0xC449 0xD6B5 # HANGUL SYLLABLE HIEUH-YO-RIEULTHIEUTH -0xC44A 0xD6B6 # HANGUL SYLLABLE HIEUH-YO-RIEULPHIEUPH -0xC44B 0xD6B7 # HANGUL SYLLABLE HIEUH-YO-RIEULHIEUH -0xC44C 0xD6B8 # HANGUL SYLLABLE HIEUH-YO-MIEUM -0xC44D 0xD6BA # HANGUL SYLLABLE HIEUH-YO-PIEUPSIOS -0xC44E 0xD6BC # HANGUL SYLLABLE HIEUH-YO-SSANGSIOS -0xC44F 0xD6BD # HANGUL SYLLABLE HIEUH-YO-IEUNG -0xC450 0xD6BE # HANGUL SYLLABLE HIEUH-YO-CIEUC -0xC451 0xD6BF # HANGUL SYLLABLE HIEUH-YO-CHIEUCH -0xC452 0xD6C0 # HANGUL SYLLABLE HIEUH-YO-KHIEUKH -0xC453 0xD6C1 # HANGUL SYLLABLE HIEUH-YO-THIEUTH -0xC454 0xD6C2 # HANGUL SYLLABLE HIEUH-YO-PHIEUPH -0xC455 0xD6C3 # HANGUL SYLLABLE HIEUH-YO-HIEUH -0xC456 0xD6C6 # HANGUL SYLLABLE HIEUH-U-SSANGKIYEOK -0xC457 0xD6C7 # HANGUL SYLLABLE HIEUH-U-KIYEOKSIOS -0xC458 0xD6C9 # HANGUL SYLLABLE HIEUH-U-NIEUNCIEUC -0xC459 0xD6CA # HANGUL SYLLABLE HIEUH-U-NIEUNHIEUH -0xC45A 0xD6CB # HANGUL SYLLABLE HIEUH-U-TIKEUT -0xC461 0xD6CD # HANGUL SYLLABLE HIEUH-U-RIEULKIYEOK -0xC462 0xD6CE # HANGUL SYLLABLE HIEUH-U-RIEULMIEUM -0xC463 0xD6CF # HANGUL SYLLABLE HIEUH-U-RIEULPIEUP -0xC464 0xD6D0 # HANGUL SYLLABLE HIEUH-U-RIEULSIOS -0xC465 0xD6D2 # HANGUL SYLLABLE HIEUH-U-RIEULPHIEUPH -0xC466 0xD6D3 # HANGUL SYLLABLE HIEUH-U-RIEULHIEUH -0xC467 0xD6D5 # HANGUL SYLLABLE HIEUH-U-PIEUP -0xC468 0xD6D6 # HANGUL SYLLABLE HIEUH-U-PIEUPSIOS -0xC469 0xD6D8 # HANGUL SYLLABLE HIEUH-U-SSANGSIOS -0xC46A 0xD6DA # HANGUL SYLLABLE HIEUH-U-CIEUC -0xC46B 0xD6DB # HANGUL SYLLABLE HIEUH-U-CHIEUCH -0xC46C 0xD6DC # HANGUL SYLLABLE HIEUH-U-KHIEUKH -0xC46D 0xD6DD # HANGUL SYLLABLE HIEUH-U-THIEUTH -0xC46E 0xD6DE # HANGUL SYLLABLE HIEUH-U-PHIEUPH -0xC46F 0xD6DF # HANGUL SYLLABLE HIEUH-U-HIEUH -0xC470 0xD6E1 # HANGUL SYLLABLE HIEUH-WEO-KIYEOK -0xC471 0xD6E2 # HANGUL SYLLABLE HIEUH-WEO-SSANGKIYEOK -0xC472 0xD6E3 # HANGUL SYLLABLE HIEUH-WEO-KIYEOKSIOS -0xC473 0xD6E5 # HANGUL SYLLABLE HIEUH-WEO-NIEUNCIEUC -0xC474 0xD6E6 # HANGUL SYLLABLE HIEUH-WEO-NIEUNHIEUH -0xC475 0xD6E7 # HANGUL SYLLABLE HIEUH-WEO-TIKEUT -0xC476 0xD6E9 # HANGUL SYLLABLE HIEUH-WEO-RIEULKIYEOK -0xC477 0xD6EA # HANGUL SYLLABLE HIEUH-WEO-RIEULMIEUM -0xC478 0xD6EB # HANGUL SYLLABLE HIEUH-WEO-RIEULPIEUP -0xC479 0xD6EC # HANGUL SYLLABLE HIEUH-WEO-RIEULSIOS -0xC47A 0xD6ED # HANGUL SYLLABLE HIEUH-WEO-RIEULTHIEUTH -0xC481 0xD6EE # HANGUL SYLLABLE HIEUH-WEO-RIEULPHIEUPH -0xC482 0xD6EF # HANGUL SYLLABLE HIEUH-WEO-RIEULHIEUH -0xC483 0xD6F1 # HANGUL SYLLABLE HIEUH-WEO-PIEUP -0xC484 0xD6F2 # HANGUL SYLLABLE HIEUH-WEO-PIEUPSIOS -0xC485 0xD6F3 # HANGUL SYLLABLE HIEUH-WEO-SIOS -0xC486 0xD6F4 # HANGUL SYLLABLE HIEUH-WEO-SSANGSIOS -0xC487 0xD6F6 # HANGUL SYLLABLE HIEUH-WEO-CIEUC -0xC488 0xD6F7 # HANGUL SYLLABLE HIEUH-WEO-CHIEUCH -0xC489 0xD6F8 # HANGUL SYLLABLE HIEUH-WEO-KHIEUKH -0xC48A 0xD6F9 # HANGUL SYLLABLE HIEUH-WEO-THIEUTH -0xC48B 0xD6FA # HANGUL SYLLABLE HIEUH-WEO-PHIEUPH -0xC48C 0xD6FB # HANGUL SYLLABLE HIEUH-WEO-HIEUH -0xC48D 0xD6FE # HANGUL SYLLABLE HIEUH-WE-SSANGKIYEOK -0xC48E 0xD6FF # HANGUL SYLLABLE HIEUH-WE-KIYEOKSIOS -0xC48F 0xD701 # HANGUL SYLLABLE HIEUH-WE-NIEUNCIEUC -0xC490 0xD702 # HANGUL SYLLABLE HIEUH-WE-NIEUNHIEUH -0xC491 0xD703 # HANGUL SYLLABLE HIEUH-WE-TIKEUT -0xC492 0xD705 # HANGUL SYLLABLE HIEUH-WE-RIEULKIYEOK -0xC493 0xD706 # HANGUL SYLLABLE HIEUH-WE-RIEULMIEUM -0xC494 0xD707 # HANGUL SYLLABLE HIEUH-WE-RIEULPIEUP -0xC495 0xD708 # HANGUL SYLLABLE HIEUH-WE-RIEULSIOS -0xC496 0xD709 # HANGUL SYLLABLE HIEUH-WE-RIEULTHIEUTH -0xC497 0xD70A # HANGUL SYLLABLE HIEUH-WE-RIEULPHIEUPH -0xC498 0xD70B # HANGUL SYLLABLE HIEUH-WE-RIEULHIEUH -0xC499 0xD70C # HANGUL SYLLABLE HIEUH-WE-MIEUM -0xC49A 0xD70D # HANGUL SYLLABLE HIEUH-WE-PIEUP -0xC49B 0xD70E # HANGUL SYLLABLE HIEUH-WE-PIEUPSIOS -0xC49C 0xD70F # HANGUL SYLLABLE HIEUH-WE-SIOS -0xC49D 0xD710 # HANGUL SYLLABLE HIEUH-WE-SSANGSIOS -0xC49E 0xD712 # HANGUL SYLLABLE HIEUH-WE-CIEUC -0xC49F 0xD713 # HANGUL SYLLABLE HIEUH-WE-CHIEUCH -0xC4A0 0xD714 # HANGUL SYLLABLE HIEUH-WE-KHIEUKH -0xC4A1 0xCE58 # HANGUL SYLLABLE CHIEUCH-I -0xC4A2 0xCE59 # HANGUL SYLLABLE CHIEUCH-I-KIYEOK -0xC4A3 0xCE5C # HANGUL SYLLABLE CHIEUCH-I-NIEUN -0xC4A4 0xCE5F # HANGUL SYLLABLE CHIEUCH-I-TIKEUT -0xC4A5 0xCE60 # HANGUL SYLLABLE CHIEUCH-I-RIEUL -0xC4A6 0xCE61 # HANGUL SYLLABLE CHIEUCH-I-RIEULKIYEOK -0xC4A7 0xCE68 # HANGUL SYLLABLE CHIEUCH-I-MIEUM -0xC4A8 0xCE69 # HANGUL SYLLABLE CHIEUCH-I-PIEUP -0xC4A9 0xCE6B # HANGUL SYLLABLE CHIEUCH-I-SIOS -0xC4AA 0xCE6D # HANGUL SYLLABLE CHIEUCH-I-IEUNG -0xC4AB 0xCE74 # HANGUL SYLLABLE KHIEUKH-A -0xC4AC 0xCE75 # HANGUL SYLLABLE KHIEUKH-A-KIYEOK -0xC4AD 0xCE78 # HANGUL SYLLABLE KHIEUKH-A-NIEUN -0xC4AE 0xCE7C # HANGUL SYLLABLE KHIEUKH-A-RIEUL -0xC4AF 0xCE84 # HANGUL SYLLABLE KHIEUKH-A-MIEUM -0xC4B0 0xCE85 # HANGUL SYLLABLE KHIEUKH-A-PIEUP -0xC4B1 0xCE87 # HANGUL SYLLABLE KHIEUKH-A-SIOS -0xC4B2 0xCE89 # HANGUL SYLLABLE KHIEUKH-A-IEUNG -0xC4B3 0xCE90 # HANGUL SYLLABLE KHIEUKH-AE -0xC4B4 0xCE91 # HANGUL SYLLABLE KHIEUKH-AE-KIYEOK -0xC4B5 0xCE94 # HANGUL SYLLABLE KHIEUKH-AE-NIEUN -0xC4B6 0xCE98 # HANGUL SYLLABLE KHIEUKH-AE-RIEUL -0xC4B7 0xCEA0 # HANGUL SYLLABLE KHIEUKH-AE-MIEUM -0xC4B8 0xCEA1 # HANGUL SYLLABLE KHIEUKH-AE-PIEUP -0xC4B9 0xCEA3 # HANGUL SYLLABLE KHIEUKH-AE-SIOS -0xC4BA 0xCEA4 # HANGUL SYLLABLE KHIEUKH-AE-SSANGSIOS -0xC4BB 0xCEA5 # HANGUL SYLLABLE KHIEUKH-AE-IEUNG -0xC4BC 0xCEAC # HANGUL SYLLABLE KHIEUKH-YA -0xC4BD 0xCEAD # HANGUL SYLLABLE KHIEUKH-YA-KIYEOK -0xC4BE 0xCEC1 # HANGUL SYLLABLE KHIEUKH-YA-IEUNG -0xC4BF 0xCEE4 # HANGUL SYLLABLE KHIEUKH-EO -0xC4C0 0xCEE5 # HANGUL SYLLABLE KHIEUKH-EO-KIYEOK -0xC4C1 0xCEE8 # HANGUL SYLLABLE KHIEUKH-EO-NIEUN -0xC4C2 0xCEEB # HANGUL SYLLABLE KHIEUKH-EO-TIKEUT -0xC4C3 0xCEEC # HANGUL SYLLABLE KHIEUKH-EO-RIEUL -0xC4C4 0xCEF4 # HANGUL SYLLABLE KHIEUKH-EO-MIEUM -0xC4C5 0xCEF5 # HANGUL SYLLABLE KHIEUKH-EO-PIEUP -0xC4C6 0xCEF7 # HANGUL SYLLABLE KHIEUKH-EO-SIOS -0xC4C7 0xCEF8 # HANGUL SYLLABLE KHIEUKH-EO-SSANGSIOS -0xC4C8 0xCEF9 # HANGUL SYLLABLE KHIEUKH-EO-IEUNG -0xC4C9 0xCF00 # HANGUL SYLLABLE KHIEUKH-E -0xC4CA 0xCF01 # HANGUL SYLLABLE KHIEUKH-E-KIYEOK -0xC4CB 0xCF04 # HANGUL SYLLABLE KHIEUKH-E-NIEUN -0xC4CC 0xCF08 # HANGUL SYLLABLE KHIEUKH-E-RIEUL -0xC4CD 0xCF10 # HANGUL SYLLABLE KHIEUKH-E-MIEUM -0xC4CE 0xCF11 # HANGUL SYLLABLE KHIEUKH-E-PIEUP -0xC4CF 0xCF13 # HANGUL SYLLABLE KHIEUKH-E-SIOS -0xC4D0 0xCF15 # HANGUL SYLLABLE KHIEUKH-E-IEUNG -0xC4D1 0xCF1C # HANGUL SYLLABLE KHIEUKH-YEO -0xC4D2 0xCF20 # HANGUL SYLLABLE KHIEUKH-YEO-NIEUN -0xC4D3 0xCF24 # HANGUL SYLLABLE KHIEUKH-YEO-RIEUL -0xC4D4 0xCF2C # HANGUL SYLLABLE KHIEUKH-YEO-MIEUM -0xC4D5 0xCF2D # HANGUL SYLLABLE KHIEUKH-YEO-PIEUP -0xC4D6 0xCF2F # HANGUL SYLLABLE KHIEUKH-YEO-SIOS -0xC4D7 0xCF30 # HANGUL SYLLABLE KHIEUKH-YEO-SSANGSIOS -0xC4D8 0xCF31 # HANGUL SYLLABLE KHIEUKH-YEO-IEUNG -0xC4D9 0xCF38 # HANGUL SYLLABLE KHIEUKH-YE -0xC4DA 0xCF54 # HANGUL SYLLABLE KHIEUKH-O -0xC4DB 0xCF55 # HANGUL SYLLABLE KHIEUKH-O-KIYEOK -0xC4DC 0xCF58 # HANGUL SYLLABLE KHIEUKH-O-NIEUN -0xC4DD 0xCF5C # HANGUL SYLLABLE KHIEUKH-O-RIEUL -0xC4DE 0xCF64 # HANGUL SYLLABLE KHIEUKH-O-MIEUM -0xC4DF 0xCF65 # HANGUL SYLLABLE KHIEUKH-O-PIEUP -0xC4E0 0xCF67 # HANGUL SYLLABLE KHIEUKH-O-SIOS -0xC4E1 0xCF69 # HANGUL SYLLABLE KHIEUKH-O-IEUNG -0xC4E2 0xCF70 # HANGUL SYLLABLE KHIEUKH-WA -0xC4E3 0xCF71 # HANGUL SYLLABLE KHIEUKH-WA-KIYEOK -0xC4E4 0xCF74 # HANGUL SYLLABLE KHIEUKH-WA-NIEUN -0xC4E5 0xCF78 # HANGUL SYLLABLE KHIEUKH-WA-RIEUL -0xC4E6 0xCF80 # HANGUL SYLLABLE KHIEUKH-WA-MIEUM -0xC4E7 0xCF85 # HANGUL SYLLABLE KHIEUKH-WA-IEUNG -0xC4E8 0xCF8C # HANGUL SYLLABLE KHIEUKH-WAE -0xC4E9 0xCFA1 # HANGUL SYLLABLE KHIEUKH-WAE-IEUNG -0xC4EA 0xCFA8 # HANGUL SYLLABLE KHIEUKH-OE -0xC4EB 0xCFB0 # HANGUL SYLLABLE KHIEUKH-OE-RIEUL -0xC4EC 0xCFC4 # HANGUL SYLLABLE KHIEUKH-YO -0xC4ED 0xCFE0 # HANGUL SYLLABLE KHIEUKH-U -0xC4EE 0xCFE1 # HANGUL SYLLABLE KHIEUKH-U-KIYEOK -0xC4EF 0xCFE4 # HANGUL SYLLABLE KHIEUKH-U-NIEUN -0xC4F0 0xCFE8 # HANGUL SYLLABLE KHIEUKH-U-RIEUL -0xC4F1 0xCFF0 # HANGUL SYLLABLE KHIEUKH-U-MIEUM -0xC4F2 0xCFF1 # HANGUL SYLLABLE KHIEUKH-U-PIEUP -0xC4F3 0xCFF3 # HANGUL SYLLABLE KHIEUKH-U-SIOS -0xC4F4 0xCFF5 # HANGUL SYLLABLE KHIEUKH-U-IEUNG -0xC4F5 0xCFFC # HANGUL SYLLABLE KHIEUKH-WEO -0xC4F6 0xD000 # HANGUL SYLLABLE KHIEUKH-WEO-NIEUN -0xC4F7 0xD004 # HANGUL SYLLABLE KHIEUKH-WEO-RIEUL -0xC4F8 0xD011 # HANGUL SYLLABLE KHIEUKH-WEO-IEUNG -0xC4F9 0xD018 # HANGUL SYLLABLE KHIEUKH-WE -0xC4FA 0xD02D # HANGUL SYLLABLE KHIEUKH-WE-IEUNG -0xC4FB 0xD034 # HANGUL SYLLABLE KHIEUKH-WI -0xC4FC 0xD035 # HANGUL SYLLABLE KHIEUKH-WI-KIYEOK -0xC4FD 0xD038 # HANGUL SYLLABLE KHIEUKH-WI-NIEUN -0xC4FE 0xD03C # HANGUL SYLLABLE KHIEUKH-WI-RIEUL -0xC541 0xD715 # HANGUL SYLLABLE HIEUH-WE-THIEUTH -0xC542 0xD716 # HANGUL SYLLABLE HIEUH-WE-PHIEUPH -0xC543 0xD717 # HANGUL SYLLABLE HIEUH-WE-HIEUH -0xC544 0xD71A # HANGUL SYLLABLE HIEUH-WI-SSANGKIYEOK -0xC545 0xD71B # HANGUL SYLLABLE HIEUH-WI-KIYEOKSIOS -0xC546 0xD71D # HANGUL SYLLABLE HIEUH-WI-NIEUNCIEUC -0xC547 0xD71E # HANGUL SYLLABLE HIEUH-WI-NIEUNHIEUH -0xC548 0xD71F # HANGUL SYLLABLE HIEUH-WI-TIKEUT -0xC549 0xD721 # HANGUL SYLLABLE HIEUH-WI-RIEULKIYEOK -0xC54A 0xD722 # HANGUL SYLLABLE HIEUH-WI-RIEULMIEUM -0xC54B 0xD723 # HANGUL SYLLABLE HIEUH-WI-RIEULPIEUP -0xC54C 0xD724 # HANGUL SYLLABLE HIEUH-WI-RIEULSIOS -0xC54D 0xD725 # HANGUL SYLLABLE HIEUH-WI-RIEULTHIEUTH -0xC54E 0xD726 # HANGUL SYLLABLE HIEUH-WI-RIEULPHIEUPH -0xC54F 0xD727 # HANGUL SYLLABLE HIEUH-WI-RIEULHIEUH -0xC550 0xD72A # HANGUL SYLLABLE HIEUH-WI-PIEUPSIOS -0xC551 0xD72C # HANGUL SYLLABLE HIEUH-WI-SSANGSIOS -0xC552 0xD72E # HANGUL SYLLABLE HIEUH-WI-CIEUC -0xC553 0xD72F # HANGUL SYLLABLE HIEUH-WI-CHIEUCH -0xC554 0xD730 # HANGUL SYLLABLE HIEUH-WI-KHIEUKH -0xC555 0xD731 # HANGUL SYLLABLE HIEUH-WI-THIEUTH -0xC556 0xD732 # HANGUL SYLLABLE HIEUH-WI-PHIEUPH -0xC557 0xD733 # HANGUL SYLLABLE HIEUH-WI-HIEUH -0xC558 0xD736 # HANGUL SYLLABLE HIEUH-YU-SSANGKIYEOK -0xC559 0xD737 # HANGUL SYLLABLE HIEUH-YU-KIYEOKSIOS -0xC55A 0xD739 # HANGUL SYLLABLE HIEUH-YU-NIEUNCIEUC -0xC561 0xD73A # HANGUL SYLLABLE HIEUH-YU-NIEUNHIEUH -0xC562 0xD73B # HANGUL SYLLABLE HIEUH-YU-TIKEUT -0xC563 0xD73D # HANGUL SYLLABLE HIEUH-YU-RIEULKIYEOK -0xC564 0xD73E # HANGUL SYLLABLE HIEUH-YU-RIEULMIEUM -0xC565 0xD73F # HANGUL SYLLABLE HIEUH-YU-RIEULPIEUP -0xC566 0xD740 # HANGUL SYLLABLE HIEUH-YU-RIEULSIOS -0xC567 0xD741 # HANGUL SYLLABLE HIEUH-YU-RIEULTHIEUTH -0xC568 0xD742 # HANGUL SYLLABLE HIEUH-YU-RIEULPHIEUPH -0xC569 0xD743 # HANGUL SYLLABLE HIEUH-YU-RIEULHIEUH -0xC56A 0xD745 # HANGUL SYLLABLE HIEUH-YU-PIEUP -0xC56B 0xD746 # HANGUL SYLLABLE HIEUH-YU-PIEUPSIOS -0xC56C 0xD748 # HANGUL SYLLABLE HIEUH-YU-SSANGSIOS -0xC56D 0xD74A # HANGUL SYLLABLE HIEUH-YU-CIEUC -0xC56E 0xD74B # HANGUL SYLLABLE HIEUH-YU-CHIEUCH -0xC56F 0xD74C # HANGUL SYLLABLE HIEUH-YU-KHIEUKH -0xC570 0xD74D # HANGUL SYLLABLE HIEUH-YU-THIEUTH -0xC571 0xD74E # HANGUL SYLLABLE HIEUH-YU-PHIEUPH -0xC572 0xD74F # HANGUL SYLLABLE HIEUH-YU-HIEUH -0xC573 0xD752 # HANGUL SYLLABLE HIEUH-EU-SSANGKIYEOK -0xC574 0xD753 # HANGUL SYLLABLE HIEUH-EU-KIYEOKSIOS -0xC575 0xD755 # HANGUL SYLLABLE HIEUH-EU-NIEUNCIEUC -0xC576 0xD75A # HANGUL SYLLABLE HIEUH-EU-RIEULMIEUM -0xC577 0xD75B # HANGUL SYLLABLE HIEUH-EU-RIEULPIEUP -0xC578 0xD75C # HANGUL SYLLABLE HIEUH-EU-RIEULSIOS -0xC579 0xD75D # HANGUL SYLLABLE HIEUH-EU-RIEULTHIEUTH -0xC57A 0xD75E # HANGUL SYLLABLE HIEUH-EU-RIEULPHIEUPH -0xC581 0xD75F # HANGUL SYLLABLE HIEUH-EU-RIEULHIEUH -0xC582 0xD762 # HANGUL SYLLABLE HIEUH-EU-PIEUPSIOS -0xC583 0xD764 # HANGUL SYLLABLE HIEUH-EU-SSANGSIOS -0xC584 0xD766 # HANGUL SYLLABLE HIEUH-EU-CIEUC -0xC585 0xD767 # HANGUL SYLLABLE HIEUH-EU-CHIEUCH -0xC586 0xD768 # HANGUL SYLLABLE HIEUH-EU-KHIEUKH -0xC587 0xD76A # HANGUL SYLLABLE HIEUH-EU-PHIEUPH -0xC588 0xD76B # HANGUL SYLLABLE HIEUH-EU-HIEUH -0xC589 0xD76D # HANGUL SYLLABLE HIEUH-YI-KIYEOK -0xC58A 0xD76E # HANGUL SYLLABLE HIEUH-YI-SSANGKIYEOK -0xC58B 0xD76F # HANGUL SYLLABLE HIEUH-YI-KIYEOKSIOS -0xC58C 0xD771 # HANGUL SYLLABLE HIEUH-YI-NIEUNCIEUC -0xC58D 0xD772 # HANGUL SYLLABLE HIEUH-YI-NIEUNHIEUH -0xC58E 0xD773 # HANGUL SYLLABLE HIEUH-YI-TIKEUT -0xC58F 0xD775 # HANGUL SYLLABLE HIEUH-YI-RIEULKIYEOK -0xC590 0xD776 # HANGUL SYLLABLE HIEUH-YI-RIEULMIEUM -0xC591 0xD777 # HANGUL SYLLABLE HIEUH-YI-RIEULPIEUP -0xC592 0xD778 # HANGUL SYLLABLE HIEUH-YI-RIEULSIOS -0xC593 0xD779 # HANGUL SYLLABLE HIEUH-YI-RIEULTHIEUTH -0xC594 0xD77A # HANGUL SYLLABLE HIEUH-YI-RIEULPHIEUPH -0xC595 0xD77B # HANGUL SYLLABLE HIEUH-YI-RIEULHIEUH -0xC596 0xD77E # HANGUL SYLLABLE HIEUH-YI-PIEUPSIOS -0xC597 0xD77F # HANGUL SYLLABLE HIEUH-YI-SIOS -0xC598 0xD780 # HANGUL SYLLABLE HIEUH-YI-SSANGSIOS -0xC599 0xD782 # HANGUL SYLLABLE HIEUH-YI-CIEUC -0xC59A 0xD783 # HANGUL SYLLABLE HIEUH-YI-CHIEUCH -0xC59B 0xD784 # HANGUL SYLLABLE HIEUH-YI-KHIEUKH -0xC59C 0xD785 # HANGUL SYLLABLE HIEUH-YI-THIEUTH -0xC59D 0xD786 # HANGUL SYLLABLE HIEUH-YI-PHIEUPH -0xC59E 0xD787 # HANGUL SYLLABLE HIEUH-YI-HIEUH -0xC59F 0xD78A # HANGUL SYLLABLE HIEUH-I-SSANGKIYEOK -0xC5A0 0xD78B # HANGUL SYLLABLE HIEUH-I-KIYEOKSIOS -0xC5A1 0xD044 # HANGUL SYLLABLE KHIEUKH-WI-MIEUM -0xC5A2 0xD045 # HANGUL SYLLABLE KHIEUKH-WI-PIEUP -0xC5A3 0xD047 # HANGUL SYLLABLE KHIEUKH-WI-SIOS -0xC5A4 0xD049 # HANGUL SYLLABLE KHIEUKH-WI-IEUNG -0xC5A5 0xD050 # HANGUL SYLLABLE KHIEUKH-YU -0xC5A6 0xD054 # HANGUL SYLLABLE KHIEUKH-YU-NIEUN -0xC5A7 0xD058 # HANGUL SYLLABLE KHIEUKH-YU-RIEUL -0xC5A8 0xD060 # HANGUL SYLLABLE KHIEUKH-YU-MIEUM -0xC5A9 0xD06C # HANGUL SYLLABLE KHIEUKH-EU -0xC5AA 0xD06D # HANGUL SYLLABLE KHIEUKH-EU-KIYEOK -0xC5AB 0xD070 # HANGUL SYLLABLE KHIEUKH-EU-NIEUN -0xC5AC 0xD074 # HANGUL SYLLABLE KHIEUKH-EU-RIEUL -0xC5AD 0xD07C # HANGUL SYLLABLE KHIEUKH-EU-MIEUM -0xC5AE 0xD07D # HANGUL SYLLABLE KHIEUKH-EU-PIEUP -0xC5AF 0xD081 # HANGUL SYLLABLE KHIEUKH-EU-IEUNG -0xC5B0 0xD0A4 # HANGUL SYLLABLE KHIEUKH-I -0xC5B1 0xD0A5 # HANGUL SYLLABLE KHIEUKH-I-KIYEOK -0xC5B2 0xD0A8 # HANGUL SYLLABLE KHIEUKH-I-NIEUN -0xC5B3 0xD0AC # HANGUL SYLLABLE KHIEUKH-I-RIEUL -0xC5B4 0xD0B4 # HANGUL SYLLABLE KHIEUKH-I-MIEUM -0xC5B5 0xD0B5 # HANGUL SYLLABLE KHIEUKH-I-PIEUP -0xC5B6 0xD0B7 # HANGUL SYLLABLE KHIEUKH-I-SIOS -0xC5B7 0xD0B9 # HANGUL SYLLABLE KHIEUKH-I-IEUNG -0xC5B8 0xD0C0 # HANGUL SYLLABLE THIEUTH-A -0xC5B9 0xD0C1 # HANGUL SYLLABLE THIEUTH-A-KIYEOK -0xC5BA 0xD0C4 # HANGUL SYLLABLE THIEUTH-A-NIEUN -0xC5BB 0xD0C8 # HANGUL SYLLABLE THIEUTH-A-RIEUL -0xC5BC 0xD0C9 # HANGUL SYLLABLE THIEUTH-A-RIEULKIYEOK -0xC5BD 0xD0D0 # HANGUL SYLLABLE THIEUTH-A-MIEUM -0xC5BE 0xD0D1 # HANGUL SYLLABLE THIEUTH-A-PIEUP -0xC5BF 0xD0D3 # HANGUL SYLLABLE THIEUTH-A-SIOS -0xC5C0 0xD0D4 # HANGUL SYLLABLE THIEUTH-A-SSANGSIOS -0xC5C1 0xD0D5 # HANGUL SYLLABLE THIEUTH-A-IEUNG -0xC5C2 0xD0DC # HANGUL SYLLABLE THIEUTH-AE -0xC5C3 0xD0DD # HANGUL SYLLABLE THIEUTH-AE-KIYEOK -0xC5C4 0xD0E0 # HANGUL SYLLABLE THIEUTH-AE-NIEUN -0xC5C5 0xD0E4 # HANGUL SYLLABLE THIEUTH-AE-RIEUL -0xC5C6 0xD0EC # HANGUL SYLLABLE THIEUTH-AE-MIEUM -0xC5C7 0xD0ED # HANGUL SYLLABLE THIEUTH-AE-PIEUP -0xC5C8 0xD0EF # HANGUL SYLLABLE THIEUTH-AE-SIOS -0xC5C9 0xD0F0 # HANGUL SYLLABLE THIEUTH-AE-SSANGSIOS -0xC5CA 0xD0F1 # HANGUL SYLLABLE THIEUTH-AE-IEUNG -0xC5CB 0xD0F8 # HANGUL SYLLABLE THIEUTH-YA -0xC5CC 0xD10D # HANGUL SYLLABLE THIEUTH-YA-IEUNG -0xC5CD 0xD130 # HANGUL SYLLABLE THIEUTH-EO -0xC5CE 0xD131 # HANGUL SYLLABLE THIEUTH-EO-KIYEOK -0xC5CF 0xD134 # HANGUL SYLLABLE THIEUTH-EO-NIEUN -0xC5D0 0xD138 # HANGUL SYLLABLE THIEUTH-EO-RIEUL -0xC5D1 0xD13A # HANGUL SYLLABLE THIEUTH-EO-RIEULMIEUM -0xC5D2 0xD140 # HANGUL SYLLABLE THIEUTH-EO-MIEUM -0xC5D3 0xD141 # HANGUL SYLLABLE THIEUTH-EO-PIEUP -0xC5D4 0xD143 # HANGUL SYLLABLE THIEUTH-EO-SIOS -0xC5D5 0xD144 # HANGUL SYLLABLE THIEUTH-EO-SSANGSIOS -0xC5D6 0xD145 # HANGUL SYLLABLE THIEUTH-EO-IEUNG -0xC5D7 0xD14C # HANGUL SYLLABLE THIEUTH-E -0xC5D8 0xD14D # HANGUL SYLLABLE THIEUTH-E-KIYEOK -0xC5D9 0xD150 # HANGUL SYLLABLE THIEUTH-E-NIEUN -0xC5DA 0xD154 # HANGUL SYLLABLE THIEUTH-E-RIEUL -0xC5DB 0xD15C # HANGUL SYLLABLE THIEUTH-E-MIEUM -0xC5DC 0xD15D # HANGUL SYLLABLE THIEUTH-E-PIEUP -0xC5DD 0xD15F # HANGUL SYLLABLE THIEUTH-E-SIOS -0xC5DE 0xD161 # HANGUL SYLLABLE THIEUTH-E-IEUNG -0xC5DF 0xD168 # HANGUL SYLLABLE THIEUTH-YEO -0xC5E0 0xD16C # HANGUL SYLLABLE THIEUTH-YEO-NIEUN -0xC5E1 0xD17C # HANGUL SYLLABLE THIEUTH-YEO-SSANGSIOS -0xC5E2 0xD184 # HANGUL SYLLABLE THIEUTH-YE -0xC5E3 0xD188 # HANGUL SYLLABLE THIEUTH-YE-NIEUN -0xC5E4 0xD1A0 # HANGUL SYLLABLE THIEUTH-O -0xC5E5 0xD1A1 # HANGUL SYLLABLE THIEUTH-O-KIYEOK -0xC5E6 0xD1A4 # HANGUL SYLLABLE THIEUTH-O-NIEUN -0xC5E7 0xD1A8 # HANGUL SYLLABLE THIEUTH-O-RIEUL -0xC5E8 0xD1B0 # HANGUL SYLLABLE THIEUTH-O-MIEUM -0xC5E9 0xD1B1 # HANGUL SYLLABLE THIEUTH-O-PIEUP -0xC5EA 0xD1B3 # HANGUL SYLLABLE THIEUTH-O-SIOS -0xC5EB 0xD1B5 # HANGUL SYLLABLE THIEUTH-O-IEUNG -0xC5EC 0xD1BA # HANGUL SYLLABLE THIEUTH-O-PHIEUPH -0xC5ED 0xD1BC # HANGUL SYLLABLE THIEUTH-WA -0xC5EE 0xD1C0 # HANGUL SYLLABLE THIEUTH-WA-NIEUN -0xC5EF 0xD1D8 # HANGUL SYLLABLE THIEUTH-WAE -0xC5F0 0xD1F4 # HANGUL SYLLABLE THIEUTH-OE -0xC5F1 0xD1F8 # HANGUL SYLLABLE THIEUTH-OE-NIEUN -0xC5F2 0xD207 # HANGUL SYLLABLE THIEUTH-OE-SIOS -0xC5F3 0xD209 # HANGUL SYLLABLE THIEUTH-OE-IEUNG -0xC5F4 0xD210 # HANGUL SYLLABLE THIEUTH-YO -0xC5F5 0xD22C # HANGUL SYLLABLE THIEUTH-U -0xC5F6 0xD22D # HANGUL SYLLABLE THIEUTH-U-KIYEOK -0xC5F7 0xD230 # HANGUL SYLLABLE THIEUTH-U-NIEUN -0xC5F8 0xD234 # HANGUL SYLLABLE THIEUTH-U-RIEUL -0xC5F9 0xD23C # HANGUL SYLLABLE THIEUTH-U-MIEUM -0xC5FA 0xD23D # HANGUL SYLLABLE THIEUTH-U-PIEUP -0xC5FB 0xD23F # HANGUL SYLLABLE THIEUTH-U-SIOS -0xC5FC 0xD241 # HANGUL SYLLABLE THIEUTH-U-IEUNG -0xC5FD 0xD248 # HANGUL SYLLABLE THIEUTH-WEO -0xC5FE 0xD25C # HANGUL SYLLABLE THIEUTH-WEO-SSANGSIOS -0xC641 0xD78D # HANGUL SYLLABLE HIEUH-I-NIEUNCIEUC -0xC642 0xD78E # HANGUL SYLLABLE HIEUH-I-NIEUNHIEUH -0xC643 0xD78F # HANGUL SYLLABLE HIEUH-I-TIKEUT -0xC644 0xD791 # HANGUL SYLLABLE HIEUH-I-RIEULKIYEOK -0xC645 0xD792 # HANGUL SYLLABLE HIEUH-I-RIEULMIEUM -0xC646 0xD793 # HANGUL SYLLABLE HIEUH-I-RIEULPIEUP -0xC647 0xD794 # HANGUL SYLLABLE HIEUH-I-RIEULSIOS -0xC648 0xD795 # HANGUL SYLLABLE HIEUH-I-RIEULTHIEUTH -0xC649 0xD796 # HANGUL SYLLABLE HIEUH-I-RIEULPHIEUPH -0xC64A 0xD797 # HANGUL SYLLABLE HIEUH-I-RIEULHIEUH -0xC64B 0xD79A # HANGUL SYLLABLE HIEUH-I-PIEUPSIOS -0xC64C 0xD79C # HANGUL SYLLABLE HIEUH-I-SSANGSIOS -0xC64D 0xD79E # HANGUL SYLLABLE HIEUH-I-CIEUC -0xC64E 0xD79F # HANGUL SYLLABLE HIEUH-I-CHIEUCH -0xC64F 0xD7A0 # HANGUL SYLLABLE HIEUH-I-KHIEUKH -0xC650 0xD7A1 # HANGUL SYLLABLE HIEUH-I-THIEUTH -0xC651 0xD7A2 # HANGUL SYLLABLE HIEUH-I-PHIEUPH -0xC652 0xD7A3 # HANGUL SYLLABLE HIEUH-I-HIEUH -0xC6A1 0xD264 # HANGUL SYLLABLE THIEUTH-WE -0xC6A2 0xD280 # HANGUL SYLLABLE THIEUTH-WI -0xC6A3 0xD281 # HANGUL SYLLABLE THIEUTH-WI-KIYEOK -0xC6A4 0xD284 # HANGUL SYLLABLE THIEUTH-WI-NIEUN -0xC6A5 0xD288 # HANGUL SYLLABLE THIEUTH-WI-RIEUL -0xC6A6 0xD290 # HANGUL SYLLABLE THIEUTH-WI-MIEUM -0xC6A7 0xD291 # HANGUL SYLLABLE THIEUTH-WI-PIEUP -0xC6A8 0xD295 # HANGUL SYLLABLE THIEUTH-WI-IEUNG -0xC6A9 0xD29C # HANGUL SYLLABLE THIEUTH-YU -0xC6AA 0xD2A0 # HANGUL SYLLABLE THIEUTH-YU-NIEUN -0xC6AB 0xD2A4 # HANGUL SYLLABLE THIEUTH-YU-RIEUL -0xC6AC 0xD2AC # HANGUL SYLLABLE THIEUTH-YU-MIEUM -0xC6AD 0xD2B1 # HANGUL SYLLABLE THIEUTH-YU-IEUNG -0xC6AE 0xD2B8 # HANGUL SYLLABLE THIEUTH-EU -0xC6AF 0xD2B9 # HANGUL SYLLABLE THIEUTH-EU-KIYEOK -0xC6B0 0xD2BC # HANGUL SYLLABLE THIEUTH-EU-NIEUN -0xC6B1 0xD2BF # HANGUL SYLLABLE THIEUTH-EU-TIKEUT -0xC6B2 0xD2C0 # HANGUL SYLLABLE THIEUTH-EU-RIEUL -0xC6B3 0xD2C2 # HANGUL SYLLABLE THIEUTH-EU-RIEULMIEUM -0xC6B4 0xD2C8 # HANGUL SYLLABLE THIEUTH-EU-MIEUM -0xC6B5 0xD2C9 # HANGUL SYLLABLE THIEUTH-EU-PIEUP -0xC6B6 0xD2CB # HANGUL SYLLABLE THIEUTH-EU-SIOS -0xC6B7 0xD2D4 # HANGUL SYLLABLE THIEUTH-YI -0xC6B8 0xD2D8 # HANGUL SYLLABLE THIEUTH-YI-NIEUN -0xC6B9 0xD2DC # HANGUL SYLLABLE THIEUTH-YI-RIEUL -0xC6BA 0xD2E4 # HANGUL SYLLABLE THIEUTH-YI-MIEUM -0xC6BB 0xD2E5 # HANGUL SYLLABLE THIEUTH-YI-PIEUP -0xC6BC 0xD2F0 # HANGUL SYLLABLE THIEUTH-I -0xC6BD 0xD2F1 # HANGUL SYLLABLE THIEUTH-I-KIYEOK -0xC6BE 0xD2F4 # HANGUL SYLLABLE THIEUTH-I-NIEUN -0xC6BF 0xD2F8 # HANGUL SYLLABLE THIEUTH-I-RIEUL -0xC6C0 0xD300 # HANGUL SYLLABLE THIEUTH-I-MIEUM -0xC6C1 0xD301 # HANGUL SYLLABLE THIEUTH-I-PIEUP -0xC6C2 0xD303 # HANGUL SYLLABLE THIEUTH-I-SIOS -0xC6C3 0xD305 # HANGUL SYLLABLE THIEUTH-I-IEUNG -0xC6C4 0xD30C # HANGUL SYLLABLE PHIEUPH-A -0xC6C5 0xD30D # HANGUL SYLLABLE PHIEUPH-A-KIYEOK -0xC6C6 0xD30E # HANGUL SYLLABLE PHIEUPH-A-SSANGKIYEOK -0xC6C7 0xD310 # HANGUL SYLLABLE PHIEUPH-A-NIEUN -0xC6C8 0xD314 # HANGUL SYLLABLE PHIEUPH-A-RIEUL -0xC6C9 0xD316 # HANGUL SYLLABLE PHIEUPH-A-RIEULMIEUM -0xC6CA 0xD31C # HANGUL SYLLABLE PHIEUPH-A-MIEUM -0xC6CB 0xD31D # HANGUL SYLLABLE PHIEUPH-A-PIEUP -0xC6CC 0xD31F # HANGUL SYLLABLE PHIEUPH-A-SIOS -0xC6CD 0xD320 # HANGUL SYLLABLE PHIEUPH-A-SSANGSIOS -0xC6CE 0xD321 # HANGUL SYLLABLE PHIEUPH-A-IEUNG -0xC6CF 0xD325 # HANGUL SYLLABLE PHIEUPH-A-THIEUTH -0xC6D0 0xD328 # HANGUL SYLLABLE PHIEUPH-AE -0xC6D1 0xD329 # HANGUL SYLLABLE PHIEUPH-AE-KIYEOK -0xC6D2 0xD32C # HANGUL SYLLABLE PHIEUPH-AE-NIEUN -0xC6D3 0xD330 # HANGUL SYLLABLE PHIEUPH-AE-RIEUL -0xC6D4 0xD338 # HANGUL SYLLABLE PHIEUPH-AE-MIEUM -0xC6D5 0xD339 # HANGUL SYLLABLE PHIEUPH-AE-PIEUP -0xC6D6 0xD33B # HANGUL SYLLABLE PHIEUPH-AE-SIOS -0xC6D7 0xD33C # HANGUL SYLLABLE PHIEUPH-AE-SSANGSIOS -0xC6D8 0xD33D # HANGUL SYLLABLE PHIEUPH-AE-IEUNG -0xC6D9 0xD344 # HANGUL SYLLABLE PHIEUPH-YA -0xC6DA 0xD345 # HANGUL SYLLABLE PHIEUPH-YA-KIYEOK -0xC6DB 0xD37C # HANGUL SYLLABLE PHIEUPH-EO -0xC6DC 0xD37D # HANGUL SYLLABLE PHIEUPH-EO-KIYEOK -0xC6DD 0xD380 # HANGUL SYLLABLE PHIEUPH-EO-NIEUN -0xC6DE 0xD384 # HANGUL SYLLABLE PHIEUPH-EO-RIEUL -0xC6DF 0xD38C # HANGUL SYLLABLE PHIEUPH-EO-MIEUM -0xC6E0 0xD38D # HANGUL SYLLABLE PHIEUPH-EO-PIEUP -0xC6E1 0xD38F # HANGUL SYLLABLE PHIEUPH-EO-SIOS -0xC6E2 0xD390 # HANGUL SYLLABLE PHIEUPH-EO-SSANGSIOS -0xC6E3 0xD391 # HANGUL SYLLABLE PHIEUPH-EO-IEUNG -0xC6E4 0xD398 # HANGUL SYLLABLE PHIEUPH-E -0xC6E5 0xD399 # HANGUL SYLLABLE PHIEUPH-E-KIYEOK -0xC6E6 0xD39C # HANGUL SYLLABLE PHIEUPH-E-NIEUN -0xC6E7 0xD3A0 # HANGUL SYLLABLE PHIEUPH-E-RIEUL -0xC6E8 0xD3A8 # HANGUL SYLLABLE PHIEUPH-E-MIEUM -0xC6E9 0xD3A9 # HANGUL SYLLABLE PHIEUPH-E-PIEUP -0xC6EA 0xD3AB # HANGUL SYLLABLE PHIEUPH-E-SIOS -0xC6EB 0xD3AD # HANGUL SYLLABLE PHIEUPH-E-IEUNG -0xC6EC 0xD3B4 # HANGUL SYLLABLE PHIEUPH-YEO -0xC6ED 0xD3B8 # HANGUL SYLLABLE PHIEUPH-YEO-NIEUN -0xC6EE 0xD3BC # HANGUL SYLLABLE PHIEUPH-YEO-RIEUL -0xC6EF 0xD3C4 # HANGUL SYLLABLE PHIEUPH-YEO-MIEUM -0xC6F0 0xD3C5 # HANGUL SYLLABLE PHIEUPH-YEO-PIEUP -0xC6F1 0xD3C8 # HANGUL SYLLABLE PHIEUPH-YEO-SSANGSIOS -0xC6F2 0xD3C9 # HANGUL SYLLABLE PHIEUPH-YEO-IEUNG -0xC6F3 0xD3D0 # HANGUL SYLLABLE PHIEUPH-YE -0xC6F4 0xD3D8 # HANGUL SYLLABLE PHIEUPH-YE-RIEUL -0xC6F5 0xD3E1 # HANGUL SYLLABLE PHIEUPH-YE-PIEUP -0xC6F6 0xD3E3 # HANGUL SYLLABLE PHIEUPH-YE-SIOS -0xC6F7 0xD3EC # HANGUL SYLLABLE PHIEUPH-O -0xC6F8 0xD3ED # HANGUL SYLLABLE PHIEUPH-O-KIYEOK -0xC6F9 0xD3F0 # HANGUL SYLLABLE PHIEUPH-O-NIEUN -0xC6FA 0xD3F4 # HANGUL SYLLABLE PHIEUPH-O-RIEUL -0xC6FB 0xD3FC # HANGUL SYLLABLE PHIEUPH-O-MIEUM -0xC6FC 0xD3FD # HANGUL SYLLABLE PHIEUPH-O-PIEUP -0xC6FD 0xD3FF # HANGUL SYLLABLE PHIEUPH-O-SIOS -0xC6FE 0xD401 # HANGUL SYLLABLE PHIEUPH-O-IEUNG -0xC7A1 0xD408 # HANGUL SYLLABLE PHIEUPH-WA -0xC7A2 0xD41D # HANGUL SYLLABLE PHIEUPH-WA-IEUNG -0xC7A3 0xD440 # HANGUL SYLLABLE PHIEUPH-OE -0xC7A4 0xD444 # HANGUL SYLLABLE PHIEUPH-OE-NIEUN -0xC7A5 0xD45C # HANGUL SYLLABLE PHIEUPH-YO -0xC7A6 0xD460 # HANGUL SYLLABLE PHIEUPH-YO-NIEUN -0xC7A7 0xD464 # HANGUL SYLLABLE PHIEUPH-YO-RIEUL -0xC7A8 0xD46D # HANGUL SYLLABLE PHIEUPH-YO-PIEUP -0xC7A9 0xD46F # HANGUL SYLLABLE PHIEUPH-YO-SIOS -0xC7AA 0xD478 # HANGUL SYLLABLE PHIEUPH-U -0xC7AB 0xD479 # HANGUL SYLLABLE PHIEUPH-U-KIYEOK -0xC7AC 0xD47C # HANGUL SYLLABLE PHIEUPH-U-NIEUN -0xC7AD 0xD47F # HANGUL SYLLABLE PHIEUPH-U-TIKEUT -0xC7AE 0xD480 # HANGUL SYLLABLE PHIEUPH-U-RIEUL -0xC7AF 0xD482 # HANGUL SYLLABLE PHIEUPH-U-RIEULMIEUM -0xC7B0 0xD488 # HANGUL SYLLABLE PHIEUPH-U-MIEUM -0xC7B1 0xD489 # HANGUL SYLLABLE PHIEUPH-U-PIEUP -0xC7B2 0xD48B # HANGUL SYLLABLE PHIEUPH-U-SIOS -0xC7B3 0xD48D # HANGUL SYLLABLE PHIEUPH-U-IEUNG -0xC7B4 0xD494 # HANGUL SYLLABLE PHIEUPH-WEO -0xC7B5 0xD4A9 # HANGUL SYLLABLE PHIEUPH-WEO-IEUNG -0xC7B6 0xD4CC # HANGUL SYLLABLE PHIEUPH-WI -0xC7B7 0xD4D0 # HANGUL SYLLABLE PHIEUPH-WI-NIEUN -0xC7B8 0xD4D4 # HANGUL SYLLABLE PHIEUPH-WI-RIEUL -0xC7B9 0xD4DC # HANGUL SYLLABLE PHIEUPH-WI-MIEUM -0xC7BA 0xD4DF # HANGUL SYLLABLE PHIEUPH-WI-SIOS -0xC7BB 0xD4E8 # HANGUL SYLLABLE PHIEUPH-YU -0xC7BC 0xD4EC # HANGUL SYLLABLE PHIEUPH-YU-NIEUN -0xC7BD 0xD4F0 # HANGUL SYLLABLE PHIEUPH-YU-RIEUL -0xC7BE 0xD4F8 # HANGUL SYLLABLE PHIEUPH-YU-MIEUM -0xC7BF 0xD4FB # HANGUL SYLLABLE PHIEUPH-YU-SIOS -0xC7C0 0xD4FD # HANGUL SYLLABLE PHIEUPH-YU-IEUNG -0xC7C1 0xD504 # HANGUL SYLLABLE PHIEUPH-EU -0xC7C2 0xD508 # HANGUL SYLLABLE PHIEUPH-EU-NIEUN -0xC7C3 0xD50C # HANGUL SYLLABLE PHIEUPH-EU-RIEUL -0xC7C4 0xD514 # HANGUL SYLLABLE PHIEUPH-EU-MIEUM -0xC7C5 0xD515 # HANGUL SYLLABLE PHIEUPH-EU-PIEUP -0xC7C6 0xD517 # HANGUL SYLLABLE PHIEUPH-EU-SIOS -0xC7C7 0xD53C # HANGUL SYLLABLE PHIEUPH-I -0xC7C8 0xD53D # HANGUL SYLLABLE PHIEUPH-I-KIYEOK -0xC7C9 0xD540 # HANGUL SYLLABLE PHIEUPH-I-NIEUN -0xC7CA 0xD544 # HANGUL SYLLABLE PHIEUPH-I-RIEUL -0xC7CB 0xD54C # HANGUL SYLLABLE PHIEUPH-I-MIEUM -0xC7CC 0xD54D # HANGUL SYLLABLE PHIEUPH-I-PIEUP -0xC7CD 0xD54F # HANGUL SYLLABLE PHIEUPH-I-SIOS -0xC7CE 0xD551 # HANGUL SYLLABLE PHIEUPH-I-IEUNG -0xC7CF 0xD558 # HANGUL SYLLABLE HIEUH-A -0xC7D0 0xD559 # HANGUL SYLLABLE HIEUH-A-KIYEOK -0xC7D1 0xD55C # HANGUL SYLLABLE HIEUH-A-NIEUN -0xC7D2 0xD560 # HANGUL SYLLABLE HIEUH-A-RIEUL -0xC7D3 0xD565 # HANGUL SYLLABLE HIEUH-A-RIEULTHIEUTH -0xC7D4 0xD568 # HANGUL SYLLABLE HIEUH-A-MIEUM -0xC7D5 0xD569 # HANGUL SYLLABLE HIEUH-A-PIEUP -0xC7D6 0xD56B # HANGUL SYLLABLE HIEUH-A-SIOS -0xC7D7 0xD56D # HANGUL SYLLABLE HIEUH-A-IEUNG -0xC7D8 0xD574 # HANGUL SYLLABLE HIEUH-AE -0xC7D9 0xD575 # HANGUL SYLLABLE HIEUH-AE-KIYEOK -0xC7DA 0xD578 # HANGUL SYLLABLE HIEUH-AE-NIEUN -0xC7DB 0xD57C # HANGUL SYLLABLE HIEUH-AE-RIEUL -0xC7DC 0xD584 # HANGUL SYLLABLE HIEUH-AE-MIEUM -0xC7DD 0xD585 # HANGUL SYLLABLE HIEUH-AE-PIEUP -0xC7DE 0xD587 # HANGUL SYLLABLE HIEUH-AE-SIOS -0xC7DF 0xD588 # HANGUL SYLLABLE HIEUH-AE-SSANGSIOS -0xC7E0 0xD589 # HANGUL SYLLABLE HIEUH-AE-IEUNG -0xC7E1 0xD590 # HANGUL SYLLABLE HIEUH-YA -0xC7E2 0xD5A5 # HANGUL SYLLABLE HIEUH-YA-IEUNG -0xC7E3 0xD5C8 # HANGUL SYLLABLE HIEUH-EO -0xC7E4 0xD5C9 # HANGUL SYLLABLE HIEUH-EO-KIYEOK -0xC7E5 0xD5CC # HANGUL SYLLABLE HIEUH-EO-NIEUN -0xC7E6 0xD5D0 # HANGUL SYLLABLE HIEUH-EO-RIEUL -0xC7E7 0xD5D2 # HANGUL SYLLABLE HIEUH-EO-RIEULMIEUM -0xC7E8 0xD5D8 # HANGUL SYLLABLE HIEUH-EO-MIEUM -0xC7E9 0xD5D9 # HANGUL SYLLABLE HIEUH-EO-PIEUP -0xC7EA 0xD5DB # HANGUL SYLLABLE HIEUH-EO-SIOS -0xC7EB 0xD5DD # HANGUL SYLLABLE HIEUH-EO-IEUNG -0xC7EC 0xD5E4 # HANGUL SYLLABLE HIEUH-E -0xC7ED 0xD5E5 # HANGUL SYLLABLE HIEUH-E-KIYEOK -0xC7EE 0xD5E8 # HANGUL SYLLABLE HIEUH-E-NIEUN -0xC7EF 0xD5EC # HANGUL SYLLABLE HIEUH-E-RIEUL -0xC7F0 0xD5F4 # HANGUL SYLLABLE HIEUH-E-MIEUM -0xC7F1 0xD5F5 # HANGUL SYLLABLE HIEUH-E-PIEUP -0xC7F2 0xD5F7 # HANGUL SYLLABLE HIEUH-E-SIOS -0xC7F3 0xD5F9 # HANGUL SYLLABLE HIEUH-E-IEUNG -0xC7F4 0xD600 # HANGUL SYLLABLE HIEUH-YEO -0xC7F5 0xD601 # HANGUL SYLLABLE HIEUH-YEO-KIYEOK -0xC7F6 0xD604 # HANGUL SYLLABLE HIEUH-YEO-NIEUN -0xC7F7 0xD608 # HANGUL SYLLABLE HIEUH-YEO-RIEUL -0xC7F8 0xD610 # HANGUL SYLLABLE HIEUH-YEO-MIEUM -0xC7F9 0xD611 # HANGUL SYLLABLE HIEUH-YEO-PIEUP -0xC7FA 0xD613 # HANGUL SYLLABLE HIEUH-YEO-SIOS -0xC7FB 0xD614 # HANGUL SYLLABLE HIEUH-YEO-SSANGSIOS -0xC7FC 0xD615 # HANGUL SYLLABLE HIEUH-YEO-IEUNG -0xC7FD 0xD61C # HANGUL SYLLABLE HIEUH-YE -0xC7FE 0xD620 # HANGUL SYLLABLE HIEUH-YE-NIEUN -0xC8A1 0xD624 # HANGUL SYLLABLE HIEUH-YE-RIEUL -0xC8A2 0xD62D # HANGUL SYLLABLE HIEUH-YE-PIEUP -0xC8A3 0xD638 # HANGUL SYLLABLE HIEUH-O -0xC8A4 0xD639 # HANGUL SYLLABLE HIEUH-O-KIYEOK -0xC8A5 0xD63C # HANGUL SYLLABLE HIEUH-O-NIEUN -0xC8A6 0xD640 # HANGUL SYLLABLE HIEUH-O-RIEUL -0xC8A7 0xD645 # HANGUL SYLLABLE HIEUH-O-RIEULTHIEUTH -0xC8A8 0xD648 # HANGUL SYLLABLE HIEUH-O-MIEUM -0xC8A9 0xD649 # HANGUL SYLLABLE HIEUH-O-PIEUP -0xC8AA 0xD64B # HANGUL SYLLABLE HIEUH-O-SIOS -0xC8AB 0xD64D # HANGUL SYLLABLE HIEUH-O-IEUNG -0xC8AC 0xD651 # HANGUL SYLLABLE HIEUH-O-THIEUTH -0xC8AD 0xD654 # HANGUL SYLLABLE HIEUH-WA -0xC8AE 0xD655 # HANGUL SYLLABLE HIEUH-WA-KIYEOK -0xC8AF 0xD658 # HANGUL SYLLABLE HIEUH-WA-NIEUN -0xC8B0 0xD65C # HANGUL SYLLABLE HIEUH-WA-RIEUL -0xC8B1 0xD667 # HANGUL SYLLABLE HIEUH-WA-SIOS -0xC8B2 0xD669 # HANGUL SYLLABLE HIEUH-WA-IEUNG -0xC8B3 0xD670 # HANGUL SYLLABLE HIEUH-WAE -0xC8B4 0xD671 # HANGUL SYLLABLE HIEUH-WAE-KIYEOK -0xC8B5 0xD674 # HANGUL SYLLABLE HIEUH-WAE-NIEUN -0xC8B6 0xD683 # HANGUL SYLLABLE HIEUH-WAE-SIOS -0xC8B7 0xD685 # HANGUL SYLLABLE HIEUH-WAE-IEUNG -0xC8B8 0xD68C # HANGUL SYLLABLE HIEUH-OE -0xC8B9 0xD68D # HANGUL SYLLABLE HIEUH-OE-KIYEOK -0xC8BA 0xD690 # HANGUL SYLLABLE HIEUH-OE-NIEUN -0xC8BB 0xD694 # HANGUL SYLLABLE HIEUH-OE-RIEUL -0xC8BC 0xD69D # HANGUL SYLLABLE HIEUH-OE-PIEUP -0xC8BD 0xD69F # HANGUL SYLLABLE HIEUH-OE-SIOS -0xC8BE 0xD6A1 # HANGUL SYLLABLE HIEUH-OE-IEUNG -0xC8BF 0xD6A8 # HANGUL SYLLABLE HIEUH-YO -0xC8C0 0xD6AC # HANGUL SYLLABLE HIEUH-YO-NIEUN -0xC8C1 0xD6B0 # HANGUL SYLLABLE HIEUH-YO-RIEUL -0xC8C2 0xD6B9 # HANGUL SYLLABLE HIEUH-YO-PIEUP -0xC8C3 0xD6BB # HANGUL SYLLABLE HIEUH-YO-SIOS -0xC8C4 0xD6C4 # HANGUL SYLLABLE HIEUH-U -0xC8C5 0xD6C5 # HANGUL SYLLABLE HIEUH-U-KIYEOK -0xC8C6 0xD6C8 # HANGUL SYLLABLE HIEUH-U-NIEUN -0xC8C7 0xD6CC # HANGUL SYLLABLE HIEUH-U-RIEUL -0xC8C8 0xD6D1 # HANGUL SYLLABLE HIEUH-U-RIEULTHIEUTH -0xC8C9 0xD6D4 # HANGUL SYLLABLE HIEUH-U-MIEUM -0xC8CA 0xD6D7 # HANGUL SYLLABLE HIEUH-U-SIOS -0xC8CB 0xD6D9 # HANGUL SYLLABLE HIEUH-U-IEUNG -0xC8CC 0xD6E0 # HANGUL SYLLABLE HIEUH-WEO -0xC8CD 0xD6E4 # HANGUL SYLLABLE HIEUH-WEO-NIEUN -0xC8CE 0xD6E8 # HANGUL SYLLABLE HIEUH-WEO-RIEUL -0xC8CF 0xD6F0 # HANGUL SYLLABLE HIEUH-WEO-MIEUM -0xC8D0 0xD6F5 # HANGUL SYLLABLE HIEUH-WEO-IEUNG -0xC8D1 0xD6FC # HANGUL SYLLABLE HIEUH-WE -0xC8D2 0xD6FD # HANGUL SYLLABLE HIEUH-WE-KIYEOK -0xC8D3 0xD700 # HANGUL SYLLABLE HIEUH-WE-NIEUN -0xC8D4 0xD704 # HANGUL SYLLABLE HIEUH-WE-RIEUL -0xC8D5 0xD711 # HANGUL SYLLABLE HIEUH-WE-IEUNG -0xC8D6 0xD718 # HANGUL SYLLABLE HIEUH-WI -0xC8D7 0xD719 # HANGUL SYLLABLE HIEUH-WI-KIYEOK -0xC8D8 0xD71C # HANGUL SYLLABLE HIEUH-WI-NIEUN -0xC8D9 0xD720 # HANGUL SYLLABLE HIEUH-WI-RIEUL -0xC8DA 0xD728 # HANGUL SYLLABLE HIEUH-WI-MIEUM -0xC8DB 0xD729 # HANGUL SYLLABLE HIEUH-WI-PIEUP -0xC8DC 0xD72B # HANGUL SYLLABLE HIEUH-WI-SIOS -0xC8DD 0xD72D # HANGUL SYLLABLE HIEUH-WI-IEUNG -0xC8DE 0xD734 # HANGUL SYLLABLE HIEUH-YU -0xC8DF 0xD735 # HANGUL SYLLABLE HIEUH-YU-KIYEOK -0xC8E0 0xD738 # HANGUL SYLLABLE HIEUH-YU-NIEUN -0xC8E1 0xD73C # HANGUL SYLLABLE HIEUH-YU-RIEUL -0xC8E2 0xD744 # HANGUL SYLLABLE HIEUH-YU-MIEUM -0xC8E3 0xD747 # HANGUL SYLLABLE HIEUH-YU-SIOS -0xC8E4 0xD749 # HANGUL SYLLABLE HIEUH-YU-IEUNG -0xC8E5 0xD750 # HANGUL SYLLABLE HIEUH-EU -0xC8E6 0xD751 # HANGUL SYLLABLE HIEUH-EU-KIYEOK -0xC8E7 0xD754 # HANGUL SYLLABLE HIEUH-EU-NIEUN -0xC8E8 0xD756 # HANGUL SYLLABLE HIEUH-EU-NIEUNHIEUH -0xC8E9 0xD757 # HANGUL SYLLABLE HIEUH-EU-TIKEUT -0xC8EA 0xD758 # HANGUL SYLLABLE HIEUH-EU-RIEUL -0xC8EB 0xD759 # HANGUL SYLLABLE HIEUH-EU-RIEULKIYEOK -0xC8EC 0xD760 # HANGUL SYLLABLE HIEUH-EU-MIEUM -0xC8ED 0xD761 # HANGUL SYLLABLE HIEUH-EU-PIEUP -0xC8EE 0xD763 # HANGUL SYLLABLE HIEUH-EU-SIOS -0xC8EF 0xD765 # HANGUL SYLLABLE HIEUH-EU-IEUNG -0xC8F0 0xD769 # HANGUL SYLLABLE HIEUH-EU-THIEUTH -0xC8F1 0xD76C # HANGUL SYLLABLE HIEUH-YI -0xC8F2 0xD770 # HANGUL SYLLABLE HIEUH-YI-NIEUN -0xC8F3 0xD774 # HANGUL SYLLABLE HIEUH-YI-RIEUL -0xC8F4 0xD77C # HANGUL SYLLABLE HIEUH-YI-MIEUM -0xC8F5 0xD77D # HANGUL SYLLABLE HIEUH-YI-PIEUP -0xC8F6 0xD781 # HANGUL SYLLABLE HIEUH-YI-IEUNG -0xC8F7 0xD788 # HANGUL SYLLABLE HIEUH-I -0xC8F8 0xD789 # HANGUL SYLLABLE HIEUH-I-KIYEOK -0xC8F9 0xD78C # HANGUL SYLLABLE HIEUH-I-NIEUN -0xC8FA 0xD790 # HANGUL SYLLABLE HIEUH-I-RIEUL -0xC8FB 0xD798 # HANGUL SYLLABLE HIEUH-I-MIEUM -0xC8FC 0xD799 # HANGUL SYLLABLE HIEUH-I-PIEUP -0xC8FD 0xD79B # HANGUL SYLLABLE HIEUH-I-SIOS -0xC8FE 0xD79D # HANGUL SYLLABLE HIEUH-I-IEUNG -0xCAA1 0x4F3D # -0xCAA2 0x4F73 # -0xCAA3 0x5047 # -0xCAA4 0x50F9 # -0xCAA5 0x52A0 # -0xCAA6 0x53EF # -0xCAA7 0x5475 # -0xCAA8 0x54E5 # -0xCAA9 0x5609 # -0xCAAA 0x5AC1 # -0xCAAB 0x5BB6 # -0xCAAC 0x6687 # -0xCAAD 0x67B6 # -0xCAAE 0x67B7 # -0xCAAF 0x67EF # -0xCAB0 0x6B4C # -0xCAB1 0x73C2 # -0xCAB2 0x75C2 # -0xCAB3 0x7A3C # -0xCAB4 0x82DB # -0xCAB5 0x8304 # -0xCAB6 0x8857 # -0xCAB7 0x8888 # -0xCAB8 0x8A36 # -0xCAB9 0x8CC8 # -0xCABA 0x8DCF # -0xCABB 0x8EFB # -0xCABC 0x8FE6 # -0xCABD 0x99D5 # -0xCABE 0x523B # -0xCABF 0x5374 # -0xCAC0 0x5404 # -0xCAC1 0x606A # -0xCAC2 0x6164 # -0xCAC3 0x6BBC # -0xCAC4 0x73CF # -0xCAC5 0x811A # -0xCAC6 0x89BA # -0xCAC7 0x89D2 # -0xCAC8 0x95A3 # -0xCAC9 0x4F83 # -0xCACA 0x520A # -0xCACB 0x58BE # -0xCACC 0x5978 # -0xCACD 0x59E6 # -0xCACE 0x5E72 # -0xCACF 0x5E79 # -0xCAD0 0x61C7 # -0xCAD1 0x63C0 # -0xCAD2 0x6746 # -0xCAD3 0x67EC # -0xCAD4 0x687F # -0xCAD5 0x6F97 # -0xCAD6 0x764E # -0xCAD7 0x770B # -0xCAD8 0x78F5 # -0xCAD9 0x7A08 # -0xCADA 0x7AFF # -0xCADB 0x7C21 # -0xCADC 0x809D # -0xCADD 0x826E # -0xCADE 0x8271 # -0xCADF 0x8AEB # -0xCAE0 0x9593 # -0xCAE1 0x4E6B # -0xCAE2 0x559D # -0xCAE3 0x66F7 # -0xCAE4 0x6E34 # -0xCAE5 0x78A3 # -0xCAE6 0x7AED # -0xCAE7 0x845B # -0xCAE8 0x8910 # -0xCAE9 0x874E # -0xCAEA 0x97A8 # -0xCAEB 0x52D8 # -0xCAEC 0x574E # -0xCAED 0x582A # -0xCAEE 0x5D4C # -0xCAEF 0x611F # -0xCAF0 0x61BE # -0xCAF1 0x6221 # -0xCAF2 0x6562 # -0xCAF3 0x67D1 # -0xCAF4 0x6A44 # -0xCAF5 0x6E1B # -0xCAF6 0x7518 # -0xCAF7 0x75B3 # -0xCAF8 0x76E3 # -0xCAF9 0x77B0 # -0xCAFA 0x7D3A # -0xCAFB 0x90AF # -0xCAFC 0x9451 # -0xCAFD 0x9452 # -0xCAFE 0x9F95 # -0xCBA1 0x5323 # -0xCBA2 0x5CAC # -0xCBA3 0x7532 # -0xCBA4 0x80DB # -0xCBA5 0x9240 # -0xCBA6 0x9598 # -0xCBA7 0x525B # -0xCBA8 0x5808 # -0xCBA9 0x59DC # -0xCBAA 0x5CA1 # -0xCBAB 0x5D17 # -0xCBAC 0x5EB7 # -0xCBAD 0x5F3A # -0xCBAE 0x5F4A # -0xCBAF 0x6177 # -0xCBB0 0x6C5F # -0xCBB1 0x757A # -0xCBB2 0x7586 # -0xCBB3 0x7CE0 # -0xCBB4 0x7D73 # -0xCBB5 0x7DB1 # -0xCBB6 0x7F8C # -0xCBB7 0x8154 # -0xCBB8 0x8221 # -0xCBB9 0x8591 # -0xCBBA 0x8941 # -0xCBBB 0x8B1B # -0xCBBC 0x92FC # -0xCBBD 0x964D # -0xCBBE 0x9C47 # -0xCBBF 0x4ECB # -0xCBC0 0x4EF7 # -0xCBC1 0x500B # -0xCBC2 0x51F1 # -0xCBC3 0x584F # -0xCBC4 0x6137 # -0xCBC5 0x613E # -0xCBC6 0x6168 # -0xCBC7 0x6539 # -0xCBC8 0x69EA # -0xCBC9 0x6F11 # -0xCBCA 0x75A5 # -0xCBCB 0x7686 # -0xCBCC 0x76D6 # -0xCBCD 0x7B87 # -0xCBCE 0x82A5 # -0xCBCF 0x84CB # -0xCBD0 0xF900 # -0xCBD1 0x93A7 # -0xCBD2 0x958B # -0xCBD3 0x5580 # -0xCBD4 0x5BA2 # -0xCBD5 0x5751 # -0xCBD6 0xF901 # -0xCBD7 0x7CB3 # -0xCBD8 0x7FB9 # -0xCBD9 0x91B5 # -0xCBDA 0x5028 # -0xCBDB 0x53BB # -0xCBDC 0x5C45 # -0xCBDD 0x5DE8 # -0xCBDE 0x62D2 # -0xCBDF 0x636E # -0xCBE0 0x64DA # -0xCBE1 0x64E7 # -0xCBE2 0x6E20 # -0xCBE3 0x70AC # -0xCBE4 0x795B # -0xCBE5 0x8DDD # -0xCBE6 0x8E1E # -0xCBE7 0xF902 # -0xCBE8 0x907D # -0xCBE9 0x9245 # -0xCBEA 0x92F8 # -0xCBEB 0x4E7E # -0xCBEC 0x4EF6 # -0xCBED 0x5065 # -0xCBEE 0x5DFE # -0xCBEF 0x5EFA # -0xCBF0 0x6106 # -0xCBF1 0x6957 # -0xCBF2 0x8171 # -0xCBF3 0x8654 # -0xCBF4 0x8E47 # -0xCBF5 0x9375 # -0xCBF6 0x9A2B # -0xCBF7 0x4E5E # -0xCBF8 0x5091 # -0xCBF9 0x6770 # -0xCBFA 0x6840 # -0xCBFB 0x5109 # -0xCBFC 0x528D # -0xCBFD 0x5292 # -0xCBFE 0x6AA2 # -0xCCA1 0x77BC # -0xCCA2 0x9210 # -0xCCA3 0x9ED4 # -0xCCA4 0x52AB # -0xCCA5 0x602F # -0xCCA6 0x8FF2 # -0xCCA7 0x5048 # -0xCCA8 0x61A9 # -0xCCA9 0x63ED # -0xCCAA 0x64CA # -0xCCAB 0x683C # -0xCCAC 0x6A84 # -0xCCAD 0x6FC0 # -0xCCAE 0x8188 # -0xCCAF 0x89A1 # -0xCCB0 0x9694 # -0xCCB1 0x5805 # -0xCCB2 0x727D # -0xCCB3 0x72AC # -0xCCB4 0x7504 # -0xCCB5 0x7D79 # -0xCCB6 0x7E6D # -0xCCB7 0x80A9 # -0xCCB8 0x898B # -0xCCB9 0x8B74 # -0xCCBA 0x9063 # -0xCCBB 0x9D51 # -0xCCBC 0x6289 # -0xCCBD 0x6C7A # -0xCCBE 0x6F54 # -0xCCBF 0x7D50 # -0xCCC0 0x7F3A # -0xCCC1 0x8A23 # -0xCCC2 0x517C # -0xCCC3 0x614A # -0xCCC4 0x7B9D # -0xCCC5 0x8B19 # -0xCCC6 0x9257 # -0xCCC7 0x938C # -0xCCC8 0x4EAC # -0xCCC9 0x4FD3 # -0xCCCA 0x501E # -0xCCCB 0x50BE # -0xCCCC 0x5106 # -0xCCCD 0x52C1 # -0xCCCE 0x52CD # -0xCCCF 0x537F # -0xCCD0 0x5770 # -0xCCD1 0x5883 # -0xCCD2 0x5E9A # -0xCCD3 0x5F91 # -0xCCD4 0x6176 # -0xCCD5 0x61AC # -0xCCD6 0x64CE # -0xCCD7 0x656C # -0xCCD8 0x666F # -0xCCD9 0x66BB # -0xCCDA 0x66F4 # -0xCCDB 0x6897 # -0xCCDC 0x6D87 # -0xCCDD 0x7085 # -0xCCDE 0x70F1 # -0xCCDF 0x749F # -0xCCE0 0x74A5 # -0xCCE1 0x74CA # -0xCCE2 0x75D9 # -0xCCE3 0x786C # -0xCCE4 0x78EC # -0xCCE5 0x7ADF # -0xCCE6 0x7AF6 # -0xCCE7 0x7D45 # -0xCCE8 0x7D93 # -0xCCE9 0x8015 # -0xCCEA 0x803F # -0xCCEB 0x811B # -0xCCEC 0x8396 # -0xCCED 0x8B66 # -0xCCEE 0x8F15 # -0xCCEF 0x9015 # -0xCCF0 0x93E1 # -0xCCF1 0x9803 # -0xCCF2 0x9838 # -0xCCF3 0x9A5A # -0xCCF4 0x9BE8 # -0xCCF5 0x4FC2 # -0xCCF6 0x5553 # -0xCCF7 0x583A # -0xCCF8 0x5951 # -0xCCF9 0x5B63 # -0xCCFA 0x5C46 # -0xCCFB 0x60B8 # -0xCCFC 0x6212 # -0xCCFD 0x6842 # -0xCCFE 0x68B0 # -0xCDA1 0x68E8 # -0xCDA2 0x6EAA # -0xCDA3 0x754C # -0xCDA4 0x7678 # -0xCDA5 0x78CE # -0xCDA6 0x7A3D # -0xCDA7 0x7CFB # -0xCDA8 0x7E6B # -0xCDA9 0x7E7C # -0xCDAA 0x8A08 # -0xCDAB 0x8AA1 # -0xCDAC 0x8C3F # -0xCDAD 0x968E # -0xCDAE 0x9DC4 # -0xCDAF 0x53E4 # -0xCDB0 0x53E9 # -0xCDB1 0x544A # -0xCDB2 0x5471 # -0xCDB3 0x56FA # -0xCDB4 0x59D1 # -0xCDB5 0x5B64 # -0xCDB6 0x5C3B # -0xCDB7 0x5EAB # -0xCDB8 0x62F7 # -0xCDB9 0x6537 # -0xCDBA 0x6545 # -0xCDBB 0x6572 # -0xCDBC 0x66A0 # -0xCDBD 0x67AF # -0xCDBE 0x69C1 # -0xCDBF 0x6CBD # -0xCDC0 0x75FC # -0xCDC1 0x7690 # -0xCDC2 0x777E # -0xCDC3 0x7A3F # -0xCDC4 0x7F94 # -0xCDC5 0x8003 # -0xCDC6 0x80A1 # -0xCDC7 0x818F # -0xCDC8 0x82E6 # -0xCDC9 0x82FD # -0xCDCA 0x83F0 # -0xCDCB 0x85C1 # -0xCDCC 0x8831 # -0xCDCD 0x88B4 # -0xCDCE 0x8AA5 # -0xCDCF 0xF903 # -0xCDD0 0x8F9C # -0xCDD1 0x932E # -0xCDD2 0x96C7 # -0xCDD3 0x9867 # -0xCDD4 0x9AD8 # -0xCDD5 0x9F13 # -0xCDD6 0x54ED # -0xCDD7 0x659B # -0xCDD8 0x66F2 # -0xCDD9 0x688F # -0xCDDA 0x7A40 # -0xCDDB 0x8C37 # -0xCDDC 0x9D60 # -0xCDDD 0x56F0 # -0xCDDE 0x5764 # -0xCDDF 0x5D11 # -0xCDE0 0x6606 # -0xCDE1 0x68B1 # -0xCDE2 0x68CD # -0xCDE3 0x6EFE # -0xCDE4 0x7428 # -0xCDE5 0x889E # -0xCDE6 0x9BE4 # -0xCDE7 0x6C68 # -0xCDE8 0xF904 # -0xCDE9 0x9AA8 # -0xCDEA 0x4F9B # -0xCDEB 0x516C # -0xCDEC 0x5171 # -0xCDED 0x529F # -0xCDEE 0x5B54 # -0xCDEF 0x5DE5 # -0xCDF0 0x6050 # -0xCDF1 0x606D # -0xCDF2 0x62F1 # -0xCDF3 0x63A7 # -0xCDF4 0x653B # -0xCDF5 0x73D9 # -0xCDF6 0x7A7A # -0xCDF7 0x86A3 # -0xCDF8 0x8CA2 # -0xCDF9 0x978F # -0xCDFA 0x4E32 # -0xCDFB 0x5BE1 # -0xCDFC 0x6208 # -0xCDFD 0x679C # -0xCDFE 0x74DC # -0xCEA1 0x79D1 # -0xCEA2 0x83D3 # -0xCEA3 0x8A87 # -0xCEA4 0x8AB2 # -0xCEA5 0x8DE8 # -0xCEA6 0x904E # -0xCEA7 0x934B # -0xCEA8 0x9846 # -0xCEA9 0x5ED3 # -0xCEAA 0x69E8 # -0xCEAB 0x85FF # -0xCEAC 0x90ED # -0xCEAD 0xF905 # -0xCEAE 0x51A0 # -0xCEAF 0x5B98 # -0xCEB0 0x5BEC # -0xCEB1 0x6163 # -0xCEB2 0x68FA # -0xCEB3 0x6B3E # -0xCEB4 0x704C # -0xCEB5 0x742F # -0xCEB6 0x74D8 # -0xCEB7 0x7BA1 # -0xCEB8 0x7F50 # -0xCEB9 0x83C5 # -0xCEBA 0x89C0 # -0xCEBB 0x8CAB # -0xCEBC 0x95DC # -0xCEBD 0x9928 # -0xCEBE 0x522E # -0xCEBF 0x605D # -0xCEC0 0x62EC # -0xCEC1 0x9002 # -0xCEC2 0x4F8A # -0xCEC3 0x5149 # -0xCEC4 0x5321 # -0xCEC5 0x58D9 # -0xCEC6 0x5EE3 # -0xCEC7 0x66E0 # -0xCEC8 0x6D38 # -0xCEC9 0x709A # -0xCECA 0x72C2 # -0xCECB 0x73D6 # -0xCECC 0x7B50 # -0xCECD 0x80F1 # -0xCECE 0x945B # -0xCECF 0x5366 # -0xCED0 0x639B # -0xCED1 0x7F6B # -0xCED2 0x4E56 # -0xCED3 0x5080 # -0xCED4 0x584A # -0xCED5 0x58DE # -0xCED6 0x602A # -0xCED7 0x6127 # -0xCED8 0x62D0 # -0xCED9 0x69D0 # -0xCEDA 0x9B41 # -0xCEDB 0x5B8F # -0xCEDC 0x7D18 # -0xCEDD 0x80B1 # -0xCEDE 0x8F5F # -0xCEDF 0x4EA4 # -0xCEE0 0x50D1 # -0xCEE1 0x54AC # -0xCEE2 0x55AC # -0xCEE3 0x5B0C # -0xCEE4 0x5DA0 # -0xCEE5 0x5DE7 # -0xCEE6 0x652A # -0xCEE7 0x654E # -0xCEE8 0x6821 # -0xCEE9 0x6A4B # -0xCEEA 0x72E1 # -0xCEEB 0x768E # -0xCEEC 0x77EF # -0xCEED 0x7D5E # -0xCEEE 0x7FF9 # -0xCEEF 0x81A0 # -0xCEF0 0x854E # -0xCEF1 0x86DF # -0xCEF2 0x8F03 # -0xCEF3 0x8F4E # -0xCEF4 0x90CA # -0xCEF5 0x9903 # -0xCEF6 0x9A55 # -0xCEF7 0x9BAB # -0xCEF8 0x4E18 # -0xCEF9 0x4E45 # -0xCEFA 0x4E5D # -0xCEFB 0x4EC7 # -0xCEFC 0x4FF1 # -0xCEFD 0x5177 # -0xCEFE 0x52FE # -0xCFA1 0x5340 # -0xCFA2 0x53E3 # -0xCFA3 0x53E5 # -0xCFA4 0x548E # -0xCFA5 0x5614 # -0xCFA6 0x5775 # -0xCFA7 0x57A2 # -0xCFA8 0x5BC7 # -0xCFA9 0x5D87 # -0xCFAA 0x5ED0 # -0xCFAB 0x61FC # -0xCFAC 0x62D8 # -0xCFAD 0x6551 # -0xCFAE 0x67B8 # -0xCFAF 0x67E9 # -0xCFB0 0x69CB # -0xCFB1 0x6B50 # -0xCFB2 0x6BC6 # -0xCFB3 0x6BEC # -0xCFB4 0x6C42 # -0xCFB5 0x6E9D # -0xCFB6 0x7078 # -0xCFB7 0x72D7 # -0xCFB8 0x7396 # -0xCFB9 0x7403 # -0xCFBA 0x77BF # -0xCFBB 0x77E9 # -0xCFBC 0x7A76 # -0xCFBD 0x7D7F # -0xCFBE 0x8009 # -0xCFBF 0x81FC # -0xCFC0 0x8205 # -0xCFC1 0x820A # -0xCFC2 0x82DF # -0xCFC3 0x8862 # -0xCFC4 0x8B33 # -0xCFC5 0x8CFC # -0xCFC6 0x8EC0 # -0xCFC7 0x9011 # -0xCFC8 0x90B1 # -0xCFC9 0x9264 # -0xCFCA 0x92B6 # -0xCFCB 0x99D2 # -0xCFCC 0x9A45 # -0xCFCD 0x9CE9 # -0xCFCE 0x9DD7 # -0xCFCF 0x9F9C # -0xCFD0 0x570B # -0xCFD1 0x5C40 # -0xCFD2 0x83CA # -0xCFD3 0x97A0 # -0xCFD4 0x97AB # -0xCFD5 0x9EB4 # -0xCFD6 0x541B # -0xCFD7 0x7A98 # -0xCFD8 0x7FA4 # -0xCFD9 0x88D9 # -0xCFDA 0x8ECD # -0xCFDB 0x90E1 # -0xCFDC 0x5800 # -0xCFDD 0x5C48 # -0xCFDE 0x6398 # -0xCFDF 0x7A9F # -0xCFE0 0x5BAE # -0xCFE1 0x5F13 # -0xCFE2 0x7A79 # -0xCFE3 0x7AAE # -0xCFE4 0x828E # -0xCFE5 0x8EAC # -0xCFE6 0x5026 # -0xCFE7 0x5238 # -0xCFE8 0x52F8 # -0xCFE9 0x5377 # -0xCFEA 0x5708 # -0xCFEB 0x62F3 # -0xCFEC 0x6372 # -0xCFED 0x6B0A # -0xCFEE 0x6DC3 # -0xCFEF 0x7737 # -0xCFF0 0x53A5 # -0xCFF1 0x7357 # -0xCFF2 0x8568 # -0xCFF3 0x8E76 # -0xCFF4 0x95D5 # -0xCFF5 0x673A # -0xCFF6 0x6AC3 # -0xCFF7 0x6F70 # -0xCFF8 0x8A6D # -0xCFF9 0x8ECC # -0xCFFA 0x994B # -0xCFFB 0xF906 # -0xCFFC 0x6677 # -0xCFFD 0x6B78 # -0xCFFE 0x8CB4 # -0xD0A1 0x9B3C # -0xD0A2 0xF907 # -0xD0A3 0x53EB # -0xD0A4 0x572D # -0xD0A5 0x594E # -0xD0A6 0x63C6 # -0xD0A7 0x69FB # -0xD0A8 0x73EA # -0xD0A9 0x7845 # -0xD0AA 0x7ABA # -0xD0AB 0x7AC5 # -0xD0AC 0x7CFE # -0xD0AD 0x8475 # -0xD0AE 0x898F # -0xD0AF 0x8D73 # -0xD0B0 0x9035 # -0xD0B1 0x95A8 # -0xD0B2 0x52FB # -0xD0B3 0x5747 # -0xD0B4 0x7547 # -0xD0B5 0x7B60 # -0xD0B6 0x83CC # -0xD0B7 0x921E # -0xD0B8 0xF908 # -0xD0B9 0x6A58 # -0xD0BA 0x514B # -0xD0BB 0x524B # -0xD0BC 0x5287 # -0xD0BD 0x621F # -0xD0BE 0x68D8 # -0xD0BF 0x6975 # -0xD0C0 0x9699 # -0xD0C1 0x50C5 # -0xD0C2 0x52A4 # -0xD0C3 0x52E4 # -0xD0C4 0x61C3 # -0xD0C5 0x65A4 # -0xD0C6 0x6839 # -0xD0C7 0x69FF # -0xD0C8 0x747E # -0xD0C9 0x7B4B # -0xD0CA 0x82B9 # -0xD0CB 0x83EB # -0xD0CC 0x89B2 # -0xD0CD 0x8B39 # -0xD0CE 0x8FD1 # -0xD0CF 0x9949 # -0xD0D0 0xF909 # -0xD0D1 0x4ECA # -0xD0D2 0x5997 # -0xD0D3 0x64D2 # -0xD0D4 0x6611 # -0xD0D5 0x6A8E # -0xD0D6 0x7434 # -0xD0D7 0x7981 # -0xD0D8 0x79BD # -0xD0D9 0x82A9 # -0xD0DA 0x887E # -0xD0DB 0x887F # -0xD0DC 0x895F # -0xD0DD 0xF90A # -0xD0DE 0x9326 # -0xD0DF 0x4F0B # -0xD0E0 0x53CA # -0xD0E1 0x6025 # -0xD0E2 0x6271 # -0xD0E3 0x6C72 # -0xD0E4 0x7D1A # -0xD0E5 0x7D66 # -0xD0E6 0x4E98 # -0xD0E7 0x5162 # -0xD0E8 0x77DC # -0xD0E9 0x80AF # -0xD0EA 0x4F01 # -0xD0EB 0x4F0E # -0xD0EC 0x5176 # -0xD0ED 0x5180 # -0xD0EE 0x55DC # -0xD0EF 0x5668 # -0xD0F0 0x573B # -0xD0F1 0x57FA # -0xD0F2 0x57FC # -0xD0F3 0x5914 # -0xD0F4 0x5947 # -0xD0F5 0x5993 # -0xD0F6 0x5BC4 # -0xD0F7 0x5C90 # -0xD0F8 0x5D0E # -0xD0F9 0x5DF1 # -0xD0FA 0x5E7E # -0xD0FB 0x5FCC # -0xD0FC 0x6280 # -0xD0FD 0x65D7 # -0xD0FE 0x65E3 # -0xD1A1 0x671E # -0xD1A2 0x671F # -0xD1A3 0x675E # -0xD1A4 0x68CB # -0xD1A5 0x68C4 # -0xD1A6 0x6A5F # -0xD1A7 0x6B3A # -0xD1A8 0x6C23 # -0xD1A9 0x6C7D # -0xD1AA 0x6C82 # -0xD1AB 0x6DC7 # -0xD1AC 0x7398 # -0xD1AD 0x7426 # -0xD1AE 0x742A # -0xD1AF 0x7482 # -0xD1B0 0x74A3 # -0xD1B1 0x7578 # -0xD1B2 0x757F # -0xD1B3 0x7881 # -0xD1B4 0x78EF # -0xD1B5 0x7941 # -0xD1B6 0x7947 # -0xD1B7 0x7948 # -0xD1B8 0x797A # -0xD1B9 0x7B95 # -0xD1BA 0x7D00 # -0xD1BB 0x7DBA # -0xD1BC 0x7F88 # -0xD1BD 0x8006 # -0xD1BE 0x802D # -0xD1BF 0x808C # -0xD1C0 0x8A18 # -0xD1C1 0x8B4F # -0xD1C2 0x8C48 # -0xD1C3 0x8D77 # -0xD1C4 0x9321 # -0xD1C5 0x9324 # -0xD1C6 0x98E2 # -0xD1C7 0x9951 # -0xD1C8 0x9A0E # -0xD1C9 0x9A0F # -0xD1CA 0x9A65 # -0xD1CB 0x9E92 # -0xD1CC 0x7DCA # -0xD1CD 0x4F76 # -0xD1CE 0x5409 # -0xD1CF 0x62EE # -0xD1D0 0x6854 # -0xD1D1 0x91D1 # -0xD1D2 0x55AB # -0xD1D3 0x513A # -0xD1D4 0xF90B # -0xD1D5 0xF90C # -0xD1D6 0x5A1C # -0xD1D7 0x61E6 # -0xD1D8 0xF90D # -0xD1D9 0x62CF # -0xD1DA 0x62FF # -0xD1DB 0xF90E # -0xD1DC 0xF90F # -0xD1DD 0xF910 # -0xD1DE 0xF911 # -0xD1DF 0xF912 # -0xD1E0 0xF913 # -0xD1E1 0x90A3 # -0xD1E2 0xF914 # -0xD1E3 0xF915 # -0xD1E4 0xF916 # -0xD1E5 0xF917 # -0xD1E6 0xF918 # -0xD1E7 0x8AFE # -0xD1E8 0xF919 # -0xD1E9 0xF91A # -0xD1EA 0xF91B # -0xD1EB 0xF91C # -0xD1EC 0x6696 # -0xD1ED 0xF91D # -0xD1EE 0x7156 # -0xD1EF 0xF91E # -0xD1F0 0xF91F # -0xD1F1 0x96E3 # -0xD1F2 0xF920 # -0xD1F3 0x634F # -0xD1F4 0x637A # -0xD1F5 0x5357 # -0xD1F6 0xF921 # -0xD1F7 0x678F # -0xD1F8 0x6960 # -0xD1F9 0x6E73 # -0xD1FA 0xF922 # -0xD1FB 0x7537 # -0xD1FC 0xF923 # -0xD1FD 0xF924 # -0xD1FE 0xF925 # -0xD2A1 0x7D0D # -0xD2A2 0xF926 # -0xD2A3 0xF927 # -0xD2A4 0x8872 # -0xD2A5 0x56CA # -0xD2A6 0x5A18 # -0xD2A7 0xF928 # -0xD2A8 0xF929 # -0xD2A9 0xF92A # -0xD2AA 0xF92B # -0xD2AB 0xF92C # -0xD2AC 0x4E43 # -0xD2AD 0xF92D # -0xD2AE 0x5167 # -0xD2AF 0x5948 # -0xD2B0 0x67F0 # -0xD2B1 0x8010 # -0xD2B2 0xF92E # -0xD2B3 0x5973 # -0xD2B4 0x5E74 # -0xD2B5 0x649A # -0xD2B6 0x79CA # -0xD2B7 0x5FF5 # -0xD2B8 0x606C # -0xD2B9 0x62C8 # -0xD2BA 0x637B # -0xD2BB 0x5BE7 # -0xD2BC 0x5BD7 # -0xD2BD 0x52AA # -0xD2BE 0xF92F # -0xD2BF 0x5974 # -0xD2C0 0x5F29 # -0xD2C1 0x6012 # -0xD2C2 0xF930 # -0xD2C3 0xF931 # -0xD2C4 0xF932 # -0xD2C5 0x7459 # -0xD2C6 0xF933 # -0xD2C7 0xF934 # -0xD2C8 0xF935 # -0xD2C9 0xF936 # -0xD2CA 0xF937 # -0xD2CB 0xF938 # -0xD2CC 0x99D1 # -0xD2CD 0xF939 # -0xD2CE 0xF93A # -0xD2CF 0xF93B # -0xD2D0 0xF93C # -0xD2D1 0xF93D # -0xD2D2 0xF93E # -0xD2D3 0xF93F # -0xD2D4 0xF940 # -0xD2D5 0xF941 # -0xD2D6 0xF942 # -0xD2D7 0xF943 # -0xD2D8 0x6FC3 # -0xD2D9 0xF944 # -0xD2DA 0xF945 # -0xD2DB 0x81BF # -0xD2DC 0x8FB2 # -0xD2DD 0x60F1 # -0xD2DE 0xF946 # -0xD2DF 0xF947 # -0xD2E0 0x8166 # -0xD2E1 0xF948 # -0xD2E2 0xF949 # -0xD2E3 0x5C3F # -0xD2E4 0xF94A # -0xD2E5 0xF94B # -0xD2E6 0xF94C # -0xD2E7 0xF94D # -0xD2E8 0xF94E # -0xD2E9 0xF94F # -0xD2EA 0xF950 # -0xD2EB 0xF951 # -0xD2EC 0x5AE9 # -0xD2ED 0x8A25 # -0xD2EE 0x677B # -0xD2EF 0x7D10 # -0xD2F0 0xF952 # -0xD2F1 0xF953 # -0xD2F2 0xF954 # -0xD2F3 0xF955 # -0xD2F4 0xF956 # -0xD2F5 0xF957 # -0xD2F6 0x80FD # -0xD2F7 0xF958 # -0xD2F8 0xF959 # -0xD2F9 0x5C3C # -0xD2FA 0x6CE5 # -0xD2FB 0x533F # -0xD2FC 0x6EBA # -0xD2FD 0x591A # -0xD2FE 0x8336 # -0xD3A1 0x4E39 # -0xD3A2 0x4EB6 # -0xD3A3 0x4F46 # -0xD3A4 0x55AE # -0xD3A5 0x5718 # -0xD3A6 0x58C7 # -0xD3A7 0x5F56 # -0xD3A8 0x65B7 # -0xD3A9 0x65E6 # -0xD3AA 0x6A80 # -0xD3AB 0x6BB5 # -0xD3AC 0x6E4D # -0xD3AD 0x77ED # -0xD3AE 0x7AEF # -0xD3AF 0x7C1E # -0xD3B0 0x7DDE # -0xD3B1 0x86CB # -0xD3B2 0x8892 # -0xD3B3 0x9132 # -0xD3B4 0x935B # -0xD3B5 0x64BB # -0xD3B6 0x6FBE # -0xD3B7 0x737A # -0xD3B8 0x75B8 # -0xD3B9 0x9054 # -0xD3BA 0x5556 # -0xD3BB 0x574D # -0xD3BC 0x61BA # -0xD3BD 0x64D4 # -0xD3BE 0x66C7 # -0xD3BF 0x6DE1 # -0xD3C0 0x6E5B # -0xD3C1 0x6F6D # -0xD3C2 0x6FB9 # -0xD3C3 0x75F0 # -0xD3C4 0x8043 # -0xD3C5 0x81BD # -0xD3C6 0x8541 # -0xD3C7 0x8983 # -0xD3C8 0x8AC7 # -0xD3C9 0x8B5A # -0xD3CA 0x931F # -0xD3CB 0x6C93 # -0xD3CC 0x7553 # -0xD3CD 0x7B54 # -0xD3CE 0x8E0F # -0xD3CF 0x905D # -0xD3D0 0x5510 # -0xD3D1 0x5802 # -0xD3D2 0x5858 # -0xD3D3 0x5E62 # -0xD3D4 0x6207 # -0xD3D5 0x649E # -0xD3D6 0x68E0 # -0xD3D7 0x7576 # -0xD3D8 0x7CD6 # -0xD3D9 0x87B3 # -0xD3DA 0x9EE8 # -0xD3DB 0x4EE3 # -0xD3DC 0x5788 # -0xD3DD 0x576E # -0xD3DE 0x5927 # -0xD3DF 0x5C0D # -0xD3E0 0x5CB1 # -0xD3E1 0x5E36 # -0xD3E2 0x5F85 # -0xD3E3 0x6234 # -0xD3E4 0x64E1 # -0xD3E5 0x73B3 # -0xD3E6 0x81FA # -0xD3E7 0x888B # -0xD3E8 0x8CB8 # -0xD3E9 0x968A # -0xD3EA 0x9EDB # -0xD3EB 0x5B85 # -0xD3EC 0x5FB7 # -0xD3ED 0x60B3 # -0xD3EE 0x5012 # -0xD3EF 0x5200 # -0xD3F0 0x5230 # -0xD3F1 0x5716 # -0xD3F2 0x5835 # -0xD3F3 0x5857 # -0xD3F4 0x5C0E # -0xD3F5 0x5C60 # -0xD3F6 0x5CF6 # -0xD3F7 0x5D8B # -0xD3F8 0x5EA6 # -0xD3F9 0x5F92 # -0xD3FA 0x60BC # -0xD3FB 0x6311 # -0xD3FC 0x6389 # -0xD3FD 0x6417 # -0xD3FE 0x6843 # -0xD4A1 0x68F9 # -0xD4A2 0x6AC2 # -0xD4A3 0x6DD8 # -0xD4A4 0x6E21 # -0xD4A5 0x6ED4 # -0xD4A6 0x6FE4 # -0xD4A7 0x71FE # -0xD4A8 0x76DC # -0xD4A9 0x7779 # -0xD4AA 0x79B1 # -0xD4AB 0x7A3B # -0xD4AC 0x8404 # -0xD4AD 0x89A9 # -0xD4AE 0x8CED # -0xD4AF 0x8DF3 # -0xD4B0 0x8E48 # -0xD4B1 0x9003 # -0xD4B2 0x9014 # -0xD4B3 0x9053 # -0xD4B4 0x90FD # -0xD4B5 0x934D # -0xD4B6 0x9676 # -0xD4B7 0x97DC # -0xD4B8 0x6BD2 # -0xD4B9 0x7006 # -0xD4BA 0x7258 # -0xD4BB 0x72A2 # -0xD4BC 0x7368 # -0xD4BD 0x7763 # -0xD4BE 0x79BF # -0xD4BF 0x7BE4 # -0xD4C0 0x7E9B # -0xD4C1 0x8B80 # -0xD4C2 0x58A9 # -0xD4C3 0x60C7 # -0xD4C4 0x6566 # -0xD4C5 0x65FD # -0xD4C6 0x66BE # -0xD4C7 0x6C8C # -0xD4C8 0x711E # -0xD4C9 0x71C9 # -0xD4CA 0x8C5A # -0xD4CB 0x9813 # -0xD4CC 0x4E6D # -0xD4CD 0x7A81 # -0xD4CE 0x4EDD # -0xD4CF 0x51AC # -0xD4D0 0x51CD # -0xD4D1 0x52D5 # -0xD4D2 0x540C # -0xD4D3 0x61A7 # -0xD4D4 0x6771 # -0xD4D5 0x6850 # -0xD4D6 0x68DF # -0xD4D7 0x6D1E # -0xD4D8 0x6F7C # -0xD4D9 0x75BC # -0xD4DA 0x77B3 # -0xD4DB 0x7AE5 # -0xD4DC 0x80F4 # -0xD4DD 0x8463 # -0xD4DE 0x9285 # -0xD4DF 0x515C # -0xD4E0 0x6597 # -0xD4E1 0x675C # -0xD4E2 0x6793 # -0xD4E3 0x75D8 # -0xD4E4 0x7AC7 # -0xD4E5 0x8373 # -0xD4E6 0xF95A # -0xD4E7 0x8C46 # -0xD4E8 0x9017 # -0xD4E9 0x982D # -0xD4EA 0x5C6F # -0xD4EB 0x81C0 # -0xD4EC 0x829A # -0xD4ED 0x9041 # -0xD4EE 0x906F # -0xD4EF 0x920D # -0xD4F0 0x5F97 # -0xD4F1 0x5D9D # -0xD4F2 0x6A59 # -0xD4F3 0x71C8 # -0xD4F4 0x767B # -0xD4F5 0x7B49 # -0xD4F6 0x85E4 # -0xD4F7 0x8B04 # -0xD4F8 0x9127 # -0xD4F9 0x9A30 # -0xD4FA 0x5587 # -0xD4FB 0x61F6 # -0xD4FC 0xF95B # -0xD4FD 0x7669 # -0xD4FE 0x7F85 # -0xD5A1 0x863F # -0xD5A2 0x87BA # -0xD5A3 0x88F8 # -0xD5A4 0x908F # -0xD5A5 0xF95C # -0xD5A6 0x6D1B # -0xD5A7 0x70D9 # -0xD5A8 0x73DE # -0xD5A9 0x7D61 # -0xD5AA 0x843D # -0xD5AB 0xF95D # -0xD5AC 0x916A # -0xD5AD 0x99F1 # -0xD5AE 0xF95E # -0xD5AF 0x4E82 # -0xD5B0 0x5375 # -0xD5B1 0x6B04 # -0xD5B2 0x6B12 # -0xD5B3 0x703E # -0xD5B4 0x721B # -0xD5B5 0x862D # -0xD5B6 0x9E1E # -0xD5B7 0x524C # -0xD5B8 0x8FA3 # -0xD5B9 0x5D50 # -0xD5BA 0x64E5 # -0xD5BB 0x652C # -0xD5BC 0x6B16 # -0xD5BD 0x6FEB # -0xD5BE 0x7C43 # -0xD5BF 0x7E9C # -0xD5C0 0x85CD # -0xD5C1 0x8964 # -0xD5C2 0x89BD # -0xD5C3 0x62C9 # -0xD5C4 0x81D8 # -0xD5C5 0x881F # -0xD5C6 0x5ECA # -0xD5C7 0x6717 # -0xD5C8 0x6D6A # -0xD5C9 0x72FC # -0xD5CA 0x7405 # -0xD5CB 0x746F # -0xD5CC 0x8782 # -0xD5CD 0x90DE # -0xD5CE 0x4F86 # -0xD5CF 0x5D0D # -0xD5D0 0x5FA0 # -0xD5D1 0x840A # -0xD5D2 0x51B7 # -0xD5D3 0x63A0 # -0xD5D4 0x7565 # -0xD5D5 0x4EAE # -0xD5D6 0x5006 # -0xD5D7 0x5169 # -0xD5D8 0x51C9 # -0xD5D9 0x6881 # -0xD5DA 0x6A11 # -0xD5DB 0x7CAE # -0xD5DC 0x7CB1 # -0xD5DD 0x7CE7 # -0xD5DE 0x826F # -0xD5DF 0x8AD2 # -0xD5E0 0x8F1B # -0xD5E1 0x91CF # -0xD5E2 0x4FB6 # -0xD5E3 0x5137 # -0xD5E4 0x52F5 # -0xD5E5 0x5442 # -0xD5E6 0x5EEC # -0xD5E7 0x616E # -0xD5E8 0x623E # -0xD5E9 0x65C5 # -0xD5EA 0x6ADA # -0xD5EB 0x6FFE # -0xD5EC 0x792A # -0xD5ED 0x85DC # -0xD5EE 0x8823 # -0xD5EF 0x95AD # -0xD5F0 0x9A62 # -0xD5F1 0x9A6A # -0xD5F2 0x9E97 # -0xD5F3 0x9ECE # -0xD5F4 0x529B # -0xD5F5 0x66C6 # -0xD5F6 0x6B77 # -0xD5F7 0x701D # -0xD5F8 0x792B # -0xD5F9 0x8F62 # -0xD5FA 0x9742 # -0xD5FB 0x6190 # -0xD5FC 0x6200 # -0xD5FD 0x6523 # -0xD5FE 0x6F23 # -0xD6A1 0x7149 # -0xD6A2 0x7489 # -0xD6A3 0x7DF4 # -0xD6A4 0x806F # -0xD6A5 0x84EE # -0xD6A6 0x8F26 # -0xD6A7 0x9023 # -0xD6A8 0x934A # -0xD6A9 0x51BD # -0xD6AA 0x5217 # -0xD6AB 0x52A3 # -0xD6AC 0x6D0C # -0xD6AD 0x70C8 # -0xD6AE 0x88C2 # -0xD6AF 0x5EC9 # -0xD6B0 0x6582 # -0xD6B1 0x6BAE # -0xD6B2 0x6FC2 # -0xD6B3 0x7C3E # -0xD6B4 0x7375 # -0xD6B5 0x4EE4 # -0xD6B6 0x4F36 # -0xD6B7 0x56F9 # -0xD6B8 0xF95F # -0xD6B9 0x5CBA # -0xD6BA 0x5DBA # -0xD6BB 0x601C # -0xD6BC 0x73B2 # -0xD6BD 0x7B2D # -0xD6BE 0x7F9A # -0xD6BF 0x7FCE # -0xD6C0 0x8046 # -0xD6C1 0x901E # -0xD6C2 0x9234 # -0xD6C3 0x96F6 # -0xD6C4 0x9748 # -0xD6C5 0x9818 # -0xD6C6 0x9F61 # -0xD6C7 0x4F8B # -0xD6C8 0x6FA7 # -0xD6C9 0x79AE # -0xD6CA 0x91B4 # -0xD6CB 0x96B7 # -0xD6CC 0x52DE # -0xD6CD 0xF960 # -0xD6CE 0x6488 # -0xD6CF 0x64C4 # -0xD6D0 0x6AD3 # -0xD6D1 0x6F5E # -0xD6D2 0x7018 # -0xD6D3 0x7210 # -0xD6D4 0x76E7 # -0xD6D5 0x8001 # -0xD6D6 0x8606 # -0xD6D7 0x865C # -0xD6D8 0x8DEF # -0xD6D9 0x8F05 # -0xD6DA 0x9732 # -0xD6DB 0x9B6F # -0xD6DC 0x9DFA # -0xD6DD 0x9E75 # -0xD6DE 0x788C # -0xD6DF 0x797F # -0xD6E0 0x7DA0 # -0xD6E1 0x83C9 # -0xD6E2 0x9304 # -0xD6E3 0x9E7F # -0xD6E4 0x9E93 # -0xD6E5 0x8AD6 # -0xD6E6 0x58DF # -0xD6E7 0x5F04 # -0xD6E8 0x6727 # -0xD6E9 0x7027 # -0xD6EA 0x74CF # -0xD6EB 0x7C60 # -0xD6EC 0x807E # -0xD6ED 0x5121 # -0xD6EE 0x7028 # -0xD6EF 0x7262 # -0xD6F0 0x78CA # -0xD6F1 0x8CC2 # -0xD6F2 0x8CDA # -0xD6F3 0x8CF4 # -0xD6F4 0x96F7 # -0xD6F5 0x4E86 # -0xD6F6 0x50DA # -0xD6F7 0x5BEE # -0xD6F8 0x5ED6 # -0xD6F9 0x6599 # -0xD6FA 0x71CE # -0xD6FB 0x7642 # -0xD6FC 0x77AD # -0xD6FD 0x804A # -0xD6FE 0x84FC # -0xD7A1 0x907C # -0xD7A2 0x9B27 # -0xD7A3 0x9F8D # -0xD7A4 0x58D8 # -0xD7A5 0x5A41 # -0xD7A6 0x5C62 # -0xD7A7 0x6A13 # -0xD7A8 0x6DDA # -0xD7A9 0x6F0F # -0xD7AA 0x763B # -0xD7AB 0x7D2F # -0xD7AC 0x7E37 # -0xD7AD 0x851E # -0xD7AE 0x8938 # -0xD7AF 0x93E4 # -0xD7B0 0x964B # -0xD7B1 0x5289 # -0xD7B2 0x65D2 # -0xD7B3 0x67F3 # -0xD7B4 0x69B4 # -0xD7B5 0x6D41 # -0xD7B6 0x6E9C # -0xD7B7 0x700F # -0xD7B8 0x7409 # -0xD7B9 0x7460 # -0xD7BA 0x7559 # -0xD7BB 0x7624 # -0xD7BC 0x786B # -0xD7BD 0x8B2C # -0xD7BE 0x985E # -0xD7BF 0x516D # -0xD7C0 0x622E # -0xD7C1 0x9678 # -0xD7C2 0x4F96 # -0xD7C3 0x502B # -0xD7C4 0x5D19 # -0xD7C5 0x6DEA # -0xD7C6 0x7DB8 # -0xD7C7 0x8F2A # -0xD7C8 0x5F8B # -0xD7C9 0x6144 # -0xD7CA 0x6817 # -0xD7CB 0xF961 # -0xD7CC 0x9686 # -0xD7CD 0x52D2 # -0xD7CE 0x808B # -0xD7CF 0x51DC # -0xD7D0 0x51CC # -0xD7D1 0x695E # -0xD7D2 0x7A1C # -0xD7D3 0x7DBE # -0xD7D4 0x83F1 # -0xD7D5 0x9675 # -0xD7D6 0x4FDA # -0xD7D7 0x5229 # -0xD7D8 0x5398 # -0xD7D9 0x540F # -0xD7DA 0x550E # -0xD7DB 0x5C65 # -0xD7DC 0x60A7 # -0xD7DD 0x674E # -0xD7DE 0x68A8 # -0xD7DF 0x6D6C # -0xD7E0 0x7281 # -0xD7E1 0x72F8 # -0xD7E2 0x7406 # -0xD7E3 0x7483 # -0xD7E4 0xF962 # -0xD7E5 0x75E2 # -0xD7E6 0x7C6C # -0xD7E7 0x7F79 # -0xD7E8 0x7FB8 # -0xD7E9 0x8389 # -0xD7EA 0x88CF # -0xD7EB 0x88E1 # -0xD7EC 0x91CC # -0xD7ED 0x91D0 # -0xD7EE 0x96E2 # -0xD7EF 0x9BC9 # -0xD7F0 0x541D # -0xD7F1 0x6F7E # -0xD7F2 0x71D0 # -0xD7F3 0x7498 # -0xD7F4 0x85FA # -0xD7F5 0x8EAA # -0xD7F6 0x96A3 # -0xD7F7 0x9C57 # -0xD7F8 0x9E9F # -0xD7F9 0x6797 # -0xD7FA 0x6DCB # -0xD7FB 0x7433 # -0xD7FC 0x81E8 # -0xD7FD 0x9716 # -0xD7FE 0x782C # -0xD8A1 0x7ACB # -0xD8A2 0x7B20 # -0xD8A3 0x7C92 # -0xD8A4 0x6469 # -0xD8A5 0x746A # -0xD8A6 0x75F2 # -0xD8A7 0x78BC # -0xD8A8 0x78E8 # -0xD8A9 0x99AC # -0xD8AA 0x9B54 # -0xD8AB 0x9EBB # -0xD8AC 0x5BDE # -0xD8AD 0x5E55 # -0xD8AE 0x6F20 # -0xD8AF 0x819C # -0xD8B0 0x83AB # -0xD8B1 0x9088 # -0xD8B2 0x4E07 # -0xD8B3 0x534D # -0xD8B4 0x5A29 # -0xD8B5 0x5DD2 # -0xD8B6 0x5F4E # -0xD8B7 0x6162 # -0xD8B8 0x633D # -0xD8B9 0x6669 # -0xD8BA 0x66FC # -0xD8BB 0x6EFF # -0xD8BC 0x6F2B # -0xD8BD 0x7063 # -0xD8BE 0x779E # -0xD8BF 0x842C # -0xD8C0 0x8513 # -0xD8C1 0x883B # -0xD8C2 0x8F13 # -0xD8C3 0x9945 # -0xD8C4 0x9C3B # -0xD8C5 0x551C # -0xD8C6 0x62B9 # -0xD8C7 0x672B # -0xD8C8 0x6CAB # -0xD8C9 0x8309 # -0xD8CA 0x896A # -0xD8CB 0x977A # -0xD8CC 0x4EA1 # -0xD8CD 0x5984 # -0xD8CE 0x5FD8 # -0xD8CF 0x5FD9 # -0xD8D0 0x671B # -0xD8D1 0x7DB2 # -0xD8D2 0x7F54 # -0xD8D3 0x8292 # -0xD8D4 0x832B # -0xD8D5 0x83BD # -0xD8D6 0x8F1E # -0xD8D7 0x9099 # -0xD8D8 0x57CB # -0xD8D9 0x59B9 # -0xD8DA 0x5A92 # -0xD8DB 0x5BD0 # -0xD8DC 0x6627 # -0xD8DD 0x679A # -0xD8DE 0x6885 # -0xD8DF 0x6BCF # -0xD8E0 0x7164 # -0xD8E1 0x7F75 # -0xD8E2 0x8CB7 # -0xD8E3 0x8CE3 # -0xD8E4 0x9081 # -0xD8E5 0x9B45 # -0xD8E6 0x8108 # -0xD8E7 0x8C8A # -0xD8E8 0x964C # -0xD8E9 0x9A40 # -0xD8EA 0x9EA5 # -0xD8EB 0x5B5F # -0xD8EC 0x6C13 # -0xD8ED 0x731B # -0xD8EE 0x76F2 # -0xD8EF 0x76DF # -0xD8F0 0x840C # -0xD8F1 0x51AA # -0xD8F2 0x8993 # -0xD8F3 0x514D # -0xD8F4 0x5195 # -0xD8F5 0x52C9 # -0xD8F6 0x68C9 # -0xD8F7 0x6C94 # -0xD8F8 0x7704 # -0xD8F9 0x7720 # -0xD8FA 0x7DBF # -0xD8FB 0x7DEC # -0xD8FC 0x9762 # -0xD8FD 0x9EB5 # -0xD8FE 0x6EC5 # -0xD9A1 0x8511 # -0xD9A2 0x51A5 # -0xD9A3 0x540D # -0xD9A4 0x547D # -0xD9A5 0x660E # -0xD9A6 0x669D # -0xD9A7 0x6927 # -0xD9A8 0x6E9F # -0xD9A9 0x76BF # -0xD9AA 0x7791 # -0xD9AB 0x8317 # -0xD9AC 0x84C2 # -0xD9AD 0x879F # -0xD9AE 0x9169 # -0xD9AF 0x9298 # -0xD9B0 0x9CF4 # -0xD9B1 0x8882 # -0xD9B2 0x4FAE # -0xD9B3 0x5192 # -0xD9B4 0x52DF # -0xD9B5 0x59C6 # -0xD9B6 0x5E3D # -0xD9B7 0x6155 # -0xD9B8 0x6478 # -0xD9B9 0x6479 # -0xD9BA 0x66AE # -0xD9BB 0x67D0 # -0xD9BC 0x6A21 # -0xD9BD 0x6BCD # -0xD9BE 0x6BDB # -0xD9BF 0x725F # -0xD9C0 0x7261 # -0xD9C1 0x7441 # -0xD9C2 0x7738 # -0xD9C3 0x77DB # -0xD9C4 0x8017 # -0xD9C5 0x82BC # -0xD9C6 0x8305 # -0xD9C7 0x8B00 # -0xD9C8 0x8B28 # -0xD9C9 0x8C8C # -0xD9CA 0x6728 # -0xD9CB 0x6C90 # -0xD9CC 0x7267 # -0xD9CD 0x76EE # -0xD9CE 0x7766 # -0xD9CF 0x7A46 # -0xD9D0 0x9DA9 # -0xD9D1 0x6B7F # -0xD9D2 0x6C92 # -0xD9D3 0x5922 # -0xD9D4 0x6726 # -0xD9D5 0x8499 # -0xD9D6 0x536F # -0xD9D7 0x5893 # -0xD9D8 0x5999 # -0xD9D9 0x5EDF # -0xD9DA 0x63CF # -0xD9DB 0x6634 # -0xD9DC 0x6773 # -0xD9DD 0x6E3A # -0xD9DE 0x732B # -0xD9DF 0x7AD7 # -0xD9E0 0x82D7 # -0xD9E1 0x9328 # -0xD9E2 0x52D9 # -0xD9E3 0x5DEB # -0xD9E4 0x61AE # -0xD9E5 0x61CB # -0xD9E6 0x620A # -0xD9E7 0x62C7 # -0xD9E8 0x64AB # -0xD9E9 0x65E0 # -0xD9EA 0x6959 # -0xD9EB 0x6B66 # -0xD9EC 0x6BCB # -0xD9ED 0x7121 # -0xD9EE 0x73F7 # -0xD9EF 0x755D # -0xD9F0 0x7E46 # -0xD9F1 0x821E # -0xD9F2 0x8302 # -0xD9F3 0x856A # -0xD9F4 0x8AA3 # -0xD9F5 0x8CBF # -0xD9F6 0x9727 # -0xD9F7 0x9D61 # -0xD9F8 0x58A8 # -0xD9F9 0x9ED8 # -0xD9FA 0x5011 # -0xD9FB 0x520E # -0xD9FC 0x543B # -0xD9FD 0x554F # -0xD9FE 0x6587 # -0xDAA1 0x6C76 # -0xDAA2 0x7D0A # -0xDAA3 0x7D0B # -0xDAA4 0x805E # -0xDAA5 0x868A # -0xDAA6 0x9580 # -0xDAA7 0x96EF # -0xDAA8 0x52FF # -0xDAA9 0x6C95 # -0xDAAA 0x7269 # -0xDAAB 0x5473 # -0xDAAC 0x5A9A # -0xDAAD 0x5C3E # -0xDAAE 0x5D4B # -0xDAAF 0x5F4C # -0xDAB0 0x5FAE # -0xDAB1 0x672A # -0xDAB2 0x68B6 # -0xDAB3 0x6963 # -0xDAB4 0x6E3C # -0xDAB5 0x6E44 # -0xDAB6 0x7709 # -0xDAB7 0x7C73 # -0xDAB8 0x7F8E # -0xDAB9 0x8587 # -0xDABA 0x8B0E # -0xDABB 0x8FF7 # -0xDABC 0x9761 # -0xDABD 0x9EF4 # -0xDABE 0x5CB7 # -0xDABF 0x60B6 # -0xDAC0 0x610D # -0xDAC1 0x61AB # -0xDAC2 0x654F # -0xDAC3 0x65FB # -0xDAC4 0x65FC # -0xDAC5 0x6C11 # -0xDAC6 0x6CEF # -0xDAC7 0x739F # -0xDAC8 0x73C9 # -0xDAC9 0x7DE1 # -0xDACA 0x9594 # -0xDACB 0x5BC6 # -0xDACC 0x871C # -0xDACD 0x8B10 # -0xDACE 0x525D # -0xDACF 0x535A # -0xDAD0 0x62CD # -0xDAD1 0x640F # -0xDAD2 0x64B2 # -0xDAD3 0x6734 # -0xDAD4 0x6A38 # -0xDAD5 0x6CCA # -0xDAD6 0x73C0 # -0xDAD7 0x749E # -0xDAD8 0x7B94 # -0xDAD9 0x7C95 # -0xDADA 0x7E1B # -0xDADB 0x818A # -0xDADC 0x8236 # -0xDADD 0x8584 # -0xDADE 0x8FEB # -0xDADF 0x96F9 # -0xDAE0 0x99C1 # -0xDAE1 0x4F34 # -0xDAE2 0x534A # -0xDAE3 0x53CD # -0xDAE4 0x53DB # -0xDAE5 0x62CC # -0xDAE6 0x642C # -0xDAE7 0x6500 # -0xDAE8 0x6591 # -0xDAE9 0x69C3 # -0xDAEA 0x6CEE # -0xDAEB 0x6F58 # -0xDAEC 0x73ED # -0xDAED 0x7554 # -0xDAEE 0x7622 # -0xDAEF 0x76E4 # -0xDAF0 0x76FC # -0xDAF1 0x78D0 # -0xDAF2 0x78FB # -0xDAF3 0x792C # -0xDAF4 0x7D46 # -0xDAF5 0x822C # -0xDAF6 0x87E0 # -0xDAF7 0x8FD4 # -0xDAF8 0x9812 # -0xDAF9 0x98EF # -0xDAFA 0x52C3 # -0xDAFB 0x62D4 # -0xDAFC 0x64A5 # -0xDAFD 0x6E24 # -0xDAFE 0x6F51 # -0xDBA1 0x767C # -0xDBA2 0x8DCB # -0xDBA3 0x91B1 # -0xDBA4 0x9262 # -0xDBA5 0x9AEE # -0xDBA6 0x9B43 # -0xDBA7 0x5023 # -0xDBA8 0x508D # -0xDBA9 0x574A # -0xDBAA 0x59A8 # -0xDBAB 0x5C28 # -0xDBAC 0x5E47 # -0xDBAD 0x5F77 # -0xDBAE 0x623F # -0xDBAF 0x653E # -0xDBB0 0x65B9 # -0xDBB1 0x65C1 # -0xDBB2 0x6609 # -0xDBB3 0x678B # -0xDBB4 0x699C # -0xDBB5 0x6EC2 # -0xDBB6 0x78C5 # -0xDBB7 0x7D21 # -0xDBB8 0x80AA # -0xDBB9 0x8180 # -0xDBBA 0x822B # -0xDBBB 0x82B3 # -0xDBBC 0x84A1 # -0xDBBD 0x868C # -0xDBBE 0x8A2A # -0xDBBF 0x8B17 # -0xDBC0 0x90A6 # -0xDBC1 0x9632 # -0xDBC2 0x9F90 # -0xDBC3 0x500D # -0xDBC4 0x4FF3 # -0xDBC5 0xF963 # -0xDBC6 0x57F9 # -0xDBC7 0x5F98 # -0xDBC8 0x62DC # -0xDBC9 0x6392 # -0xDBCA 0x676F # -0xDBCB 0x6E43 # -0xDBCC 0x7119 # -0xDBCD 0x76C3 # -0xDBCE 0x80CC # -0xDBCF 0x80DA # -0xDBD0 0x88F4 # -0xDBD1 0x88F5 # -0xDBD2 0x8919 # -0xDBD3 0x8CE0 # -0xDBD4 0x8F29 # -0xDBD5 0x914D # -0xDBD6 0x966A # -0xDBD7 0x4F2F # -0xDBD8 0x4F70 # -0xDBD9 0x5E1B # -0xDBDA 0x67CF # -0xDBDB 0x6822 # -0xDBDC 0x767D # -0xDBDD 0x767E # -0xDBDE 0x9B44 # -0xDBDF 0x5E61 # -0xDBE0 0x6A0A # -0xDBE1 0x7169 # -0xDBE2 0x71D4 # -0xDBE3 0x756A # -0xDBE4 0xF964 # -0xDBE5 0x7E41 # -0xDBE6 0x8543 # -0xDBE7 0x85E9 # -0xDBE8 0x98DC # -0xDBE9 0x4F10 # -0xDBEA 0x7B4F # -0xDBEB 0x7F70 # -0xDBEC 0x95A5 # -0xDBED 0x51E1 # -0xDBEE 0x5E06 # -0xDBEF 0x68B5 # -0xDBF0 0x6C3E # -0xDBF1 0x6C4E # -0xDBF2 0x6CDB # -0xDBF3 0x72AF # -0xDBF4 0x7BC4 # -0xDBF5 0x8303 # -0xDBF6 0x6CD5 # -0xDBF7 0x743A # -0xDBF8 0x50FB # -0xDBF9 0x5288 # -0xDBFA 0x58C1 # -0xDBFB 0x64D8 # -0xDBFC 0x6A97 # -0xDBFD 0x74A7 # -0xDBFE 0x7656 # -0xDCA1 0x78A7 # -0xDCA2 0x8617 # -0xDCA3 0x95E2 # -0xDCA4 0x9739 # -0xDCA5 0xF965 # -0xDCA6 0x535E # -0xDCA7 0x5F01 # -0xDCA8 0x8B8A # -0xDCA9 0x8FA8 # -0xDCAA 0x8FAF # -0xDCAB 0x908A # -0xDCAC 0x5225 # -0xDCAD 0x77A5 # -0xDCAE 0x9C49 # -0xDCAF 0x9F08 # -0xDCB0 0x4E19 # -0xDCB1 0x5002 # -0xDCB2 0x5175 # -0xDCB3 0x5C5B # -0xDCB4 0x5E77 # -0xDCB5 0x661E # -0xDCB6 0x663A # -0xDCB7 0x67C4 # -0xDCB8 0x68C5 # -0xDCB9 0x70B3 # -0xDCBA 0x7501 # -0xDCBB 0x75C5 # -0xDCBC 0x79C9 # -0xDCBD 0x7ADD # -0xDCBE 0x8F27 # -0xDCBF 0x9920 # -0xDCC0 0x9A08 # -0xDCC1 0x4FDD # -0xDCC2 0x5821 # -0xDCC3 0x5831 # -0xDCC4 0x5BF6 # -0xDCC5 0x666E # -0xDCC6 0x6B65 # -0xDCC7 0x6D11 # -0xDCC8 0x6E7A # -0xDCC9 0x6F7D # -0xDCCA 0x73E4 # -0xDCCB 0x752B # -0xDCCC 0x83E9 # -0xDCCD 0x88DC # -0xDCCE 0x8913 # -0xDCCF 0x8B5C # -0xDCD0 0x8F14 # -0xDCD1 0x4F0F # -0xDCD2 0x50D5 # -0xDCD3 0x5310 # -0xDCD4 0x535C # -0xDCD5 0x5B93 # -0xDCD6 0x5FA9 # -0xDCD7 0x670D # -0xDCD8 0x798F # -0xDCD9 0x8179 # -0xDCDA 0x832F # -0xDCDB 0x8514 # -0xDCDC 0x8907 # -0xDCDD 0x8986 # -0xDCDE 0x8F39 # -0xDCDF 0x8F3B # -0xDCE0 0x99A5 # -0xDCE1 0x9C12 # -0xDCE2 0x672C # -0xDCE3 0x4E76 # -0xDCE4 0x4FF8 # -0xDCE5 0x5949 # -0xDCE6 0x5C01 # -0xDCE7 0x5CEF # -0xDCE8 0x5CF0 # -0xDCE9 0x6367 # -0xDCEA 0x68D2 # -0xDCEB 0x70FD # -0xDCEC 0x71A2 # -0xDCED 0x742B # -0xDCEE 0x7E2B # -0xDCEF 0x84EC # -0xDCF0 0x8702 # -0xDCF1 0x9022 # -0xDCF2 0x92D2 # -0xDCF3 0x9CF3 # -0xDCF4 0x4E0D # -0xDCF5 0x4ED8 # -0xDCF6 0x4FEF # -0xDCF7 0x5085 # -0xDCF8 0x5256 # -0xDCF9 0x526F # -0xDCFA 0x5426 # -0xDCFB 0x5490 # -0xDCFC 0x57E0 # -0xDCFD 0x592B # -0xDCFE 0x5A66 # -0xDDA1 0x5B5A # -0xDDA2 0x5B75 # -0xDDA3 0x5BCC # -0xDDA4 0x5E9C # -0xDDA5 0xF966 # -0xDDA6 0x6276 # -0xDDA7 0x6577 # -0xDDA8 0x65A7 # -0xDDA9 0x6D6E # -0xDDAA 0x6EA5 # -0xDDAB 0x7236 # -0xDDAC 0x7B26 # -0xDDAD 0x7C3F # -0xDDAE 0x7F36 # -0xDDAF 0x8150 # -0xDDB0 0x8151 # -0xDDB1 0x819A # -0xDDB2 0x8240 # -0xDDB3 0x8299 # -0xDDB4 0x83A9 # -0xDDB5 0x8A03 # -0xDDB6 0x8CA0 # -0xDDB7 0x8CE6 # -0xDDB8 0x8CFB # -0xDDB9 0x8D74 # -0xDDBA 0x8DBA # -0xDDBB 0x90E8 # -0xDDBC 0x91DC # -0xDDBD 0x961C # -0xDDBE 0x9644 # -0xDDBF 0x99D9 # -0xDDC0 0x9CE7 # -0xDDC1 0x5317 # -0xDDC2 0x5206 # -0xDDC3 0x5429 # -0xDDC4 0x5674 # -0xDDC5 0x58B3 # -0xDDC6 0x5954 # -0xDDC7 0x596E # -0xDDC8 0x5FFF # -0xDDC9 0x61A4 # -0xDDCA 0x626E # -0xDDCB 0x6610 # -0xDDCC 0x6C7E # -0xDDCD 0x711A # -0xDDCE 0x76C6 # -0xDDCF 0x7C89 # -0xDDD0 0x7CDE # -0xDDD1 0x7D1B # -0xDDD2 0x82AC # -0xDDD3 0x8CC1 # -0xDDD4 0x96F0 # -0xDDD5 0xF967 # -0xDDD6 0x4F5B # -0xDDD7 0x5F17 # -0xDDD8 0x5F7F # -0xDDD9 0x62C2 # -0xDDDA 0x5D29 # -0xDDDB 0x670B # -0xDDDC 0x68DA # -0xDDDD 0x787C # -0xDDDE 0x7E43 # -0xDDDF 0x9D6C # -0xDDE0 0x4E15 # -0xDDE1 0x5099 # -0xDDE2 0x5315 # -0xDDE3 0x532A # -0xDDE4 0x5351 # -0xDDE5 0x5983 # -0xDDE6 0x5A62 # -0xDDE7 0x5E87 # -0xDDE8 0x60B2 # -0xDDE9 0x618A # -0xDDEA 0x6249 # -0xDDEB 0x6279 # -0xDDEC 0x6590 # -0xDDED 0x6787 # -0xDDEE 0x69A7 # -0xDDEF 0x6BD4 # -0xDDF0 0x6BD6 # -0xDDF1 0x6BD7 # -0xDDF2 0x6BD8 # -0xDDF3 0x6CB8 # -0xDDF4 0xF968 # -0xDDF5 0x7435 # -0xDDF6 0x75FA # -0xDDF7 0x7812 # -0xDDF8 0x7891 # -0xDDF9 0x79D5 # -0xDDFA 0x79D8 # -0xDDFB 0x7C83 # -0xDDFC 0x7DCB # -0xDDFD 0x7FE1 # -0xDDFE 0x80A5 # -0xDEA1 0x813E # -0xDEA2 0x81C2 # -0xDEA3 0x83F2 # -0xDEA4 0x871A # -0xDEA5 0x88E8 # -0xDEA6 0x8AB9 # -0xDEA7 0x8B6C # -0xDEA8 0x8CBB # -0xDEA9 0x9119 # -0xDEAA 0x975E # -0xDEAB 0x98DB # -0xDEAC 0x9F3B # -0xDEAD 0x56AC # -0xDEAE 0x5B2A # -0xDEAF 0x5F6C # -0xDEB0 0x658C # -0xDEB1 0x6AB3 # -0xDEB2 0x6BAF # -0xDEB3 0x6D5C # -0xDEB4 0x6FF1 # -0xDEB5 0x7015 # -0xDEB6 0x725D # -0xDEB7 0x73AD # -0xDEB8 0x8CA7 # -0xDEB9 0x8CD3 # -0xDEBA 0x983B # -0xDEBB 0x6191 # -0xDEBC 0x6C37 # -0xDEBD 0x8058 # -0xDEBE 0x9A01 # -0xDEBF 0x4E4D # -0xDEC0 0x4E8B # -0xDEC1 0x4E9B # -0xDEC2 0x4ED5 # -0xDEC3 0x4F3A # -0xDEC4 0x4F3C # -0xDEC5 0x4F7F # -0xDEC6 0x4FDF # -0xDEC7 0x50FF # -0xDEC8 0x53F2 # -0xDEC9 0x53F8 # -0xDECA 0x5506 # -0xDECB 0x55E3 # -0xDECC 0x56DB # -0xDECD 0x58EB # -0xDECE 0x5962 # -0xDECF 0x5A11 # -0xDED0 0x5BEB # -0xDED1 0x5BFA # -0xDED2 0x5C04 # -0xDED3 0x5DF3 # -0xDED4 0x5E2B # -0xDED5 0x5F99 # -0xDED6 0x601D # -0xDED7 0x6368 # -0xDED8 0x659C # -0xDED9 0x65AF # -0xDEDA 0x67F6 # -0xDEDB 0x67FB # -0xDEDC 0x68AD # -0xDEDD 0x6B7B # -0xDEDE 0x6C99 # -0xDEDF 0x6CD7 # -0xDEE0 0x6E23 # -0xDEE1 0x7009 # -0xDEE2 0x7345 # -0xDEE3 0x7802 # -0xDEE4 0x793E # -0xDEE5 0x7940 # -0xDEE6 0x7960 # -0xDEE7 0x79C1 # -0xDEE8 0x7BE9 # -0xDEE9 0x7D17 # -0xDEEA 0x7D72 # -0xDEEB 0x8086 # -0xDEEC 0x820D # -0xDEED 0x838E # -0xDEEE 0x84D1 # -0xDEEF 0x86C7 # -0xDEF0 0x88DF # -0xDEF1 0x8A50 # -0xDEF2 0x8A5E # -0xDEF3 0x8B1D # -0xDEF4 0x8CDC # -0xDEF5 0x8D66 # -0xDEF6 0x8FAD # -0xDEF7 0x90AA # -0xDEF8 0x98FC # -0xDEF9 0x99DF # -0xDEFA 0x9E9D # -0xDEFB 0x524A # -0xDEFC 0xF969 # -0xDEFD 0x6714 # -0xDEFE 0xF96A # -0xDFA1 0x5098 # -0xDFA2 0x522A # -0xDFA3 0x5C71 # -0xDFA4 0x6563 # -0xDFA5 0x6C55 # -0xDFA6 0x73CA # -0xDFA7 0x7523 # -0xDFA8 0x759D # -0xDFA9 0x7B97 # -0xDFAA 0x849C # -0xDFAB 0x9178 # -0xDFAC 0x9730 # -0xDFAD 0x4E77 # -0xDFAE 0x6492 # -0xDFAF 0x6BBA # -0xDFB0 0x715E # -0xDFB1 0x85A9 # -0xDFB2 0x4E09 # -0xDFB3 0xF96B # -0xDFB4 0x6749 # -0xDFB5 0x68EE # -0xDFB6 0x6E17 # -0xDFB7 0x829F # -0xDFB8 0x8518 # -0xDFB9 0x886B # -0xDFBA 0x63F7 # -0xDFBB 0x6F81 # -0xDFBC 0x9212 # -0xDFBD 0x98AF # -0xDFBE 0x4E0A # -0xDFBF 0x50B7 # -0xDFC0 0x50CF # -0xDFC1 0x511F # -0xDFC2 0x5546 # -0xDFC3 0x55AA # -0xDFC4 0x5617 # -0xDFC5 0x5B40 # -0xDFC6 0x5C19 # -0xDFC7 0x5CE0 # -0xDFC8 0x5E38 # -0xDFC9 0x5E8A # -0xDFCA 0x5EA0 # -0xDFCB 0x5EC2 # -0xDFCC 0x60F3 # -0xDFCD 0x6851 # -0xDFCE 0x6A61 # -0xDFCF 0x6E58 # -0xDFD0 0x723D # -0xDFD1 0x7240 # -0xDFD2 0x72C0 # -0xDFD3 0x76F8 # -0xDFD4 0x7965 # -0xDFD5 0x7BB1 # -0xDFD6 0x7FD4 # -0xDFD7 0x88F3 # -0xDFD8 0x89F4 # -0xDFD9 0x8A73 # -0xDFDA 0x8C61 # -0xDFDB 0x8CDE # -0xDFDC 0x971C # -0xDFDD 0x585E # -0xDFDE 0x74BD # -0xDFDF 0x8CFD # -0xDFE0 0x55C7 # -0xDFE1 0xF96C # -0xDFE2 0x7A61 # -0xDFE3 0x7D22 # -0xDFE4 0x8272 # -0xDFE5 0x7272 # -0xDFE6 0x751F # -0xDFE7 0x7525 # -0xDFE8 0xF96D # -0xDFE9 0x7B19 # -0xDFEA 0x5885 # -0xDFEB 0x58FB # -0xDFEC 0x5DBC # -0xDFED 0x5E8F # -0xDFEE 0x5EB6 # -0xDFEF 0x5F90 # -0xDFF0 0x6055 # -0xDFF1 0x6292 # -0xDFF2 0x637F # -0xDFF3 0x654D # -0xDFF4 0x6691 # -0xDFF5 0x66D9 # -0xDFF6 0x66F8 # -0xDFF7 0x6816 # -0xDFF8 0x68F2 # -0xDFF9 0x7280 # -0xDFFA 0x745E # -0xDFFB 0x7B6E # -0xDFFC 0x7D6E # -0xDFFD 0x7DD6 # -0xDFFE 0x7F72 # -0xE0A1 0x80E5 # -0xE0A2 0x8212 # -0xE0A3 0x85AF # -0xE0A4 0x897F # -0xE0A5 0x8A93 # -0xE0A6 0x901D # -0xE0A7 0x92E4 # -0xE0A8 0x9ECD # -0xE0A9 0x9F20 # -0xE0AA 0x5915 # -0xE0AB 0x596D # -0xE0AC 0x5E2D # -0xE0AD 0x60DC # -0xE0AE 0x6614 # -0xE0AF 0x6673 # -0xE0B0 0x6790 # -0xE0B1 0x6C50 # -0xE0B2 0x6DC5 # -0xE0B3 0x6F5F # -0xE0B4 0x77F3 # -0xE0B5 0x78A9 # -0xE0B6 0x84C6 # -0xE0B7 0x91CB # -0xE0B8 0x932B # -0xE0B9 0x4ED9 # -0xE0BA 0x50CA # -0xE0BB 0x5148 # -0xE0BC 0x5584 # -0xE0BD 0x5B0B # -0xE0BE 0x5BA3 # -0xE0BF 0x6247 # -0xE0C0 0x657E # -0xE0C1 0x65CB # -0xE0C2 0x6E32 # -0xE0C3 0x717D # -0xE0C4 0x7401 # -0xE0C5 0x7444 # -0xE0C6 0x7487 # -0xE0C7 0x74BF # -0xE0C8 0x766C # -0xE0C9 0x79AA # -0xE0CA 0x7DDA # -0xE0CB 0x7E55 # -0xE0CC 0x7FA8 # -0xE0CD 0x817A # -0xE0CE 0x81B3 # -0xE0CF 0x8239 # -0xE0D0 0x861A # -0xE0D1 0x87EC # -0xE0D2 0x8A75 # -0xE0D3 0x8DE3 # -0xE0D4 0x9078 # -0xE0D5 0x9291 # -0xE0D6 0x9425 # -0xE0D7 0x994D # -0xE0D8 0x9BAE # -0xE0D9 0x5368 # -0xE0DA 0x5C51 # -0xE0DB 0x6954 # -0xE0DC 0x6CC4 # -0xE0DD 0x6D29 # -0xE0DE 0x6E2B # -0xE0DF 0x820C # -0xE0E0 0x859B # -0xE0E1 0x893B # -0xE0E2 0x8A2D # -0xE0E3 0x8AAA # -0xE0E4 0x96EA # -0xE0E5 0x9F67 # -0xE0E6 0x5261 # -0xE0E7 0x66B9 # -0xE0E8 0x6BB2 # -0xE0E9 0x7E96 # -0xE0EA 0x87FE # -0xE0EB 0x8D0D # -0xE0EC 0x9583 # -0xE0ED 0x965D # -0xE0EE 0x651D # -0xE0EF 0x6D89 # -0xE0F0 0x71EE # -0xE0F1 0xF96E # -0xE0F2 0x57CE # -0xE0F3 0x59D3 # -0xE0F4 0x5BAC # -0xE0F5 0x6027 # -0xE0F6 0x60FA # -0xE0F7 0x6210 # -0xE0F8 0x661F # -0xE0F9 0x665F # -0xE0FA 0x7329 # -0xE0FB 0x73F9 # -0xE0FC 0x76DB # -0xE0FD 0x7701 # -0xE0FE 0x7B6C # -0xE1A1 0x8056 # -0xE1A2 0x8072 # -0xE1A3 0x8165 # -0xE1A4 0x8AA0 # -0xE1A5 0x9192 # -0xE1A6 0x4E16 # -0xE1A7 0x52E2 # -0xE1A8 0x6B72 # -0xE1A9 0x6D17 # -0xE1AA 0x7A05 # -0xE1AB 0x7B39 # -0xE1AC 0x7D30 # -0xE1AD 0xF96F # -0xE1AE 0x8CB0 # -0xE1AF 0x53EC # -0xE1B0 0x562F # -0xE1B1 0x5851 # -0xE1B2 0x5BB5 # -0xE1B3 0x5C0F # -0xE1B4 0x5C11 # -0xE1B5 0x5DE2 # -0xE1B6 0x6240 # -0xE1B7 0x6383 # -0xE1B8 0x6414 # -0xE1B9 0x662D # -0xE1BA 0x68B3 # -0xE1BB 0x6CBC # -0xE1BC 0x6D88 # -0xE1BD 0x6EAF # -0xE1BE 0x701F # -0xE1BF 0x70A4 # -0xE1C0 0x71D2 # -0xE1C1 0x7526 # -0xE1C2 0x758F # -0xE1C3 0x758E # -0xE1C4 0x7619 # -0xE1C5 0x7B11 # -0xE1C6 0x7BE0 # -0xE1C7 0x7C2B # -0xE1C8 0x7D20 # -0xE1C9 0x7D39 # -0xE1CA 0x852C # -0xE1CB 0x856D # -0xE1CC 0x8607 # -0xE1CD 0x8A34 # -0xE1CE 0x900D # -0xE1CF 0x9061 # -0xE1D0 0x90B5 # -0xE1D1 0x92B7 # -0xE1D2 0x97F6 # -0xE1D3 0x9A37 # -0xE1D4 0x4FD7 # -0xE1D5 0x5C6C # -0xE1D6 0x675F # -0xE1D7 0x6D91 # -0xE1D8 0x7C9F # -0xE1D9 0x7E8C # -0xE1DA 0x8B16 # -0xE1DB 0x8D16 # -0xE1DC 0x901F # -0xE1DD 0x5B6B # -0xE1DE 0x5DFD # -0xE1DF 0x640D # -0xE1E0 0x84C0 # -0xE1E1 0x905C # -0xE1E2 0x98E1 # -0xE1E3 0x7387 # -0xE1E4 0x5B8B # -0xE1E5 0x609A # -0xE1E6 0x677E # -0xE1E7 0x6DDE # -0xE1E8 0x8A1F # -0xE1E9 0x8AA6 # -0xE1EA 0x9001 # -0xE1EB 0x980C # -0xE1EC 0x5237 # -0xE1ED 0xF970 # -0xE1EE 0x7051 # -0xE1EF 0x788E # -0xE1F0 0x9396 # -0xE1F1 0x8870 # -0xE1F2 0x91D7 # -0xE1F3 0x4FEE # -0xE1F4 0x53D7 # -0xE1F5 0x55FD # -0xE1F6 0x56DA # -0xE1F7 0x5782 # -0xE1F8 0x58FD # -0xE1F9 0x5AC2 # -0xE1FA 0x5B88 # -0xE1FB 0x5CAB # -0xE1FC 0x5CC0 # -0xE1FD 0x5E25 # -0xE1FE 0x6101 # -0xE2A1 0x620D # -0xE2A2 0x624B # -0xE2A3 0x6388 # -0xE2A4 0x641C # -0xE2A5 0x6536 # -0xE2A6 0x6578 # -0xE2A7 0x6A39 # -0xE2A8 0x6B8A # -0xE2A9 0x6C34 # -0xE2AA 0x6D19 # -0xE2AB 0x6F31 # -0xE2AC 0x71E7 # -0xE2AD 0x72E9 # -0xE2AE 0x7378 # -0xE2AF 0x7407 # -0xE2B0 0x74B2 # -0xE2B1 0x7626 # -0xE2B2 0x7761 # -0xE2B3 0x79C0 # -0xE2B4 0x7A57 # -0xE2B5 0x7AEA # -0xE2B6 0x7CB9 # -0xE2B7 0x7D8F # -0xE2B8 0x7DAC # -0xE2B9 0x7E61 # -0xE2BA 0x7F9E # -0xE2BB 0x8129 # -0xE2BC 0x8331 # -0xE2BD 0x8490 # -0xE2BE 0x84DA # -0xE2BF 0x85EA # -0xE2C0 0x8896 # -0xE2C1 0x8AB0 # -0xE2C2 0x8B90 # -0xE2C3 0x8F38 # -0xE2C4 0x9042 # -0xE2C5 0x9083 # -0xE2C6 0x916C # -0xE2C7 0x9296 # -0xE2C8 0x92B9 # -0xE2C9 0x968B # -0xE2CA 0x96A7 # -0xE2CB 0x96A8 # -0xE2CC 0x96D6 # -0xE2CD 0x9700 # -0xE2CE 0x9808 # -0xE2CF 0x9996 # -0xE2D0 0x9AD3 # -0xE2D1 0x9B1A # -0xE2D2 0x53D4 # -0xE2D3 0x587E # -0xE2D4 0x5919 # -0xE2D5 0x5B70 # -0xE2D6 0x5BBF # -0xE2D7 0x6DD1 # -0xE2D8 0x6F5A # -0xE2D9 0x719F # -0xE2DA 0x7421 # -0xE2DB 0x74B9 # -0xE2DC 0x8085 # -0xE2DD 0x83FD # -0xE2DE 0x5DE1 # -0xE2DF 0x5F87 # -0xE2E0 0x5FAA # -0xE2E1 0x6042 # -0xE2E2 0x65EC # -0xE2E3 0x6812 # -0xE2E4 0x696F # -0xE2E5 0x6A53 # -0xE2E6 0x6B89 # -0xE2E7 0x6D35 # -0xE2E8 0x6DF3 # -0xE2E9 0x73E3 # -0xE2EA 0x76FE # -0xE2EB 0x77AC # -0xE2EC 0x7B4D # -0xE2ED 0x7D14 # -0xE2EE 0x8123 # -0xE2EF 0x821C # -0xE2F0 0x8340 # -0xE2F1 0x84F4 # -0xE2F2 0x8563 # -0xE2F3 0x8A62 # -0xE2F4 0x8AC4 # -0xE2F5 0x9187 # -0xE2F6 0x931E # -0xE2F7 0x9806 # -0xE2F8 0x99B4 # -0xE2F9 0x620C # -0xE2FA 0x8853 # -0xE2FB 0x8FF0 # -0xE2FC 0x9265 # -0xE2FD 0x5D07 # -0xE2FE 0x5D27 # -0xE3A1 0x5D69 # -0xE3A2 0x745F # -0xE3A3 0x819D # -0xE3A4 0x8768 # -0xE3A5 0x6FD5 # -0xE3A6 0x62FE # -0xE3A7 0x7FD2 # -0xE3A8 0x8936 # -0xE3A9 0x8972 # -0xE3AA 0x4E1E # -0xE3AB 0x4E58 # -0xE3AC 0x50E7 # -0xE3AD 0x52DD # -0xE3AE 0x5347 # -0xE3AF 0x627F # -0xE3B0 0x6607 # -0xE3B1 0x7E69 # -0xE3B2 0x8805 # -0xE3B3 0x965E # -0xE3B4 0x4F8D # -0xE3B5 0x5319 # -0xE3B6 0x5636 # -0xE3B7 0x59CB # -0xE3B8 0x5AA4 # -0xE3B9 0x5C38 # -0xE3BA 0x5C4E # -0xE3BB 0x5C4D # -0xE3BC 0x5E02 # -0xE3BD 0x5F11 # -0xE3BE 0x6043 # -0xE3BF 0x65BD # -0xE3C0 0x662F # -0xE3C1 0x6642 # -0xE3C2 0x67BE # -0xE3C3 0x67F4 # -0xE3C4 0x731C # -0xE3C5 0x77E2 # -0xE3C6 0x793A # -0xE3C7 0x7FC5 # -0xE3C8 0x8494 # -0xE3C9 0x84CD # -0xE3CA 0x8996 # -0xE3CB 0x8A66 # -0xE3CC 0x8A69 # -0xE3CD 0x8AE1 # -0xE3CE 0x8C55 # -0xE3CF 0x8C7A # -0xE3D0 0x57F4 # -0xE3D1 0x5BD4 # -0xE3D2 0x5F0F # -0xE3D3 0x606F # -0xE3D4 0x62ED # -0xE3D5 0x690D # -0xE3D6 0x6B96 # -0xE3D7 0x6E5C # -0xE3D8 0x7184 # -0xE3D9 0x7BD2 # -0xE3DA 0x8755 # -0xE3DB 0x8B58 # -0xE3DC 0x8EFE # -0xE3DD 0x98DF # -0xE3DE 0x98FE # -0xE3DF 0x4F38 # -0xE3E0 0x4F81 # -0xE3E1 0x4FE1 # -0xE3E2 0x547B # -0xE3E3 0x5A20 # -0xE3E4 0x5BB8 # -0xE3E5 0x613C # -0xE3E6 0x65B0 # -0xE3E7 0x6668 # -0xE3E8 0x71FC # -0xE3E9 0x7533 # -0xE3EA 0x795E # -0xE3EB 0x7D33 # -0xE3EC 0x814E # -0xE3ED 0x81E3 # -0xE3EE 0x8398 # -0xE3EF 0x85AA # -0xE3F0 0x85CE # -0xE3F1 0x8703 # -0xE3F2 0x8A0A # -0xE3F3 0x8EAB # -0xE3F4 0x8F9B # -0xE3F5 0xF971 # -0xE3F6 0x8FC5 # -0xE3F7 0x5931 # -0xE3F8 0x5BA4 # -0xE3F9 0x5BE6 # -0xE3FA 0x6089 # -0xE3FB 0x5BE9 # -0xE3FC 0x5C0B # -0xE3FD 0x5FC3 # -0xE3FE 0x6C81 # -0xE4A1 0xF972 # -0xE4A2 0x6DF1 # -0xE4A3 0x700B # -0xE4A4 0x751A # -0xE4A5 0x82AF # -0xE4A6 0x8AF6 # -0xE4A7 0x4EC0 # -0xE4A8 0x5341 # -0xE4A9 0xF973 # -0xE4AA 0x96D9 # -0xE4AB 0x6C0F # -0xE4AC 0x4E9E # -0xE4AD 0x4FC4 # -0xE4AE 0x5152 # -0xE4AF 0x555E # -0xE4B0 0x5A25 # -0xE4B1 0x5CE8 # -0xE4B2 0x6211 # -0xE4B3 0x7259 # -0xE4B4 0x82BD # -0xE4B5 0x83AA # -0xE4B6 0x86FE # -0xE4B7 0x8859 # -0xE4B8 0x8A1D # -0xE4B9 0x963F # -0xE4BA 0x96C5 # -0xE4BB 0x9913 # -0xE4BC 0x9D09 # -0xE4BD 0x9D5D # -0xE4BE 0x580A # -0xE4BF 0x5CB3 # -0xE4C0 0x5DBD # -0xE4C1 0x5E44 # -0xE4C2 0x60E1 # -0xE4C3 0x6115 # -0xE4C4 0x63E1 # -0xE4C5 0x6A02 # -0xE4C6 0x6E25 # -0xE4C7 0x9102 # -0xE4C8 0x9354 # -0xE4C9 0x984E # -0xE4CA 0x9C10 # -0xE4CB 0x9F77 # -0xE4CC 0x5B89 # -0xE4CD 0x5CB8 # -0xE4CE 0x6309 # -0xE4CF 0x664F # -0xE4D0 0x6848 # -0xE4D1 0x773C # -0xE4D2 0x96C1 # -0xE4D3 0x978D # -0xE4D4 0x9854 # -0xE4D5 0x9B9F # -0xE4D6 0x65A1 # -0xE4D7 0x8B01 # -0xE4D8 0x8ECB # -0xE4D9 0x95BC # -0xE4DA 0x5535 # -0xE4DB 0x5CA9 # -0xE4DC 0x5DD6 # -0xE4DD 0x5EB5 # -0xE4DE 0x6697 # -0xE4DF 0x764C # -0xE4E0 0x83F4 # -0xE4E1 0x95C7 # -0xE4E2 0x58D3 # -0xE4E3 0x62BC # -0xE4E4 0x72CE # -0xE4E5 0x9D28 # -0xE4E6 0x4EF0 # -0xE4E7 0x592E # -0xE4E8 0x600F # -0xE4E9 0x663B # -0xE4EA 0x6B83 # -0xE4EB 0x79E7 # -0xE4EC 0x9D26 # -0xE4ED 0x5393 # -0xE4EE 0x54C0 # -0xE4EF 0x57C3 # -0xE4F0 0x5D16 # -0xE4F1 0x611B # -0xE4F2 0x66D6 # -0xE4F3 0x6DAF # -0xE4F4 0x788D # -0xE4F5 0x827E # -0xE4F6 0x9698 # -0xE4F7 0x9744 # -0xE4F8 0x5384 # -0xE4F9 0x627C # -0xE4FA 0x6396 # -0xE4FB 0x6DB2 # -0xE4FC 0x7E0A # -0xE4FD 0x814B # -0xE4FE 0x984D # -0xE5A1 0x6AFB # -0xE5A2 0x7F4C # -0xE5A3 0x9DAF # -0xE5A4 0x9E1A # -0xE5A5 0x4E5F # -0xE5A6 0x503B # -0xE5A7 0x51B6 # -0xE5A8 0x591C # -0xE5A9 0x60F9 # -0xE5AA 0x63F6 # -0xE5AB 0x6930 # -0xE5AC 0x723A # -0xE5AD 0x8036 # -0xE5AE 0xF974 # -0xE5AF 0x91CE # -0xE5B0 0x5F31 # -0xE5B1 0xF975 # -0xE5B2 0xF976 # -0xE5B3 0x7D04 # -0xE5B4 0x82E5 # -0xE5B5 0x846F # -0xE5B6 0x84BB # -0xE5B7 0x85E5 # -0xE5B8 0x8E8D # -0xE5B9 0xF977 # -0xE5BA 0x4F6F # -0xE5BB 0xF978 # -0xE5BC 0xF979 # -0xE5BD 0x58E4 # -0xE5BE 0x5B43 # -0xE5BF 0x6059 # -0xE5C0 0x63DA # -0xE5C1 0x6518 # -0xE5C2 0x656D # -0xE5C3 0x6698 # -0xE5C4 0xF97A # -0xE5C5 0x694A # -0xE5C6 0x6A23 # -0xE5C7 0x6D0B # -0xE5C8 0x7001 # -0xE5C9 0x716C # -0xE5CA 0x75D2 # -0xE5CB 0x760D # -0xE5CC 0x79B3 # -0xE5CD 0x7A70 # -0xE5CE 0xF97B # -0xE5CF 0x7F8A # -0xE5D0 0xF97C # -0xE5D1 0x8944 # -0xE5D2 0xF97D # -0xE5D3 0x8B93 # -0xE5D4 0x91C0 # -0xE5D5 0x967D # -0xE5D6 0xF97E # -0xE5D7 0x990A # -0xE5D8 0x5704 # -0xE5D9 0x5FA1 # -0xE5DA 0x65BC # -0xE5DB 0x6F01 # -0xE5DC 0x7600 # -0xE5DD 0x79A6 # -0xE5DE 0x8A9E # -0xE5DF 0x99AD # -0xE5E0 0x9B5A # -0xE5E1 0x9F6C # -0xE5E2 0x5104 # -0xE5E3 0x61B6 # -0xE5E4 0x6291 # -0xE5E5 0x6A8D # -0xE5E6 0x81C6 # -0xE5E7 0x5043 # -0xE5E8 0x5830 # -0xE5E9 0x5F66 # -0xE5EA 0x7109 # -0xE5EB 0x8A00 # -0xE5EC 0x8AFA # -0xE5ED 0x5B7C # -0xE5EE 0x8616 # -0xE5EF 0x4FFA # -0xE5F0 0x513C # -0xE5F1 0x56B4 # -0xE5F2 0x5944 # -0xE5F3 0x63A9 # -0xE5F4 0x6DF9 # -0xE5F5 0x5DAA # -0xE5F6 0x696D # -0xE5F7 0x5186 # -0xE5F8 0x4E88 # -0xE5F9 0x4F59 # -0xE5FA 0xF97F # -0xE5FB 0xF980 # -0xE5FC 0xF981 # -0xE5FD 0x5982 # -0xE5FE 0xF982 # -0xE6A1 0xF983 # -0xE6A2 0x6B5F # -0xE6A3 0x6C5D # -0xE6A4 0xF984 # -0xE6A5 0x74B5 # -0xE6A6 0x7916 # -0xE6A7 0xF985 # -0xE6A8 0x8207 # -0xE6A9 0x8245 # -0xE6AA 0x8339 # -0xE6AB 0x8F3F # -0xE6AC 0x8F5D # -0xE6AD 0xF986 # -0xE6AE 0x9918 # -0xE6AF 0xF987 # -0xE6B0 0xF988 # -0xE6B1 0xF989 # -0xE6B2 0x4EA6 # -0xE6B3 0xF98A # -0xE6B4 0x57DF # -0xE6B5 0x5F79 # -0xE6B6 0x6613 # -0xE6B7 0xF98B # -0xE6B8 0xF98C # -0xE6B9 0x75AB # -0xE6BA 0x7E79 # -0xE6BB 0x8B6F # -0xE6BC 0xF98D # -0xE6BD 0x9006 # -0xE6BE 0x9A5B # -0xE6BF 0x56A5 # -0xE6C0 0x5827 # -0xE6C1 0x59F8 # -0xE6C2 0x5A1F # -0xE6C3 0x5BB4 # -0xE6C4 0xF98E # -0xE6C5 0x5EF6 # -0xE6C6 0xF98F # -0xE6C7 0xF990 # -0xE6C8 0x6350 # -0xE6C9 0x633B # -0xE6CA 0xF991 # -0xE6CB 0x693D # -0xE6CC 0x6C87 # -0xE6CD 0x6CBF # -0xE6CE 0x6D8E # -0xE6CF 0x6D93 # -0xE6D0 0x6DF5 # -0xE6D1 0x6F14 # -0xE6D2 0xF992 # -0xE6D3 0x70DF # -0xE6D4 0x7136 # -0xE6D5 0x7159 # -0xE6D6 0xF993 # -0xE6D7 0x71C3 # -0xE6D8 0x71D5 # -0xE6D9 0xF994 # -0xE6DA 0x784F # -0xE6DB 0x786F # -0xE6DC 0xF995 # -0xE6DD 0x7B75 # -0xE6DE 0x7DE3 # -0xE6DF 0xF996 # -0xE6E0 0x7E2F # -0xE6E1 0xF997 # -0xE6E2 0x884D # -0xE6E3 0x8EDF # -0xE6E4 0xF998 # -0xE6E5 0xF999 # -0xE6E6 0xF99A # -0xE6E7 0x925B # -0xE6E8 0xF99B # -0xE6E9 0x9CF6 # -0xE6EA 0xF99C # -0xE6EB 0xF99D # -0xE6EC 0xF99E # -0xE6ED 0x6085 # -0xE6EE 0x6D85 # -0xE6EF 0xF99F # -0xE6F0 0x71B1 # -0xE6F1 0xF9A0 # -0xE6F2 0xF9A1 # -0xE6F3 0x95B1 # -0xE6F4 0x53AD # -0xE6F5 0xF9A2 # -0xE6F6 0xF9A3 # -0xE6F7 0xF9A4 # -0xE6F8 0x67D3 # -0xE6F9 0xF9A5 # -0xE6FA 0x708E # -0xE6FB 0x7130 # -0xE6FC 0x7430 # -0xE6FD 0x8276 # -0xE6FE 0x82D2 # -0xE7A1 0xF9A6 # -0xE7A2 0x95BB # -0xE7A3 0x9AE5 # -0xE7A4 0x9E7D # -0xE7A5 0x66C4 # -0xE7A6 0xF9A7 # -0xE7A7 0x71C1 # -0xE7A8 0x8449 # -0xE7A9 0xF9A8 # -0xE7AA 0xF9A9 # -0xE7AB 0x584B # -0xE7AC 0xF9AA # -0xE7AD 0xF9AB # -0xE7AE 0x5DB8 # -0xE7AF 0x5F71 # -0xE7B0 0xF9AC # -0xE7B1 0x6620 # -0xE7B2 0x668E # -0xE7B3 0x6979 # -0xE7B4 0x69AE # -0xE7B5 0x6C38 # -0xE7B6 0x6CF3 # -0xE7B7 0x6E36 # -0xE7B8 0x6F41 # -0xE7B9 0x6FDA # -0xE7BA 0x701B # -0xE7BB 0x702F # -0xE7BC 0x7150 # -0xE7BD 0x71DF # -0xE7BE 0x7370 # -0xE7BF 0xF9AD # -0xE7C0 0x745B # -0xE7C1 0xF9AE # -0xE7C2 0x74D4 # -0xE7C3 0x76C8 # -0xE7C4 0x7A4E # -0xE7C5 0x7E93 # -0xE7C6 0xF9AF # -0xE7C7 0xF9B0 # -0xE7C8 0x82F1 # -0xE7C9 0x8A60 # -0xE7CA 0x8FCE # -0xE7CB 0xF9B1 # -0xE7CC 0x9348 # -0xE7CD 0xF9B2 # -0xE7CE 0x9719 # -0xE7CF 0xF9B3 # -0xE7D0 0xF9B4 # -0xE7D1 0x4E42 # -0xE7D2 0x502A # -0xE7D3 0xF9B5 # -0xE7D4 0x5208 # -0xE7D5 0x53E1 # -0xE7D6 0x66F3 # -0xE7D7 0x6C6D # -0xE7D8 0x6FCA # -0xE7D9 0x730A # -0xE7DA 0x777F # -0xE7DB 0x7A62 # -0xE7DC 0x82AE # -0xE7DD 0x85DD # -0xE7DE 0x8602 # -0xE7DF 0xF9B6 # -0xE7E0 0x88D4 # -0xE7E1 0x8A63 # -0xE7E2 0x8B7D # -0xE7E3 0x8C6B # -0xE7E4 0xF9B7 # -0xE7E5 0x92B3 # -0xE7E6 0xF9B8 # -0xE7E7 0x9713 # -0xE7E8 0x9810 # -0xE7E9 0x4E94 # -0xE7EA 0x4F0D # -0xE7EB 0x4FC9 # -0xE7EC 0x50B2 # -0xE7ED 0x5348 # -0xE7EE 0x543E # -0xE7EF 0x5433 # -0xE7F0 0x55DA # -0xE7F1 0x5862 # -0xE7F2 0x58BA # -0xE7F3 0x5967 # -0xE7F4 0x5A1B # -0xE7F5 0x5BE4 # -0xE7F6 0x609F # -0xE7F7 0xF9B9 # -0xE7F8 0x61CA # -0xE7F9 0x6556 # -0xE7FA 0x65FF # -0xE7FB 0x6664 # -0xE7FC 0x68A7 # -0xE7FD 0x6C5A # -0xE7FE 0x6FB3 # -0xE8A1 0x70CF # -0xE8A2 0x71AC # -0xE8A3 0x7352 # -0xE8A4 0x7B7D # -0xE8A5 0x8708 # -0xE8A6 0x8AA4 # -0xE8A7 0x9C32 # -0xE8A8 0x9F07 # -0xE8A9 0x5C4B # -0xE8AA 0x6C83 # -0xE8AB 0x7344 # -0xE8AC 0x7389 # -0xE8AD 0x923A # -0xE8AE 0x6EAB # -0xE8AF 0x7465 # -0xE8B0 0x761F # -0xE8B1 0x7A69 # -0xE8B2 0x7E15 # -0xE8B3 0x860A # -0xE8B4 0x5140 # -0xE8B5 0x58C5 # -0xE8B6 0x64C1 # -0xE8B7 0x74EE # -0xE8B8 0x7515 # -0xE8B9 0x7670 # -0xE8BA 0x7FC1 # -0xE8BB 0x9095 # -0xE8BC 0x96CD # -0xE8BD 0x9954 # -0xE8BE 0x6E26 # -0xE8BF 0x74E6 # -0xE8C0 0x7AA9 # -0xE8C1 0x7AAA # -0xE8C2 0x81E5 # -0xE8C3 0x86D9 # -0xE8C4 0x8778 # -0xE8C5 0x8A1B # -0xE8C6 0x5A49 # -0xE8C7 0x5B8C # -0xE8C8 0x5B9B # -0xE8C9 0x68A1 # -0xE8CA 0x6900 # -0xE8CB 0x6D63 # -0xE8CC 0x73A9 # -0xE8CD 0x7413 # -0xE8CE 0x742C # -0xE8CF 0x7897 # -0xE8D0 0x7DE9 # -0xE8D1 0x7FEB # -0xE8D2 0x8118 # -0xE8D3 0x8155 # -0xE8D4 0x839E # -0xE8D5 0x8C4C # -0xE8D6 0x962E # -0xE8D7 0x9811 # -0xE8D8 0x66F0 # -0xE8D9 0x5F80 # -0xE8DA 0x65FA # -0xE8DB 0x6789 # -0xE8DC 0x6C6A # -0xE8DD 0x738B # -0xE8DE 0x502D # -0xE8DF 0x5A03 # -0xE8E0 0x6B6A # -0xE8E1 0x77EE # -0xE8E2 0x5916 # -0xE8E3 0x5D6C # -0xE8E4 0x5DCD # -0xE8E5 0x7325 # -0xE8E6 0x754F # -0xE8E7 0xF9BA # -0xE8E8 0xF9BB # -0xE8E9 0x50E5 # -0xE8EA 0x51F9 # -0xE8EB 0x582F # -0xE8EC 0x592D # -0xE8ED 0x5996 # -0xE8EE 0x59DA # -0xE8EF 0x5BE5 # -0xE8F0 0xF9BC # -0xE8F1 0xF9BD # -0xE8F2 0x5DA2 # -0xE8F3 0x62D7 # -0xE8F4 0x6416 # -0xE8F5 0x6493 # -0xE8F6 0x64FE # -0xE8F7 0xF9BE # -0xE8F8 0x66DC # -0xE8F9 0xF9BF # -0xE8FA 0x6A48 # -0xE8FB 0xF9C0 # -0xE8FC 0x71FF # -0xE8FD 0x7464 # -0xE8FE 0xF9C1 # -0xE9A1 0x7A88 # -0xE9A2 0x7AAF # -0xE9A3 0x7E47 # -0xE9A4 0x7E5E # -0xE9A5 0x8000 # -0xE9A6 0x8170 # -0xE9A7 0xF9C2 # -0xE9A8 0x87EF # -0xE9A9 0x8981 # -0xE9AA 0x8B20 # -0xE9AB 0x9059 # -0xE9AC 0xF9C3 # -0xE9AD 0x9080 # -0xE9AE 0x9952 # -0xE9AF 0x617E # -0xE9B0 0x6B32 # -0xE9B1 0x6D74 # -0xE9B2 0x7E1F # -0xE9B3 0x8925 # -0xE9B4 0x8FB1 # -0xE9B5 0x4FD1 # -0xE9B6 0x50AD # -0xE9B7 0x5197 # -0xE9B8 0x52C7 # -0xE9B9 0x57C7 # -0xE9BA 0x5889 # -0xE9BB 0x5BB9 # -0xE9BC 0x5EB8 # -0xE9BD 0x6142 # -0xE9BE 0x6995 # -0xE9BF 0x6D8C # -0xE9C0 0x6E67 # -0xE9C1 0x6EB6 # -0xE9C2 0x7194 # -0xE9C3 0x7462 # -0xE9C4 0x7528 # -0xE9C5 0x752C # -0xE9C6 0x8073 # -0xE9C7 0x8338 # -0xE9C8 0x84C9 # -0xE9C9 0x8E0A # -0xE9CA 0x9394 # -0xE9CB 0x93DE # -0xE9CC 0xF9C4 # -0xE9CD 0x4E8E # -0xE9CE 0x4F51 # -0xE9CF 0x5076 # -0xE9D0 0x512A # -0xE9D1 0x53C8 # -0xE9D2 0x53CB # -0xE9D3 0x53F3 # -0xE9D4 0x5B87 # -0xE9D5 0x5BD3 # -0xE9D6 0x5C24 # -0xE9D7 0x611A # -0xE9D8 0x6182 # -0xE9D9 0x65F4 # -0xE9DA 0x725B # -0xE9DB 0x7397 # -0xE9DC 0x7440 # -0xE9DD 0x76C2 # -0xE9DE 0x7950 # -0xE9DF 0x7991 # -0xE9E0 0x79B9 # -0xE9E1 0x7D06 # -0xE9E2 0x7FBD # -0xE9E3 0x828B # -0xE9E4 0x85D5 # -0xE9E5 0x865E # -0xE9E6 0x8FC2 # -0xE9E7 0x9047 # -0xE9E8 0x90F5 # -0xE9E9 0x91EA # -0xE9EA 0x9685 # -0xE9EB 0x96E8 # -0xE9EC 0x96E9 # -0xE9ED 0x52D6 # -0xE9EE 0x5F67 # -0xE9EF 0x65ED # -0xE9F0 0x6631 # -0xE9F1 0x682F # -0xE9F2 0x715C # -0xE9F3 0x7A36 # -0xE9F4 0x90C1 # -0xE9F5 0x980A # -0xE9F6 0x4E91 # -0xE9F7 0xF9C5 # -0xE9F8 0x6A52 # -0xE9F9 0x6B9E # -0xE9FA 0x6F90 # -0xE9FB 0x7189 # -0xE9FC 0x8018 # -0xE9FD 0x82B8 # -0xE9FE 0x8553 # -0xEAA1 0x904B # -0xEAA2 0x9695 # -0xEAA3 0x96F2 # -0xEAA4 0x97FB # -0xEAA5 0x851A # -0xEAA6 0x9B31 # -0xEAA7 0x4E90 # -0xEAA8 0x718A # -0xEAA9 0x96C4 # -0xEAAA 0x5143 # -0xEAAB 0x539F # -0xEAAC 0x54E1 # -0xEAAD 0x5713 # -0xEAAE 0x5712 # -0xEAAF 0x57A3 # -0xEAB0 0x5A9B # -0xEAB1 0x5AC4 # -0xEAB2 0x5BC3 # -0xEAB3 0x6028 # -0xEAB4 0x613F # -0xEAB5 0x63F4 # -0xEAB6 0x6C85 # -0xEAB7 0x6D39 # -0xEAB8 0x6E72 # -0xEAB9 0x6E90 # -0xEABA 0x7230 # -0xEABB 0x733F # -0xEABC 0x7457 # -0xEABD 0x82D1 # -0xEABE 0x8881 # -0xEABF 0x8F45 # -0xEAC0 0x9060 # -0xEAC1 0xF9C6 # -0xEAC2 0x9662 # -0xEAC3 0x9858 # -0xEAC4 0x9D1B # -0xEAC5 0x6708 # -0xEAC6 0x8D8A # -0xEAC7 0x925E # -0xEAC8 0x4F4D # -0xEAC9 0x5049 # -0xEACA 0x50DE # -0xEACB 0x5371 # -0xEACC 0x570D # -0xEACD 0x59D4 # -0xEACE 0x5A01 # -0xEACF 0x5C09 # -0xEAD0 0x6170 # -0xEAD1 0x6690 # -0xEAD2 0x6E2D # -0xEAD3 0x7232 # -0xEAD4 0x744B # -0xEAD5 0x7DEF # -0xEAD6 0x80C3 # -0xEAD7 0x840E # -0xEAD8 0x8466 # -0xEAD9 0x853F # -0xEADA 0x875F # -0xEADB 0x885B # -0xEADC 0x8918 # -0xEADD 0x8B02 # -0xEADE 0x9055 # -0xEADF 0x97CB # -0xEAE0 0x9B4F # -0xEAE1 0x4E73 # -0xEAE2 0x4F91 # -0xEAE3 0x5112 # -0xEAE4 0x516A # -0xEAE5 0xF9C7 # -0xEAE6 0x552F # -0xEAE7 0x55A9 # -0xEAE8 0x5B7A # -0xEAE9 0x5BA5 # -0xEAEA 0x5E7C # -0xEAEB 0x5E7D # -0xEAEC 0x5EBE # -0xEAED 0x60A0 # -0xEAEE 0x60DF # -0xEAEF 0x6108 # -0xEAF0 0x6109 # -0xEAF1 0x63C4 # -0xEAF2 0x6538 # -0xEAF3 0x6709 # -0xEAF4 0xF9C8 # -0xEAF5 0x67D4 # -0xEAF6 0x67DA # -0xEAF7 0xF9C9 # -0xEAF8 0x6961 # -0xEAF9 0x6962 # -0xEAFA 0x6CB9 # -0xEAFB 0x6D27 # -0xEAFC 0xF9CA # -0xEAFD 0x6E38 # -0xEAFE 0xF9CB # -0xEBA1 0x6FE1 # -0xEBA2 0x7336 # -0xEBA3 0x7337 # -0xEBA4 0xF9CC # -0xEBA5 0x745C # -0xEBA6 0x7531 # -0xEBA7 0xF9CD # -0xEBA8 0x7652 # -0xEBA9 0xF9CE # -0xEBAA 0xF9CF # -0xEBAB 0x7DAD # -0xEBAC 0x81FE # -0xEBAD 0x8438 # -0xEBAE 0x88D5 # -0xEBAF 0x8A98 # -0xEBB0 0x8ADB # -0xEBB1 0x8AED # -0xEBB2 0x8E30 # -0xEBB3 0x8E42 # -0xEBB4 0x904A # -0xEBB5 0x903E # -0xEBB6 0x907A # -0xEBB7 0x9149 # -0xEBB8 0x91C9 # -0xEBB9 0x936E # -0xEBBA 0xF9D0 # -0xEBBB 0xF9D1 # -0xEBBC 0x5809 # -0xEBBD 0xF9D2 # -0xEBBE 0x6BD3 # -0xEBBF 0x8089 # -0xEBC0 0x80B2 # -0xEBC1 0xF9D3 # -0xEBC2 0xF9D4 # -0xEBC3 0x5141 # -0xEBC4 0x596B # -0xEBC5 0x5C39 # -0xEBC6 0xF9D5 # -0xEBC7 0xF9D6 # -0xEBC8 0x6F64 # -0xEBC9 0x73A7 # -0xEBCA 0x80E4 # -0xEBCB 0x8D07 # -0xEBCC 0xF9D7 # -0xEBCD 0x9217 # -0xEBCE 0x958F # -0xEBCF 0xF9D8 # -0xEBD0 0xF9D9 # -0xEBD1 0xF9DA # -0xEBD2 0xF9DB # -0xEBD3 0x807F # -0xEBD4 0x620E # -0xEBD5 0x701C # -0xEBD6 0x7D68 # -0xEBD7 0x878D # -0xEBD8 0xF9DC # -0xEBD9 0x57A0 # -0xEBDA 0x6069 # -0xEBDB 0x6147 # -0xEBDC 0x6BB7 # -0xEBDD 0x8ABE # -0xEBDE 0x9280 # -0xEBDF 0x96B1 # -0xEBE0 0x4E59 # -0xEBE1 0x541F # -0xEBE2 0x6DEB # -0xEBE3 0x852D # -0xEBE4 0x9670 # -0xEBE5 0x97F3 # -0xEBE6 0x98EE # -0xEBE7 0x63D6 # -0xEBE8 0x6CE3 # -0xEBE9 0x9091 # -0xEBEA 0x51DD # -0xEBEB 0x61C9 # -0xEBEC 0x81BA # -0xEBED 0x9DF9 # -0xEBEE 0x4F9D # -0xEBEF 0x501A # -0xEBF0 0x5100 # -0xEBF1 0x5B9C # -0xEBF2 0x610F # -0xEBF3 0x61FF # -0xEBF4 0x64EC # -0xEBF5 0x6905 # -0xEBF6 0x6BC5 # -0xEBF7 0x7591 # -0xEBF8 0x77E3 # -0xEBF9 0x7FA9 # -0xEBFA 0x8264 # -0xEBFB 0x858F # -0xEBFC 0x87FB # -0xEBFD 0x8863 # -0xEBFE 0x8ABC # -0xECA1 0x8B70 # -0xECA2 0x91AB # -0xECA3 0x4E8C # -0xECA4 0x4EE5 # -0xECA5 0x4F0A # -0xECA6 0xF9DD # -0xECA7 0xF9DE # -0xECA8 0x5937 # -0xECA9 0x59E8 # -0xECAA 0xF9DF # -0xECAB 0x5DF2 # -0xECAC 0x5F1B # -0xECAD 0x5F5B # -0xECAE 0x6021 # -0xECAF 0xF9E0 # -0xECB0 0xF9E1 # -0xECB1 0xF9E2 # -0xECB2 0xF9E3 # -0xECB3 0x723E # -0xECB4 0x73E5 # -0xECB5 0xF9E4 # -0xECB6 0x7570 # -0xECB7 0x75CD # -0xECB8 0xF9E5 # -0xECB9 0x79FB # -0xECBA 0xF9E6 # -0xECBB 0x800C # -0xECBC 0x8033 # -0xECBD 0x8084 # -0xECBE 0x82E1 # -0xECBF 0x8351 # -0xECC0 0xF9E7 # -0xECC1 0xF9E8 # -0xECC2 0x8CBD # -0xECC3 0x8CB3 # -0xECC4 0x9087 # -0xECC5 0xF9E9 # -0xECC6 0xF9EA # -0xECC7 0x98F4 # -0xECC8 0x990C # -0xECC9 0xF9EB # -0xECCA 0xF9EC # -0xECCB 0x7037 # -0xECCC 0x76CA # -0xECCD 0x7FCA # -0xECCE 0x7FCC # -0xECCF 0x7FFC # -0xECD0 0x8B1A # -0xECD1 0x4EBA # -0xECD2 0x4EC1 # -0xECD3 0x5203 # -0xECD4 0x5370 # -0xECD5 0xF9ED # -0xECD6 0x54BD # -0xECD7 0x56E0 # -0xECD8 0x59FB # -0xECD9 0x5BC5 # -0xECDA 0x5F15 # -0xECDB 0x5FCD # -0xECDC 0x6E6E # -0xECDD 0xF9EE # -0xECDE 0xF9EF # -0xECDF 0x7D6A # -0xECE0 0x8335 # -0xECE1 0xF9F0 # -0xECE2 0x8693 # -0xECE3 0x8A8D # -0xECE4 0xF9F1 # -0xECE5 0x976D # -0xECE6 0x9777 # -0xECE7 0xF9F2 # -0xECE8 0xF9F3 # -0xECE9 0x4E00 # -0xECEA 0x4F5A # -0xECEB 0x4F7E # -0xECEC 0x58F9 # -0xECED 0x65E5 # -0xECEE 0x6EA2 # -0xECEF 0x9038 # -0xECF0 0x93B0 # -0xECF1 0x99B9 # -0xECF2 0x4EFB # -0xECF3 0x58EC # -0xECF4 0x598A # -0xECF5 0x59D9 # -0xECF6 0x6041 # -0xECF7 0xF9F4 # -0xECF8 0xF9F5 # -0xECF9 0x7A14 # -0xECFA 0xF9F6 # -0xECFB 0x834F # -0xECFC 0x8CC3 # -0xECFD 0x5165 # -0xECFE 0x5344 # -0xEDA1 0xF9F7 # -0xEDA2 0xF9F8 # -0xEDA3 0xF9F9 # -0xEDA4 0x4ECD # -0xEDA5 0x5269 # -0xEDA6 0x5B55 # -0xEDA7 0x82BF # -0xEDA8 0x4ED4 # -0xEDA9 0x523A # -0xEDAA 0x54A8 # -0xEDAB 0x59C9 # -0xEDAC 0x59FF # -0xEDAD 0x5B50 # -0xEDAE 0x5B57 # -0xEDAF 0x5B5C # -0xEDB0 0x6063 # -0xEDB1 0x6148 # -0xEDB2 0x6ECB # -0xEDB3 0x7099 # -0xEDB4 0x716E # -0xEDB5 0x7386 # -0xEDB6 0x74F7 # -0xEDB7 0x75B5 # -0xEDB8 0x78C1 # -0xEDB9 0x7D2B # -0xEDBA 0x8005 # -0xEDBB 0x81EA # -0xEDBC 0x8328 # -0xEDBD 0x8517 # -0xEDBE 0x85C9 # -0xEDBF 0x8AEE # -0xEDC0 0x8CC7 # -0xEDC1 0x96CC # -0xEDC2 0x4F5C # -0xEDC3 0x52FA # -0xEDC4 0x56BC # -0xEDC5 0x65AB # -0xEDC6 0x6628 # -0xEDC7 0x707C # -0xEDC8 0x70B8 # -0xEDC9 0x7235 # -0xEDCA 0x7DBD # -0xEDCB 0x828D # -0xEDCC 0x914C # -0xEDCD 0x96C0 # -0xEDCE 0x9D72 # -0xEDCF 0x5B71 # -0xEDD0 0x68E7 # -0xEDD1 0x6B98 # -0xEDD2 0x6F7A # -0xEDD3 0x76DE # -0xEDD4 0x5C91 # -0xEDD5 0x66AB # -0xEDD6 0x6F5B # -0xEDD7 0x7BB4 # -0xEDD8 0x7C2A # -0xEDD9 0x8836 # -0xEDDA 0x96DC # -0xEDDB 0x4E08 # -0xEDDC 0x4ED7 # -0xEDDD 0x5320 # -0xEDDE 0x5834 # -0xEDDF 0x58BB # -0xEDE0 0x58EF # -0xEDE1 0x596C # -0xEDE2 0x5C07 # -0xEDE3 0x5E33 # -0xEDE4 0x5E84 # -0xEDE5 0x5F35 # -0xEDE6 0x638C # -0xEDE7 0x66B2 # -0xEDE8 0x6756 # -0xEDE9 0x6A1F # -0xEDEA 0x6AA3 # -0xEDEB 0x6B0C # -0xEDEC 0x6F3F # -0xEDED 0x7246 # -0xEDEE 0xF9FA # -0xEDEF 0x7350 # -0xEDF0 0x748B # -0xEDF1 0x7AE0 # -0xEDF2 0x7CA7 # -0xEDF3 0x8178 # -0xEDF4 0x81DF # -0xEDF5 0x81E7 # -0xEDF6 0x838A # -0xEDF7 0x846C # -0xEDF8 0x8523 # -0xEDF9 0x8594 # -0xEDFA 0x85CF # -0xEDFB 0x88DD # -0xEDFC 0x8D13 # -0xEDFD 0x91AC # -0xEDFE 0x9577 # -0xEEA1 0x969C # -0xEEA2 0x518D # -0xEEA3 0x54C9 # -0xEEA4 0x5728 # -0xEEA5 0x5BB0 # -0xEEA6 0x624D # -0xEEA7 0x6750 # -0xEEA8 0x683D # -0xEEA9 0x6893 # -0xEEAA 0x6E3D # -0xEEAB 0x6ED3 # -0xEEAC 0x707D # -0xEEAD 0x7E21 # -0xEEAE 0x88C1 # -0xEEAF 0x8CA1 # -0xEEB0 0x8F09 # -0xEEB1 0x9F4B # -0xEEB2 0x9F4E # -0xEEB3 0x722D # -0xEEB4 0x7B8F # -0xEEB5 0x8ACD # -0xEEB6 0x931A # -0xEEB7 0x4F47 # -0xEEB8 0x4F4E # -0xEEB9 0x5132 # -0xEEBA 0x5480 # -0xEEBB 0x59D0 # -0xEEBC 0x5E95 # -0xEEBD 0x62B5 # -0xEEBE 0x6775 # -0xEEBF 0x696E # -0xEEC0 0x6A17 # -0xEEC1 0x6CAE # -0xEEC2 0x6E1A # -0xEEC3 0x72D9 # -0xEEC4 0x732A # -0xEEC5 0x75BD # -0xEEC6 0x7BB8 # -0xEEC7 0x7D35 # -0xEEC8 0x82E7 # -0xEEC9 0x83F9 # -0xEECA 0x8457 # -0xEECB 0x85F7 # -0xEECC 0x8A5B # -0xEECD 0x8CAF # -0xEECE 0x8E87 # -0xEECF 0x9019 # -0xEED0 0x90B8 # -0xEED1 0x96CE # -0xEED2 0x9F5F # -0xEED3 0x52E3 # -0xEED4 0x540A # -0xEED5 0x5AE1 # -0xEED6 0x5BC2 # -0xEED7 0x6458 # -0xEED8 0x6575 # -0xEED9 0x6EF4 # -0xEEDA 0x72C4 # -0xEEDB 0xF9FB # -0xEEDC 0x7684 # -0xEEDD 0x7A4D # -0xEEDE 0x7B1B # -0xEEDF 0x7C4D # -0xEEE0 0x7E3E # -0xEEE1 0x7FDF # -0xEEE2 0x837B # -0xEEE3 0x8B2B # -0xEEE4 0x8CCA # -0xEEE5 0x8D64 # -0xEEE6 0x8DE1 # -0xEEE7 0x8E5F # -0xEEE8 0x8FEA # -0xEEE9 0x8FF9 # -0xEEEA 0x9069 # -0xEEEB 0x93D1 # -0xEEEC 0x4F43 # -0xEEED 0x4F7A # -0xEEEE 0x50B3 # -0xEEEF 0x5168 # -0xEEF0 0x5178 # -0xEEF1 0x524D # -0xEEF2 0x526A # -0xEEF3 0x5861 # -0xEEF4 0x587C # -0xEEF5 0x5960 # -0xEEF6 0x5C08 # -0xEEF7 0x5C55 # -0xEEF8 0x5EDB # -0xEEF9 0x609B # -0xEEFA 0x6230 # -0xEEFB 0x6813 # -0xEEFC 0x6BBF # -0xEEFD 0x6C08 # -0xEEFE 0x6FB1 # -0xEFA1 0x714E # -0xEFA2 0x7420 # -0xEFA3 0x7530 # -0xEFA4 0x7538 # -0xEFA5 0x7551 # -0xEFA6 0x7672 # -0xEFA7 0x7B4C # -0xEFA8 0x7B8B # -0xEFA9 0x7BAD # -0xEFAA 0x7BC6 # -0xEFAB 0x7E8F # -0xEFAC 0x8A6E # -0xEFAD 0x8F3E # -0xEFAE 0x8F49 # -0xEFAF 0x923F # -0xEFB0 0x9293 # -0xEFB1 0x9322 # -0xEFB2 0x942B # -0xEFB3 0x96FB # -0xEFB4 0x985A # -0xEFB5 0x986B # -0xEFB6 0x991E # -0xEFB7 0x5207 # -0xEFB8 0x622A # -0xEFB9 0x6298 # -0xEFBA 0x6D59 # -0xEFBB 0x7664 # -0xEFBC 0x7ACA # -0xEFBD 0x7BC0 # -0xEFBE 0x7D76 # -0xEFBF 0x5360 # -0xEFC0 0x5CBE # -0xEFC1 0x5E97 # -0xEFC2 0x6F38 # -0xEFC3 0x70B9 # -0xEFC4 0x7C98 # -0xEFC5 0x9711 # -0xEFC6 0x9B8E # -0xEFC7 0x9EDE # -0xEFC8 0x63A5 # -0xEFC9 0x647A # -0xEFCA 0x8776 # -0xEFCB 0x4E01 # -0xEFCC 0x4E95 # -0xEFCD 0x4EAD # -0xEFCE 0x505C # -0xEFCF 0x5075 # -0xEFD0 0x5448 # -0xEFD1 0x59C3 # -0xEFD2 0x5B9A # -0xEFD3 0x5E40 # -0xEFD4 0x5EAD # -0xEFD5 0x5EF7 # -0xEFD6 0x5F81 # -0xEFD7 0x60C5 # -0xEFD8 0x633A # -0xEFD9 0x653F # -0xEFDA 0x6574 # -0xEFDB 0x65CC # -0xEFDC 0x6676 # -0xEFDD 0x6678 # -0xEFDE 0x67FE # -0xEFDF 0x6968 # -0xEFE0 0x6A89 # -0xEFE1 0x6B63 # -0xEFE2 0x6C40 # -0xEFE3 0x6DC0 # -0xEFE4 0x6DE8 # -0xEFE5 0x6E1F # -0xEFE6 0x6E5E # -0xEFE7 0x701E # -0xEFE8 0x70A1 # -0xEFE9 0x738E # -0xEFEA 0x73FD # -0xEFEB 0x753A # -0xEFEC 0x775B # -0xEFED 0x7887 # -0xEFEE 0x798E # -0xEFEF 0x7A0B # -0xEFF0 0x7A7D # -0xEFF1 0x7CBE # -0xEFF2 0x7D8E # -0xEFF3 0x8247 # -0xEFF4 0x8A02 # -0xEFF5 0x8AEA # -0xEFF6 0x8C9E # -0xEFF7 0x912D # -0xEFF8 0x914A # -0xEFF9 0x91D8 # -0xEFFA 0x9266 # -0xEFFB 0x92CC # -0xEFFC 0x9320 # -0xEFFD 0x9706 # -0xEFFE 0x9756 # -0xF0A1 0x975C # -0xF0A2 0x9802 # -0xF0A3 0x9F0E # -0xF0A4 0x5236 # -0xF0A5 0x5291 # -0xF0A6 0x557C # -0xF0A7 0x5824 # -0xF0A8 0x5E1D # -0xF0A9 0x5F1F # -0xF0AA 0x608C # -0xF0AB 0x63D0 # -0xF0AC 0x68AF # -0xF0AD 0x6FDF # -0xF0AE 0x796D # -0xF0AF 0x7B2C # -0xF0B0 0x81CD # -0xF0B1 0x85BA # -0xF0B2 0x88FD # -0xF0B3 0x8AF8 # -0xF0B4 0x8E44 # -0xF0B5 0x918D # -0xF0B6 0x9664 # -0xF0B7 0x969B # -0xF0B8 0x973D # -0xF0B9 0x984C # -0xF0BA 0x9F4A # -0xF0BB 0x4FCE # -0xF0BC 0x5146 # -0xF0BD 0x51CB # -0xF0BE 0x52A9 # -0xF0BF 0x5632 # -0xF0C0 0x5F14 # -0xF0C1 0x5F6B # -0xF0C2 0x63AA # -0xF0C3 0x64CD # -0xF0C4 0x65E9 # -0xF0C5 0x6641 # -0xF0C6 0x66FA # -0xF0C7 0x66F9 # -0xF0C8 0x671D # -0xF0C9 0x689D # -0xF0CA 0x68D7 # -0xF0CB 0x69FD # -0xF0CC 0x6F15 # -0xF0CD 0x6F6E # -0xF0CE 0x7167 # -0xF0CF 0x71E5 # -0xF0D0 0x722A # -0xF0D1 0x74AA # -0xF0D2 0x773A # -0xF0D3 0x7956 # -0xF0D4 0x795A # -0xF0D5 0x79DF # -0xF0D6 0x7A20 # -0xF0D7 0x7A95 # -0xF0D8 0x7C97 # -0xF0D9 0x7CDF # -0xF0DA 0x7D44 # -0xF0DB 0x7E70 # -0xF0DC 0x8087 # -0xF0DD 0x85FB # -0xF0DE 0x86A4 # -0xF0DF 0x8A54 # -0xF0E0 0x8ABF # -0xF0E1 0x8D99 # -0xF0E2 0x8E81 # -0xF0E3 0x9020 # -0xF0E4 0x906D # -0xF0E5 0x91E3 # -0xF0E6 0x963B # -0xF0E7 0x96D5 # -0xF0E8 0x9CE5 # -0xF0E9 0x65CF # -0xF0EA 0x7C07 # -0xF0EB 0x8DB3 # -0xF0EC 0x93C3 # -0xF0ED 0x5B58 # -0xF0EE 0x5C0A # -0xF0EF 0x5352 # -0xF0F0 0x62D9 # -0xF0F1 0x731D # -0xF0F2 0x5027 # -0xF0F3 0x5B97 # -0xF0F4 0x5F9E # -0xF0F5 0x60B0 # -0xF0F6 0x616B # -0xF0F7 0x68D5 # -0xF0F8 0x6DD9 # -0xF0F9 0x742E # -0xF0FA 0x7A2E # -0xF0FB 0x7D42 # -0xF0FC 0x7D9C # -0xF0FD 0x7E31 # -0xF0FE 0x816B # -0xF1A1 0x8E2A # -0xF1A2 0x8E35 # -0xF1A3 0x937E # -0xF1A4 0x9418 # -0xF1A5 0x4F50 # -0xF1A6 0x5750 # -0xF1A7 0x5DE6 # -0xF1A8 0x5EA7 # -0xF1A9 0x632B # -0xF1AA 0x7F6A # -0xF1AB 0x4E3B # -0xF1AC 0x4F4F # -0xF1AD 0x4F8F # -0xF1AE 0x505A # -0xF1AF 0x59DD # -0xF1B0 0x80C4 # -0xF1B1 0x546A # -0xF1B2 0x5468 # -0xF1B3 0x55FE # -0xF1B4 0x594F # -0xF1B5 0x5B99 # -0xF1B6 0x5DDE # -0xF1B7 0x5EDA # -0xF1B8 0x665D # -0xF1B9 0x6731 # -0xF1BA 0x67F1 # -0xF1BB 0x682A # -0xF1BC 0x6CE8 # -0xF1BD 0x6D32 # -0xF1BE 0x6E4A # -0xF1BF 0x6F8D # -0xF1C0 0x70B7 # -0xF1C1 0x73E0 # -0xF1C2 0x7587 # -0xF1C3 0x7C4C # -0xF1C4 0x7D02 # -0xF1C5 0x7D2C # -0xF1C6 0x7DA2 # -0xF1C7 0x821F # -0xF1C8 0x86DB # -0xF1C9 0x8A3B # -0xF1CA 0x8A85 # -0xF1CB 0x8D70 # -0xF1CC 0x8E8A # -0xF1CD 0x8F33 # -0xF1CE 0x9031 # -0xF1CF 0x914E # -0xF1D0 0x9152 # -0xF1D1 0x9444 # -0xF1D2 0x99D0 # -0xF1D3 0x7AF9 # -0xF1D4 0x7CA5 # -0xF1D5 0x4FCA # -0xF1D6 0x5101 # -0xF1D7 0x51C6 # -0xF1D8 0x57C8 # -0xF1D9 0x5BEF # -0xF1DA 0x5CFB # -0xF1DB 0x6659 # -0xF1DC 0x6A3D # -0xF1DD 0x6D5A # -0xF1DE 0x6E96 # -0xF1DF 0x6FEC # -0xF1E0 0x710C # -0xF1E1 0x756F # -0xF1E2 0x7AE3 # -0xF1E3 0x8822 # -0xF1E4 0x9021 # -0xF1E5 0x9075 # -0xF1E6 0x96CB # -0xF1E7 0x99FF # -0xF1E8 0x8301 # -0xF1E9 0x4E2D # -0xF1EA 0x4EF2 # -0xF1EB 0x8846 # -0xF1EC 0x91CD # -0xF1ED 0x537D # -0xF1EE 0x6ADB # -0xF1EF 0x696B # -0xF1F0 0x6C41 # -0xF1F1 0x847A # -0xF1F2 0x589E # -0xF1F3 0x618E # -0xF1F4 0x66FE # -0xF1F5 0x62EF # -0xF1F6 0x70DD # -0xF1F7 0x7511 # -0xF1F8 0x75C7 # -0xF1F9 0x7E52 # -0xF1FA 0x84B8 # -0xF1FB 0x8B49 # -0xF1FC 0x8D08 # -0xF1FD 0x4E4B # -0xF1FE 0x53EA # -0xF2A1 0x54AB # -0xF2A2 0x5730 # -0xF2A3 0x5740 # -0xF2A4 0x5FD7 # -0xF2A5 0x6301 # -0xF2A6 0x6307 # -0xF2A7 0x646F # -0xF2A8 0x652F # -0xF2A9 0x65E8 # -0xF2AA 0x667A # -0xF2AB 0x679D # -0xF2AC 0x67B3 # -0xF2AD 0x6B62 # -0xF2AE 0x6C60 # -0xF2AF 0x6C9A # -0xF2B0 0x6F2C # -0xF2B1 0x77E5 # -0xF2B2 0x7825 # -0xF2B3 0x7949 # -0xF2B4 0x7957 # -0xF2B5 0x7D19 # -0xF2B6 0x80A2 # -0xF2B7 0x8102 # -0xF2B8 0x81F3 # -0xF2B9 0x829D # -0xF2BA 0x82B7 # -0xF2BB 0x8718 # -0xF2BC 0x8A8C # -0xF2BD 0xF9FC # -0xF2BE 0x8D04 # -0xF2BF 0x8DBE # -0xF2C0 0x9072 # -0xF2C1 0x76F4 # -0xF2C2 0x7A19 # -0xF2C3 0x7A37 # -0xF2C4 0x7E54 # -0xF2C5 0x8077 # -0xF2C6 0x5507 # -0xF2C7 0x55D4 # -0xF2C8 0x5875 # -0xF2C9 0x632F # -0xF2CA 0x6422 # -0xF2CB 0x6649 # -0xF2CC 0x664B # -0xF2CD 0x686D # -0xF2CE 0x699B # -0xF2CF 0x6B84 # -0xF2D0 0x6D25 # -0xF2D1 0x6EB1 # -0xF2D2 0x73CD # -0xF2D3 0x7468 # -0xF2D4 0x74A1 # -0xF2D5 0x755B # -0xF2D6 0x75B9 # -0xF2D7 0x76E1 # -0xF2D8 0x771E # -0xF2D9 0x778B # -0xF2DA 0x79E6 # -0xF2DB 0x7E09 # -0xF2DC 0x7E1D # -0xF2DD 0x81FB # -0xF2DE 0x852F # -0xF2DF 0x8897 # -0xF2E0 0x8A3A # -0xF2E1 0x8CD1 # -0xF2E2 0x8EEB # -0xF2E3 0x8FB0 # -0xF2E4 0x9032 # -0xF2E5 0x93AD # -0xF2E6 0x9663 # -0xF2E7 0x9673 # -0xF2E8 0x9707 # -0xF2E9 0x4F84 # -0xF2EA 0x53F1 # -0xF2EB 0x59EA # -0xF2EC 0x5AC9 # -0xF2ED 0x5E19 # -0xF2EE 0x684E # -0xF2EF 0x74C6 # -0xF2F0 0x75BE # -0xF2F1 0x79E9 # -0xF2F2 0x7A92 # -0xF2F3 0x81A3 # -0xF2F4 0x86ED # -0xF2F5 0x8CEA # -0xF2F6 0x8DCC # -0xF2F7 0x8FED # -0xF2F8 0x659F # -0xF2F9 0x6715 # -0xF2FA 0xF9FD # -0xF2FB 0x57F7 # -0xF2FC 0x6F57 # -0xF2FD 0x7DDD # -0xF2FE 0x8F2F # -0xF3A1 0x93F6 # -0xF3A2 0x96C6 # -0xF3A3 0x5FB5 # -0xF3A4 0x61F2 # -0xF3A5 0x6F84 # -0xF3A6 0x4E14 # -0xF3A7 0x4F98 # -0xF3A8 0x501F # -0xF3A9 0x53C9 # -0xF3AA 0x55DF # -0xF3AB 0x5D6F # -0xF3AC 0x5DEE # -0xF3AD 0x6B21 # -0xF3AE 0x6B64 # -0xF3AF 0x78CB # -0xF3B0 0x7B9A # -0xF3B1 0xF9FE # -0xF3B2 0x8E49 # -0xF3B3 0x8ECA # -0xF3B4 0x906E # -0xF3B5 0x6349 # -0xF3B6 0x643E # -0xF3B7 0x7740 # -0xF3B8 0x7A84 # -0xF3B9 0x932F # -0xF3BA 0x947F # -0xF3BB 0x9F6A # -0xF3BC 0x64B0 # -0xF3BD 0x6FAF # -0xF3BE 0x71E6 # -0xF3BF 0x74A8 # -0xF3C0 0x74DA # -0xF3C1 0x7AC4 # -0xF3C2 0x7C12 # -0xF3C3 0x7E82 # -0xF3C4 0x7CB2 # -0xF3C5 0x7E98 # -0xF3C6 0x8B9A # -0xF3C7 0x8D0A # -0xF3C8 0x947D # -0xF3C9 0x9910 # -0xF3CA 0x994C # -0xF3CB 0x5239 # -0xF3CC 0x5BDF # -0xF3CD 0x64E6 # -0xF3CE 0x672D # -0xF3CF 0x7D2E # -0xF3D0 0x50ED # -0xF3D1 0x53C3 # -0xF3D2 0x5879 # -0xF3D3 0x6158 # -0xF3D4 0x6159 # -0xF3D5 0x61FA # -0xF3D6 0x65AC # -0xF3D7 0x7AD9 # -0xF3D8 0x8B92 # -0xF3D9 0x8B96 # -0xF3DA 0x5009 # -0xF3DB 0x5021 # -0xF3DC 0x5275 # -0xF3DD 0x5531 # -0xF3DE 0x5A3C # -0xF3DF 0x5EE0 # -0xF3E0 0x5F70 # -0xF3E1 0x6134 # -0xF3E2 0x655E # -0xF3E3 0x660C # -0xF3E4 0x6636 # -0xF3E5 0x66A2 # -0xF3E6 0x69CD # -0xF3E7 0x6EC4 # -0xF3E8 0x6F32 # -0xF3E9 0x7316 # -0xF3EA 0x7621 # -0xF3EB 0x7A93 # -0xF3EC 0x8139 # -0xF3ED 0x8259 # -0xF3EE 0x83D6 # -0xF3EF 0x84BC # -0xF3F0 0x50B5 # -0xF3F1 0x57F0 # -0xF3F2 0x5BC0 # -0xF3F3 0x5BE8 # -0xF3F4 0x5F69 # -0xF3F5 0x63A1 # -0xF3F6 0x7826 # -0xF3F7 0x7DB5 # -0xF3F8 0x83DC # -0xF3F9 0x8521 # -0xF3FA 0x91C7 # -0xF3FB 0x91F5 # -0xF3FC 0x518A # -0xF3FD 0x67F5 # -0xF3FE 0x7B56 # -0xF4A1 0x8CAC # -0xF4A2 0x51C4 # -0xF4A3 0x59BB # -0xF4A4 0x60BD # -0xF4A5 0x8655 # -0xF4A6 0x501C # -0xF4A7 0xF9FF # -0xF4A8 0x5254 # -0xF4A9 0x5C3A # -0xF4AA 0x617D # -0xF4AB 0x621A # -0xF4AC 0x62D3 # -0xF4AD 0x64F2 # -0xF4AE 0x65A5 # -0xF4AF 0x6ECC # -0xF4B0 0x7620 # -0xF4B1 0x810A # -0xF4B2 0x8E60 # -0xF4B3 0x965F # -0xF4B4 0x96BB # -0xF4B5 0x4EDF # -0xF4B6 0x5343 # -0xF4B7 0x5598 # -0xF4B8 0x5929 # -0xF4B9 0x5DDD # -0xF4BA 0x64C5 # -0xF4BB 0x6CC9 # -0xF4BC 0x6DFA # -0xF4BD 0x7394 # -0xF4BE 0x7A7F # -0xF4BF 0x821B # -0xF4C0 0x85A6 # -0xF4C1 0x8CE4 # -0xF4C2 0x8E10 # -0xF4C3 0x9077 # -0xF4C4 0x91E7 # -0xF4C5 0x95E1 # -0xF4C6 0x9621 # -0xF4C7 0x97C6 # -0xF4C8 0x51F8 # -0xF4C9 0x54F2 # -0xF4CA 0x5586 # -0xF4CB 0x5FB9 # -0xF4CC 0x64A4 # -0xF4CD 0x6F88 # -0xF4CE 0x7DB4 # -0xF4CF 0x8F1F # -0xF4D0 0x8F4D # -0xF4D1 0x9435 # -0xF4D2 0x50C9 # -0xF4D3 0x5C16 # -0xF4D4 0x6CBE # -0xF4D5 0x6DFB # -0xF4D6 0x751B # -0xF4D7 0x77BB # -0xF4D8 0x7C3D # -0xF4D9 0x7C64 # -0xF4DA 0x8A79 # -0xF4DB 0x8AC2 # -0xF4DC 0x581E # -0xF4DD 0x59BE # -0xF4DE 0x5E16 # -0xF4DF 0x6377 # -0xF4E0 0x7252 # -0xF4E1 0x758A # -0xF4E2 0x776B # -0xF4E3 0x8ADC # -0xF4E4 0x8CBC # -0xF4E5 0x8F12 # -0xF4E6 0x5EF3 # -0xF4E7 0x6674 # -0xF4E8 0x6DF8 # -0xF4E9 0x807D # -0xF4EA 0x83C1 # -0xF4EB 0x8ACB # -0xF4EC 0x9751 # -0xF4ED 0x9BD6 # -0xF4EE 0xFA00 # -0xF4EF 0x5243 # -0xF4F0 0x66FF # -0xF4F1 0x6D95 # -0xF4F2 0x6EEF # -0xF4F3 0x7DE0 # -0xF4F4 0x8AE6 # -0xF4F5 0x902E # -0xF4F6 0x905E # -0xF4F7 0x9AD4 # -0xF4F8 0x521D # -0xF4F9 0x527F # -0xF4FA 0x54E8 # -0xF4FB 0x6194 # -0xF4FC 0x6284 # -0xF4FD 0x62DB # -0xF4FE 0x68A2 # -0xF5A1 0x6912 # -0xF5A2 0x695A # -0xF5A3 0x6A35 # -0xF5A4 0x7092 # -0xF5A5 0x7126 # -0xF5A6 0x785D # -0xF5A7 0x7901 # -0xF5A8 0x790E # -0xF5A9 0x79D2 # -0xF5AA 0x7A0D # -0xF5AB 0x8096 # -0xF5AC 0x8278 # -0xF5AD 0x82D5 # -0xF5AE 0x8349 # -0xF5AF 0x8549 # -0xF5B0 0x8C82 # -0xF5B1 0x8D85 # -0xF5B2 0x9162 # -0xF5B3 0x918B # -0xF5B4 0x91AE # -0xF5B5 0x4FC3 # -0xF5B6 0x56D1 # -0xF5B7 0x71ED # -0xF5B8 0x77D7 # -0xF5B9 0x8700 # -0xF5BA 0x89F8 # -0xF5BB 0x5BF8 # -0xF5BC 0x5FD6 # -0xF5BD 0x6751 # -0xF5BE 0x90A8 # -0xF5BF 0x53E2 # -0xF5C0 0x585A # -0xF5C1 0x5BF5 # -0xF5C2 0x60A4 # -0xF5C3 0x6181 # -0xF5C4 0x6460 # -0xF5C5 0x7E3D # -0xF5C6 0x8070 # -0xF5C7 0x8525 # -0xF5C8 0x9283 # -0xF5C9 0x64AE # -0xF5CA 0x50AC # -0xF5CB 0x5D14 # -0xF5CC 0x6700 # -0xF5CD 0x589C # -0xF5CE 0x62BD # -0xF5CF 0x63A8 # -0xF5D0 0x690E # -0xF5D1 0x6978 # -0xF5D2 0x6A1E # -0xF5D3 0x6E6B # -0xF5D4 0x76BA # -0xF5D5 0x79CB # -0xF5D6 0x82BB # -0xF5D7 0x8429 # -0xF5D8 0x8ACF # -0xF5D9 0x8DA8 # -0xF5DA 0x8FFD # -0xF5DB 0x9112 # -0xF5DC 0x914B # -0xF5DD 0x919C # -0xF5DE 0x9310 # -0xF5DF 0x9318 # -0xF5E0 0x939A # -0xF5E1 0x96DB # -0xF5E2 0x9A36 # -0xF5E3 0x9C0D # -0xF5E4 0x4E11 # -0xF5E5 0x755C # -0xF5E6 0x795D # -0xF5E7 0x7AFA # -0xF5E8 0x7B51 # -0xF5E9 0x7BC9 # -0xF5EA 0x7E2E # -0xF5EB 0x84C4 # -0xF5EC 0x8E59 # -0xF5ED 0x8E74 # -0xF5EE 0x8EF8 # -0xF5EF 0x9010 # -0xF5F0 0x6625 # -0xF5F1 0x693F # -0xF5F2 0x7443 # -0xF5F3 0x51FA # -0xF5F4 0x672E # -0xF5F5 0x9EDC # -0xF5F6 0x5145 # -0xF5F7 0x5FE0 # -0xF5F8 0x6C96 # -0xF5F9 0x87F2 # -0xF5FA 0x885D # -0xF5FB 0x8877 # -0xF5FC 0x60B4 # -0xF5FD 0x81B5 # -0xF5FE 0x8403 # -0xF6A1 0x8D05 # -0xF6A2 0x53D6 # -0xF6A3 0x5439 # -0xF6A4 0x5634 # -0xF6A5 0x5A36 # -0xF6A6 0x5C31 # -0xF6A7 0x708A # -0xF6A8 0x7FE0 # -0xF6A9 0x805A # -0xF6AA 0x8106 # -0xF6AB 0x81ED # -0xF6AC 0x8DA3 # -0xF6AD 0x9189 # -0xF6AE 0x9A5F # -0xF6AF 0x9DF2 # -0xF6B0 0x5074 # -0xF6B1 0x4EC4 # -0xF6B2 0x53A0 # -0xF6B3 0x60FB # -0xF6B4 0x6E2C # -0xF6B5 0x5C64 # -0xF6B6 0x4F88 # -0xF6B7 0x5024 # -0xF6B8 0x55E4 # -0xF6B9 0x5CD9 # -0xF6BA 0x5E5F # -0xF6BB 0x6065 # -0xF6BC 0x6894 # -0xF6BD 0x6CBB # -0xF6BE 0x6DC4 # -0xF6BF 0x71BE # -0xF6C0 0x75D4 # -0xF6C1 0x75F4 # -0xF6C2 0x7661 # -0xF6C3 0x7A1A # -0xF6C4 0x7A49 # -0xF6C5 0x7DC7 # -0xF6C6 0x7DFB # -0xF6C7 0x7F6E # -0xF6C8 0x81F4 # -0xF6C9 0x86A9 # -0xF6CA 0x8F1C # -0xF6CB 0x96C9 # -0xF6CC 0x99B3 # -0xF6CD 0x9F52 # -0xF6CE 0x5247 # -0xF6CF 0x52C5 # -0xF6D0 0x98ED # -0xF6D1 0x89AA # -0xF6D2 0x4E03 # -0xF6D3 0x67D2 # -0xF6D4 0x6F06 # -0xF6D5 0x4FB5 # -0xF6D6 0x5BE2 # -0xF6D7 0x6795 # -0xF6D8 0x6C88 # -0xF6D9 0x6D78 # -0xF6DA 0x741B # -0xF6DB 0x7827 # -0xF6DC 0x91DD # -0xF6DD 0x937C # -0xF6DE 0x87C4 # -0xF6DF 0x79E4 # -0xF6E0 0x7A31 # -0xF6E1 0x5FEB # -0xF6E2 0x4ED6 # -0xF6E3 0x54A4 # -0xF6E4 0x553E # -0xF6E5 0x58AE # -0xF6E6 0x59A5 # -0xF6E7 0x60F0 # -0xF6E8 0x6253 # -0xF6E9 0x62D6 # -0xF6EA 0x6736 # -0xF6EB 0x6955 # -0xF6EC 0x8235 # -0xF6ED 0x9640 # -0xF6EE 0x99B1 # -0xF6EF 0x99DD # -0xF6F0 0x502C # -0xF6F1 0x5353 # -0xF6F2 0x5544 # -0xF6F3 0x577C # -0xF6F4 0xFA01 # -0xF6F5 0x6258 # -0xF6F6 0xFA02 # -0xF6F7 0x64E2 # -0xF6F8 0x666B # -0xF6F9 0x67DD # -0xF6FA 0x6FC1 # -0xF6FB 0x6FEF # -0xF6FC 0x7422 # -0xF6FD 0x7438 # -0xF6FE 0x8A17 # -0xF7A1 0x9438 # -0xF7A2 0x5451 # -0xF7A3 0x5606 # -0xF7A4 0x5766 # -0xF7A5 0x5F48 # -0xF7A6 0x619A # -0xF7A7 0x6B4E # -0xF7A8 0x7058 # -0xF7A9 0x70AD # -0xF7AA 0x7DBB # -0xF7AB 0x8A95 # -0xF7AC 0x596A # -0xF7AD 0x812B # -0xF7AE 0x63A2 # -0xF7AF 0x7708 # -0xF7B0 0x803D # -0xF7B1 0x8CAA # -0xF7B2 0x5854 # -0xF7B3 0x642D # -0xF7B4 0x69BB # -0xF7B5 0x5B95 # -0xF7B6 0x5E11 # -0xF7B7 0x6E6F # -0xF7B8 0xFA03 # -0xF7B9 0x8569 # -0xF7BA 0x514C # -0xF7BB 0x53F0 # -0xF7BC 0x592A # -0xF7BD 0x6020 # -0xF7BE 0x614B # -0xF7BF 0x6B86 # -0xF7C0 0x6C70 # -0xF7C1 0x6CF0 # -0xF7C2 0x7B1E # -0xF7C3 0x80CE # -0xF7C4 0x82D4 # -0xF7C5 0x8DC6 # -0xF7C6 0x90B0 # -0xF7C7 0x98B1 # -0xF7C8 0xFA04 # -0xF7C9 0x64C7 # -0xF7CA 0x6FA4 # -0xF7CB 0x6491 # -0xF7CC 0x6504 # -0xF7CD 0x514E # -0xF7CE 0x5410 # -0xF7CF 0x571F # -0xF7D0 0x8A0E # -0xF7D1 0x615F # -0xF7D2 0x6876 # -0xF7D3 0xFA05 # -0xF7D4 0x75DB # -0xF7D5 0x7B52 # -0xF7D6 0x7D71 # -0xF7D7 0x901A # -0xF7D8 0x5806 # -0xF7D9 0x69CC # -0xF7DA 0x817F # -0xF7DB 0x892A # -0xF7DC 0x9000 # -0xF7DD 0x9839 # -0xF7DE 0x5078 # -0xF7DF 0x5957 # -0xF7E0 0x59AC # -0xF7E1 0x6295 # -0xF7E2 0x900F # -0xF7E3 0x9B2A # -0xF7E4 0x615D # -0xF7E5 0x7279 # -0xF7E6 0x95D6 # -0xF7E7 0x5761 # -0xF7E8 0x5A46 # -0xF7E9 0x5DF4 # -0xF7EA 0x628A # -0xF7EB 0x64AD # -0xF7EC 0x64FA # -0xF7ED 0x6777 # -0xF7EE 0x6CE2 # -0xF7EF 0x6D3E # -0xF7F0 0x722C # -0xF7F1 0x7436 # -0xF7F2 0x7834 # -0xF7F3 0x7F77 # -0xF7F4 0x82AD # -0xF7F5 0x8DDB # -0xF7F6 0x9817 # -0xF7F7 0x5224 # -0xF7F8 0x5742 # -0xF7F9 0x677F # -0xF7FA 0x7248 # -0xF7FB 0x74E3 # -0xF7FC 0x8CA9 # -0xF7FD 0x8FA6 # -0xF7FE 0x9211 # -0xF8A1 0x962A # -0xF8A2 0x516B # -0xF8A3 0x53ED # -0xF8A4 0x634C # -0xF8A5 0x4F69 # -0xF8A6 0x5504 # -0xF8A7 0x6096 # -0xF8A8 0x6557 # -0xF8A9 0x6C9B # -0xF8AA 0x6D7F # -0xF8AB 0x724C # -0xF8AC 0x72FD # -0xF8AD 0x7A17 # -0xF8AE 0x8987 # -0xF8AF 0x8C9D # -0xF8B0 0x5F6D # -0xF8B1 0x6F8E # -0xF8B2 0x70F9 # -0xF8B3 0x81A8 # -0xF8B4 0x610E # -0xF8B5 0x4FBF # -0xF8B6 0x504F # -0xF8B7 0x6241 # -0xF8B8 0x7247 # -0xF8B9 0x7BC7 # -0xF8BA 0x7DE8 # -0xF8BB 0x7FE9 # -0xF8BC 0x904D # -0xF8BD 0x97AD # -0xF8BE 0x9A19 # -0xF8BF 0x8CB6 # -0xF8C0 0x576A # -0xF8C1 0x5E73 # -0xF8C2 0x67B0 # -0xF8C3 0x840D # -0xF8C4 0x8A55 # -0xF8C5 0x5420 # -0xF8C6 0x5B16 # -0xF8C7 0x5E63 # -0xF8C8 0x5EE2 # -0xF8C9 0x5F0A # -0xF8CA 0x6583 # -0xF8CB 0x80BA # -0xF8CC 0x853D # -0xF8CD 0x9589 # -0xF8CE 0x965B # -0xF8CF 0x4F48 # -0xF8D0 0x5305 # -0xF8D1 0x530D # -0xF8D2 0x530F # -0xF8D3 0x5486 # -0xF8D4 0x54FA # -0xF8D5 0x5703 # -0xF8D6 0x5E03 # -0xF8D7 0x6016 # -0xF8D8 0x629B # -0xF8D9 0x62B1 # -0xF8DA 0x6355 # -0xF8DB 0xFA06 # -0xF8DC 0x6CE1 # -0xF8DD 0x6D66 # -0xF8DE 0x75B1 # -0xF8DF 0x7832 # -0xF8E0 0x80DE # -0xF8E1 0x812F # -0xF8E2 0x82DE # -0xF8E3 0x8461 # -0xF8E4 0x84B2 # -0xF8E5 0x888D # -0xF8E6 0x8912 # -0xF8E7 0x900B # -0xF8E8 0x92EA # -0xF8E9 0x98FD # -0xF8EA 0x9B91 # -0xF8EB 0x5E45 # -0xF8EC 0x66B4 # -0xF8ED 0x66DD # -0xF8EE 0x7011 # -0xF8EF 0x7206 # -0xF8F0 0xFA07 # -0xF8F1 0x4FF5 # -0xF8F2 0x527D # -0xF8F3 0x5F6A # -0xF8F4 0x6153 # -0xF8F5 0x6753 # -0xF8F6 0x6A19 # -0xF8F7 0x6F02 # -0xF8F8 0x74E2 # -0xF8F9 0x7968 # -0xF8FA 0x8868 # -0xF8FB 0x8C79 # -0xF8FC 0x98C7 # -0xF8FD 0x98C4 # -0xF8FE 0x9A43 # -0xF9A1 0x54C1 # -0xF9A2 0x7A1F # -0xF9A3 0x6953 # -0xF9A4 0x8AF7 # -0xF9A5 0x8C4A # -0xF9A6 0x98A8 # -0xF9A7 0x99AE # -0xF9A8 0x5F7C # -0xF9A9 0x62AB # -0xF9AA 0x75B2 # -0xF9AB 0x76AE # -0xF9AC 0x88AB # -0xF9AD 0x907F # -0xF9AE 0x9642 # -0xF9AF 0x5339 # -0xF9B0 0x5F3C # -0xF9B1 0x5FC5 # -0xF9B2 0x6CCC # -0xF9B3 0x73CC # -0xF9B4 0x7562 # -0xF9B5 0x758B # -0xF9B6 0x7B46 # -0xF9B7 0x82FE # -0xF9B8 0x999D # -0xF9B9 0x4E4F # -0xF9BA 0x903C # -0xF9BB 0x4E0B # -0xF9BC 0x4F55 # -0xF9BD 0x53A6 # -0xF9BE 0x590F # -0xF9BF 0x5EC8 # -0xF9C0 0x6630 # -0xF9C1 0x6CB3 # -0xF9C2 0x7455 # -0xF9C3 0x8377 # -0xF9C4 0x8766 # -0xF9C5 0x8CC0 # -0xF9C6 0x9050 # -0xF9C7 0x971E # -0xF9C8 0x9C15 # -0xF9C9 0x58D1 # -0xF9CA 0x5B78 # -0xF9CB 0x8650 # -0xF9CC 0x8B14 # -0xF9CD 0x9DB4 # -0xF9CE 0x5BD2 # -0xF9CF 0x6068 # -0xF9D0 0x608D # -0xF9D1 0x65F1 # -0xF9D2 0x6C57 # -0xF9D3 0x6F22 # -0xF9D4 0x6FA3 # -0xF9D5 0x701A # -0xF9D6 0x7F55 # -0xF9D7 0x7FF0 # -0xF9D8 0x9591 # -0xF9D9 0x9592 # -0xF9DA 0x9650 # -0xF9DB 0x97D3 # -0xF9DC 0x5272 # -0xF9DD 0x8F44 # -0xF9DE 0x51FD # -0xF9DF 0x542B # -0xF9E0 0x54B8 # -0xF9E1 0x5563 # -0xF9E2 0x558A # -0xF9E3 0x6ABB # -0xF9E4 0x6DB5 # -0xF9E5 0x7DD8 # -0xF9E6 0x8266 # -0xF9E7 0x929C # -0xF9E8 0x9677 # -0xF9E9 0x9E79 # -0xF9EA 0x5408 # -0xF9EB 0x54C8 # -0xF9EC 0x76D2 # -0xF9ED 0x86E4 # -0xF9EE 0x95A4 # -0xF9EF 0x95D4 # -0xF9F0 0x965C # -0xF9F1 0x4EA2 # -0xF9F2 0x4F09 # -0xF9F3 0x59EE # -0xF9F4 0x5AE6 # -0xF9F5 0x5DF7 # -0xF9F6 0x6052 # -0xF9F7 0x6297 # -0xF9F8 0x676D # -0xF9F9 0x6841 # -0xF9FA 0x6C86 # -0xF9FB 0x6E2F # -0xF9FC 0x7F38 # -0xF9FD 0x809B # -0xF9FE 0x822A # -0xFAA1 0xFA08 # -0xFAA2 0xFA09 # -0xFAA3 0x9805 # -0xFAA4 0x4EA5 # -0xFAA5 0x5055 # -0xFAA6 0x54B3 # -0xFAA7 0x5793 # -0xFAA8 0x595A # -0xFAA9 0x5B69 # -0xFAAA 0x5BB3 # -0xFAAB 0x61C8 # -0xFAAC 0x6977 # -0xFAAD 0x6D77 # -0xFAAE 0x7023 # -0xFAAF 0x87F9 # -0xFAB0 0x89E3 # -0xFAB1 0x8A72 # -0xFAB2 0x8AE7 # -0xFAB3 0x9082 # -0xFAB4 0x99ED # -0xFAB5 0x9AB8 # -0xFAB6 0x52BE # -0xFAB7 0x6838 # -0xFAB8 0x5016 # -0xFAB9 0x5E78 # -0xFABA 0x674F # -0xFABB 0x8347 # -0xFABC 0x884C # -0xFABD 0x4EAB # -0xFABE 0x5411 # -0xFABF 0x56AE # -0xFAC0 0x73E6 # -0xFAC1 0x9115 # -0xFAC2 0x97FF # -0xFAC3 0x9909 # -0xFAC4 0x9957 # -0xFAC5 0x9999 # -0xFAC6 0x5653 # -0xFAC7 0x589F # -0xFAC8 0x865B # -0xFAC9 0x8A31 # -0xFACA 0x61B2 # -0xFACB 0x6AF6 # -0xFACC 0x737B # -0xFACD 0x8ED2 # -0xFACE 0x6B47 # -0xFACF 0x96AA # -0xFAD0 0x9A57 # -0xFAD1 0x5955 # -0xFAD2 0x7200 # -0xFAD3 0x8D6B # -0xFAD4 0x9769 # -0xFAD5 0x4FD4 # -0xFAD6 0x5CF4 # -0xFAD7 0x5F26 # -0xFAD8 0x61F8 # -0xFAD9 0x665B # -0xFADA 0x6CEB # -0xFADB 0x70AB # -0xFADC 0x7384 # -0xFADD 0x73B9 # -0xFADE 0x73FE # -0xFADF 0x7729 # -0xFAE0 0x774D # -0xFAE1 0x7D43 # -0xFAE2 0x7D62 # -0xFAE3 0x7E23 # -0xFAE4 0x8237 # -0xFAE5 0x8852 # -0xFAE6 0xFA0A # -0xFAE7 0x8CE2 # -0xFAE8 0x9249 # -0xFAE9 0x986F # -0xFAEA 0x5B51 # -0xFAEB 0x7A74 # -0xFAEC 0x8840 # -0xFAED 0x9801 # -0xFAEE 0x5ACC # -0xFAEF 0x4FE0 # -0xFAF0 0x5354 # -0xFAF1 0x593E # -0xFAF2 0x5CFD # -0xFAF3 0x633E # -0xFAF4 0x6D79 # -0xFAF5 0x72F9 # -0xFAF6 0x8105 # -0xFAF7 0x8107 # -0xFAF8 0x83A2 # -0xFAF9 0x92CF # -0xFAFA 0x9830 # -0xFAFB 0x4EA8 # -0xFAFC 0x5144 # -0xFAFD 0x5211 # -0xFAFE 0x578B # -0xFBA1 0x5F62 # -0xFBA2 0x6CC2 # -0xFBA3 0x6ECE # -0xFBA4 0x7005 # -0xFBA5 0x7050 # -0xFBA6 0x70AF # -0xFBA7 0x7192 # -0xFBA8 0x73E9 # -0xFBA9 0x7469 # -0xFBAA 0x834A # -0xFBAB 0x87A2 # -0xFBAC 0x8861 # -0xFBAD 0x9008 # -0xFBAE 0x90A2 # -0xFBAF 0x93A3 # -0xFBB0 0x99A8 # -0xFBB1 0x516E # -0xFBB2 0x5F57 # -0xFBB3 0x60E0 # -0xFBB4 0x6167 # -0xFBB5 0x66B3 # -0xFBB6 0x8559 # -0xFBB7 0x8E4A # -0xFBB8 0x91AF # -0xFBB9 0x978B # -0xFBBA 0x4E4E # -0xFBBB 0x4E92 # -0xFBBC 0x547C # -0xFBBD 0x58D5 # -0xFBBE 0x58FA # -0xFBBF 0x597D # -0xFBC0 0x5CB5 # -0xFBC1 0x5F27 # -0xFBC2 0x6236 # -0xFBC3 0x6248 # -0xFBC4 0x660A # -0xFBC5 0x6667 # -0xFBC6 0x6BEB # -0xFBC7 0x6D69 # -0xFBC8 0x6DCF # -0xFBC9 0x6E56 # -0xFBCA 0x6EF8 # -0xFBCB 0x6F94 # -0xFBCC 0x6FE0 # -0xFBCD 0x6FE9 # -0xFBCE 0x705D # -0xFBCF 0x72D0 # -0xFBD0 0x7425 # -0xFBD1 0x745A # -0xFBD2 0x74E0 # -0xFBD3 0x7693 # -0xFBD4 0x795C # -0xFBD5 0x7CCA # -0xFBD6 0x7E1E # -0xFBD7 0x80E1 # -0xFBD8 0x82A6 # -0xFBD9 0x846B # -0xFBDA 0x84BF # -0xFBDB 0x864E # -0xFBDC 0x865F # -0xFBDD 0x8774 # -0xFBDE 0x8B77 # -0xFBDF 0x8C6A # -0xFBE0 0x93AC # -0xFBE1 0x9800 # -0xFBE2 0x9865 # -0xFBE3 0x60D1 # -0xFBE4 0x6216 # -0xFBE5 0x9177 # -0xFBE6 0x5A5A # -0xFBE7 0x660F # -0xFBE8 0x6DF7 # -0xFBE9 0x6E3E # -0xFBEA 0x743F # -0xFBEB 0x9B42 # -0xFBEC 0x5FFD # -0xFBED 0x60DA # -0xFBEE 0x7B0F # -0xFBEF 0x54C4 # -0xFBF0 0x5F18 # -0xFBF1 0x6C5E # -0xFBF2 0x6CD3 # -0xFBF3 0x6D2A # -0xFBF4 0x70D8 # -0xFBF5 0x7D05 # -0xFBF6 0x8679 # -0xFBF7 0x8A0C # -0xFBF8 0x9D3B # -0xFBF9 0x5316 # -0xFBFA 0x548C # -0xFBFB 0x5B05 # -0xFBFC 0x6A3A # -0xFBFD 0x706B # -0xFBFE 0x7575 # -0xFCA1 0x798D # -0xFCA2 0x79BE # -0xFCA3 0x82B1 # -0xFCA4 0x83EF # -0xFCA5 0x8A71 # -0xFCA6 0x8B41 # -0xFCA7 0x8CA8 # -0xFCA8 0x9774 # -0xFCA9 0xFA0B # -0xFCAA 0x64F4 # -0xFCAB 0x652B # -0xFCAC 0x78BA # -0xFCAD 0x78BB # -0xFCAE 0x7A6B # -0xFCAF 0x4E38 # -0xFCB0 0x559A # -0xFCB1 0x5950 # -0xFCB2 0x5BA6 # -0xFCB3 0x5E7B # -0xFCB4 0x60A3 # -0xFCB5 0x63DB # -0xFCB6 0x6B61 # -0xFCB7 0x6665 # -0xFCB8 0x6853 # -0xFCB9 0x6E19 # -0xFCBA 0x7165 # -0xFCBB 0x74B0 # -0xFCBC 0x7D08 # -0xFCBD 0x9084 # -0xFCBE 0x9A69 # -0xFCBF 0x9C25 # -0xFCC0 0x6D3B # -0xFCC1 0x6ED1 # -0xFCC2 0x733E # -0xFCC3 0x8C41 # -0xFCC4 0x95CA # -0xFCC5 0x51F0 # -0xFCC6 0x5E4C # -0xFCC7 0x5FA8 # -0xFCC8 0x604D # -0xFCC9 0x60F6 # -0xFCCA 0x6130 # -0xFCCB 0x614C # -0xFCCC 0x6643 # -0xFCCD 0x6644 # -0xFCCE 0x69A5 # -0xFCCF 0x6CC1 # -0xFCD0 0x6E5F # -0xFCD1 0x6EC9 # -0xFCD2 0x6F62 # -0xFCD3 0x714C # -0xFCD4 0x749C # -0xFCD5 0x7687 # -0xFCD6 0x7BC1 # -0xFCD7 0x7C27 # -0xFCD8 0x8352 # -0xFCD9 0x8757 # -0xFCDA 0x9051 # -0xFCDB 0x968D # -0xFCDC 0x9EC3 # -0xFCDD 0x532F # -0xFCDE 0x56DE # -0xFCDF 0x5EFB # -0xFCE0 0x5F8A # -0xFCE1 0x6062 # -0xFCE2 0x6094 # -0xFCE3 0x61F7 # -0xFCE4 0x6666 # -0xFCE5 0x6703 # -0xFCE6 0x6A9C # -0xFCE7 0x6DEE # -0xFCE8 0x6FAE # -0xFCE9 0x7070 # -0xFCEA 0x736A # -0xFCEB 0x7E6A # -0xFCEC 0x81BE # -0xFCED 0x8334 # -0xFCEE 0x86D4 # -0xFCEF 0x8AA8 # -0xFCF0 0x8CC4 # -0xFCF1 0x5283 # -0xFCF2 0x7372 # -0xFCF3 0x5B96 # -0xFCF4 0x6A6B # -0xFCF5 0x9404 # -0xFCF6 0x54EE # -0xFCF7 0x5686 # -0xFCF8 0x5B5D # -0xFCF9 0x6548 # -0xFCFA 0x6585 # -0xFCFB 0x66C9 # -0xFCFC 0x689F # -0xFCFD 0x6D8D # -0xFCFE 0x6DC6 # -0xFDA1 0x723B # -0xFDA2 0x80B4 # -0xFDA3 0x9175 # -0xFDA4 0x9A4D # -0xFDA5 0x4FAF # -0xFDA6 0x5019 # -0xFDA7 0x539A # -0xFDA8 0x540E # -0xFDA9 0x543C # -0xFDAA 0x5589 # -0xFDAB 0x55C5 # -0xFDAC 0x5E3F # -0xFDAD 0x5F8C # -0xFDAE 0x673D # -0xFDAF 0x7166 # -0xFDB0 0x73DD # -0xFDB1 0x9005 # -0xFDB2 0x52DB # -0xFDB3 0x52F3 # -0xFDB4 0x5864 # -0xFDB5 0x58CE # -0xFDB6 0x7104 # -0xFDB7 0x718F # -0xFDB8 0x71FB # -0xFDB9 0x85B0 # -0xFDBA 0x8A13 # -0xFDBB 0x6688 # -0xFDBC 0x85A8 # -0xFDBD 0x55A7 # -0xFDBE 0x6684 # -0xFDBF 0x714A # -0xFDC0 0x8431 # -0xFDC1 0x5349 # -0xFDC2 0x5599 # -0xFDC3 0x6BC1 # -0xFDC4 0x5F59 # -0xFDC5 0x5FBD # -0xFDC6 0x63EE # -0xFDC7 0x6689 # -0xFDC8 0x7147 # -0xFDC9 0x8AF1 # -0xFDCA 0x8F1D # -0xFDCB 0x9EBE # -0xFDCC 0x4F11 # -0xFDCD 0x643A # -0xFDCE 0x70CB # -0xFDCF 0x7566 # -0xFDD0 0x8667 # -0xFDD1 0x6064 # -0xFDD2 0x8B4E # -0xFDD3 0x9DF8 # -0xFDD4 0x5147 # -0xFDD5 0x51F6 # -0xFDD6 0x5308 # -0xFDD7 0x6D36 # -0xFDD8 0x80F8 # -0xFDD9 0x9ED1 # -0xFDDA 0x6615 # -0xFDDB 0x6B23 # -0xFDDC 0x7098 # -0xFDDD 0x75D5 # -0xFDDE 0x5403 # -0xFDDF 0x5C79 # -0xFDE0 0x7D07 # -0xFDE1 0x8A16 # -0xFDE2 0x6B20 # -0xFDE3 0x6B3D # -0xFDE4 0x6B46 # -0xFDE5 0x5438 # -0xFDE6 0x6070 # -0xFDE7 0x6D3D # -0xFDE8 0x7FD5 # -0xFDE9 0x8208 # -0xFDEA 0x50D6 # -0xFDEB 0x51DE # -0xFDEC 0x559C # -0xFDED 0x566B # -0xFDEE 0x56CD # -0xFDEF 0x59EC # -0xFDF0 0x5B09 # -0xFDF1 0x5E0C # -0xFDF2 0x6199 # -0xFDF3 0x6198 # -0xFDF4 0x6231 # -0xFDF5 0x665E # -0xFDF6 0x66E6 # -0xFDF7 0x7199 # -0xFDF8 0x71B9 # -0xFDF9 0x71BA # -0xFDFA 0x72A7 # -0xFDFB 0x79A7 # -0xFDFC 0x7A00 # -0xFDFD 0x7FB2 # -0xFDFE 0x8A70 # - - \ No newline at end of file diff --git a/program/lib/utf8.class.php b/program/lib/utf8.class.php deleted file mode 100644 index 0446159c7..000000000 --- a/program/lib/utf8.class.php +++ /dev/null @@ -1,171 +0,0 @@ -loadCharset(CP1252); - Then call - $res = $utfConverter->strToUtf8($str); - or - $res = $utfConverter->utf8ToStr($utf); - to get the needed encoding. ---------------------------------------------------------------------------------- -Note: - Rewrite or Override the onError method if needed. It's the error handler used from everywhere and takes 2 parameters: - err_code and err_text. By default it just prints out a message about the error. -*/ - -// Charset maps -// Adapted to fit Roundcube -define("UTF8_MAP_DIR", "program/lib/encoding"); - -//Error constants -define("ERR_OPEN_MAP_FILE", "ERR_OPEN_MAP_FILE"); - -//Class definition -Class utf8 { - - var $charset = "ISO-8859-1"; - var $ascMap = array(); - var $utfMap = array(); - var $aliases = array( - 'KOI8-R' => 'KOI8R' - ); - var $error = null; - - function __construct($charset="ISO-8859-1") { - $this->loadCharset($charset); - } - - //Load charset - function loadCharset($charset) { - - $charset = preg_replace(array('/^WINDOWS-*125([0-8])$/', '/^CP-/'), array('CP125\\1', 'CP'), $charset); - if (isset($this->aliases[$charset])) - $charset = $this->aliases[$charset]; - - $this->charset = $charset; - - if (empty($this->ascMap[$charset])) - { - $file = UTF8_MAP_DIR.'/'.$charset.'.map'; - - if (!is_file($file)) { - $this->onError(ERR_OPEN_MAP_FILE, "Failed to open map file for $charset"); - return; - } - - $lines = file_get_contents($file); - $lines = preg_replace("/#.*$/m","",$lines); - $lines = preg_replace("/\n\n/","",$lines); - $lines = explode("\n",$lines); - - foreach($lines as $line){ - $parts = explode('0x',$line); - if(count($parts)==3){ - $asc=hexdec(substr($parts[1],0,2)); - $utf=hexdec(substr($parts[2],0,4)); - $this->ascMap[$charset][$asc]=$utf; - } - } - - $this->utfMap = array_flip($this->ascMap[$charset]); - } - } - - //Error handler - function onError($err_code,$err_text){ - $this->error = $err_text; - return null; - } - - //Translate string ($str) to UTF-8 from given charset - function strToUtf8($str){ - if (empty($this->ascMap[$this->charset])) - return null; - - $chars = unpack('C*', $str); - $cnt = count($chars); - for($i=1; $i<=$cnt; $i++) - $this->_charToUtf8($chars[$i]); - - return implode("",$chars); - } - - //Translate UTF-8 string to single byte string in the given charset - function utf8ToStr($utf){ - if (empty($this->ascMap[$this->charset])) - return null; - - $chars = unpack('C*', $utf); - $cnt = count($chars); - $res = ""; //No simple way to do it in place... concatenate char by char - - for ($i=1; $i<=$cnt; $i++) - $res .= $this->_utf8ToChar($chars, $i); - - return $res; - } - - //Char to UTF-8 sequence - function _charToUtf8(&$char){ - $c = (int)$this->ascMap[$this->charset][$char]; - if ($c < 0x80){ - $char = chr($c); - } - else if($c<0x800) // 2 bytes - $char = (chr(0xC0 | $c>>6) . chr(0x80 | $c & 0x3F)); - else if($c<0x10000) // 3 bytes - $char = (chr(0xE0 | $c>>12) . chr(0x80 | $c>>6 & 0x3F) . chr(0x80 | $c & 0x3F)); - else if($c<0x200000) // 4 bytes - $char = (chr(0xF0 | $c>>18) . chr(0x80 | $c>>12 & 0x3F) . chr(0x80 | $c>>6 & 0x3F) . chr(0x80 | $c & 0x3F)); - } - - //UTF-8 sequence to single byte character - function _utf8ToChar(&$chars, &$idx){ - if(($chars[$idx] >= 240) && ($chars[$idx] <= 255)){ // 4 bytes - $utf = (intval($chars[$idx]-240) << 18) + - (intval($chars[++$idx]-128) << 12) + - (intval($chars[++$idx]-128) << 6) + - (intval($chars[++$idx]-128) << 0); - } - else if (($chars[$idx] >= 224) && ($chars[$idx] <= 239)){ // 3 bytes - $utf = (intval($chars[$idx]-224) << 12) + - (intval($chars[++$idx]-128) << 6) + - (intval($chars[++$idx]-128) << 0); - } - else if (($chars[$idx] >= 192) && ($chars[$idx] <= 223)){ // 2 bytes - $utf = (intval($chars[$idx]-192) << 6) + - (intval($chars[++$idx]-128) << 0); - } - else{ // 1 byte - $utf = $chars[$idx]; - } - if(array_key_exists($utf,$this->utfMap)) - return chr($this->utfMap[$utf]); - else - return "?"; - } - -} - -?> -- cgit v1.2.3 From 29c24e647cb4c4a0928382a9ab2964980898562b Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 28 Aug 2014 19:24:03 +0200 Subject: Get rid of DIRECTORY_SEPARATOR for consistency --- bin/update.sh | 2 +- bin/updatedb.sh | 4 ++-- program/lib/Roundcube/bootstrap.php | 2 +- program/lib/Roundcube/rcube_plugin_api.php | 5 ++--- program/lib/Roundcube/rcube_utils.php | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/bin/update.sh b/bin/update.sh index 91af6413d..f0c6d2f6c 100755 --- a/bin/update.sh +++ b/bin/update.sh @@ -157,7 +157,7 @@ if ($RCI->configured) { if ($RCI->config['db_dsnw']) { echo "Executing database schema update.\n"; system("php " . INSTALL_PATH . "bin/updatedb.sh --package=roundcube --version=" . $opts['version'] - . " --dir=" . INSTALL_PATH . DIRECTORY_SEPARATOR . "SQL", $res); + . " --dir=" . INSTALL_PATH . "SQL", $res); $success = !$res; } diff --git a/bin/updatedb.sh b/bin/updatedb.sh index daee6e835..964bc184c 100755 --- a/bin/updatedb.sh +++ b/bin/updatedb.sh @@ -116,7 +116,7 @@ if (empty($version)) { $version = 2012080700; } -$dir = $opts['dir'] . DIRECTORY_SEPARATOR . $DB->db_provider; +$dir = $opts['dir'] . '/' . $DB->db_provider; if (!file_exists($dir)) { rcube::raise_error("DDL Upgrade files for " . $DB->db_provider . " driver not found.", false, true); } @@ -133,7 +133,7 @@ sort($result, SORT_NUMERIC); foreach ($result as $v) { echo "Updating database schema ($v)... "; - $error = update_db_schema($opts['package'], $v, $dir . DIRECTORY_SEPARATOR . "$v.sql"); + $error = update_db_schema($opts['package'], $v, "$dir/$v.sql"); if ($error) { echo "[FAILED]\n"; diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php index 0aa5cb1de..98bbce5d4 100644 --- a/program/lib/Roundcube/bootstrap.php +++ b/program/lib/Roundcube/bootstrap.php @@ -58,7 +58,7 @@ define('RCUBE_VERSION', '1.1-git'); define('RCUBE_CHARSET', 'UTF-8'); if (!defined('RCUBE_LIB_DIR')) { - define('RCUBE_LIB_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR); + define('RCUBE_LIB_DIR', dirname(__FILE__) . '/'); } if (!defined('RCUBE_INSTALL_PATH')) { diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index defccc94f..e0b8aea38 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -188,8 +188,7 @@ class rcube_plugin_api return true; } - $fn = $plugins_dir . DIRECTORY_SEPARATOR . $plugin_name - . DIRECTORY_SEPARATOR . $plugin_name . '.php'; + $fn = "$plugins_dir/$plugin_name/$plugin_name.php"; if (is_readable($fn)) { if (!class_exists($plugin_name, false)) { @@ -279,7 +278,7 @@ class rcube_plugin_api ); $dir = dir($this->dir); - $fn = unslashify($dir->path) . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php'; + $fn = unslashify($dir->path) . "/$plugin_name/$plugin_name.php"; $info = false; if (!class_exists($plugin_name, false)) { diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index ef303f8c1..330322f10 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -1068,7 +1068,7 @@ class rcube_utils return (bool) preg_match('!^[a-z]:[\\\\/]!i', $path); } else { - return $path[0] == DIRECTORY_SEPARATOR; + return $path[0] == '/'; } } -- cgit v1.2.3 From 9cc5a522df25d7f98e578dc483e0ff067b6c1ded Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 30 Aug 2014 12:33:42 +0200 Subject: Fix so rcube_text2html class does not depend on rcmail_string_replacer --- program/lib/Roundcube/rcube_text2html.php | 4 +++- program/steps/mail/func.inc | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 46c2b7e9a..0afc6d110 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -57,6 +57,8 @@ class rcube_text2html 'end' => '
  • ', // enables links replacement 'links' => true, + // string replacer class + 'replacer' => 'rcube_string_replacer', ); @@ -141,7 +143,7 @@ class rcube_text2html { // make links and email-addresses clickable $attribs = array('link_attribs' => array('rel' => 'noreferrer', 'target' => '_blank')); - $replacer = new rcmail_string_replacer($attribs); + $replacer = new $this->config['replacer']($attribs); if ($this->config['flowed']) { $flowed_char = 0x01; diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 41fe28e7a..a7c483bba 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -920,7 +920,7 @@ function rcmail_print_body($part, $p = array()) */ function rcmail_plain_body($body, $flowed = false) { - $options = array('flowed' => $flowed, 'wrap' => !$flowed); + $options = array('flowed' => $flowed, 'wrap' => !$flowed, 'replacer' => 'rcmail_string_replacer'); $text2html = new rcube_text2html($body, false, $options); $body = $text2html->get_html(); -- cgit v1.2.3