summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-07-26 11:51:14 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-07-26 11:51:14 +0000
commit5c4aba4b9c9dab31aae9e35a0b7333c273c892b7 (patch)
tree60ca5d30f6723c551c3fbf29e527b23d2c886568
parent39005461c5c06f51a1b44621753df6513e8d222e (diff)
parent87e2a02e0c69cec7c04a48265761da13b99c9a2b (diff)
downloadgtk+-5c4aba4b9c9dab31aae9e35a0b7333c273c892b7.tar.gz
Merge branch 'wip/compose-parser' into 'master'
Clean up the GtkComposeTable api See merge request GNOME/gtk!3746
-rw-r--r--gtk/compose/charsbin0 -> 1573 bytes
-rw-r--r--gtk/compose/compose-parse.c63
-rwxr-xr-xgtk/compose/compose-parse.py984
-rw-r--r--gtk/compose/gtk-compose-lookaside.txt405
-rw-r--r--gtk/compose/gtkcomposedata.h9
-rw-r--r--gtk/compose/meson.build7
-rw-r--r--gtk/compose/sequencesbin0 -> 33042 bytes
-rw-r--r--gtk/gen-gtk-gresources-xml.py2
-rw-r--r--gtk/gtkcomposetable.c1150
-rw-r--r--gtk/gtkcomposetable.h77
-rw-r--r--gtk/gtkimcontextsimple.c206
-rw-r--r--gtk/gtkimcontextsimple.h8
-rw-r--r--gtk/meson.build2
-rw-r--r--testsuite/gtk/compose/basic.expected5
-rw-r--r--testsuite/gtk/compose/codepoint.expected5
-rw-r--r--testsuite/gtk/compose/comments.expected5
-rw-r--r--testsuite/gtk/compose/cycle3
-rw-r--r--testsuite/gtk/compose/hex.expected5
-rw-r--r--testsuite/gtk/compose/include4
-rw-r--r--testsuite/gtk/compose/include.expected6
-rw-r--r--testsuite/gtk/compose/included2
-rw-r--r--testsuite/gtk/compose/long.expected5
-rw-r--r--testsuite/gtk/compose/match.expected9
-rw-r--r--testsuite/gtk/compose/multi.expected9
-rw-r--r--testsuite/gtk/compose/nofile3
-rw-r--r--testsuite/gtk/compose/octal.expected5
-rw-r--r--testsuite/gtk/compose/strings.expected9
-rw-r--r--testsuite/gtk/compose/system1
-rw-r--r--testsuite/gtk/compose/system.expected4914
-rw-r--r--testsuite/gtk/composetable.c192
30 files changed, 6097 insertions, 1998 deletions
diff --git a/gtk/compose/chars b/gtk/compose/chars
new file mode 100644
index 0000000000..9f9b15314f
--- /dev/null
+++ b/gtk/compose/chars
Binary files differ
diff --git a/gtk/compose/compose-parse.c b/gtk/compose/compose-parse.c
new file mode 100644
index 0000000000..e80b270453
--- /dev/null
+++ b/gtk/compose/compose-parse.c
@@ -0,0 +1,63 @@
+#include <gtk/gtk.h>
+#include "gtk/gtkcomposetable.h"
+#include <locale.h>
+
+/* This program reads a Compose file and generates files with sequences,
+ * character data, and definitions for the builtin compose table of GTK.
+ * Run it like this:
+ *
+ * compose-parse Compose sequences chars gtkcomposedata.h
+ *
+ * The GTK build expects the output files to be in the source tree, in
+ * the gtk/compose directory.
+ */
+int
+main (int argc, char *argv[])
+{
+ GtkComposeTable *table;
+ GError *error = NULL;
+ GString *str;
+
+ setlocale (LC_ALL, "");
+
+ if (argc < 5)
+ {
+ g_print ("Usage: compose-parse INPUT OUTPUT1 OUTPUT2 OUTPUT3\n");
+ exit (1);
+ }
+
+ table = gtk_compose_table_parse (argv[1], NULL);
+ if (!table)
+ g_error ("Failed to parse %s", argv[1]);
+
+ /* data_size is the size in guint16 */
+ if (!g_file_set_contents (argv[2], (char *)table->data, 2 * table->data_size, &error))
+ g_error ("%s", error->message);
+
+ if (!g_file_set_contents (argv[3], table->char_data, table->n_chars + 1, &error))
+ g_error ("%s", error->message);
+
+ str = g_string_new ("");
+ g_string_append (str,
+ "#ifndef __GTK_COMPOSE_DATA__\n"
+ "#define __GTK_COMPOSE_DATA__\n"
+ "\n");
+ g_string_append_printf (str,
+ "#define MAX_SEQ_LEN %d\n", table->max_seq_len);
+ g_string_append_printf (str,
+ "#define N_INDEX_SIZE %d\n", table->n_index_size);
+ g_string_append_printf (str,
+ "#define DATA_SIZE %d\n", table->data_size);
+ g_string_append_printf (str,
+ "#define N_CHARS %d\n", table->n_chars);
+ g_string_append (str,
+ "\n"
+ "#endif\n");
+
+ if (!g_file_set_contents (argv[4], str->str, str->len, &error))
+ g_error ("%s", error->message);
+
+ g_string_free (str, TRUE);
+
+ return 0;
+}
diff --git a/gtk/compose/compose-parse.py b/gtk/compose/compose-parse.py
deleted file mode 100755
index 23444bc1ed..0000000000
--- a/gtk/compose/compose-parse.py
+++ /dev/null
@@ -1,984 +0,0 @@
-#!/usr/bin/env python2
-# -*- coding: utf-8 -*-
-#
-# compose-parse.py, version 1.4
-#
-# multifunction script that helps manage the compose sequence table in GTK+ (gtk/gtkimcontextsimple.c)
-# the script produces statistics and information about the whole process, run with --help for more.
-#
-# You may need to switch your python installation to utf-8, if you get 'ascii' codec errors.
-#
-# Complain to Simos Xenitellis (simos@gnome.org, http://simos.info/blog) for this craft.
-
-from re import findall, match, split, sub
-from string import atoi
-from unicodedata import normalize
-from urllib import urlretrieve
-from os.path import isfile, getsize
-from copy import copy
-
-import sys
-import getopt
-
-# We grab files off the web, left and right.
-URL_COMPOSE = 'http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre'
-URL_KEYSYMSTXT = "http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt"
-URL_GDKKEYSYMSH = "http://git.gnome.org/browse/gtk%2B/plain/gdk/gdkkeysyms.h"
-URL_UNICODEDATATXT = 'http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt'
-FILENAME_COMPOSE_SUPPLEMENTARY = 'gtk-compose-lookaside.txt'
-FILENAME_COMPOSE_NEGATIVE_SUPPLEMENTARY = 'gtk-compose-remove.txt'
-
-# We currently support keysyms of size 2; once upstream xorg gets sorted,
-# we might produce some tables with size 2 and some with size 4.
-SIZEOFINT = 2
-
-# Current max compose sequence length; in case it gets increased.
-WIDTHOFCOMPOSETABLE = 5
-
-keysymdatabase = {}
-keysymunicodedatabase = {}
-unicodedatabase = {}
-
-headerfile_start = """/* GTK - The GIMP Tool Kit
- * Copyright (C) 2007, 2008 GNOME Foundation
- *
- * 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 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, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * File auto-generated from script found at http://bugzilla.gnome.org/show_bug.cgi?id=321896
- * using the input files
- * Input : http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre
- * Input : http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt
- * Input : http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
- *
- * This table is optimised for space and requires special handling to access the content.
- * This table is used solely by http://svn.gnome.org/viewcvs/gtk%2B/trunk/gtk/gtkimcontextsimple.c
- *
- * The resulting file is placed at http://svn.gnome.org/viewcvs/gtk%2B/trunk/gtk/gtkimcontextsimpleseqs.h
- * This file is described in bug report http://bugzilla.gnome.org/show_bug.cgi?id=321896
- */
-
-/*
- * Modified by the GTK+ Team and others 2007, 2008. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __GTK_IM_CONTEXT_SIMPLE_SEQS_H__
-#define __GTK_IM_CONTEXT_SIMPLE_SEQS_H__
-
-/* === These are the original comments of the file; we keep for historical purposes ===
- *
- * The following table was generated from the X compose tables include with
- * XFree86 4.0 using a set of Perl scripts. Contact Owen Taylor <otaylor@redhat.com>
- * to obtain the relevant perl scripts.
- *
- * The following compose letter letter sequences conflicted
- * Dstroke/dstroke and ETH/eth; resolved to Dstroke (Croatian, Vietnamese, Lappish), over
- * ETH (Icelandic, Faroese, old English, IPA) [ D- -D d- -d ]
- * Amacron/amacron and ordfeminine; resolved to ordfeminine [ _A A_ a_ _a ]
- * Amacron/amacron and Atilde/atilde; resolved to atilde [ -A A- a- -a ]
- * Omacron/Omacron and masculine; resolved to masculine [ _O O_ o_ _o ]
- * Omacron/omacron and Otilde/atilde; resolved to otilde [ -O O- o- -o ]
- *
- * [ Amacron and Omacron are in Latin-4 (Baltic). ordfeminine and masculine are used for
- * spanish. atilde and otilde are used at least for Portuguese ]
- *
- * at and Aring; resolved to Aring [ AA ]
- * guillemotleft and caron; resolved to guillemotleft [ << ]
- * ogonek and cedilla; resolved to cedilla [ ,, ]
- *
- * This probably should be resolved by first checking an additional set of compose tables
- * that depend on the locale or selected input method.
- */
-
-static const guint16 gtk_compose_seqs_compact[] = {"""
-
-headerfile_end = """};
-
-#endif /* __GTK_IM_CONTEXT_SIMPLE_SEQS_H__ */
-"""
-
-def stringtohex(str): return atoi(str, 16)
-
-def factorial(n):
- if n <= 1:
- return 1
- else:
- return n * factorial(n-1)
-
-def uniq(*args) :
- """ Performs a uniq operation on a list or lists """
- theInputList = []
- for theList in args:
- theInputList += theList
- theFinalList = []
- for elem in theInputList:
- if elem not in theFinalList:
- theFinalList.append(elem)
- return theFinalList
-
-
-
-def all_permutations(seq):
- """ Borrowed from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252178 """
- """ Produces all permutations of the items of a list """
- if len(seq) <=1:
- yield seq
- else:
- for perm in all_permutations(seq[1:]):
- for i in range(len(perm)+1):
- #nb str[0:1] works in both string and list contexts
- yield perm[:i] + seq[0:1] + perm[i:]
-
-def usage():
- print """compose-parse available parameters:
- -h, --help this craft
- -s, --statistics show overall statistics (both algorithmic, non-algorithmic)
- -a, --algorithmic show sequences saved with algorithmic optimisation
- -g, --gtk show entries that go to GTK+
- -u, --unicodedatatxt show compose sequences derived from UnicodeData.txt (from unicode.org)
- -v, --verbose show verbose output
- -p, --plane1 show plane1 compose sequences
- -n, --numeric when used with --gtk, create file with numeric values only
- -e, --gtk-expanded when used with --gtk, create file that repeats first column; not usable in GTK+
-
- Default is to show statistics.
- """
-
-try:
- opts, args = getopt.getopt(sys.argv[1:], "pvgashune", ["help", "algorithmic", "statistics", "unicodedatatxt",
- "stats", "gtk", "verbose", "plane1", "numeric", "gtk-expanded"])
-except:
- usage()
- sys.exit(2)
-
-opt_statistics = False
-opt_algorithmic = False
-opt_gtk = False
-opt_unicodedatatxt = False
-opt_verbose = False
-opt_plane1 = False
-opt_numeric = False
-opt_gtkexpanded = False
-
-for o, a in opts:
- if o in ("-h", "--help"):
- usage()
- sys.exit()
- if o in ("-s", "--statistics"):
- opt_statistics = True
- if o in ("-a", "--algorithmic"):
- opt_algorithmic = True
- if o in ("-g", "--gtk"):
- opt_gtk = True
- if o in ("-u", "--unicodedatatxt"):
- opt_unicodedatatxt = True
- if o in ("-v", "--verbose"):
- opt_verbose = True
- if o in ("-p", "--plane1"):
- opt_plane1 = True
- if o in ("-n", "--numeric"):
- opt_numeric = True
- if o in ("-e", "--gtk-expanded"):
- opt_gtkexpanded = True
-
-if not opt_algorithmic and not opt_gtk and not opt_unicodedatatxt:
- opt_statistics = True
-
-def download_hook(blocks_transferred, block_size, file_size):
- """ A download hook to provide some feedback when downloading """
- if blocks_transferred == 0:
- if file_size > 0:
- if opt_verbose:
- print "Downloading", file_size, "bytes: ",
- else:
- if opt_verbose:
- print "Downloading: ",
- sys.stdout.write('#')
- sys.stdout.flush()
-
-
-def download_file(url):
- """ Downloads a file provided a URL. Returns the filename. """
- """ Borks on failure """
- localfilename = url.split('/')[-1]
- if not isfile(localfilename) or getsize(localfilename) <= 0:
- if opt_verbose:
- print "Downloading ", url, "..."
- try:
- urlretrieve(url, localfilename, download_hook)
- except IOError, (errno, strerror):
- print "I/O error(%s): %s" % (errno, strerror)
- sys.exit(-1)
- except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
- print " done."
- else:
- if opt_verbose:
- print "Using cached file for ", url
- return localfilename
-
-def process_gdkkeysymsh():
- """ Opens the gdkkeysyms.h file from GTK+/gdk/gdkkeysyms.h """
- """ Fills up keysymdb with contents """
- filename_gdkkeysymsh = download_file(URL_GDKKEYSYMSH)
- try:
- gdkkeysymsh = open(filename_gdkkeysymsh, 'r')
- except IOError, (errno, strerror):
- print "I/O error(%s): %s" % (errno, strerror)
- sys.exit(-1)
- except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
-
- """ Parse the gdkkeysyms.h file and place contents in keysymdb """
- linenum_gdkkeysymsh = 0
- keysymdb = {}
- for line in gdkkeysymsh.readlines():
- linenum_gdkkeysymsh += 1
- line = line.strip()
- if line == "" or not match('^#define GDK_KEY_', line):
- continue
- components = split('\s+', line)
- if len(components) < 3:
- print "Invalid line %(linenum)d in %(filename)s: %(line)s"\
- % {'linenum': linenum_gdkkeysymsh, 'filename': filename_gdkkeysymsh, 'line': line}
- print "Was expecting 3 items in the line"
- sys.exit(-1)
- if not match('^GDK_KEY_', components[1]):
- print "Invalid line %(linenum)d in %(filename)s: %(line)s"\
- % {'linenum': linenum_gdkkeysymsh, 'filename': filename_gdkkeysymsh, 'line': line}
- print "Was expecting a keysym starting with GDK_KEY_"
- sys.exit(-1)
- if match('^0x[0-9a-fA-F]+$', components[2]):
- unival = long(components[2][2:], 16)
- if unival == 0:
- continue
- keysymdb[components[1][8:]] = unival
- else:
- print "Invalid line %(linenum)d in %(filename)s: %(line)s"\
- % {'linenum': linenum_gdkkeysymsh, 'filename': filename_gdkkeysymsh, 'line': line}
- print "Was expecting a hexadecimal number at the end of the line"
- sys.exit(-1)
- gdkkeysymsh.close()
-
- """ Patch up the keysymdb with some of our own stuff """
-
- """ This is for a missing keysym from the currently upstream file """
- ###keysymdb['dead_stroke'] = 0x338
-
- """ This is for a missing keysym from the currently upstream file """
- ###keysymdb['dead_belowring'] = 0x323
- ###keysymdb['dead_belowmacron'] = 0x331
- ###keysymdb['dead_belowcircumflex'] = 0x32d
- ###keysymdb['dead_belowtilde'] = 0x330
- ###keysymdb['dead_belowbreve'] = 0x32e
- ###keysymdb['dead_belowdiaeresis'] = 0x324
-
- """ This is^Wwas preferential treatment for Greek """
- # keysymdb['dead_tilde'] = 0x342
- """ This is^was preferential treatment for Greek """
- #keysymdb['combining_tilde'] = 0x342
-
- """ Fixing VoidSymbol """
- keysymdb['VoidSymbol'] = 0xFFFF
-
- return keysymdb
-
-def process_keysymstxt():
- """ Grabs and opens the keysyms.txt file that Markus Kuhn maintains """
- """ This file keeps a record between keysyms <-> unicode chars """
- filename_keysymstxt = download_file(URL_KEYSYMSTXT)
- try:
- keysymstxt = open(filename_keysymstxt, 'r')
- except IOError, (errno, strerror):
- print "I/O error(%s): %s" % (errno, strerror)
- sys.exit(-1)
- except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
-
- """ Parse the keysyms.txt file and place content in keysymdb """
- linenum_keysymstxt = 0
- keysymdb = {}
- for line in keysymstxt.readlines():
- linenum_keysymstxt += 1
- line = line.strip()
- if line == "" or match('^#', line):
- continue
- components = split('\s+', line)
- if len(components) < 5:
- print "Invalid line %(linenum)d in %(filename)s: %(line)s'"\
- % {'linenum': linenum_keysymstxt, 'filename': filename_keysymstxt, 'line': line}
- print "Was expecting 5 items in the line"
- sys.exit(-1)
- if match('^U[0-9a-fA-F]+$', components[1]):
- unival = long(components[1][1:], 16)
- if unival == 0:
- continue
- keysymdb[components[4]] = unival
- keysymstxt.close()
-
- """ Patch up the keysymdb with some of our own stuff """
- """ This is for a missing keysym from the currently upstream file """
- keysymdb['dead_belowring'] = 0x323
- keysymdb['dead_belowmacron'] = 0x331
- keysymdb['dead_belowcircumflex'] = 0x32d
- keysymdb['dead_belowtilde'] = 0x330
- keysymdb['dead_belowbreve'] = 0x32e
- keysymdb['dead_belowdiaeresis'] = 0x324
-
- """ This is preferential treatment for Greek """
- """ => we get more savings if used for Greek """
- # keysymdb['dead_tilde'] = 0x342
- """ This is preferential treatment for Greek """
- # keysymdb['combining_tilde'] = 0x342
-
- """ This is for a missing keysym from Markus Kuhn's db """
- keysymdb['dead_stroke'] = 0x338
- """ This is for a missing keysym from Markus Kuhn's db """
- keysymdb['Oslash'] = 0x0d8
- """ This is for a missing keysym from Markus Kuhn's db """
- keysymdb['Ssharp'] = 0x1e9e
-
- """ This is for a missing (recently added) keysym """
- keysymdb['dead_psili'] = 0x313
- """ This is for a missing (recently added) keysym """
- keysymdb['dead_dasia'] = 0x314
-
- """ Allows to import Multi_key sequences """
- keysymdb['Multi_key'] = 0xff20
-
- keysymdb['zerosubscript'] = 0x2080
- keysymdb['onesubscript'] = 0x2081
- keysymdb['twosubscript'] = 0x2082
- keysymdb['threesubscript'] = 0x2083
- keysymdb['foursubscript'] = 0x2084
- keysymdb['fivesubscript'] = 0x2085
- keysymdb['sixsubscript'] = 0x2086
- keysymdb['sevensubscript'] = 0x2087
- keysymdb['eightsubscript'] = 0x2088
- keysymdb['ninesubscript'] = 0x2089
- keysymdb['dead_doublegrave'] = 0x030F
- keysymdb['dead_invertedbreve'] = 0x0311
- keysymdb['dead_belowcomma'] = 0xfe6e
- keysymdb['dead_currency'] = 0xfe6f
- keysymdb['dead_greek'] = 0xfe8c
-
- return keysymdb
-
-def keysymvalue(keysym, file = "n/a", linenum = 0):
- """ Extracts a value from the keysym """
- """ Find the value of keysym, using the data from keysyms """
- """ Use file and linenum to when reporting errors """
- if keysym == "":
- return 0
- if keysymdatabase.has_key(keysym):
- return keysymdatabase[keysym]
- elif keysym[0] == 'U' and match('[0-9a-fA-F]+$', keysym[1:]):
- return atoi(keysym[1:], 16)
- elif keysym[:2] == '0x' and match('[0-9a-fA-F]+$', keysym[2:]):
- return atoi(keysym[2:], 16)
- else:
- print 'keysymvalue: UNKNOWN{%(keysym)s}' % { "keysym": keysym }
- #return -1
- sys.exit(-1)
-
-def keysymunicodevalue(keysym, file = "n/a", linenum = 0):
- """ Extracts a value from the keysym """
- """ Find the value of keysym, using the data from keysyms """
- """ Use file and linenum to when reporting errors """
- if keysym == "":
- return 0
- if keysymunicodedatabase.has_key(keysym):
- return keysymunicodedatabase[keysym]
- elif keysym[0] == 'U' and match('[0-9a-fA-F]+$', keysym[1:]):
- return atoi(keysym[1:], 16)
- elif keysym[:2] == '0x' and match('[0-9a-fA-F]+$', keysym[2:]):
- return atoi(keysym[2:], 16)
- else:
- print 'keysymunicodevalue: UNKNOWN{%(keysym)s}' % { "keysym": keysym }
- sys.exit(-1)
-
-def rename_combining(seq):
- filtered_sequence = []
- for ks in seq:
- if findall('^combining_', ks):
- ks = sub('^combining_', 'dead_', ks)
- if ks == 'dead_double_grave':
- ks = 'dead_doublegrave'
- if ks == 'dead_inverted_breve':
- ks = 'dead_invertedbreve'
- filtered_sequence.append(ks)
- return filtered_sequence
-
-
-keysymunicodedatabase = process_keysymstxt()
-keysymdatabase = process_gdkkeysymsh()
-
-""" Grab and open the compose file from upstream """
-filename_compose = download_file(URL_COMPOSE)
-try:
- composefile = open(filename_compose, 'r')
-except IOError, (errno, strerror):
- print "I/O error(%s): %s" % (errno, strerror)
- sys.exit(-1)
-except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
-
-""" Look if there is a lookaside (supplementary) compose file in the current
- directory, and if so, open, then merge with upstream Compose file.
-"""
-xorg_compose_sequences_raw = []
-for seq in composefile.readlines():
- xorg_compose_sequences_raw.append(seq)
-
-try:
- composefile_lookaside = open(FILENAME_COMPOSE_NEGATIVE_SUPPLEMENTARY, 'r')
- for seq in composefile_lookaside.readlines():
- xorg_compose_sequences_raw.remove(seq)
-except IOError, (errno, strerror):
- if opt_verbose:
- print "I/O error(%s): %s" % (errno, strerror)
- print "Did not find negative lookaside compose file. Continuing..."
-except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
-
-try:
- composefile_lookaside = open(FILENAME_COMPOSE_SUPPLEMENTARY, 'r')
- for seq in composefile_lookaside.readlines():
- xorg_compose_sequences_raw.append(seq)
-except IOError, (errno, strerror):
- if opt_verbose:
- print "I/O error(%s): %s" % (errno, strerror)
- print "Did not find lookaside compose file. Continuing..."
-except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
-
-""" Parse the compose file in xorg_compose_sequences"""
-xorg_compose_sequences = []
-xorg_compose_sequences_algorithmic = []
-linenum_compose = 0
-comment_nest_depth = 0
-for line in xorg_compose_sequences_raw:
- linenum_compose += 1
- line = line.strip()
- if match("^XCOMM", line) or match("^#", line):
- continue
-
- line = sub(r"\/\*([^\*]*|[\*][^/])\*\/", "", line)
-
- comment_start = line.find("/*")
-
- if comment_start >= 0:
- if comment_nest_depth == 0:
- line = line[:comment_start]
- else:
- line = ""
-
- comment_nest_depth += 1
- else:
- comment_end = line.find("*/")
-
- if comment_end >= 0:
- comment_nest_depth -= 1
-
- if comment_nest_depth < 0:
- print "Invalid comment %(linenum_compose)d in %(filename)s: \
- Closing '*/' without opening '/*'" % { "linenum_compose": linenum_compose, "filename": filename_compose }
- exit(-1)
-
- if comment_nest_depth > 0:
- line = ""
- else:
- line = line[comment_end + 2:]
-
- if line is "":
- continue
-
- #line = line[:-1]
- components = split(':', line, 1)
- if len(components) != 2:
- print "Invalid line %(linenum_compose)d in %(filename)s: No sequence\
- /value pair found" % { "linenum_compose": linenum_compose, "filename": filename_compose }
- exit(-1)
- (seq, val ) = split(':', line, 1)
- seq = seq.strip()
- val = val.strip()
- raw_sequence = findall('\w+', seq)
- values = split('\s+', val)
- unichar_temp = split('"', values[0])
- unichar_utf8 = unichar_temp[1]
- if len(values) == 1:
- continue
- codepointstr = values[1]
- if values[1] == '#':
- # No codepoints that are >1 characters yet.
- continue
- if raw_sequence[0][0] == 'U' and match('[0-9a-fA-F]+$', raw_sequence[0][1:]):
- raw_sequence[0] = '0x' + raw_sequence[0][1:]
- if match('^U[0-9a-fA-F]+$', codepointstr):
- codepoint = long(codepointstr[1:], 16)
- elif keysymunicodedatabase.has_key(codepointstr):
- #if keysymdatabase[codepointstr] != keysymunicodedatabase[codepointstr]:
- #print "DIFFERENCE: 0x%(a)X 0x%(b)X" % { "a": keysymdatabase[codepointstr], "b": keysymunicodedatabase[codepointstr]},
- #print raw_sequence, codepointstr
- codepoint = keysymunicodedatabase[codepointstr]
- else:
- unichar = unicode(unichar_utf8, 'utf-8')
- codepoint = ord(unichar)
- sequence = rename_combining(raw_sequence)
- reject_this = False
- for i in sequence:
- if keysymvalue(i) > 0xFFFF:
- reject_this = True
- if opt_plane1:
- print sequence
- break
- if keysymvalue(i) < 0:
- reject_this = True
- break
- if reject_this:
- continue
- if "U0342" in sequence or \
- "U0313" in sequence or \
- "U0314" in sequence or \
- "0x0313" in sequence or \
- "0x0342" in sequence or \
- "0x0314" in sequence:
- continue
- if codepoint > 0xFFFF:
- if opt_verbose:
- print "Ignore the line greater than guint16:\n%s" % line
- continue
- #for i in range(len(sequence)):
- # if sequence[i] == "0x0342":
- # sequence[i] = "dead_tilde"
- if "Multi_key" not in sequence:
- """ Ignore for now >0xFFFF keysyms """
- if codepoint < 0xFFFF:
- original_sequence = copy(sequence)
- stats_sequence = copy(sequence)
- base = sequence.pop()
- basechar = keysymvalue(base, filename_compose, linenum_compose)
-
- if basechar < 0xFFFF:
- counter = 1
- unisequence = []
- not_normalised = True
- skipping_this = False
- for i in range(0, len(sequence)):
- """ If the sequence has dead_tilde and is for Greek, we don't do algorithmically
- because of lack of dead_perispomeni (i.e. conflict)
- """
- bc = basechar
- """if sequence[-1] == "dead_tilde" and (bc >= 0x370 and bc <= 0x3ff) or (bc >= 0x1f00 and bc <= 0x1fff):
- skipping_this = True
- break
- if sequence[-1] == "dead_horn" and (bc >= 0x370 and bc <= 0x3ff) or (bc >= 0x1f00 and bc <= 0x1fff):
- skipping_this = True
- break
- if sequence[-1] == "dead_ogonek" and (bc >= 0x370 and bc <= 0x3ff) or (bc >= 0x1f00 and bc <= 0x1fff):
- skipping_this = True
- break
- if sequence[-1] == "dead_psili":
- sequence[i] = "dead_horn"
- if sequence[-1] == "dead_dasia":
- sequence[-1] = "dead_ogonek"
- """
- unisequence.append(unichr(keysymunicodevalue(sequence.pop(), filename_compose, linenum_compose)))
-
- if skipping_this:
- unisequence = []
- for perm in all_permutations(unisequence):
- # print counter, original_sequence, unichr(basechar) + "".join(perm)
- # print counter, map(unichr, perm)
- normalized = normalize('NFC', unichr(basechar) + "".join(perm))
- if len(normalized) == 1:
- # print 'Base: %(base)s [%(basechar)s], produces [%(unichar)s] (0x%(codepoint)04X)' \
- # % { "base": base, "basechar": unichr(basechar), "unichar": unichar, "codepoint": codepoint },
- # print "Normalized: [%(normalized)s] SUCCESS %(c)d" % { "normalized": normalized, "c": counter }
- stats_sequence_data = map(keysymunicodevalue, stats_sequence)
- stats_sequence_data.append(normalized)
- xorg_compose_sequences_algorithmic.append(stats_sequence_data)
- not_normalised = False
- break;
- counter += 1
- if not_normalised:
- original_sequence.append(codepoint)
- xorg_compose_sequences.append(original_sequence)
- """ print xorg_compose_sequences[-1] """
-
- else:
- print "Error in base char !?!"
- exit(-2)
- else:
- print "OVER", sequence
- exit(-1)
- else:
- sequence.append(codepoint)
- xorg_compose_sequences.append(sequence)
- """ print xorg_compose_sequences[-1] """
-
-def sequence_cmp(x, y):
- if keysymvalue(x[0]) > keysymvalue(y[0]):
- return 1
- elif keysymvalue(x[0]) < keysymvalue(y[0]):
- return -1
- elif len(x) > len(y):
- return 1
- elif len(x) < len(y):
- return -1
- elif keysymvalue(x[1]) > keysymvalue(y[1]):
- return 1
- elif keysymvalue(x[1]) < keysymvalue(y[1]):
- return -1
- elif len(x) < 4:
- return 0
- elif keysymvalue(x[2]) > keysymvalue(y[2]):
- return 1
- elif keysymvalue(x[2]) < keysymvalue(y[2]):
- return -1
- elif len(x) < 5:
- return 0
- elif keysymvalue(x[3]) > keysymvalue(y[3]):
- return 1
- elif keysymvalue(x[3]) < keysymvalue(y[3]):
- return -1
- elif len(x) < 6:
- return 0
- elif keysymvalue(x[4]) > keysymvalue(y[4]):
- return 1
- elif keysymvalue(x[4]) < keysymvalue(y[4]):
- return -1
- else:
- return 0
-
-def sequence_unicode_cmp(x, y):
- if keysymunicodevalue(x[0]) > keysymunicodevalue(y[0]):
- return 1
- elif keysymunicodevalue(x[0]) < keysymunicodevalue(y[0]):
- return -1
- elif len(x) > len(y):
- return 1
- elif len(x) < len(y):
- return -1
- elif keysymunicodevalue(x[1]) > keysymunicodevalue(y[1]):
- return 1
- elif keysymunicodevalue(x[1]) < keysymunicodevalue(y[1]):
- return -1
- elif len(x) < 4:
- return 0
- elif keysymunicodevalue(x[2]) > keysymunicodevalue(y[2]):
- return 1
- elif keysymunicodevalue(x[2]) < keysymunicodevalue(y[2]):
- return -1
- elif len(x) < 5:
- return 0
- elif keysymunicodevalue(x[3]) > keysymunicodevalue(y[3]):
- return 1
- elif keysymunicodevalue(x[3]) < keysymunicodevalue(y[3]):
- return -1
- elif len(x) < 6:
- return 0
- elif keysymunicodevalue(x[4]) > keysymunicodevalue(y[4]):
- return 1
- elif keysymunicodevalue(x[4]) < keysymunicodevalue(y[4]):
- return -1
- else:
- return 0
-
-def sequence_algorithmic_cmp(x, y):
- if len(x) < len(y):
- return -1
- elif len(x) > len(y):
- return 1
- else:
- for i in range(len(x)):
- if x[i] < y[i]:
- return -1
- elif x[i] > y[i]:
- return 1
- return 0
-
-
-xorg_compose_sequences.sort(sequence_cmp)
-
-xorg_compose_sequences_uniqued = []
-first_time = True
-item = None
-for next_item in xorg_compose_sequences:
- if first_time:
- first_time = False
- item = next_item
- if sequence_unicode_cmp(item, next_item) != 0:
- xorg_compose_sequences_uniqued.append(item)
- item = next_item
-
-xorg_compose_sequences = copy(xorg_compose_sequences_uniqued)
-
-counter_multikey = 0
-for item in xorg_compose_sequences:
- if findall('Multi_key', "".join(item[:-1])) != []:
- counter_multikey += 1
-
-xorg_compose_sequences_algorithmic.sort(sequence_algorithmic_cmp)
-xorg_compose_sequences_algorithmic_uniqued = uniq(xorg_compose_sequences_algorithmic)
-
-firstitem = ""
-num_first_keysyms = 0
-zeroes = 0
-num_entries = 0
-num_algorithmic_greek = 0
-for sequence in xorg_compose_sequences:
- if keysymvalue(firstitem) != keysymvalue(sequence[0]):
- firstitem = sequence[0]
- num_first_keysyms += 1
- zeroes += 6 - len(sequence) + 1
- num_entries += 1
-
-for sequence in xorg_compose_sequences_algorithmic_uniqued:
- ch = ord(sequence[-1:][0])
- if ch >= 0x370 and ch <= 0x3ff or ch >= 0x1f00 and ch <= 0x1fff:
- num_algorithmic_greek += 1
-
-
-if opt_algorithmic:
- for sequence in xorg_compose_sequences_algorithmic_uniqued:
- letter = "".join(sequence[-1:])
- print '0x%(cp)04X, %(uni)s, seq: [ <0x%(base)04X>,' % { 'cp': ord(unicode(letter)), 'uni': letter.encode('utf-8'), 'base': sequence[-2] },
- for elem in sequence[:-2]:
- print "<0x%(keysym)04X>," % { 'keysym': elem },
- """ Yeah, verified... We just want to keep the output similar to -u, so we can compare/sort easily """
- print "], recomposed as", letter.encode('utf-8'), "verified"
-
-def num_of_keysyms(seq):
- return len(seq) - 1
-
-def convert_UnotationToHex(arg):
- if isinstance(arg, str):
- if match('^U[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$', arg):
- return sub('^U', '0x', arg)
- return arg
-
-def addprefix_GDK(arg):
- if match('^0x', arg):
- return '%(arg)s, ' % { 'arg': arg }
- elif match('^U[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$', arg.upper()):
- keysym = ''
- for k, c in keysymunicodedatabase.items():
- if c == keysymvalue(arg):
- keysym = k
- break
- if keysym != '':
- return 'GDK_KEY_%(arg)s, ' % { 'arg': keysym }
- else:
- return '0x%(arg)04X, ' % { 'arg': keysymvalue(arg) }
- else:
- return 'GDK_KEY_%(arg)s, ' % { 'arg': arg }
-
-if opt_gtk:
- first_keysym = ""
- sequence = []
- compose_table = []
- ct_second_part = []
- ct_sequence_width = 2
- start_offset = num_first_keysyms * (WIDTHOFCOMPOSETABLE+1)
- we_finished = False
- counter = 0
-
- sequence_iterator = iter(xorg_compose_sequences)
- sequence = sequence_iterator.next()
- while True:
- first_keysym = sequence[0] # Set the first keysym
- compose_table.append([first_keysym, 0, 0, 0, 0, 0])
- while sequence[0] == first_keysym:
- compose_table[counter][num_of_keysyms(sequence)-1] += 1
- try:
- sequence = sequence_iterator.next()
- except StopIteration:
- we_finished = True
- break
- if we_finished:
- break
- counter += 1
-
- ct_index = start_offset
- for line_num in range(len(compose_table)):
- for i in range(WIDTHOFCOMPOSETABLE):
- occurrences = compose_table[line_num][i+1]
- compose_table[line_num][i+1] = ct_index
- ct_index += occurrences * (i+2)
-
- for sequence in xorg_compose_sequences:
- ct_second_part.append(map(convert_UnotationToHex, sequence))
-
- print headerfile_start
- for i in compose_table:
- if opt_gtkexpanded:
- print "0x%(ks)04X," % { "ks": keysymvalue(i[0]) },
- print '%(str)s' % { 'str': "".join(map(lambda x : str(x) + ", ", i[1:])) }
- elif not match('^0x', i[0]):
- print 'GDK_KEY_%(str)s' % { 'str': "".join(map(lambda x : str(x) + ", ", i)) }
- else:
- print '%(str)s' % { 'str': "".join(map(lambda x : str(x) + ", ", i)) }
- for i in ct_second_part:
- if opt_numeric:
- for ks in i[1:][:-1]:
- print '0x%(seq)04X, ' % { 'seq': keysymvalue(ks) },
- print '0x%(cp)04X, ' % { 'cp':i[-1] }
- """
- for ks in i[:-1]:
- print '0x%(seq)04X, ' % { 'seq': keysymvalue(ks) },
- print '0x%(cp)04X, ' % { 'cp':i[-1] }
- """
- elif opt_gtkexpanded:
- print '%(seq)s0x%(cp)04X, ' % { 'seq': "".join(map(addprefix_GDK, i[:-1])), 'cp':i[-1] }
- else:
- print '%(seq)s0x%(cp)04X, ' % { 'seq': "".join(map(addprefix_GDK, i[:-1][1:])), 'cp':i[-1] }
- print headerfile_end
-
-def redecompose(codepoint):
- (name, decomposition, combiningclass) = unicodedatabase[codepoint]
- if decomposition[0] == '' or decomposition[0] == '0':
- return [codepoint]
- if match('<\w+>', decomposition[0]):
- numdecomposition = map(stringtohex, decomposition[1:])
- return map(redecompose, numdecomposition)
- numdecomposition = map(stringtohex, decomposition)
- return map(redecompose, numdecomposition)
-
-def process_unicodedata_file(verbose = False):
- """ Grab from wget http://www.unicode.org/Public/UNIDATA/UnicodeData.txt """
- filename_unicodedatatxt = download_file(URL_UNICODEDATATXT)
- try:
- unicodedatatxt = open(filename_unicodedatatxt, 'r')
- except IOError, (errno, strerror):
- print "I/O error(%s): %s" % (errno, strerror)
- sys.exit(-1)
- except:
- print "Unexpected error: ", sys.exc_info()[0]
- sys.exit(-1)
- for line in unicodedatatxt.readlines():
- if line[0] == "" or line[0] == '#':
- continue
- line = line[:-1]
- uniproperties = split(';', line)
- codepoint = stringtohex(uniproperties[0])
- """ We don't do Plane 1 or CJK blocks. The latter require reading additional files. """
- if codepoint > 0xFFFF or (codepoint >= 0x4E00 and codepoint <= 0x9FFF) or (codepoint >= 0xF900 and codepoint <= 0xFAFF):
- continue
- name = uniproperties[1]
- category = uniproperties[2]
- combiningclass = uniproperties[3]
- decomposition = uniproperties[5]
- unicodedatabase[codepoint] = [name, split('\s+', decomposition), combiningclass]
-
- counter_combinations = 0
- counter_combinations_greek = 0
- counter_entries = 0
- counter_entries_greek = 0
-
- for item in unicodedatabase.keys():
- (name, decomposition, combiningclass) = unicodedatabase[item]
- if decomposition[0] == '':
- continue
- print name, "is empty"
- elif match('<\w+>', decomposition[0]):
- continue
- print name, "has weird", decomposition[0]
- else:
- sequence = map(stringtohex, decomposition)
- chrsequence = map(unichr, sequence)
- normalized = normalize('NFC', "".join(chrsequence))
-
- """ print name, sequence, "Combining: ", "".join(chrsequence), normalized, len(normalized), """
- decomposedsequence = []
- for subseq in map(redecompose, sequence):
- for seqitem in subseq:
- if isinstance(seqitem, list):
- for i in seqitem:
- if isinstance(i, list):
- for j in i:
- decomposedsequence.append(j)
- else:
- decomposedsequence.append(i)
- else:
- decomposedsequence.append(seqitem)
- recomposedchar = normalize('NFC', "".join(map(unichr, decomposedsequence)))
- if len(recomposedchar) == 1 and len(decomposedsequence) > 1:
- counter_entries += 1
- counter_combinations += factorial(len(decomposedsequence)-1)
- ch = item
- if ch >= 0x370 and ch <= 0x3ff or ch >= 0x1f00 and ch <= 0x1fff:
- counter_entries_greek += 1
- counter_combinations_greek += factorial(len(decomposedsequence)-1)
- if verbose:
- print "0x%(cp)04X, %(uni)c, seq:" % { 'cp':item, 'uni':unichr(item) },
- print "[",
- for elem in decomposedsequence:
- print '<0x%(hex)04X>,' % { 'hex': elem },
- print "], recomposed as", recomposedchar,
- if unichr(item) == recomposedchar:
- print "verified"
-
- if verbose == False:
- print "Unicode statistics from UnicodeData.txt"
- print "Number of entries that can be algorithmically produced :", counter_entries
- print " of which are for Greek :", counter_entries_greek
- print "Number of compose sequence combinations requiring :", counter_combinations
- print " of which are for Greek :", counter_combinations_greek
- print "Note: We do not include partial compositions, "
- print "thus the slight discrepancy in the figures"
- print
-
-if opt_unicodedatatxt:
- process_unicodedata_file(True)
-
-if opt_statistics:
- print
- print "Total number of compose sequences (from file) :", len(xorg_compose_sequences) + len(xorg_compose_sequences_algorithmic)
- print " of which can be expressed algorithmically :", len(xorg_compose_sequences_algorithmic)
- print " of which cannot be expressed algorithmically :", len(xorg_compose_sequences)
- print " of which have Multi_key :", counter_multikey
- print
- print "Algorithmic (stats for Xorg Compose file)"
- print "Number of sequences off due to algo from file (len(array)) :", len(xorg_compose_sequences_algorithmic)
- print "Number of sequences off due to algo (uniq(sort(array))) :", len(xorg_compose_sequences_algorithmic_uniqued)
- print " of which are for Greek :", num_algorithmic_greek
- print
- process_unicodedata_file()
- print "Not algorithmic (stats from Xorg Compose file)"
- print "Number of sequences :", len(xorg_compose_sequences)
- print "Flat array looks like :", len(xorg_compose_sequences), "rows of 6 integers (2 bytes per int, or 12 bytes per row)"
- print "Flat array would have taken up (in bytes) :", num_entries * 2 * 6, "bytes from the GTK+ library"
- print "Number of items in flat array :", len(xorg_compose_sequences) * 6
- print " of which are zeroes :", zeroes, "or ", (100 * zeroes) / (len(xorg_compose_sequences) * 6), " per cent"
- print "Number of different first items :", num_first_keysyms
- print "Number of max bytes (if using flat array) :", num_entries * 2 * 6
- print "Number of savings :", zeroes * 2 - num_first_keysyms * 2 * 5
- print
- print "Memory needs if both algorithmic+optimised table in latest Xorg compose file"
- print " :", num_entries * 2 * 6 - zeroes * 2 + num_first_keysyms * 2 * 5
- print
- print "Existing (old) implementation in GTK+"
- print "Number of sequences in old gtkimcontextsimple.c :", 691
- print "The existing (old) implementation in GTK+ takes up :", 691 * 2 * 12, "bytes"
diff --git a/gtk/compose/gtk-compose-lookaside.txt b/gtk/compose/gtk-compose-lookaside.txt
deleted file mode 100644
index 3f3b23c69c..0000000000
--- a/gtk/compose/gtk-compose-lookaside.txt
+++ /dev/null
@@ -1,405 +0,0 @@
-#
-# This file contains the compose sequences that GTK+ used to have until GTK+ 2.12
-# but are not found anymore at the upstream Compose file at X.Org.
-# When updating gtkimcontextsimpleseqs.h with compose-parse.py,
-# we include this file as well. There are 15 conflicts currently
-# in the compose sequences, and we currently favour the sequences from
-# this file (against the upstream X.Org file). For more, see
-# http://bugzilla.gnome.org/show_bug.cgi?id=557420
-#
-
-<Greek_accentdieresis> <Greek_iota> : "ἴ" U0390
-<Greek_accentdieresis> <Greek_upsilon> : "ΐ" U03B0
-<Multi_key> <B> <period> : "Ḃ" U1E02
-<Multi_key> <b> <period> : "ḃ" U1E03
-<Multi_key> <D> <period> : "Ḋ" U1E0A
-<Multi_key> <d> <period> : "ḋ" U1E0B
-<Multi_key> <F> <period> : "Ḟ" U1E1E
-<Multi_key> <f> <period> : "ḟ" U1E1F
-<Multi_key> <M> <period> : "Ṁ" U1E40
-<Multi_key> <S> <period> : "Ṡ" U1E60
-<Multi_key> <P> <period> : "Ṗ" U1E56
-<Multi_key> <p> <period> : "ṗ" U1E57
-<Multi_key> <s> <period> : "ṡ" U1E61
-<Multi_key> <T> <period> : "Ṫ" U1E6A
-<Multi_key> <t> <period> : "ṫ" U1E6B
-<Multi_key> <e> <period> : "ė" U0117
-<Multi_key> <C> <bar> : "¢" U00A2
-<Multi_key> <bar> <C> : "¢" U00A2
-<Multi_key> <minus> <l> : "£" U00A3
-<Multi_key> <equal> <l> : "£" U00A3
-<Multi_key> <L> <equal> : "£" U00A3
-<Multi_key> <l> <minus> : "£" U00A3
-<Multi_key> <l> <equal> : "£" U00A3
-<Multi_key> <0> <X> : "¤" U00A4
-<Multi_key> <0> <x> : "¤" U00A4
-<Multi_key> <O> <X> : "¤" U00A4
-<Multi_key> <O> <x> : "¤" U00A4
-<Multi_key> <X> <0> : "¤" U00A4
-<Multi_key> <X> <O> : "¤" U00A4
-<Multi_key> <X> <o> : "¤" U00A4
-<Multi_key> <o> <X> : "¤" U00A4
-<Multi_key> <x> <0> : "¤" U00A4
-<Multi_key> <x> <O> : "¤" U00A4
-<Multi_key> <minus> <Y> : "¥" U00A5
-<Multi_key> <minus> <y> : "¥" U00A5
-<Multi_key> <equal> <y> : "¥" U00A5
-<Multi_key> <Y> <minus> : "¥" U00A5
-<Multi_key> <y> <minus> : "¥" U00A5
-<Multi_key> <y> <equal> : "¥" U00A5
-<Multi_key> <0> <S> : "§" U00A7
-<Multi_key> <0> <s> : "§" U00A7
-<Multi_key> <O> <S> : "§" U00A7
-<Multi_key> <S> <exclam> : "§" U00A7
-<Multi_key> <S> <0> : "§" U00A7
-<Multi_key> <S> <O> : "§" U00A7
-<Multi_key> <s> <exclam> : "§" U00A7
-<Multi_key> <s> <0> : "§" U00A7
-<Multi_key> <quotedbl> <quotedbl> : "¨" U00A8
-<Multi_key> <parenleft> <c> : "©" U00A9
-<Multi_key> <0> <C> : "©" U00A9
-<Multi_key> <0> <c> : "©" U00A9
-<Multi_key> <C> <0> : "©" U00A9
-<Multi_key> <C> <O> : "©" U00A9
-<Multi_key> <C> <o> : "©" U00A9
-<Multi_key> <c> <0> : "©" U00A9
-<Multi_key> <A> <underscore> : "ª" U00AA
-<Multi_key> <a> <underscore> : "ª" U00AA
-<Multi_key> <C> <comma> : "Ç" U00C7
-<Multi_key> <minus> <minus> <space> : "­" U00AD
-<Multi_key> <parenleft> <r> : "®" U00AE
-<Multi_key> <R> <O> : "®" U00AE
-<Multi_key> <minus> <asciicircum> : "¯" U00AF
-<Multi_key> <asciicircum> <minus> : "¯" U00AF
-<Multi_key> <asciicircum> <underscore> : "¯" U00AF
-<Multi_key> <underscore> <asciicircum> : "¯" U00AF
-<Multi_key> <underscore> <underscore> : "¯" U00AF
-<Multi_key> <asterisk> <0> : "°" U00B0
-<Multi_key> <0> <asterisk> : "°" U00B0
-<Multi_key> <0> <asciicircum> : "°" U00B0
-<Multi_key> <minus> <plus> : "±" U00B1
-<Multi_key> <2> <S> : "²" U00B2
-<Multi_key> <2> <asciicircum> : "²" U00B2
-<Multi_key> <2> <s> : "²" U00B2
-<Multi_key> <S> <2> : "²" U00B2
-<Multi_key> <s> <2> : "²" U00B2
-<Multi_key> <3> <S> : "³" U00B3
-<Multi_key> <3> <asciicircum> : "³" U00B3
-<Multi_key> <3> <s> : "³" U00B3
-<Multi_key> <S> <3> : "³" U00B3
-<Multi_key> <s> <3> : "³" U00B3
-<Multi_key> <apostrophe> <apostrophe> : "´" U00B4
-<Multi_key> <slash> <U> : "µ" U00B5
-<Multi_key> <slash> <u> : "µ" U00B5
-<Multi_key> <U> <slash> : "µ" U00B5
-<Multi_key> <u> <slash> : "µ" U00B5
-<Multi_key> <exclam> <P> : "¶" U00B6
-<Multi_key> <exclam> <p> : "¶" U00B6
-<Multi_key> <period> <asciicircum> : "·" U00B7
-<Multi_key> <asciicircum> <period> : "·" U00B7
-<Multi_key> <comma> <comma> : "¸" U00B8
-<Multi_key> <1> <S> : "¹" U00B9
-<Multi_key> <1> <asciicircum> : "¹" U00B9
-<Multi_key> <1> <s> : "¹" U00B9
-<Multi_key> <S> <1> : "¹" U00B9
-<Multi_key> <s> <1> : "¹" U00B9
-<Multi_key> <O> <underscore> : "º" U00BA
-<Multi_key> <o> <underscore> : "º" U00BA
-<Multi_key> <A> <grave> : "À" U00C0
-<Multi_key> <A> <apostrophe> : "Á" U00C1
-<Multi_key> <A> <acute> : "Á" U00C1
-<Multi_key> <greater> <A> : "Â" U00C2
-<Multi_key> <A> <greater> : "Â" U00C2
-<Multi_key> <A> <asciicircum> : "Â" U00C2
-<Multi_key> <minus> <A> : "Ã" U00C3
-<Multi_key> <A> <minus> : "Ã" U00C3
-<Multi_key> <A> <asciitilde> : "Ã" U00C3
-<Multi_key> <A> <quotedbl> : "Ä" U00C4
-<Multi_key> <A> <diaeresis> : "Ä" U00C4
-<Multi_key> <diaeresis> <A> : "Ä" U00C4
-<Multi_key> <asterisk> <A> : "Å" U00C5
-<Multi_key> <A> <asterisk> : "Å" U00C5
-<Multi_key> <A> <A> : "Å" U00C5
-<Multi_key> <space> <less> : "ˇ" U02C7
-<Multi_key> <less> <space> : "ˇ" U02C7
-<Multi_key> <E> <grave> : "È" U00C8
-<Multi_key> <E> <apostrophe> : "É" U00C9
-<Multi_key> <E> <acute> : "É" U00C9
-<Multi_key> <greater> <E> : "Ê" U00CA
-<Multi_key> <E> <greater> : "Ê" U00CA
-<Multi_key> <E> <asciicircum> : "Ê" U00CA
-<Multi_key> <E> <quotedbl> : "Ë" U00CB
-<Multi_key> <E> <diaeresis> : "Ë" U00CB
-<Multi_key> <diaeresis> <E> : "Ë" U00CB
-<Multi_key> <I> <grave> : "Ì" U00CC
-<Multi_key> <I> <apostrophe> : "Í" U00CD
-<Multi_key> <I> <acute> : "Í" U00CD
-<Multi_key> <greater> <I> : "Î" U00CE
-<Multi_key> <I> <greater> : "Î" U00CE
-<Multi_key> <I> <asciicircum> : "Î" U00CE
-<Multi_key> <I> <quotedbl> : "Ï" U00CF
-<Multi_key> <I> <diaeresis> : "Ï" U00CF
-<Multi_key> <diaeresis> <I> : "Ï" U00CF
-<Multi_key> <minus> <N> : "Ñ" U00D1
-<Multi_key> <N> <minus> : "Ñ" U00D1
-<Multi_key> <N> <asciitilde> : "Ñ" U00D1
-<Multi_key> <O> <grave> : "Ò" U00D2
-<Multi_key> <O> <apostrophe> : "Ó" U00D3
-<Multi_key> <O> <acute> : "Ó" U00D3
-<Multi_key> <greater> <O> : "Ô" U00D4
-<Multi_key> <O> <greater> : "Ô" U00D4
-<Multi_key> <O> <asciicircum> : "Ô" U00D4
-<Multi_key> <minus> <O> : "Õ" U00D5
-<Multi_key> <O> <minus> : "Õ" U00D5
-<Multi_key> <O> <asciitilde> : "Õ" U00D5
-<Multi_key> <O> <quotedbl> : "Ö" U00D6
-<Multi_key> <O> <diaeresis> : "Ö" U00D6
-<Multi_key> <diaeresis> <O> : "Ö" U00D6
-<Multi_key> <space> <parenleft> : "˘" U02D8
-<Multi_key> <parenleft> <space> : "˘" U02D8
-<Multi_key> <U> <grave> : "Ù" U00D9
-<Multi_key> <U> <apostrophe> : "Ú" U00DA
-<Multi_key> <U> <acute> : "Ú" U00DA
-<Multi_key> <greater> <U> : "Û" U00DB
-<Multi_key> <U> <greater> : "Û" U00DB
-<Multi_key> <U> <asciicircum> : "Û" U00DB
-<Multi_key> <U> <quotedbl> : "Ü" U00DC
-<Multi_key> <U> <diaeresis> : "Ü" U00DC
-<Multi_key> <diaeresis> <U> : "Ü" U00DC
-<Multi_key> <Y> <apostrophe> : "Ý" U00DD
-<Multi_key> <Y> <acute> : "Ý" U00DD
-<Multi_key> <a> <grave> : "à" U00E0
-<Multi_key> <a> <apostrophe> : "á" U00E1
-<Multi_key> <a> <acute> : "á" U00E1
-<Multi_key> <greater> <a> : "â" U00E2
-<Multi_key> <a> <greater> : "â" U00E2
-<Multi_key> <a> <asciicircum> : "â" U00E2
-<Multi_key> <minus> <a> : "ā" U0101
-<Multi_key> <a> <minus> : "ā" U0101
-<Multi_key> <a> <asciitilde> : "ã" U00E3
-<Multi_key> <a> <quotedbl> : "ä" U00E4
-<Multi_key> <a> <diaeresis> : "ä" U00E4
-<Multi_key> <diaeresis> <a> : "ä" U00E4
-<Multi_key> <asterisk> <a> : "å" U00E5
-<Multi_key> <a> <asterisk> : "å" U00E5
-<Multi_key> <a> <a> : "å" U00E5
-<Multi_key> <c> <comma> : "ç" U00E7
-<Multi_key> <e> <grave> : "è" U00E8
-<Multi_key> <e> <apostrophe> : "é" U00E9
-<Multi_key> <e> <acute> : "é" U00E9
-<Multi_key> <greater> <e> : "ê" U00EA
-<Multi_key> <e> <greater> : "ê" U00EA
-<Multi_key> <e> <asciicircum> : "ê" U00EA
-<Multi_key> <e> <quotedbl> : "ë" U00EB
-<Multi_key> <e> <diaeresis> : "ë" U00EB
-<Multi_key> <diaeresis> <e> : "ë" U00EB
-<Multi_key> <i> <grave> : "ì" U00EC
-<Multi_key> <i> <apostrophe> : "í" U00ED
-<Multi_key> <i> <acute> : "í" U00ED
-<Multi_key> <greater> <i> : "î" U00EE
-<Multi_key> <i> <greater> : "î" U00EE
-<Multi_key> <i> <asciicircum> : "î" U00EE
-<Multi_key> <i> <quotedbl> : "ï" U00EF
-<Multi_key> <i> <diaeresis> : "ï" U00EF
-<Multi_key> <diaeresis> <i> : "ï" U00EF
-<Multi_key> <minus> <n> : "ñ" U00F1
-<Multi_key> <n> <minus> : "ñ" U00F1
-<Multi_key> <n> <asciitilde> : "ñ" U00F1
-<Multi_key> <o> <grave> : "ò" U00F2
-<Multi_key> <o> <apostrophe> : "ó" U00F3
-<Multi_key> <o> <acute> : "ó" U00F3
-<Multi_key> <greater> <o> : "ô" U00F4
-<Multi_key> <o> <greater> : "ô" U00F4
-<Multi_key> <o> <asciicircum> : "ô" U00F4
-<Multi_key> <minus> <o> : "ō" U014D
-<Multi_key> <o> <minus> : "ō" U014D
-<Multi_key> <o> <asciitilde> : "õ" U00F5
-<Multi_key> <o> <quotedbl> : "ö" U00F6
-<Multi_key> <o> <diaeresis> : "ö" U00F6
-<Multi_key> <diaeresis> <o> : "ö" U00F6
-<Multi_key> <o> <slash> : "ø" U00F8
-<Multi_key> <u> <grave> : "ù" U00F9
-<Multi_key> <u> <apostrophe> : "ú" U00FA
-<Multi_key> <u> <acute> : "ú" U00FA
-<Multi_key> <greater> <u> : "û" U00FB
-<Multi_key> <u> <greater> : "û" U00FB
-<Multi_key> <u> <asciicircum> : "û" U00FB
-<Multi_key> <u> <quotedbl> : "ü" U00FC
-<Multi_key> <u> <diaeresis> : "ü" U00FC
-<Multi_key> <diaeresis> <u> : "ü" U00FC
-<Multi_key> <y> <apostrophe> : "ý" U00FD
-<Multi_key> <y> <acute> : "ý" U00FD
-<Multi_key> <y> <quotedbl> : "ÿ" U00FF
-<Multi_key> <y> <diaeresis> : "ÿ" U00FF
-<Multi_key> <diaeresis> <y> : "ÿ" U00FF
-<Multi_key> <parenleft> <A> : "Ă" U0102
-<Multi_key> <A> <parenleft> : "Ă" U0102
-<Multi_key> <parenleft> <a> : "ă" U0103
-<Multi_key> <a> <parenleft> : "ă" U0103
-<Multi_key> <comma> <A> : "Ą" U0104
-<Multi_key> <A> <comma> : "Ą" U0104
-<Multi_key> <comma> <a> : "ą" U0105
-<Multi_key> <a> <comma> : "ą" U0105
-<Multi_key> <C> <apostrophe> : "Ć" U0106
-<Multi_key> <c> <apostrophe> : "ć" U0107
-<Multi_key> <C> <period> : "Ċ" U010A
-<Multi_key> <c> <period> : "ċ" U010B
-<Multi_key> <less> <C> : "Č" U010C
-<Multi_key> <C> <less> : "Č" U010C
-<Multi_key> <less> <c> : "č" U010D
-<Multi_key> <c> <less> : "č" U010D
-<Multi_key> <less> <D> : "Ď" U010E
-<Multi_key> <D> <less> : "Ď" U010E
-<Multi_key> <less> <d> : "ď" U010F
-<Multi_key> <d> <less> : "ď" U010F
-<Multi_key> <minus> <D> : "Đ" U0110
-<Multi_key> <D> <minus> : "Đ" U0110
-<Multi_key> <minus> <d> : "đ" U0111
-<Multi_key> <minus> <E> : "Ē" U0112
-<Multi_key> <E> <minus> : "Ē" U0112
-<Multi_key> <E> <underscore> : "Ē" U0112
-<Multi_key> <minus> <e> : "ē" U0113
-<Multi_key> <e> <minus> : "ē" U0113
-<Multi_key> <e> <underscore> : "ē" U0113
-<Multi_key> <E> <period> : "Ė" U0116
-<Multi_key> <E> <comma> : "Ę" U0118
-<Multi_key> <e> <comma> : "ę" U0119
-<Multi_key> <less> <E> : "Ě" U011A
-<Multi_key> <E> <less> : "Ě" U011A
-<Multi_key> <less> <e> : "ě" U011B
-<Multi_key> <e> <less> : "ě" U011B
-<Multi_key> <parenleft> <G> : "Ğ" U011E
-<Multi_key> <G> <parenleft> : "Ğ" U011E
-<Multi_key> <G> <U> : "Ğ" U011E
-<Multi_key> <G> <breve> : "Ğ" U011E
-<Multi_key> <breve> <G> : "Ğ" U011E
-<Multi_key> <parenleft> <g> : "ğ" U011F
-<Multi_key> <g> <parenleft> : "ğ" U011F
-<Multi_key> <g> <U> : "ğ" U011F
-<Multi_key> <g> <breve> : "ğ" U011F
-<Multi_key> <breve> <g> : "ğ" U011F
-<Multi_key> <G> <period> : "Ġ" U0120
-<Multi_key> <g> <period> : "ġ" U0121
-<Multi_key> <G> <comma> : "Ģ" U0122
-<Multi_key> <g> <comma> : "ģ" U0123
-<Multi_key> <I> <asciitilde> : "Ĩ" U0128
-<Multi_key> <i> <asciitilde> : "ĩ" U0129
-<Multi_key> <minus> <I> : "Ī" U012A
-<Multi_key> <I> <minus> : "Ī" U012A
-<Multi_key> <I> <underscore> : "Ī" U012A
-<Multi_key> <minus> <i> : "ī" U012B
-<Multi_key> <i> <minus> : "ī" U012B
-<Multi_key> <i> <underscore> : "ī" U012B
-<Multi_key> <comma> <I> : "Į" U012E
-<Multi_key> <I> <comma> : "Į" U012E
-<Multi_key> <I> <period> : "İ" U0130
-<Multi_key> <period> <i> : "ı" U0131
-<Multi_key> <K> <comma> : "Ķ" U0136
-<Multi_key> <k> <comma> : "ķ" U0137
-<Multi_key> <L> <apostrophe> : "Ĺ" U0139
-<Multi_key> <l> <apostrophe> : "ĺ" U013A
-<Multi_key> <L> <comma> : "Ļ" U013B
-<Multi_key> <l> <comma> : "ļ" U013C
-<Multi_key> <less> <L> : "Ľ" U013D
-<Multi_key> <L> <less> : "Ľ" U013D
-<Multi_key> <less> <l> : "ľ" U013E
-<Multi_key> <l> <less> : "ľ" U013E
-<Multi_key> <L> <slash> : "Ł" U0141
-<Multi_key> <l> <slash> : "ł" U0142
-<Multi_key> <N> <apostrophe> : "Ń" U0143
-<Multi_key> <n> <apostrophe> : "ń" U0144
-<Multi_key> <N> <comma> : "Ņ" U0145
-<Multi_key> <n> <comma> : "ņ" U0146
-<Multi_key> <less> <N> : "Ň" U0147
-<Multi_key> <N> <less> : "Ň" U0147
-<Multi_key> <less> <n> : "ň" U0148
-<Multi_key> <n> <less> : "ň" U0148
-<Multi_key> <R> <apostrophe> : "Ŕ" U0154
-<Multi_key> <r> <apostrophe> : "ŕ" U0155
-<Multi_key> <R> <comma> : "Ŗ" U0156
-<Multi_key> <r> <comma> : "ŗ" U0157
-<Multi_key> <less> <R> : "Ř" U0158
-<Multi_key> <R> <less> : "Ř" U0158
-<Multi_key> <less> <r> : "ř" U0159
-<Multi_key> <r> <less> : "ř" U0159
-<Multi_key> <S> <apostrophe> : "Ś" U015A
-<Multi_key> <s> <apostrophe> : "ś" U015B
-<Multi_key> <O> <slash> : "Ø" U00D8
-<Multi_key> <S> <comma> : "Ş" U015E
-<Multi_key> <S> <cedilla> : "Ş" U015E
-<Multi_key> <s> <comma> : "ş" U015F
-<Multi_key> <s> <cedilla> : "ş" U015F
-<Multi_key> <less> <S> : "Š" U0160
-<Multi_key> <S> <less> : "Š" U0160
-<Multi_key> <less> <s> : "š" U0161
-<Multi_key> <s> <less> : "š" U0161
-<Multi_key> <less> <T> : "Ť" U0164
-<Multi_key> <T> <less> : "Ť" U0164
-<Multi_key> <less> <t> : "ť" U0165
-<Multi_key> <t> <less> : "ť" U0165
-<Multi_key> <T> <minus> : "Ŧ" U0166
-<Multi_key> <T> <slash> : "Ŧ" U0166
-<Multi_key> <t> <minus> : "ŧ" U0167
-<Multi_key> <t> <slash> : "ŧ" U0167
-<Multi_key> <U> <asciitilde> : "Ũ" U0168
-<Multi_key> <u> <asciitilde> : "ũ" U0169
-<Multi_key> <minus> <U> : "Ū" U016A
-<Multi_key> <U> <minus> : "Ū" U016A
-<Multi_key> <U> <underscore> : "Ū" U016A
-<Multi_key> <minus> <u> : "ū" U016B
-<Multi_key> <u> <minus> : "ū" U016B
-<Multi_key> <u> <underscore> : "ū" U016B
-<Multi_key> <asterisk> <U> : "Ů" U016E
-<Multi_key> <U> <asterisk> : "Ů" U016E
-<Multi_key> <asterisk> <u> : "ů" U016F
-<Multi_key> <u> <asterisk> : "ů" U016F
-<Multi_key> <comma> <U> : "Ų" U0172
-<Multi_key> <U> <comma> : "Ų" U0172
-<Multi_key> <comma> <u> : "ų" U0173
-<Multi_key> <u> <comma> : "ų" U0173
-<Multi_key> <W> <asciicircum> : "Ŵ" U0174
-<Multi_key> <w> <asciicircum> : "ŵ" U0175
-<Multi_key> <Y> <asciicircum> : "Ŷ" U0176
-<Multi_key> <y> <asciicircum> : "ŷ" U0177
-<Multi_key> <Y> <quotedbl> : "Ÿ" U0178
-<Multi_key> <Y> <diaeresis> : "Ÿ" U0178
-<Multi_key> <diaeresis> <Y> : "Ÿ" U0178
-<Multi_key> <Z> <apostrophe> : "Ź" U0179
-<Multi_key> <z> <apostrophe> : "ź" U017A
-<Multi_key> <Z> <period> : "Ż" U017B
-<Multi_key> <z> <period> : "ż" U017C
-<Multi_key> <less> <Z> : "Ž" U017D
-<Multi_key> <Z> <less> : "Ž" U017D
-<Multi_key> <v> <Z> : "Ž" U017D
-<Multi_key> <less> <z> : "ž" U017E
-<Multi_key> <v> <z> : "ž" U017E
-<Multi_key> <z> <less> : "ž" U017E
-<dead_acute> <dead_diaeresis> <space> : "΅" U0385
-<dead_diaeresis> <dead_acute> <space> : "΅" U0385
-<Multi_key> <quotedbl> <apostrophe> <space> : "΅" U0385
-<Multi_key> <apostrophe> <quotedbl> <space> : "΅" U0385
-<Multi_key> <Greek_ALPHA> <apostrophe> : "Ά" U0386
-<Multi_key> <m> <period> : "ṁ" U1E41
-<Multi_key> <Greek_EPSILON> <apostrophe> : "Έ" U0388
-<Multi_key> <Greek_ETA> <apostrophe> : "Ή" U0389
-<Multi_key> <Greek_IOTA> <apostrophe> : "Ί" U038A
-<Multi_key> <Greek_OMICRON> <apostrophe> : "Ό" U038C
-<Multi_key> <Greek_UPSILON> <apostrophe> : "Ύ" U038E
-<Multi_key> <Greek_OMEGA> <apostrophe> : "Ώ" U038F
-<dead_diaeresis> <dead_acute> <Greek_iota> : "ΐ" U0390
-<Multi_key> <quotedbl> <apostrophe> <Greek_iota> : "ΐ" U0390
-<Multi_key> <comma> <i> : "į" U012F
-<Multi_key> <i> <comma> : "į" U012F
-<Multi_key> <Greek_IOTA> <quotedbl> : "Ϊ" U03AA
-<Multi_key> <Greek_UPSILON> <quotedbl> : "Ϋ" U03AB
-<Multi_key> <Greek_alpha> <apostrophe> : "ά" U03AC
-<Multi_key> <Greek_epsilon> <apostrophe> : "έ" U03AD
-<Multi_key> <Greek_eta> <apostrophe> : "ή" U03AE
-<Multi_key> <Greek_iota> <apostrophe> : "ί" U03AF
-<dead_diaeresis> <dead_acute> <Greek_upsilon> : "ΰ" U03B0
-<Multi_key> <quotedbl> <apostrophe> <Greek_upsilon> : "ΰ" U03B0
-<Multi_key> <Greek_iota> <quotedbl> : "ϊ" U03CA
-<Multi_key> <Greek_upsilon> <quotedbl> : "ϋ" U03CB
-<Multi_key> <Greek_omicron> <apostrophe> : "ό" U03CC
-<Multi_key> <Greek_upsilon> <apostrophe> : "ύ" U03CD
-<Multi_key> <Greek_omega> <apostrophe> : "ώ" U03CE
diff --git a/gtk/compose/gtkcomposedata.h b/gtk/compose/gtkcomposedata.h
new file mode 100644
index 0000000000..057347a36b
--- /dev/null
+++ b/gtk/compose/gtkcomposedata.h
@@ -0,0 +1,9 @@
+#ifndef __GTK_COMPOSE_DATA__
+#define __GTK_COMPOSE_DATA__
+
+#define MAX_SEQ_LEN 5
+#define N_INDEX_SIZE 30
+#define DATA_SIZE 16521
+#define N_CHARS 1572
+
+#endif
diff --git a/gtk/compose/meson.build b/gtk/compose/meson.build
new file mode 100644
index 0000000000..90998faf90
--- /dev/null
+++ b/gtk/compose/meson.build
@@ -0,0 +1,7 @@
+compose_parse = executable('compose-parse',
+ sources: 'compose-parse.c',
+ c_args: gtk_cargs + common_cflags,
+ include_directories: [confinc, gtkinc],
+ dependencies: libgtk_static_dep,
+ install: false,
+)
diff --git a/gtk/compose/sequences b/gtk/compose/sequences
new file mode 100644
index 0000000000..1db7a6cddb
--- /dev/null
+++ b/gtk/compose/sequences
Binary files differ
diff --git a/gtk/gen-gtk-gresources-xml.py b/gtk/gen-gtk-gresources-xml.py
index ad602d53bb..8a8da4254e 100644
--- a/gtk/gen-gtk-gresources-xml.py
+++ b/gtk/gen-gtk-gresources-xml.py
@@ -84,6 +84,8 @@ for f in get_files('inspector', '.ui'):
xml += '''
<file>inspector/inspector.css</file>
<file>emoji/en.data</file>
+ <file>compose/sequences</file>
+ <file>compose/chars</file>
</gresource>
</gresources>'''
diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c
index 7aa9792e3b..c95b153e6f 100644
--- a/gtk/gtkcomposetable.c
+++ b/gtk/gtkcomposetable.c
@@ -28,30 +28,85 @@
#define GTK_COMPOSE_TABLE_MAGIC "GtkComposeTable"
-#define GTK_COMPOSE_TABLE_VERSION (2)
+#define GTK_COMPOSE_TABLE_VERSION (3)
+
+extern const GtkComposeTable builtin_compose_table;
/* Maximum length of sequences we parse */
#define MAX_COMPOSE_LEN 20
-typedef struct {
- gunichar *sequence;
- char *value;
-} GtkComposeData;
+/* Implemented from g_str_hash() */
+static guint32
+data_hash (gconstpointer v, int length)
+{
+ const guint16 *p, *head;
+ unsigned char c;
+ guint32 h = 5381;
+ for (p = v, head = v; (p - head) < length; p++)
+ {
+ c = 0x00ff & (*p >> 8);
+ h = (h << 5) + h + c;
+ c = 0x00ff & *p;
+ h = (h << 5) + h + c;
+ }
-static void
-gtk_compose_data_free (GtkComposeData *compose_data)
+ return h;
+}
+
+static guint32
+sequence_hash (gconstpointer v)
+{
+ const gunichar *p = v;
+ int i;
+
+ for (i = 0; p[i]; i++) ;
+
+ return data_hash (v, i);
+}
+
+static gboolean
+sequence_equal (gconstpointer v1,
+ gconstpointer v2)
{
- g_free (compose_data->sequence);
- g_free (compose_data->value);
- g_slice_free (GtkComposeData, compose_data);
+ const gunichar *p1 = v1;
+ const gunichar *p2 = v2;
+ int i;
+
+ for (i = 0; p1[i] && p2[i] && p1[i] == p2[i]; i++) ;
+
+ return p1[i] == p2[i];
+}
+
+typedef struct {
+ GHashTable *sequences;
+ GList *files;
+ const char *compose_file;
+ gboolean found_include;
+} GtkComposeParser;
+
+static GtkComposeParser *
+parser_new (void)
+{
+ GtkComposeParser *parser;
+
+ parser = g_new (GtkComposeParser, 1);
+
+ parser->sequences = g_hash_table_new_full (sequence_hash, sequence_equal, g_free, g_free);
+ parser->files = NULL;
+ parser->compose_file = NULL;
+ parser->found_include = FALSE;
+
+ return parser;
}
static void
-gtk_compose_list_element_free (GtkComposeData *compose_data, gpointer data)
+parser_free (GtkComposeParser *parser)
{
- gtk_compose_data_free (compose_data);
+ g_hash_table_unref (parser->sequences);
+ g_list_free_full (parser->files, g_free);
+ g_free (parser);
}
static gboolean
@@ -72,10 +127,9 @@ is_codepoint (const char *str)
return TRUE;
}
-static gboolean
-parse_compose_value (GtkComposeData *compose_data,
- const char *val,
- const char *line)
+static char *
+parse_compose_value (const char *val,
+ const char *line)
{
const char *p;
GString *value;
@@ -95,8 +149,7 @@ parse_compose_value (GtkComposeData *compose_data,
{
if (*p == '\"')
{
- compose_data->value = g_string_free (value, FALSE);
- return TRUE;
+ return g_string_free (value, FALSE);
}
if (p[1] == '\0')
@@ -154,18 +207,17 @@ parse_compose_value (GtkComposeData *compose_data,
fail:
g_string_free (value, TRUE);
-
- return FALSE;
+ return NULL;
}
-static gboolean
-parse_compose_sequence (GtkComposeData *compose_data,
- const char *seq,
- const char *line)
+static gunichar *
+parse_compose_sequence (const char *seq,
+ const char *line)
{
char **words = g_strsplit (seq, "<", -1);
int i;
int n = 0;
+ gunichar *sequence = NULL;
if (g_strv_length (words) < 2)
{
@@ -191,22 +243,19 @@ parse_compose_sequence (GtkComposeData *compose_data,
match = g_strndup (start, end - start);
- if (compose_data->sequence == NULL)
- compose_data->sequence = g_malloc (sizeof (gunichar) * 2);
- else
- compose_data->sequence = g_realloc (compose_data->sequence, sizeof (gunichar) * (n + 2));
+ sequence = g_realloc (sequence, sizeof (gunichar) * (n + 2));
if (is_codepoint (match))
{
codepoint = (gunichar) g_ascii_strtoll (match + 1, NULL, 16);
- compose_data->sequence[n] = codepoint;
- compose_data->sequence[n + 1] = 0;
+ sequence[n] = codepoint;
+ sequence[n + 1] = 0;
}
else
{
codepoint = (gunichar) gdk_keyval_from_name (match);
- compose_data->sequence[n] = codepoint;
- compose_data->sequence[n + 1] = 0;
+ sequence[n] = codepoint;
+ sequence[n + 1] = 0;
}
if (codepoint == GDK_KEY_VoidSymbol)
@@ -215,33 +264,165 @@ parse_compose_sequence (GtkComposeData *compose_data,
n++;
}
- g_strfreev (words);
if (0 == n || n > MAX_COMPOSE_LEN)
{
g_warning ("Suspicious compose sequence length (%d). Are you sure this is right?: %s",
n, line);
- return FALSE;
+ goto fail;
}
- return TRUE;
+ g_strfreev (words);
+
+ return sequence;
fail:
g_strfreev (words);
- return FALSE;
+ g_free (sequence);
+ return NULL;
+}
+
+static void parser_parse_file (GtkComposeParser *parser,
+ const char *path);
+
+/* Substitute %H, %L and %S */
+static char *
+handle_substitutions (const char *start,
+ int length)
+{
+ GString *s;
+ const char *locale_name;
+ const char *p;
+
+ s = g_string_new ("");
+
+ locale_name = getenv ("LANG");
+
+ for (p = start; *p && p < start + length; p++)
+ {
+ if (*p != '%')
+ {
+ g_string_append_c (s, *p);
+ }
+ else
+ {
+ switch (p[1])
+ {
+ case 'H':
+ p++;
+ g_string_append (s, g_get_home_dir ());
+ break;
+ case 'L':
+ p++;
+ g_string_append_printf (s, "/usr/share/X11/locale/%s/Compose", locale_name);
+ break;
+ case 'S':
+ p++;
+ g_string_append (s, "/usr/share/X11/locale");
+ break;
+ default: ;
+ /* do nothing, next iteration handles p[1] */
+ }
+ }
+ }
+
+ return g_string_free (s, FALSE);
}
static void
-parse_compose_line (GList **compose_list,
- const char *line)
+add_sequence (gunichar *sequence,
+ int len,
+ const char *value,
+ gpointer data)
+{
+ GtkComposeParser *parser = data;
+ gunichar *seq;
+
+ seq = g_new (gunichar, len + 1);
+ memcpy (seq, sequence, (len + 1) * sizeof (gunichar));
+
+ g_hash_table_replace (parser->sequences, seq, g_strdup (value));
+}
+
+static void
+parser_add_default_sequences (GtkComposeParser *parser)
+{
+ const GtkComposeTable *table = &builtin_compose_table;
+
+ gtk_compose_table_foreach (table, add_sequence, parser);
+}
+
+static void
+parser_handle_include (GtkComposeParser *parser,
+ const char *line)
+{
+ const char *p;
+ const char *start, *end;
+ char *path;
+
+ parser->found_include = TRUE;
+
+ p = line + strlen ("include ");
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ if (*p != '"')
+ goto error;
+
+ p++;
+
+ start = p;
+
+ while (*p && *p != '"')
+ p++;
+
+ if (*p != '"')
+ goto error;
+
+ end = p;
+
+ p++;
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ if (*p && *p != '#')
+ goto error;
+
+ if (end - start == 2 &&
+ strncmp ("%L", start, end - start) == 0)
+ {
+ parser_add_default_sequences (parser);
+ }
+ else
+ {
+ path = handle_substitutions (start, end - start);
+ parser_parse_file (parser, path);
+ g_free (path);
+ }
+
+ return;
+
+error:
+ g_warning ("Could not parse include: %s", line);
+}
+
+static void
+parser_parse_line (GtkComposeParser *parser,
+ const char *line)
{
char **components = NULL;
- GtkComposeData *compose_data = NULL;
+ gunichar *sequence = NULL;
+ char *value = NULL;
if (line[0] == '\0' || line[0] == '#')
return;
if (g_str_has_prefix (line, "include "))
- return;
+ {
+ parser_handle_include (parser, line);
+ return;
+ }
components = g_strsplit (line, ":", 2);
@@ -251,203 +432,193 @@ parse_compose_line (GList **compose_list,
goto fail;
}
- compose_data = g_slice_new0 (GtkComposeData);
-
- if (!parse_compose_sequence (compose_data, g_strstrip (components[0]), line))
+ sequence = parse_compose_sequence (g_strstrip (components[0]), line);
+ if (sequence == NULL)
goto fail;
- if (!parse_compose_value (compose_data, g_strstrip (components[1]), line))
+ value = parse_compose_value (g_strstrip (components[1]), line);
+ if (value == NULL)
goto fail;
g_strfreev (components);
- *compose_list = g_list_append (*compose_list, compose_data);
+ g_hash_table_replace (parser->sequences, sequence, value);
return;
fail:
g_strfreev (components);
- if (compose_data)
- gtk_compose_data_free (compose_data);
+ g_free (sequence);
+ g_free (value);
}
-extern const GtkComposeTableCompact gtk_compose_table_compact;
-
-static GList *
-gtk_compose_list_parse_file (const char *compose_file)
+static void
+parser_read_file (GtkComposeParser *parser,
+ const char *compose_file)
{
char *contents = NULL;
char **lines = NULL;
gsize length = 0;
GError *error = NULL;
- GList *compose_list = NULL;
- int i;
if (!g_file_get_contents (compose_file, &contents, &length, &error))
{
g_warning ("%s", error->message);
g_error_free (error);
- return NULL;
+ return;
}
lines = g_strsplit (contents, "\n", -1);
- g_free (contents);
- for (i = 0; lines[i] != NULL; i++)
- parse_compose_line (&compose_list, lines[i]);
- g_strfreev (lines);
+ for (int i = 0; lines[i] != NULL; i++)
+ parser_parse_line (parser, lines[i]);
- return compose_list;
+ g_strfreev (lines);
+ g_free (contents);
}
-static GList *
-gtk_compose_list_check_duplicated (GList *compose_list)
+/* Remove sequences that can be handled algorithmically,
+ * sequences with non-BMP keys, and sequences that produce
+ * empty strings.
+ */
+static void
+parser_remove_duplicates (GtkComposeParser *parser)
{
- GList *list;
- GList *removed_list = NULL;
- GtkComposeData *compose_data;
+ GHashTableIter iter;
+ gunichar *sequence;
+ char *value;
- for (list = compose_list; list != NULL; list = list->next)
+ g_hash_table_iter_init (&iter, parser->sequences);
+ while (g_hash_table_iter_next (&iter, (gpointer *)&sequence, (gpointer *)&value))
{
static guint16 keysyms[MAX_COMPOSE_LEN + 1];
int i;
int n_compose = 0;
- gboolean compose_finish;
gunichar output_char;
char buf[8] = { 0, };
+ gboolean remove_sequence = FALSE;
+
+ if (value[0] == '\0')
+ {
+ remove_sequence = TRUE;
+ goto next;
+ }
- compose_data = list->data;
+ if (sequence[1] == 0)
+ {
+ remove_sequence = TRUE;
+ goto next;
+ }
for (i = 0; i < MAX_COMPOSE_LEN + 1; i++)
keysyms[i] = 0;
for (i = 0; i < MAX_COMPOSE_LEN + 1; i++)
{
- gunichar codepoint = compose_data->sequence[i];
+ gunichar codepoint = sequence[i];
keysyms[i] = (guint16) codepoint;
if (codepoint == 0)
break;
+ if (codepoint > 0xffff)
+ {
+ remove_sequence = TRUE;
+ goto next;
+ }
+
n_compose++;
}
- if (gtk_compose_table_compact_check (&gtk_compose_table_compact,
- keysyms, n_compose,
- &compose_finish,
- NULL,
- &output_char) &&
- compose_finish)
- {
- g_unichar_to_utf8 (output_char, buf);
- if (strcmp (compose_data->value, buf) == 0)
- removed_list = g_list_prepend (removed_list, compose_data);
- }
- else if (gtk_check_algorithmically (keysyms, n_compose, &output_char))
+ if (gtk_check_algorithmically (keysyms, n_compose, &output_char))
{
g_unichar_to_utf8 (output_char, buf);
- if (strcmp (compose_data->value, buf) == 0)
- removed_list = g_list_prepend (removed_list, compose_data);
+ if (strcmp (value, buf) == 0)
+ remove_sequence = TRUE;
}
- }
- for (list = removed_list; list != NULL; list = list->next)
- {
- compose_data = list->data;
- compose_list = g_list_remove (compose_list, compose_data);
- gtk_compose_data_free (compose_data);
+next:
+ if (remove_sequence)
+ g_hash_table_iter_remove (&iter);
}
-
- g_list_free (removed_list);
-
- return compose_list;
}
-static GList *
-gtk_compose_list_check_uint16 (GList *compose_list)
+static void
+parser_compute_max_compose_len (GtkComposeParser *parser,
+ int *max_compose_len,
+ int *n_first,
+ int *size)
{
- GList *list;
- GList *removed_list = NULL;
- GtkComposeData *compose_data;
+ GHashTableIter iter;
+ gunichar *sequence;
+ char *value;
+ int max = 0;
+ int count = 0;
+ GHashTable *first;
- for (list = compose_list; list != NULL; list = list->next)
+ first = g_hash_table_new (NULL, NULL);
+
+ g_hash_table_iter_init (&iter, parser->sequences);
+ while (g_hash_table_iter_next (&iter, (gpointer *)&sequence, (gpointer *)&value))
{
- int i;
+ g_hash_table_add (first, GUINT_TO_POINTER (sequence[0]));
- compose_data = list->data;
- for (i = 0; i < MAX_COMPOSE_LEN; i++)
+ for (int i = 0; i < MAX_COMPOSE_LEN + 1; i++)
{
- gunichar codepoint = compose_data->sequence[i];
-
- if (codepoint == 0)
- break;
-
- if (codepoint > 0xffff)
+ if (sequence[i] == 0)
{
- removed_list = g_list_prepend (removed_list, compose_data);
+ count += i;
+ if (max < i)
+ max = i;
break;
}
}
}
- for (list = removed_list; list != NULL; list = list->next)
- {
- compose_data = list->data;
- compose_list = g_list_remove (compose_list, compose_data);
- gtk_compose_data_free (compose_data);
- }
-
- g_list_free (removed_list);
+ *max_compose_len = max;
+ *n_first = g_hash_table_size (first);
+ *size = count;
- return compose_list;
+ g_hash_table_unref (first);
}
-static GList *
-gtk_compose_list_format_for_gtk (GList *compose_list,
- int *p_max_compose_len,
- int *p_n_index_stride)
+static inline int
+sequence_length (gpointer a)
{
- GList *list;
- GtkComposeData *compose_data;
- int max_compose_len = 0;
+ gunichar *seq = a;
int i;
- gunichar codepoint;
- for (list = compose_list; list != NULL; list = list->next)
- {
- compose_data = list->data;
- for (i = 0; i < MAX_COMPOSE_LEN + 1; i++)
- {
- codepoint = compose_data->sequence[i];
- if (codepoint == 0)
- {
- if (max_compose_len < i)
- max_compose_len = i;
- break;
- }
- }
- }
-
- if (p_max_compose_len)
- *p_max_compose_len = max_compose_len;
- if (p_n_index_stride)
- *p_n_index_stride = max_compose_len + 2;
+ for (i = 0; seq[i]; i++) ;
- return compose_list;
+ return i;
}
static int
-gtk_compose_data_compare (gpointer a,
- gpointer b,
- gpointer data)
+sequence_compare (gpointer a,
+ gpointer b,
+ gpointer data)
{
- GtkComposeData *compose_data_a = a;
- GtkComposeData *compose_data_b = b;
- int max_compose_len = GPOINTER_TO_INT (data);
+ gunichar *seq_a = a;
+ gunichar *seq_b = b;
int i;
- for (i = 0; i < max_compose_len; i++)
+ gunichar code_a, code_b;
+ int len_a, len_b;
+
+ code_a = seq_a[0];
+ code_b = seq_b[0];
+
+ if (code_a != code_b)
+ return code_a - code_b;
+
+ len_a = sequence_length (a);
+ len_b = sequence_length (b);
+
+ if (len_a != len_b)
+ return len_a - len_b;
+
+ for (i = 1; i < len_a; i++)
{
- gunichar code_a = compose_data_a->sequence[i];
- gunichar code_b = compose_data_b->sequence[i];
+ code_a = seq_a[i];
+ code_b = seq_b[i];
if (code_a != code_b)
return code_a - code_b;
@@ -456,23 +627,22 @@ gtk_compose_data_compare (gpointer a,
return 0;
}
-/* Implemented from g_str_hash() */
-static guint32
-gtk_compose_table_data_hash (gconstpointer v, int length)
+guint32
+gtk_compose_table_data_hash (const guint16 *data,
+ int max_seq_len,
+ int n_seqs)
{
- const guint16 *p, *head;
- unsigned char c;
- guint32 h = 5381;
+ gsize n_index_stride;
+ gsize length;
- for (p = v, head = v; (p - head) < length; p++)
+ n_index_stride = max_seq_len + 2;
+ if (!g_size_checked_mul (&length, n_index_stride, n_seqs))
{
- c = 0x00ff & (*p >> 8);
- h = (h << 5) + h + c;
- c = 0x00ff & *p;
- h = (h << 5) + h + c;
+ g_critical ("Overflow in the compose sequences");
+ return 0;
}
- return h;
+ return data_hash (data, length);
}
static char *
@@ -504,29 +674,29 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
gsize *count)
{
char *p, *contents;
- gsize length, total_length;
+ gsize header_length, total_length;
guint16 bytes;
const char *header = GTK_COMPOSE_TABLE_MAGIC;
const guint16 version = GTK_COMPOSE_TABLE_VERSION;
guint16 max_seq_len = compose_table->max_seq_len;
- guint16 index_stride = max_seq_len + 2;
- guint16 n_seqs = compose_table->n_seqs;
+ guint16 n_index_size = compose_table->n_index_size;
+ guint16 data_size = compose_table->data_size;
guint16 n_chars = compose_table->n_chars;
guint32 i;
g_return_val_if_fail (compose_table != NULL, NULL);
g_return_val_if_fail (max_seq_len > 0, NULL);
- g_return_val_if_fail (index_stride > 0, NULL);
+ g_return_val_if_fail (n_index_size > 0, NULL);
- length = strlen (header);
- total_length = length + sizeof (guint16) * (4 + index_stride * n_seqs) + n_chars;
+ header_length = strlen (header);
+ total_length = header_length + sizeof (guint16) * (5 + data_size) + n_chars;
if (count)
*count = total_length;
p = contents = g_malloc (total_length);
- memcpy (p, header, length);
- p += length;
+ memcpy (p, header, header_length);
+ p += header_length;
#define APPEND_GUINT16(elt) \
bytes = GUINT16_TO_BE (elt); \
@@ -535,10 +705,11 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
APPEND_GUINT16 (version);
APPEND_GUINT16 (max_seq_len);
- APPEND_GUINT16 (n_seqs);
+ APPEND_GUINT16 (n_index_size);
+ APPEND_GUINT16 (data_size);
APPEND_GUINT16 (n_chars);
- for (i = 0; i < (guint32) index_stride * n_seqs; i++)
+ for (i = 0; i < data_size; i++)
{
APPEND_GUINT16 (compose_table->data[i]);
}
@@ -551,17 +722,9 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
return contents;
}
-static int
-gtk_compose_table_find (gconstpointer data1,
- gconstpointer data2)
-{
- const GtkComposeTable *compose_table = (const GtkComposeTable *) data1;
- guint32 hash = (guint32) GPOINTER_TO_INT (data2);
- return compose_table->id != hash;
-}
-
static GtkComposeTable *
-gtk_compose_table_load_cache (const char *compose_file)
+gtk_compose_table_load_cache (const char *compose_file,
+ gboolean *found_old_cache)
{
guint32 hash;
char *path = NULL;
@@ -574,13 +737,15 @@ gtk_compose_table_load_cache (const char *compose_file)
guint16 bytes;
guint16 version;
guint16 max_seq_len;
- guint16 index_stride;
- guint16 n_seqs;
+ guint16 n_index_size;
+ guint16 data_size;
guint16 n_chars;
guint32 i;
- guint16 *gtk_compose_seqs = NULL;
- GtkComposeTable *retval;
+ guint16 *data = NULL;
char *char_data = NULL;
+ GtkComposeTable *retval;
+
+ *found_old_cache = FALSE;
hash = g_str_hash (compose_file);
if ((path = gtk_compose_hash_get_cache_path (hash)) == NULL)
@@ -622,27 +787,27 @@ gtk_compose_table_load_cache (const char *compose_file)
GET_GUINT16 (version);
if (version != GTK_COMPOSE_TABLE_VERSION)
{
- g_warning ("cache version is different %u != %u",
- version, GTK_COMPOSE_TABLE_VERSION);
+ if (version < GTK_COMPOSE_TABLE_VERSION)
+ *found_old_cache = TRUE;
goto out_load_cache;
}
GET_GUINT16 (max_seq_len);
- GET_GUINT16 (n_seqs);
+ GET_GUINT16 (n_index_size);
+ GET_GUINT16 (data_size);
GET_GUINT16 (n_chars);
- if (max_seq_len == 0 || n_seqs == 0)
+ if (max_seq_len == 0 || data_size == 0)
{
- g_warning ("cache size is not correct %d %d", max_seq_len, n_seqs);
+ g_warning ("cache size is not correct %d %d", max_seq_len, data_size);
goto out_load_cache;
}
- index_stride = max_seq_len + 2;
- gtk_compose_seqs = g_new0 (guint16, n_seqs * index_stride);
+ data = g_new0 (guint16, data_size);
- for (i = 0; i < (guint32) index_stride * n_seqs; i++)
+ for (i = 0; i < data_size; i++)
{
- GET_GUINT16 (gtk_compose_seqs[i]);
+ GET_GUINT16 (data[i]);
}
if (n_chars > 0)
@@ -653,9 +818,10 @@ gtk_compose_table_load_cache (const char *compose_file)
}
retval = g_new0 (GtkComposeTable, 1);
- retval->data = gtk_compose_seqs;
+ retval->data = data;
retval->max_seq_len = max_seq_len;
- retval->n_seqs = n_seqs;
+ retval->n_index_size = n_index_size;
+ retval->data_size = data_size;
retval->char_data = char_data;
retval->n_chars = n_chars;
retval->id = hash;
@@ -668,7 +834,7 @@ gtk_compose_table_load_cache (const char *compose_file)
#undef GET_GUINT16
out_load_cache:
- g_free (gtk_compose_seqs);
+ g_free (data);
g_free (char_data);
g_free (contents);
g_free (path);
@@ -705,174 +871,344 @@ out_save_cache:
}
static GtkComposeTable *
-gtk_compose_table_new_with_list (GList *compose_list,
- int max_compose_len,
- int n_index_stride,
- guint32 hash)
+parser_get_compose_table (GtkComposeParser *parser)
{
- guint length;
- guint n = 0;
- int i, j;
- guint16 *gtk_compose_seqs = NULL;
- GList *list;
- GtkComposeData *compose_data;
- GtkComposeTable *retval = NULL;
- gunichar codepoint;
+ guint16 *data;
+ GtkComposeTable *table;
+ guint16 encoded_value;
GString *char_data;
+ int max_compose_len;
+ GList *sequences;
+ GList *list;
+ int i;
+ int size;
+ int n_first;
+ int first_pos;
+ int rest_pos;
+ int index_rowstride;
+ int n_sequences;
+ gunichar current_first;
+
+ parser_remove_duplicates (parser);
+
+ if (g_hash_table_size (parser->sequences) == 0)
+ return NULL;
+
+ parser_compute_max_compose_len (parser, &max_compose_len, &n_first, &size);
- g_return_val_if_fail (compose_list != NULL, NULL);
+ sequences = g_hash_table_get_keys (parser->sequences);
- length = g_list_length (compose_list);
+ sequences = g_list_sort_with_data (sequences,
+ (GCompareDataFunc) sequence_compare,
+ NULL);
- gtk_compose_seqs = g_new0 (guint16, length * n_index_stride);
+ index_rowstride = max_compose_len + 1;
+ data = g_new0 (guint16, n_first * index_rowstride + size);
char_data = g_string_new ("");
- for (list = compose_list; list != NULL; list = list->next)
+ n_sequences = 0;
+ current_first = 0;
+ first_pos = 0;
+ rest_pos = n_first * index_rowstride;
+
+ for (list = sequences; list != NULL; list = list->next)
{
- compose_data = list->data;
- for (i = 0; i < max_compose_len; i++)
+ gunichar *sequence = list->data;
+ char *value = g_hash_table_lookup (parser->sequences, sequence);
+ int len = sequence_length (sequence);
+
+ g_assert (2 <= len && len <= max_compose_len);
+
+ /* Encode the value. If the value is a single
+ * character with a value smaller than 1 << 15,
+ * we just use it directly.
+ * Otherwise, we store the value as string and
+ * put the offset into the table, with the high
+ * bit set.
+ */
+ if (g_utf8_strlen (value, -1) == 1 &&
+ g_utf8_get_char (value) < 0x8000)
{
- if (compose_data->sequence[i] == 0)
- {
- for (j = i; j < max_compose_len; j++)
- gtk_compose_seqs[n++] = 0;
- break;
- }
- gtk_compose_seqs[n++] = (guint16) compose_data->sequence[i];
+ encoded_value = (guint16) g_utf8_get_char (value);
}
-
- if (g_utf8_strlen (compose_data->value, -1) > 1)
+ else
{
+ g_assert (strlen (value) < 20);
+
if (char_data->len > 0)
g_string_append_c (char_data, 0);
- codepoint = char_data->len | (1 << 31);
+ g_assert (char_data->len < 0x8000);
- g_string_append (char_data, compose_data->value);
+ encoded_value = (guint16) (char_data->len | 0x8000);
+ g_string_append (char_data, value);
}
- else
+
+ if (sequence[0] != current_first)
+ {
+ g_assert (sequence[0] <= 0xffff);
+ if (current_first != 0)
+ first_pos += index_rowstride;
+ current_first = (guint16)sequence[0];
+
+ data[first_pos] = (guint16)sequence[0];
+ for (i = 1; i < index_rowstride; i++)
+ data[first_pos + i] = rest_pos;
+ }
+
+ for (i = 1; i < len; i++)
{
- codepoint = g_utf8_get_char (compose_data->value);
- g_assert ((codepoint & (1 << 31)) == 0);
+ g_assert (sequence[i] != 0);
+ g_assert (sequence[i] <= 0xffff);
+ data[rest_pos + i - 1] = (guint16) sequence[i];
}
- gtk_compose_seqs[n++] = (codepoint & 0xffff0000) >> 16;
- gtk_compose_seqs[n++] = codepoint & 0xffff;
+ g_assert (encoded_value != 0);
+ data[rest_pos + len - 1] = encoded_value;
+
+ n_sequences++;
+
+ rest_pos += len;
+
+ for (i = len; i <= max_compose_len; i++)
+ data[first_pos + i] = rest_pos;
+
+ for (i = 1; i < max_compose_len; i++)
+ g_assert (data[first_pos + i] <= data[first_pos + i + 1]);
}
- retval = g_new0 (GtkComposeTable, 1);
- retval->data = gtk_compose_seqs;
- retval->max_seq_len = max_compose_len;
- retval->n_seqs = length;
- retval->id = hash;
- retval->n_chars = char_data->len;
- retval->char_data = g_string_free (char_data, FALSE);
+ g_assert (first_pos + index_rowstride == n_first * index_rowstride);
+ g_assert (rest_pos == n_first * index_rowstride + size);
+
+ if (char_data->len > 0)
+ g_string_append_c (char_data, 0);
+
+ table = g_new0 (GtkComposeTable, 1);
+ table->data = data;
+ table->data_size = n_first * index_rowstride + size;
+ table->max_seq_len = max_compose_len;
+ table->n_index_size = n_first;
+ table->n_chars = char_data->len;
+ table->char_data = g_string_free (char_data, FALSE);
+ table->n_sequences = n_sequences;
+ table->id = g_str_hash (parser->compose_file);
+
+ g_list_free (sequences);
+
+ return table;
+}
+
+static char *
+canonicalize_filename (const char *parent_path,
+ const char *path)
+{
+ GFile *file;
+ char *retval;
+
+ if (path[0] != '/' && parent_path)
+ {
+ GFile *orig = g_file_new_for_path (parent_path);
+ GFile *parent = g_file_get_parent (orig);
+ file = g_file_resolve_relative_path (parent, path);
+ g_object_unref (parent);
+ g_object_unref (orig);
+ }
+ else
+ {
+ file = g_file_new_for_path (path);
+ }
+
+ retval = g_file_get_path (file);
+
+ g_object_unref (file);
return retval;
}
-GtkComposeTable *
-gtk_compose_table_new_with_file (const char *compose_file)
+static void
+parser_parse_file (GtkComposeParser *parser,
+ const char *compose_file)
{
- GList *compose_list = NULL;
- GtkComposeTable *compose_table;
- int max_compose_len = 0;
- int n_index_stride = 0;
+ char *path;
- g_assert (compose_file != NULL);
+ // stash the name for the table hash
+ if (parser->compose_file == NULL)
+ parser->compose_file = compose_file;
- compose_list = gtk_compose_list_parse_file (compose_file);
- if (compose_list == NULL)
- return NULL;
- compose_list = gtk_compose_list_check_duplicated (compose_list);
- compose_list = gtk_compose_list_check_uint16 (compose_list);
- compose_list = gtk_compose_list_format_for_gtk (compose_list,
- &max_compose_len,
- &n_index_stride);
- compose_list = g_list_sort_with_data (compose_list,
- (GCompareDataFunc) gtk_compose_data_compare,
- GINT_TO_POINTER (max_compose_len));
- if (compose_list == NULL)
+ path = canonicalize_filename (parser->compose_file, compose_file);
+
+ if (g_list_find_custom (parser->files, path, (GCompareFunc)strcmp))
{
- g_warning ("compose file %s does not include any keys besides keys in en-us compose file", compose_file);
- return NULL;
+ g_warning ("include cycle detected: %s", compose_file);
+ g_free (path);
+ return;
}
- compose_table = gtk_compose_table_new_with_list (compose_list,
- max_compose_len,
- n_index_stride,
- g_str_hash (compose_file));
- g_list_free_full (compose_list, (GDestroyNotify) gtk_compose_list_element_free);
- return compose_table;
+ parser->files = g_list_prepend (parser->files, path);
+
+ parser_read_file (parser, path);
+
+ parser->files = g_list_remove (parser->files, path);
}
-GSList *
-gtk_compose_table_list_add_array (GSList *compose_tables,
- const guint16 *data,
- int max_seq_len,
- int n_seqs)
+GtkComposeTable *
+gtk_compose_table_parse (const char *compose_file,
+ gboolean *found_include)
{
- guint32 hash;
+ GtkComposeParser *parser;
GtkComposeTable *compose_table;
- gsize n_index_stride;
- gsize length;
- int i;
- guint16 *gtk_compose_seqs = NULL;
- g_return_val_if_fail (data != NULL, compose_tables);
- g_return_val_if_fail (max_seq_len >= 0, compose_tables);
- g_return_val_if_fail (n_seqs >= 0, compose_tables);
+ parser = parser_new ();
+ parser_parse_file (parser, compose_file);
+ compose_table = parser_get_compose_table (parser);
+ if (found_include)
+ *found_include = parser->found_include;
+ parser_free (parser);
- n_index_stride = max_seq_len + 2;
- if (!g_size_checked_mul (&length, n_index_stride, n_seqs))
- {
- g_critical ("Overflow in the compose sequences");
- return compose_tables;
- }
+ return compose_table;
+}
+
+static const char *prefix =
+ "# GTK has rewritten this file to add the line:\n"
+ "\n"
+ "include \"%L\"\n"
+ "\n"
+ "# This is necessary to add your own Compose sequences\n"
+ "# in addition to the builtin sequences of GTK. If this\n"
+ "# is not what you want, just remove that line.\n"
+ "#\n"
+ "# A backup of the previous file contents has been made.\n"
+ "\n"
+ "\n";
+
+static gboolean
+rewrite_compose_file (const char *compose_file)
+{
+ char *path = NULL;
+ char *content = NULL;
+ gsize content_len;
+ GFile *file = NULL;
+ GOutputStream *stream = NULL;
+ gboolean ret = FALSE;
- hash = gtk_compose_table_data_hash (data, length);
+ path = canonicalize_filename (NULL, compose_file);
- if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL)
- return compose_tables;
+ if (!g_file_get_contents (path, &content, &content_len, NULL))
+ goto out;
- gtk_compose_seqs = g_new0 (guint16, length);
- for (i = 0; i < length; i++)
- gtk_compose_seqs[i] = data[i];
+ file = g_file_new_for_path (path);
+ stream = G_OUTPUT_STREAM (g_file_replace (file, NULL, TRUE, 0, NULL, NULL));
- compose_table = g_new (GtkComposeTable, 1);
- compose_table->data = gtk_compose_seqs;
- compose_table->max_seq_len = max_seq_len;
- compose_table->n_seqs = n_seqs;
- compose_table->id = hash;
- compose_table->char_data = NULL;
- compose_table->n_chars = 0;
+ if (stream == NULL)
+ goto out;
- return g_slist_prepend (compose_tables, compose_table);
+ if (!g_output_stream_write (stream, prefix, strlen (prefix), NULL, NULL))
+ goto out;
+
+ if (!g_output_stream_write (stream, content, content_len, NULL, NULL))
+ goto out;
+
+ if (!g_output_stream_close (stream, NULL, NULL))
+ goto out;
+
+ ret = TRUE;
+
+out:
+ g_clear_object (&stream);
+ g_clear_object (&file);
+ g_clear_pointer (&path, g_free);
+ g_clear_pointer (&content, g_free);
+
+ return ret;
}
-GSList *
-gtk_compose_table_list_add_file (GSList *compose_tables,
- const char *compose_file)
+GtkComposeTable *
+gtk_compose_table_new_with_file (const char *compose_file)
{
- guint32 hash;
GtkComposeTable *compose_table;
+ gboolean found_old_cache = FALSE;
+ gboolean found_include = FALSE;
- g_return_val_if_fail (compose_file != NULL, compose_tables);
+ g_assert (compose_file != NULL);
- hash = g_str_hash (compose_file);
- if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL)
- return compose_tables;
+ compose_table = gtk_compose_table_load_cache (compose_file, &found_old_cache);
+ if (compose_table != NULL)
+ return compose_table;
+
+parse:
+ compose_table = gtk_compose_table_parse (compose_file, &found_include);
+
+ /* This is where we apply heuristics to avoid breaking users existing configurations
+ * with the change to not always add the default sequences.
+ *
+ * If we find a cache that was generated before 4.4, and the Compose file
+ * does not have an include, and doesn't contain so many sequences that it
+ * is probably a copy of the system one, we take steps to keep things working,
+ * and thell the user about it.
+ */
+ if (found_old_cache && !found_include && compose_table->n_sequences < 100)
+ {
+ if (rewrite_compose_file (compose_file))
+ {
+ g_warning ("\nSince GTK 4.4, Compose files replace the builtin\n"
+ "compose sequences. To keep them and add your own\n"
+ "sequences on top, the line:\n"
+ "\n"
+ " include \"%%L\"\n"
+ "\n"
+ "has been added to the Compose file\n%s.\n", compose_file);
+ goto parse;
+ }
+ else
+ {
+ g_warning ("\nSince GTK 4.4, Compose files replace the builtin\n"
+ "compose sequences. To keep them and add your own\n"
+ "sequences on top, you need to add the line:\n"
+ "\n"
+ " include \"%%L\"\n"
+ "\n"
+ "to the Compose file\n%s.\n", compose_file);
+ }
+ }
- compose_table = gtk_compose_table_load_cache (compose_file);
if (compose_table != NULL)
- return g_slist_prepend (compose_tables, compose_table);
+ gtk_compose_table_save_cache (compose_table);
+
+ return compose_table;
+}
+
+GtkComposeTable *
+gtk_compose_table_new_with_data (const guint16 *data,
+ int max_seq_len,
+ int n_seqs)
+{
+ GtkComposeParser *parser;
+ GtkComposeTable *compose_table;
+ int i;
- if ((compose_table = gtk_compose_table_new_with_file (compose_file)) == NULL)
- return compose_tables;
+ parser = parser_new ();
+
+ for (i = 0; i < n_seqs; i++)
+ {
+ const guint16 *seq = data + i * (max_seq_len + 2);
+ guint16 *sequence;
+ gunichar ch;
+ char buf[8] = { 0, };
- gtk_compose_table_save_cache (compose_table);
- return g_slist_prepend (compose_tables, compose_table);
+ sequence = g_new0 (guint16, max_seq_len + 1);
+ memcpy (sequence, seq, sizeof (guint16) * max_seq_len);
+
+ ch = ((gunichar)seq[max_seq_len]) << 16 | (gunichar)seq[max_seq_len + 1];
+ g_unichar_to_utf8 (ch, buf);
+
+ g_hash_table_replace (parser->sequences, sequence, g_strdup (buf));
+ }
+
+ compose_table = parser_get_compose_table (parser);
+ parser_free (parser);
+
+ return compose_table;
}
static int
@@ -895,6 +1231,20 @@ compare_seq (const void *key, const void *value)
return 0;
}
+static int
+compare_seq_index (const void *key, const void *value)
+{
+ const guint16 *keysyms = key;
+ const guint16 *seq = value;
+
+ if (keysyms[0] < seq[0])
+ return -1;
+ else if (keysyms[0] > seq[0])
+ return 1;
+
+ return 0;
+}
+
/*
* gtk_compose_table_check:
* @table: the table to check
@@ -916,97 +1266,6 @@ gtk_compose_table_check (const GtkComposeTable *table,
gboolean *compose_match,
GString *output)
{
- int row_stride = table->max_seq_len + 2;
- guint16 *seq;
-
- *compose_finish = FALSE;
- *compose_match = FALSE;
-
- g_string_set_size (output, 0);
-
- /* Will never match, if the sequence in the compose buffer is longer
- * than the sequences in the table. Further, compare_seq (key, val)
- * will overrun val if key is longer than val.
- */
- if (n_compose > table->max_seq_len)
- return FALSE;
-
- seq = bsearch (compose_buffer,
- table->data, table->n_seqs,
- sizeof (guint16) * row_stride,
- compare_seq);
-
- if (seq)
- {
- guint16 *prev_seq;
-
- /* Back up to the first sequence that matches to make sure
- * we find the exact match if there is one.
- */
- while (seq > table->data)
- {
- prev_seq = seq - row_stride;
- if (compare_seq (compose_buffer, prev_seq) != 0)
- break;
- seq = prev_seq;
- }
-
- if (n_compose == table->max_seq_len ||
- seq[n_compose] == 0) /* complete sequence */
- {
- guint16 *next_seq;
- gunichar value;
-
- value = (seq[table->max_seq_len] << 16) | seq[table->max_seq_len + 1];
- if ((value & (1 << 31)) != 0)
- g_string_append (output, &table->char_data[value & ~(1 << 31)]);
- else
- g_string_append_unichar (output, value);
-
- *compose_match = TRUE;
-
- /* We found a tentative match. See if there are any longer
- * sequences containing this subsequence
- */
- next_seq = seq + row_stride;
- if (next_seq < table->data + row_stride * table->n_seqs)
- {
- if (compare_seq (compose_buffer, next_seq) == 0)
- return TRUE;
- }
-
- *compose_finish = TRUE;
- return TRUE;
- }
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static int
-compare_seq_index (const void *key, const void *value)
-{
- const guint16 *keysyms = key;
- const guint16 *seq = value;
-
- if (keysyms[0] < seq[0])
- return -1;
- else if (keysyms[0] > seq[0])
- return 1;
-
- return 0;
-}
-
-gboolean
-gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
- const guint16 *compose_buffer,
- int n_compose,
- gboolean *compose_finish,
- gboolean *compose_match,
- gunichar *output_char)
-{
int row_stride;
guint16 *seq_index;
guint16 *seq;
@@ -1018,8 +1277,6 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
*compose_finish = FALSE;
if (compose_match)
*compose_match = FALSE;
- if (output_char)
- *output_char = 0;
/* Will never match, if the sequence in the compose buffer is longer
* than the sequences in the table. Further, compare_seq (key, val)
@@ -1031,7 +1288,7 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
seq_index = bsearch (compose_buffer,
table->data,
table->n_index_size,
- sizeof (guint16) * table->n_index_stride,
+ sizeof (guint16) * (table->max_seq_len + 1),
compare_seq_index);
if (!seq_index)
@@ -1053,7 +1310,7 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
seq = bsearch (compose_buffer + 1,
table->data + seq_index[i],
(seq_index[i + 1] - seq_index[i]) / row_stride,
- sizeof (guint16) * row_stride,
+ sizeof (guint16) * row_stride,
compare_seq);
if (seq)
@@ -1061,12 +1318,15 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
if (i == n_compose - 1)
{
value = seq[row_stride - 1];
+
+ if ((value & (1 << 15)) != 0)
+ g_string_append (output, &table->char_data[value & ~(1 << 15)]);
+ else
+ g_string_append_unichar (output, value);
match = TRUE;
}
else
{
- if (output_char)
- *output_char = value;
if (match)
{
if (compose_match)
@@ -1085,8 +1345,6 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
*compose_match = TRUE;
if (compose_finish)
*compose_finish = TRUE;
- if (output_char)
- *output_char = value;
return TRUE;
}
@@ -1094,6 +1352,65 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
return FALSE;
}
+void
+gtk_compose_table_foreach (const GtkComposeTable *table,
+ GtkComposeSequenceCallback callback,
+ gpointer data)
+{
+ int index_stride = table->max_seq_len + 1;
+ gunichar *sequence;
+ int seqno;
+
+ sequence = g_new0 (gunichar, table->max_seq_len + 1);
+
+ seqno = 0;
+ for (int idx = 0; idx < table->n_index_size; idx++)
+ {
+ const guint16 *seq_index = table->data + (idx * index_stride);
+
+ for (int i = 1; i < table->max_seq_len; i++)
+ {
+ int len = i + 1;
+
+ g_assert (seq_index[i] <= seq_index[i + 1]);
+ g_assert (seq_index[i + 1] <= table->data_size);
+ g_assert ((seq_index[i + 1] - seq_index[i]) % len == 0);
+
+ for (int j = seq_index[i]; j < seq_index[i + 1]; j += len)
+ {
+ char buf[8] = { 0, };
+ guint16 encoded_value;
+ char *value;
+
+ sequence[0] = seq_index[0];
+ for (int k = 0; k < len - 1; k++)
+ sequence[k + 1] = (gunichar) table->data[j + k];
+ sequence[len] = 0;
+
+ encoded_value = table->data[j + len - 1];
+ g_assert (encoded_value != 0);
+ if ((encoded_value & (1 << 15)) != 0)
+ {
+ int char_offset = encoded_value & ~(1 << 15);
+ g_assert (char_offset < table->n_chars);
+ value = &table->char_data[char_offset];
+ g_assert (strlen (value) < 20);
+ }
+ else
+ {
+ g_unichar_to_utf8 ((gunichar)encoded_value, buf);
+ value = buf;
+ }
+
+ callback (sequence, len, value, data);
+ seqno++;
+ }
+ }
+ }
+
+ g_free (sequence);
+}
+
/* Checks if a keysym is a dead key.
* Dead key keysym values are defined in ../gdk/gdkkeysyms.h and the
* first is GDK_KEY_dead_grave. As X.Org is updated, more dead keys
@@ -1285,4 +1602,3 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
return FALSE;
}
-
diff --git a/gtk/gtkcomposetable.h b/gtk/gtkcomposetable.h
index 101aa94359..1398559a66 100644
--- a/gtk/gtkcomposetable.h
+++ b/gtk/gtkcomposetable.h
@@ -26,50 +26,67 @@ G_BEGIN_DECLS
typedef struct _GtkComposeTable GtkComposeTable;
typedef struct _GtkComposeTableCompact GtkComposeTableCompact;
+/* The layout of the data is as follows:
+ *
+ * The first part of the data contains rows of length max_seq_len + 1,
+ * where the first element is the item of the sequence, and the
+ * following elements are offsets to the data for sequences that
+ * start with the first item of length 2, ..., max_seq_len.
+ *
+ * The second part of the data contains the rest of the sequence
+ * data. It does not have a fixed stride. For each sequence, we
+ * put seq[2], ..., seq[len - 1], followed by the encoded value
+ * for this sequence.
+ *
+ * The values are encoded as follows:
+ *
+ * If the value is a single Unicode character smaler than 0x8000,
+ * then we place it directly. Otherwise, we put the UTF8-encoded
+ * value in the char_data array, and use offset | 0x8000 as the
+ * encoded value.
+ */
struct _GtkComposeTable
{
guint16 *data;
char *char_data;
int max_seq_len;
- int n_seqs;
+ int n_index_size;
+ int data_size;
int n_chars;
+ int n_sequences;
guint32 id;
};
-struct _GtkComposeTableCompact
-{
- const guint16 *data;
- int max_seq_len;
- int n_index_size;
- int n_index_stride;
-};
+GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file);
+GtkComposeTable * gtk_compose_table_parse (const char *compose_file,
+ gboolean *found_include);
+GtkComposeTable * gtk_compose_table_new_with_data (const guint16 *data,
+ int max_seq_len,
+ int n_seqs);
-GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file);
-GSList * gtk_compose_table_list_add_array (GSList *compose_tables,
- const guint16 *data,
- int max_seq_len,
- int n_seqs);
-GSList * gtk_compose_table_list_add_file (GSList *compose_tables,
- const char *compose_file);
+typedef void (* GtkComposeSequenceCallback) (gunichar *sequence,
+ int len,
+ const char *value,
+ gpointer data);
-gboolean gtk_compose_table_check (const GtkComposeTable *table,
- const guint16 *compose_buffer,
- int n_compose,
- gboolean *compose_finish,
- gboolean *compose_match,
- GString *output);
+void gtk_compose_table_foreach (const GtkComposeTable *table,
+ GtkComposeSequenceCallback callback,
+ gpointer data);
-gboolean gtk_compose_table_compact_check (const GtkComposeTableCompact *table,
- const guint16 *compose_buffer,
- int n_compose,
- gboolean *compose_finish,
- gboolean *compose_match,
- gunichar *output_char);
+gboolean gtk_compose_table_check (const GtkComposeTable *table,
+ const guint16 *compose_buffer,
+ int n_compose,
+ gboolean *compose_finish,
+ gboolean *compose_match,
+ GString *output);
-gboolean gtk_check_algorithmically (const guint16 *compose_buffer,
- int n_compose,
- gunichar *output);
+gboolean gtk_check_algorithmically (const guint16 *compose_buffer,
+ int n_compose,
+ gunichar *output);
+guint32 gtk_compose_table_data_hash (const guint16 *data,
+ int max_seq_len,
+ int n_seqs);
G_END_DECLS
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
index 2ff3fe03b9..7183205646 100644
--- a/gtk/gtkimcontextsimple.c
+++ b/gtk/gtkimcontextsimple.c
@@ -40,15 +40,21 @@
*
* `GtkIMContextSimple` is an input method supporting table-based input methods.
*
- * `GtkIMContextSimple` has a built-in table of compose sequences that is
- * derived from the X11 Compose files.
+ * ## Compose sequences
*
- * `GtkIMContextSimple` reads additional compose sequences from the first of the
+ * `GtkIMContextSimple` reads compose sequences from the first of the
* following files that is found: ~/.config/gtk-4.0/Compose, ~/.XCompose,
* /usr/share/X11/locale/$locale/Compose (for locales that have a nontrivial
* Compose file). The syntax of these files is described in the Compose(5)
* manual page.
*
+ * If none of these files is found, `GtkIMContextSimple` uses a built-in table
+ * of compose sequences that is derived from the X11 Compose files.
+ *
+ * Note that compose sequences typically start with the Compose_key, which is
+ * often not available as a dedicated key on keyboards. Keyboard layouts may
+ * map this keysym to other keys, such as the right Control key.
+ *
* ## Unicode characters
*
* `GtkIMContextSimple` also supports numeric entry of Unicode characters
@@ -60,6 +66,15 @@
* Ctrl-Shift-u 1 2 3 Enter
*
* yields U+0123 LATIN SMALL LETTER G WITH CEDILLA, i.e. ģ.
+ *
+ * ## Dead keys
+ *
+ * `GtkIMContextSimple` supports dead keys. For example, typing
+ *
+ * dead_acute a
+ *
+ * yields U+00E! LATIN SMALL LETTER_A WITH ACUTE, i.e. á. Note that this
+ * depends on the keyboard layout including dead keys.
*/
struct _GtkIMContextSimplePrivate
@@ -74,18 +89,32 @@ struct _GtkIMContextSimplePrivate
guint modifiers_dropped : 1;
};
-/* From the values below, the value 30 means the number of different first keysyms
- * that exist in the Compose file (from Xorg). When running compose-parse.py without
- * parameters, you get the count that you can put here. Needed when updating the
- * gtkimcontextsimpleseqs.h header file (contains the compose sequences).
- */
-const GtkComposeTableCompact gtk_compose_table_compact = {
- gtk_compose_seqs_compact,
- 5,
- 30,
- 6
+#include "gtk/compose/gtkcomposedata.h"
+
+GtkComposeTable builtin_compose_table = {
+ NULL,
+ NULL,
+ MAX_SEQ_LEN,
+ N_INDEX_SIZE,
+ DATA_SIZE,
+ N_CHARS,
+ 0
};
+static void
+init_builtin_table (void)
+{
+ GBytes *bytes;
+
+ bytes = g_resources_lookup_data ("/org/gtk/libgtk/compose/sequences", 0, NULL);
+ builtin_compose_table.data = (guint16 *) g_bytes_get_data (bytes, NULL);
+ g_bytes_unref (bytes);
+
+ bytes = g_resources_lookup_data ("/org/gtk/libgtk/compose/chars", 0, NULL);
+ builtin_compose_table.char_data = (char *) g_bytes_get_data (bytes, NULL);
+ g_bytes_unref (bytes);
+}
+
G_LOCK_DEFINE_STATIC (global_tables);
static GSList *global_tables;
@@ -146,6 +175,7 @@ gtk_im_context_simple_class_init (GtkIMContextSimpleClass *class)
im_context_class->get_preedit_string = gtk_im_context_simple_get_preedit_string;
gobject_class->finalize = gtk_im_context_simple_finalize;
+ init_builtin_table ();
init_compose_table_async (NULL, NULL, NULL);
}
@@ -163,6 +193,75 @@ get_x11_compose_file_dir (void)
return compose_file_dir;
}
+static int
+gtk_compose_table_find (gconstpointer data1,
+ gconstpointer data2)
+{
+ const GtkComposeTable *compose_table = (const GtkComposeTable *) data1;
+ guint32 hash = (guint32) GPOINTER_TO_INT (data2);
+ return compose_table->id != hash;
+}
+
+static gboolean
+add_compose_table_from_file (const char *compose_file)
+{
+ guint hash;
+ gboolean ret = FALSE;
+
+ G_LOCK (global_tables);
+
+ hash = g_str_hash (compose_file);
+ if (!g_slist_find_custom (global_tables, GINT_TO_POINTER (hash), gtk_compose_table_find))
+ {
+ GtkComposeTable *table;
+
+ table = gtk_compose_table_new_with_file (compose_file);
+
+ if (table)
+ {
+ ret = TRUE;
+ global_tables = g_slist_prepend (global_tables, table);
+ }
+ }
+
+ G_UNLOCK (global_tables);
+
+ return ret;
+}
+
+static void
+add_builtin_compose_table (void)
+{
+ G_LOCK (global_tables);
+
+ global_tables = g_slist_prepend (global_tables, &builtin_compose_table);
+
+ G_UNLOCK (global_tables);
+}
+
+static void
+add_compose_table_from_data (guint16 *data,
+ int max_seq_len,
+ int n_seqs)
+{
+ guint hash;
+
+ G_LOCK (global_tables);
+
+ hash = gtk_compose_table_data_hash (data, max_seq_len, n_seqs);
+ if (!g_slist_find_custom (global_tables, GINT_TO_POINTER (hash), gtk_compose_table_find))
+ {
+ GtkComposeTable *table;
+
+ table = gtk_compose_table_new_with_data (data, max_seq_len, n_seqs);
+
+ if (table)
+ global_tables = g_slist_prepend (global_tables, table);
+ }
+
+ G_UNLOCK (global_tables);
+}
+
static void
gtk_im_context_simple_init_compose_table (void)
{
@@ -171,6 +270,7 @@ gtk_im_context_simple_init_compose_table (void)
const char *locale;
char **langs = NULL;
char **lang = NULL;
+ gboolean added;
const char * const sys_langs[] = { "el_gr", "fi_fi", "pt_br", NULL };
const char * const *sys_lang = NULL;
char *x11_compose_file_dir = get_x11_compose_file_dir ();
@@ -178,12 +278,10 @@ gtk_im_context_simple_init_compose_table (void)
path = g_build_filename (g_get_user_config_dir (), "gtk-4.0", "Compose", NULL);
if (g_file_test (path, G_FILE_TEST_EXISTS))
{
- G_LOCK (global_tables);
- global_tables = gtk_compose_table_list_add_file (global_tables, path);
- G_UNLOCK (global_tables);
-
+ added = add_compose_table_from_file (path);
g_free (path);
- return;
+ if (added)
+ return;
}
g_clear_pointer (&path, g_free);
@@ -194,11 +292,10 @@ gtk_im_context_simple_init_compose_table (void)
path = g_build_filename (home, ".XCompose", NULL);
if (g_file_test (path, G_FILE_TEST_EXISTS))
{
- G_LOCK (global_tables);
- global_tables = gtk_compose_table_list_add_file (global_tables, path);
- G_UNLOCK (global_tables);
+ added = add_compose_table_from_file (path);
g_free (path);
- return;
+ if (added)
+ return;
}
g_clear_pointer (&path, g_free);
@@ -241,11 +338,13 @@ gtk_im_context_simple_init_compose_table (void)
if (path != NULL)
{
- G_LOCK (global_tables);
- global_tables = gtk_compose_table_list_add_file (global_tables, path);
- G_UNLOCK (global_tables);
+ added = add_compose_table_from_file (path);
+ g_free (path);
}
- g_clear_pointer (&path, g_free);
+ if (added)
+ return;
+
+ add_builtin_compose_table ();
}
static void
@@ -284,7 +383,7 @@ gtk_im_context_simple_init (GtkIMContextSimple *context_simple)
priv = context_simple->priv = gtk_im_context_simple_get_instance_private (context_simple);
- priv->compose_buffer_len = gtk_compose_table_compact.max_seq_len + 1;
+ priv->compose_buffer_len = builtin_compose_table.max_seq_len + 1;
priv->compose_buffer = g_new0 (guint16, priv->compose_buffer_len);
priv->tentative_match = g_string_new ("");
priv->tentative_match_len = 0;
@@ -1021,36 +1120,6 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
if (success)
return TRUE;
- if (gtk_compose_table_compact_check (&gtk_compose_table_compact,
- priv->compose_buffer, n_compose,
- &compose_finish, &compose_match,
- &output_char))
- {
- if (!priv->in_compose_sequence)
- {
- priv->in_compose_sequence = TRUE;
- g_signal_emit_by_name (context_simple, "preedit-start");
- }
-
- if (compose_finish)
- {
- if (compose_match)
- gtk_im_context_simple_commit_char (context_simple, output_char);
- }
- else
- {
- if (compose_match)
- {
- g_string_set_size (priv->tentative_match, 0);
- g_string_append_unichar (priv->tentative_match, output_char);
- priv->tentative_match_len = n_compose;
- }
- g_signal_emit_by_name (context_simple, "preedit-changed");
- }
-
- return TRUE;
- }
-
if (gtk_check_algorithmically (priv->compose_buffer, n_compose, &output_char))
{
if (!priv->in_compose_sequence)
@@ -1203,21 +1272,18 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context,
* The table must be sorted in dictionary order on the
* numeric value of the key symbol fields. (Values beyond
* the length of the sequence should be zero.)
- **/
+ *
+ * Deprecated: 4.4: Use gtk_im_context_simple_add_compose_file()
+ */
void
gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple,
- guint16 *data,
- int max_seq_len,
- int n_seqs)
+ guint16 *data,
+ int max_seq_len,
+ int n_seqs)
{
g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple));
- G_LOCK (global_tables);
-
- global_tables = gtk_compose_table_list_add_array (global_tables,
- data, max_seq_len, n_seqs);
-
- G_UNLOCK (global_tables);
+ add_compose_table_from_data (data, max_seq_len, n_seqs);
}
/**
@@ -1233,9 +1299,5 @@ gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple,
{
g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple));
- G_LOCK (global_tables);
-
- global_tables = gtk_compose_table_list_add_file (global_tables, compose_file);
-
- G_UNLOCK (global_tables);
+ add_compose_table_from_file (compose_file);
}
diff --git a/gtk/gtkimcontextsimple.h b/gtk/gtkimcontextsimple.h
index 7bd4454b1c..c2629a8fdd 100644
--- a/gtk/gtkimcontextsimple.h
+++ b/gtk/gtkimcontextsimple.h
@@ -63,11 +63,11 @@ GType gtk_im_context_simple_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkIMContext *gtk_im_context_simple_new (void);
-GDK_AVAILABLE_IN_ALL
+GDK_DEPRECATED_IN_4_4_FOR(gtk_im_context_simple_add_compose_file)
void gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple,
- guint16 *data,
- int max_seq_len,
- int n_seqs);
+ guint16 *data,
+ int max_seq_len,
+ int n_seqs);
GDK_AVAILABLE_IN_ALL
void gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple,
const char *compose_file);
diff --git a/gtk/meson.build b/gtk/meson.build
index bf108df11a..18fbe6ac61 100644
--- a/gtk/meson.build
+++ b/gtk/meson.build
@@ -1279,3 +1279,5 @@ libgtk_static_dep = declare_dependency(sources: gtk_dep_sources,
link_with: [libgtk_static, libgtk_css, libgdk, libgsk ],
link_args: common_ldflags,
)
+
+subdir('compose')
diff --git a/testsuite/gtk/compose/basic.expected b/testsuite/gtk/compose/basic.expected
index ab7a0d2b94..465a4e37f8 100644
--- a/testsuite/gtk/compose/basic.expected
+++ b/testsuite/gtk/compose/basic.expected
@@ -1,3 +1,6 @@
-# n_seqs: 1
+# n_sequences: 1
# max_seq_len: 4
+# n_index_size: 1
+# data_size: 9
+# n_chars: 0
<Uff20> <U73> <U65> <U71> : "!" # U21
diff --git a/testsuite/gtk/compose/codepoint.expected b/testsuite/gtk/compose/codepoint.expected
index d2c09f6c3f..c1d11e791e 100644
--- a/testsuite/gtk/compose/codepoint.expected
+++ b/testsuite/gtk/compose/codepoint.expected
@@ -1,3 +1,6 @@
-# n_seqs: 1
+# n_sequences: 1
# max_seq_len: 4
+# n_index_size: 1
+# data_size: 9
+# n_chars: 0
<Uff20> <U73> <U6f> <U7a> : "!" # U21
diff --git a/testsuite/gtk/compose/comments.expected b/testsuite/gtk/compose/comments.expected
index 728817b5db..891c490a1a 100644
--- a/testsuite/gtk/compose/comments.expected
+++ b/testsuite/gtk/compose/comments.expected
@@ -1,5 +1,8 @@
-# n_seqs: 3
+# n_sequences: 3
# max_seq_len: 2
+# n_index_size: 1
+# data_size: 9
+# n_chars: 0
<Uff20> <U61> : "a" # U61
<Uff20> <U62> : "#" # U23
<Uff20> <U63> : "a" # U61
diff --git a/testsuite/gtk/compose/cycle b/testsuite/gtk/compose/cycle
new file mode 100644
index 0000000000..2f9a0c6a15
--- /dev/null
+++ b/testsuite/gtk/compose/cycle
@@ -0,0 +1,3 @@
+include "cycle" # create an include cycle
+
+<Multi_key> <s> <e> <q> : "!"
diff --git a/testsuite/gtk/compose/hex.expected b/testsuite/gtk/compose/hex.expected
index 603344216c..7d2d26af98 100644
--- a/testsuite/gtk/compose/hex.expected
+++ b/testsuite/gtk/compose/hex.expected
@@ -1,3 +1,6 @@
-# n_seqs: 1
+# n_sequences: 1
# max_seq_len: 4
+# n_index_size: 1
+# data_size: 9
+# n_chars: 7
<Uff20> <U73> <U65> <U71> : "⏾⏳"
diff --git a/testsuite/gtk/compose/include b/testsuite/gtk/compose/include
new file mode 100644
index 0000000000..d6c3ee7bb6
--- /dev/null
+++ b/testsuite/gtk/compose/include
@@ -0,0 +1,4 @@
+include "included" # see if this works
+
+<Multi_key> <s> <s> <s> : "!" # replace this entry
+<Multi_key> <a> <a> <a> : "" # remove this entry
diff --git a/testsuite/gtk/compose/include.expected b/testsuite/gtk/compose/include.expected
new file mode 100644
index 0000000000..8307b1c594
--- /dev/null
+++ b/testsuite/gtk/compose/include.expected
@@ -0,0 +1,6 @@
+# n_sequences: 1
+# max_seq_len: 4
+# n_index_size: 1
+# data_size: 9
+# n_chars: 0
+<Uff20> <U73> <U73> <U73> : "!" # U21
diff --git a/testsuite/gtk/compose/included b/testsuite/gtk/compose/included
new file mode 100644
index 0000000000..77162b6563
--- /dev/null
+++ b/testsuite/gtk/compose/included
@@ -0,0 +1,2 @@
+<Multi_key> <s> <s> <s> : "XO"
+<Multi_key> <a> <a> <a> : "Aaah!"
diff --git a/testsuite/gtk/compose/long.expected b/testsuite/gtk/compose/long.expected
index 17de9b5575..0846c7f6e9 100644
--- a/testsuite/gtk/compose/long.expected
+++ b/testsuite/gtk/compose/long.expected
@@ -1,3 +1,6 @@
-# n_seqs: 1
+# n_sequences: 1
# max_seq_len: 11
+# n_index_size: 1
+# data_size: 23
+# n_chars: 5
<Uff20> <U65> <U6d> <U6d> <U65> <U6e> <U74> <U61> <U6c> <U65> <U72> : "🧀" # U1f9c0
diff --git a/testsuite/gtk/compose/match.expected b/testsuite/gtk/compose/match.expected
index c9013cac3c..bed10c5a10 100644
--- a/testsuite/gtk/compose/match.expected
+++ b/testsuite/gtk/compose/match.expected
@@ -1,5 +1,8 @@
-# n_seqs: 3
+# n_sequences: 3
# max_seq_len: 7
-<Uff20> <U73> <U65> <U71> <U0> <U0> <U0> : "!" # U21
-<Uff20> <U73> <U65> <U71> <U75> <U0> <U0> : "?" # U3f
+# n_index_size: 1
+# data_size: 24
+# n_chars: 5
+<Uff20> <U73> <U65> <U71> : "!" # U21
+<Uff20> <U73> <U65> <U71> <U75> : "?" # U3f
<Uff20> <U7a> <U77> <U69> <U6e> <U65> <U73> : "🥂" # U1f942
diff --git a/testsuite/gtk/compose/multi.expected b/testsuite/gtk/compose/multi.expected
index 21b97a0fe5..078f21f441 100644
--- a/testsuite/gtk/compose/multi.expected
+++ b/testsuite/gtk/compose/multi.expected
@@ -1,5 +1,8 @@
-# n_seqs: 3
+# n_sequences: 3
# max_seq_len: 5
-<Uff20> <U73> <U61> <U73> <U0> : "_" # U5f
-<Uff20> <U73> <U65> <U71> <U0> : "!" # U21
+# n_index_size: 1
+# data_size: 19
+# n_chars: 0
+<Uff20> <U73> <U61> <U73> : "_" # U5f
+<Uff20> <U73> <U65> <U71> : "!" # U21
<Uff20> <U75> <U62> <U32> <U33> : "/" # U2f
diff --git a/testsuite/gtk/compose/nofile b/testsuite/gtk/compose/nofile
new file mode 100644
index 0000000000..0b676e16d6
--- /dev/null
+++ b/testsuite/gtk/compose/nofile
@@ -0,0 +1,3 @@
+include "testsuite/gtk/compose/nosuchfile" # this file does not exist
+
+<Multi_key> <s> <e> <q> : "!"
diff --git a/testsuite/gtk/compose/octal.expected b/testsuite/gtk/compose/octal.expected
index ab7a0d2b94..465a4e37f8 100644
--- a/testsuite/gtk/compose/octal.expected
+++ b/testsuite/gtk/compose/octal.expected
@@ -1,3 +1,6 @@
-# n_seqs: 1
+# n_sequences: 1
# max_seq_len: 4
+# n_index_size: 1
+# data_size: 9
+# n_chars: 0
<Uff20> <U73> <U65> <U71> : "!" # U21
diff --git a/testsuite/gtk/compose/strings.expected b/testsuite/gtk/compose/strings.expected
index e1dfdc6dc1..84f13c765b 100644
--- a/testsuite/gtk/compose/strings.expected
+++ b/testsuite/gtk/compose/strings.expected
@@ -1,6 +1,9 @@
-# n_seqs: 4
+# n_sequences: 4
# max_seq_len: 5
-<Uff20> <U73> <U61> <U73> <U0> : "\"\\"
-<Uff20> <U73> <U65> <U71> <U0> : "!a"
+# n_index_size: 1
+# data_size: 24
+# n_chars: 9
+<Uff20> <U73> <U61> <U73> : "\"\\"
+<Uff20> <U73> <U65> <U71> : "!a"
<Uff20> <U73> <U65> <U71> <U75> : "?" # U3f
<Uff20> <U75> <U62> <U32> <U33> : "QR"
diff --git a/testsuite/gtk/compose/system b/testsuite/gtk/compose/system
new file mode 100644
index 0000000000..28fe1f1616
--- /dev/null
+++ b/testsuite/gtk/compose/system
@@ -0,0 +1 @@
+include "%L"
diff --git a/testsuite/gtk/compose/system.expected b/testsuite/gtk/compose/system.expected
new file mode 100644
index 0000000000..aac5ac82ea
--- /dev/null
+++ b/testsuite/gtk/compose/system.expected
@@ -0,0 +1,4914 @@
+# n_sequences: 4909
+# max_seq_len: 5
+# n_index_size: 30
+# data_size: 16521
+# n_chars: 1572
+<U7ae> <U7e9> : "ΐ" # U390
+<U7ae> <U7f5> : "ΰ" # U3b0
+<Ufe50> <U20> : "`" # U60
+<Ufe50> <U4d> : "M̀"
+<Ufe50> <U56> : "Ǜ" # U1db
+<Ufe50> <U6d> : "m̀"
+<Ufe50> <U76> : "ǜ" # U1dc
+<Ufe50> <Ua0> : "̀" # U300
+<Ufe50> <U186> : "Ɔ̀"
+<Ufe50> <U18e> : "Ǝ̀"
+<Ufe50> <U190> : "Ɛ̀"
+<Ufe50> <U196> : "Ɩ̀"
+<Ufe50> <U1b1> : "Ʊ̀"
+<Ufe50> <U1b2> : "Ʋ̀"
+<Ufe50> <U1dd> : "ǝ̀"
+<Ufe50> <U254> : "ɔ̀"
+<Ufe50> <U25b> : "ɛ̀"
+<Ufe50> <U269> : "ɩ̀"
+<Ufe50> <U28a> : "ʊ̀"
+<Ufe50> <U28b> : "ʋ̀"
+<Ufe50> <U3bd> : "Ŋ̀"
+<Ufe50> <U3bf> : "ŋ̀"
+<Ufe50> <U6c1> : "а̀"
+<Ufe50> <U6cf> : "о̀"
+<Ufe50> <U6d2> : "р̀"
+<Ufe50> <U6d5> : "у̀"
+<Ufe50> <U6e1> : "А̀"
+<Ufe50> <U6ef> : "О̀"
+<Ufe50> <U6f2> : "Р̀"
+<Ufe50> <U6f5> : "У̀"
+<Ufe50> <U1f00> : "ἂ" # U1f02
+<Ufe50> <U1f01> : "ἃ" # U1f03
+<Ufe50> <U1f08> : "Ἂ" # U1f0a
+<Ufe50> <U1f09> : "Ἃ" # U1f0b
+<Ufe50> <U1f10> : "ἒ" # U1f12
+<Ufe50> <U1f11> : "ἓ" # U1f13
+<Ufe50> <U1f18> : "Ἒ" # U1f1a
+<Ufe50> <U1f19> : "Ἓ" # U1f1b
+<Ufe50> <U1f20> : "ἢ" # U1f22
+<Ufe50> <U1f21> : "ἣ" # U1f23
+<Ufe50> <U1f28> : "Ἢ" # U1f2a
+<Ufe50> <U1f29> : "Ἣ" # U1f2b
+<Ufe50> <U1f30> : "ἲ" # U1f32
+<Ufe50> <U1f31> : "ἳ" # U1f33
+<Ufe50> <U1f38> : "Ἲ" # U1f3a
+<Ufe50> <U1f39> : "Ἳ" # U1f3b
+<Ufe50> <U1f40> : "ὂ" # U1f42
+<Ufe50> <U1f41> : "ὃ" # U1f43
+<Ufe50> <U1f48> : "Ὂ" # U1f4a
+<Ufe50> <U1f49> : "Ὃ" # U1f4b
+<Ufe50> <U1f50> : "ὒ" # U1f52
+<Ufe50> <U1f51> : "ὓ" # U1f53
+<Ufe50> <U1f59> : "Ὓ" # U1f5b
+<Ufe50> <U1f60> : "ὢ" # U1f62
+<Ufe50> <U1f61> : "ὣ" # U1f63
+<Ufe50> <U1f68> : "Ὢ" # U1f6a
+<Ufe50> <U1f69> : "Ὣ" # U1f6b
+<Ufe50> <Ufe50> : "`" # U60
+<Ufe50> <Ufe53> <U41> : "Ã̀"
+<Ufe50> <Ufe53> <U45> : "Ẽ̀"
+<Ufe50> <Ufe53> <U49> : "Ĩ̀"
+<Ufe50> <Ufe53> <U4f> : "Õ̀"
+<Ufe50> <Ufe53> <U55> : "Ũ̀"
+<Ufe50> <Ufe53> <U61> : "ã̀"
+<Ufe50> <Ufe53> <U65> : "ẽ̀"
+<Ufe50> <Ufe53> <U69> : "ĩ̀"
+<Ufe50> <Ufe53> <U6f> : "õ̀"
+<Ufe50> <Ufe53> <U75> : "ũ̀"
+<Ufe50> <Ufe53> <U186> : "Ɔ̃̀"
+<Ufe50> <Ufe53> <U18e> : "Ǝ̃̀"
+<Ufe50> <Ufe53> <U190> : "Ɛ̃̀"
+<Ufe50> <Ufe53> <U1dd> : "ǝ̃̀"
+<Ufe50> <Ufe53> <U254> : "ɔ̃̀"
+<Ufe50> <Ufe53> <U25b> : "ɛ̃̀"
+<Ufe50> <Uff20> <U22> <U55> : "Ǜ" # U1db
+<Ufe50> <Uff20> <U22> <U75> : "ǜ" # U1dc
+<Ufe50> <Uff20> <U22> <U7e9> : "ῒ" # U1fd2
+<Ufe50> <Uff20> <U22> <U7f5> : "ῢ" # U1fe2
+<Ufe50> <Uff20> <U28> <U7c1> : "Ἃ" # U1f0b
+<Ufe50> <Uff20> <U28> <U7c5> : "Ἓ" # U1f1b
+<Ufe50> <Uff20> <U28> <U7c7> : "Ἣ" # U1f2b
+<Ufe50> <Uff20> <U28> <U7c9> : "Ἳ" # U1f3b
+<Ufe50> <Uff20> <U28> <U7cf> : "Ὃ" # U1f4b
+<Ufe50> <Uff20> <U28> <U7d5> : "Ὓ" # U1f5b
+<Ufe50> <Uff20> <U28> <U7d9> : "Ὣ" # U1f6b
+<Ufe50> <Uff20> <U28> <U7e1> : "ἃ" # U1f03
+<Ufe50> <Uff20> <U28> <U7e5> : "ἓ" # U1f13
+<Ufe50> <Uff20> <U28> <U7e7> : "ἣ" # U1f23
+<Ufe50> <Uff20> <U28> <U7e9> : "ἳ" # U1f33
+<Ufe50> <Uff20> <U28> <U7ef> : "ὃ" # U1f43
+<Ufe50> <Uff20> <U28> <U7f5> : "ὓ" # U1f53
+<Ufe50> <Uff20> <U28> <U7f9> : "ὣ" # U1f63
+<Ufe50> <Uff20> <U29> <U7c1> : "Ἂ" # U1f0a
+<Ufe50> <Uff20> <U29> <U7c5> : "Ἒ" # U1f1a
+<Ufe50> <Uff20> <U29> <U7c7> : "Ἢ" # U1f2a
+<Ufe50> <Uff20> <U29> <U7c9> : "Ἲ" # U1f3a
+<Ufe50> <Uff20> <U29> <U7cf> : "Ὂ" # U1f4a
+<Ufe50> <Uff20> <U29> <U7d9> : "Ὢ" # U1f6a
+<Ufe50> <Uff20> <U29> <U7e1> : "ἂ" # U1f02
+<Ufe50> <Uff20> <U29> <U7e5> : "ἒ" # U1f12
+<Ufe50> <Uff20> <U29> <U7e7> : "ἢ" # U1f22
+<Ufe50> <Uff20> <U29> <U7e9> : "ἲ" # U1f32
+<Ufe50> <Uff20> <U29> <U7ef> : "ὂ" # U1f42
+<Ufe50> <Uff20> <U29> <U7f5> : "ὒ" # U1f52
+<Ufe50> <Uff20> <U29> <U7f9> : "ὢ" # U1f62
+<Ufe50> <Uff20> <U2b> <U4f> : "Ờ" # U1edc
+<Ufe50> <Uff20> <U2b> <U55> : "Ừ" # U1eea
+<Ufe50> <Uff20> <U2b> <U6f> : "ờ" # U1edd
+<Ufe50> <Uff20> <U2b> <U75> : "ừ" # U1eeb
+<Ufe50> <Uff20> <U55> <U41> : "Ằ" # U1eb0
+<Ufe50> <Uff20> <U55> <U61> : "ằ" # U1eb1
+<Ufe50> <Uff20> <U5e> <U41> : "Ầ" # U1ea6
+<Ufe50> <Uff20> <U5e> <U45> : "Ề" # U1ec0
+<Ufe50> <Uff20> <U5e> <U4f> : "Ồ" # U1ed2
+<Ufe50> <Uff20> <U5e> <U61> : "ầ" # U1ea7
+<Ufe50> <Uff20> <U5e> <U65> : "ề" # U1ec1
+<Ufe50> <Uff20> <U5e> <U6f> : "ồ" # U1ed3
+<Ufe50> <Uff20> <U5f> <U45> : "Ḕ" # U1e14
+<Ufe50> <Uff20> <U5f> <U4f> : "Ṑ" # U1e50
+<Ufe50> <Uff20> <U5f> <U65> : "ḕ" # U1e15
+<Ufe50> <Uff20> <U5f> <U6f> : "ṑ" # U1e51
+<Ufe50> <Uff20> <U62> <U41> : "Ằ" # U1eb0
+<Ufe50> <Uff20> <U62> <U61> : "ằ" # U1eb1
+<Ufe50> <Uff20> <Uaf> <U45> : "Ḕ" # U1e14
+<Ufe50> <Uff20> <Uaf> <U4f> : "Ṑ" # U1e50
+<Ufe50> <Uff20> <Uaf> <U65> : "ḕ" # U1e15
+<Ufe50> <Uff20> <Uaf> <U6f> : "ṑ" # U1e51
+<Ufe51> <U20> : "'" # U27
+<Ufe51> <U4a> : "J́"
+<Ufe51> <U56> : "Ǘ" # U1d7
+<Ufe51> <U6a> : "j́"
+<Ufe51> <U76> : "ǘ" # U1d8
+<Ufe51> <Ua0> : "́" # U301
+<Ufe51> <U186> : "Ɔ́"
+<Ufe51> <U18e> : "Ǝ́"
+<Ufe51> <U190> : "Ɛ́"
+<Ufe51> <U196> : "Ɩ́"
+<Ufe51> <U1b1> : "Ʊ́"
+<Ufe51> <U1b2> : "Ʋ́"
+<Ufe51> <U1dd> : "ǝ́"
+<Ufe51> <U254> : "ɔ́"
+<Ufe51> <U25b> : "ɛ́"
+<Ufe51> <U269> : "ɩ́"
+<Ufe51> <U28a> : "ʊ́"
+<Ufe51> <U28b> : "ʋ́"
+<Ufe51> <U3bd> : "Ŋ́"
+<Ufe51> <U3bf> : "ŋ́"
+<Ufe51> <U6c0> : "ю́"
+<Ufe51> <U6c1> : "а́"
+<Ufe51> <U6c5> : "е́"
+<Ufe51> <U6c9> : "и́"
+<Ufe51> <U6cf> : "о́"
+<Ufe51> <U6d1> : "я́"
+<Ufe51> <U6d2> : "р́"
+<Ufe51> <U6d5> : "у́"
+<Ufe51> <U6d9> : "ы́"
+<Ufe51> <U6dc> : "э́"
+<Ufe51> <U6e0> : "Ю́́"
+<Ufe51> <U6e1> : "А́"
+<Ufe51> <U6e5> : "Е́"
+<Ufe51> <U6e9> : "И́"
+<Ufe51> <U6ef> : "О́"
+<Ufe51> <U6f1> : "Я́"
+<Ufe51> <U6f2> : "Р́"
+<Ufe51> <U6f5> : "У́"
+<Ufe51> <U6f9> : "Ы́"
+<Ufe51> <U6fc> : "Э́"
+<Ufe51> <U1f00> : "ἄ" # U1f04
+<Ufe51> <U1f01> : "ἅ" # U1f05
+<Ufe51> <U1f08> : "Ἄ" # U1f0c
+<Ufe51> <U1f09> : "Ἅ" # U1f0d
+<Ufe51> <U1f10> : "ἔ" # U1f14
+<Ufe51> <U1f11> : "ἕ" # U1f15
+<Ufe51> <U1f18> : "Ἔ" # U1f1c
+<Ufe51> <U1f19> : "Ἕ" # U1f1d
+<Ufe51> <U1f20> : "ἤ" # U1f24
+<Ufe51> <U1f21> : "ἥ" # U1f25
+<Ufe51> <U1f28> : "Ἤ" # U1f2c
+<Ufe51> <U1f29> : "Ἥ" # U1f2d
+<Ufe51> <U1f30> : "ἴ" # U1f34
+<Ufe51> <U1f31> : "ἵ" # U1f35
+<Ufe51> <U1f38> : "Ἴ" # U1f3c
+<Ufe51> <U1f39> : "Ἵ" # U1f3d
+<Ufe51> <U1f40> : "ὄ" # U1f44
+<Ufe51> <U1f41> : "ὅ" # U1f45
+<Ufe51> <U1f48> : "Ὄ" # U1f4c
+<Ufe51> <U1f49> : "Ὅ" # U1f4d
+<Ufe51> <U1f50> : "ὔ" # U1f54
+<Ufe51> <U1f51> : "ὕ" # U1f55
+<Ufe51> <U1f59> : "Ὕ" # U1f5d
+<Ufe51> <U1f60> : "ὤ" # U1f64
+<Ufe51> <U1f61> : "ὥ" # U1f65
+<Ufe51> <U1f68> : "Ὤ" # U1f6c
+<Ufe51> <U1f69> : "Ὥ" # U1f6d
+<Ufe51> <Ufe51> : "´" # Ub4
+<Ufe51> <Ufe53> <U41> : "Ã́"
+<Ufe51> <Ufe53> <U45> : "Ẽ́"
+<Ufe51> <Ufe53> <U49> : "Ĩ́"
+<Ufe51> <Ufe53> <U61> : "ã́"
+<Ufe51> <Ufe53> <U65> : "ẽ́"
+<Ufe51> <Ufe53> <U69> : "ĩ́"
+<Ufe51> <Ufe53> <U186> : "Ɔ̃́"
+<Ufe51> <Ufe53> <U18e> : "Ǝ̃́"
+<Ufe51> <Ufe53> <U190> : "Ɛ̃́"
+<Ufe51> <Ufe53> <U1dd> : "ǝ̃́"
+<Ufe51> <Ufe53> <U254> : "ɔ̃́"
+<Ufe51> <Ufe53> <U25b> : "ɛ̃́"
+<Ufe51> <Ufe57> <U20> : "΅" # U385
+<Ufe51> <Ufe63> <U4f> : "Ǿ" # U1fe
+<Ufe51> <Ufe63> <U6f> : "ǿ" # U1ff
+<Ufe51> <Uff20> <U22> <U49> : "Ḯ" # U1e2e
+<Ufe51> <Uff20> <U22> <U55> : "Ǘ" # U1d7
+<Ufe51> <Uff20> <U22> <U69> : "ḯ" # U1e2f
+<Ufe51> <Uff20> <U22> <U75> : "ǘ" # U1d8
+<Ufe51> <Uff20> <U22> <U7e9> : "ΐ" # U390
+<Ufe51> <Uff20> <U22> <U7f5> : "ΰ" # U3b0
+<Ufe51> <Uff20> <U28> <U7c1> : "Ἅ" # U1f0d
+<Ufe51> <Uff20> <U28> <U7c5> : "Ἕ" # U1f1d
+<Ufe51> <Uff20> <U28> <U7c7> : "Ἥ" # U1f2d
+<Ufe51> <Uff20> <U28> <U7c9> : "Ἵ" # U1f3d
+<Ufe51> <Uff20> <U28> <U7cf> : "Ὅ" # U1f4d
+<Ufe51> <Uff20> <U28> <U7d5> : "Ὕ" # U1f5d
+<Ufe51> <Uff20> <U28> <U7d9> : "Ὥ" # U1f6d
+<Ufe51> <Uff20> <U28> <U7e1> : "ἅ" # U1f05
+<Ufe51> <Uff20> <U28> <U7e5> : "ἕ" # U1f15
+<Ufe51> <Uff20> <U28> <U7e7> : "ἥ" # U1f25
+<Ufe51> <Uff20> <U28> <U7e9> : "ἵ" # U1f35
+<Ufe51> <Uff20> <U28> <U7ef> : "ὅ" # U1f45
+<Ufe51> <Uff20> <U28> <U7f5> : "ὕ" # U1f55
+<Ufe51> <Uff20> <U28> <U7f9> : "ὥ" # U1f65
+<Ufe51> <Uff20> <U29> <U7c1> : "Ἄ" # U1f0c
+<Ufe51> <Uff20> <U29> <U7c5> : "Ἔ" # U1f1c
+<Ufe51> <Uff20> <U29> <U7c7> : "Ἤ" # U1f2c
+<Ufe51> <Uff20> <U29> <U7c9> : "Ἴ" # U1f3c
+<Ufe51> <Uff20> <U29> <U7cf> : "Ὄ" # U1f4c
+<Ufe51> <Uff20> <U29> <U7d9> : "Ὤ" # U1f6c
+<Ufe51> <Uff20> <U29> <U7e1> : "ἄ" # U1f04
+<Ufe51> <Uff20> <U29> <U7e5> : "ἔ" # U1f14
+<Ufe51> <Uff20> <U29> <U7e7> : "ἤ" # U1f24
+<Ufe51> <Uff20> <U29> <U7e9> : "ἴ" # U1f34
+<Ufe51> <Uff20> <U29> <U7ef> : "ὄ" # U1f44
+<Ufe51> <Uff20> <U29> <U7f5> : "ὔ" # U1f54
+<Ufe51> <Uff20> <U29> <U7f9> : "ὤ" # U1f64
+<Ufe51> <Uff20> <U2b> <U4f> : "Ớ" # U1eda
+<Ufe51> <Uff20> <U2b> <U55> : "Ứ" # U1ee8
+<Ufe51> <Uff20> <U2b> <U6f> : "ớ" # U1edb
+<Ufe51> <Uff20> <U2b> <U75> : "ứ" # U1ee9
+<Ufe51> <Uff20> <U2c> <U43> : "Ḉ" # U1e08
+<Ufe51> <Uff20> <U2c> <U63> : "ḉ" # U1e09
+<Ufe51> <Uff20> <U2f> <U4f> : "Ǿ" # U1fe
+<Ufe51> <Uff20> <U2f> <U6f> : "ǿ" # U1ff
+<Ufe51> <Uff20> <U55> <U41> : "Ắ" # U1eae
+<Ufe51> <Uff20> <U55> <U61> : "ắ" # U1eaf
+<Ufe51> <Uff20> <U5e> <U41> : "Ấ" # U1ea4
+<Ufe51> <Uff20> <U5e> <U45> : "Ế" # U1ebe
+<Ufe51> <Uff20> <U5e> <U4f> : "Ố" # U1ed0
+<Ufe51> <Uff20> <U5e> <U61> : "ấ" # U1ea5
+<Ufe51> <Uff20> <U5e> <U65> : "ế" # U1ebf
+<Ufe51> <Uff20> <U5e> <U6f> : "ố" # U1ed1
+<Ufe51> <Uff20> <U5f> <U45> : "Ḗ" # U1e16
+<Ufe51> <Uff20> <U5f> <U4f> : "Ṓ" # U1e52
+<Ufe51> <Uff20> <U5f> <U65> : "ḗ" # U1e17
+<Ufe51> <Uff20> <U5f> <U6f> : "ṓ" # U1e53
+<Ufe51> <Uff20> <U62> <U41> : "Ắ" # U1eae
+<Ufe51> <Uff20> <U62> <U61> : "ắ" # U1eaf
+<Ufe51> <Uff20> <U6f> <U41> : "Ǻ" # U1fa
+<Ufe51> <Uff20> <U6f> <U61> : "ǻ" # U1fb
+<Ufe51> <Uff20> <U7e> <U4f> : "Ṍ" # U1e4c
+<Ufe51> <Uff20> <U7e> <U55> : "Ṹ" # U1e78
+<Ufe51> <Uff20> <U7e> <U6f> : "ṍ" # U1e4d
+<Ufe51> <Uff20> <U7e> <U75> : "ṹ" # U1e79
+<Ufe51> <Uff20> <Uaf> <U45> : "Ḗ" # U1e16
+<Ufe51> <Uff20> <Uaf> <U4f> : "Ṓ" # U1e52
+<Ufe51> <Uff20> <Uaf> <U65> : "ḗ" # U1e17
+<Ufe51> <Uff20> <Uaf> <U6f> : "ṓ" # U1e53
+<Ufe51> <Uff20> <Ub8> <U43> : "Ḉ" # U1e08
+<Ufe51> <Uff20> <Ub8> <U63> : "ḉ" # U1e09
+<Ufe51> <Uff20> <Uffaf> <U4f> : "Ǿ" # U1fe
+<Ufe51> <Uff20> <Uffaf> <U6f> : "ǿ" # U1ff
+<Ufe52> <U20> : "^" # U5e
+<Ufe52> <U28> : "⁽" # U207d
+<Ufe52> <U29> : "⁾" # U207e
+<Ufe52> <U2b> : "⁺" # U207a
+<Ufe52> <U2d> : "⁻" # U207b
+<Ufe52> <U30> : "⁰" # U2070
+<Ufe52> <U31> : "¹" # Ub9
+<Ufe52> <U32> : "²" # Ub2
+<Ufe52> <U33> : "³" # Ub3
+<Ufe52> <U34> : "⁴" # U2074
+<Ufe52> <U35> : "⁵" # U2075
+<Ufe52> <U36> : "⁶" # U2076
+<Ufe52> <U37> : "⁷" # U2077
+<Ufe52> <U38> : "⁸" # U2078
+<Ufe52> <U39> : "⁹" # U2079
+<Ufe52> <U3d> : "⁼" # U207c
+<Ufe52> <Ua0> : "̂" # U302
+<Ufe52> <Uc0> : "Ầ" # U1ea6
+<Ufe52> <Uc1> : "Ấ" # U1ea4
+<Ufe52> <Uc3> : "Ẫ" # U1eaa
+<Ufe52> <Uc8> : "Ề" # U1ec0
+<Ufe52> <Uc9> : "Ế" # U1ebe
+<Ufe52> <Ud2> : "Ồ" # U1ed2
+<Ufe52> <Ud3> : "Ố" # U1ed0
+<Ufe52> <Ud5> : "Ỗ" # U1ed6
+<Ufe52> <Ue0> : "ầ" # U1ea7
+<Ufe52> <Ue1> : "ấ" # U1ea5
+<Ufe52> <Ue3> : "ẫ" # U1eab
+<Ufe52> <Ue8> : "ề" # U1ec1
+<Ufe52> <Ue9> : "ế" # U1ebf
+<Ufe52> <Uf2> : "ồ" # U1ed3
+<Ufe52> <Uf3> : "ố" # U1ed1
+<Ufe52> <Uf5> : "ỗ" # U1ed7
+<Ufe52> <U186> : "Ɔ̂"
+<Ufe52> <U18e> : "Ǝ̂"
+<Ufe52> <U190> : "Ɛ̂"
+<Ufe52> <U196> : "Ɩ̂"
+<Ufe52> <U1b1> : "Ʊ̂"
+<Ufe52> <U1b2> : "Ʋ̂"
+<Ufe52> <U1dd> : "ǝ̂"
+<Ufe52> <U254> : "ɔ̂"
+<Ufe52> <U25b> : "ɛ̂"
+<Ufe52> <U269> : "ɩ̂"
+<Ufe52> <U28a> : "ʊ̂"
+<Ufe52> <U28b> : "ʋ̂"
+<Ufe52> <U6c1> : "а̂"
+<Ufe52> <U6c5> : "е̂"
+<Ufe52> <U6c9> : "и̂"
+<Ufe52> <U6cf> : "о̂"
+<Ufe52> <U6d2> : "р̂"
+<Ufe52> <U6d5> : "у̂"
+<Ufe52> <U6e1> : "А̂"
+<Ufe52> <U6e5> : "Е̂"
+<Ufe52> <U6e9> : "И̂"
+<Ufe52> <U6ef> : "О̂"
+<Ufe52> <U6f2> : "Р̂"
+<Ufe52> <U6f5> : "У̂"
+<Ufe52> <U1ea0> : "Ậ" # U1eac
+<Ufe52> <U1ea1> : "ậ" # U1ead
+<Ufe52> <U1eb8> : "Ệ" # U1ec6
+<Ufe52> <U1eb9> : "ệ" # U1ec7
+<Ufe52> <U1ecc> : "Ộ" # U1ed8
+<Ufe52> <U1ecd> : "ộ" # U1ed9
+<Ufe52> <U2212> : "⁻" # U207b
+<Ufe52> <U4e00> : "㆒" # U3192
+<Ufe52> <U4e01> : "㆜" # U319c
+<Ufe52> <U4e09> : "㆔" # U3194
+<Ufe52> <U4e0a> : "㆖" # U3196
+<Ufe52> <U4e0b> : "㆘" # U3198
+<Ufe52> <U4e19> : "㆛" # U319b
+<Ufe52> <U4e2d> : "㆗" # U3197
+<Ufe52> <U4e59> : "㆚" # U319a
+<Ufe52> <U4e8c> : "㆓" # U3193
+<Ufe52> <U4eba> : "㆟" # U319f
+<Ufe52> <U56db> : "㆕" # U3195
+<Ufe52> <U5730> : "㆞" # U319e
+<Ufe52> <U5929> : "㆝" # U319d
+<Ufe52> <U7532> : "㆙" # U3199
+<Ufe52> <Ufe52> : "^" # U5e
+<Ufe52> <Uff80> : "²" # Ub2
+<Ufe52> <Uffab> : "⁺" # U207a
+<Ufe52> <Uffb0> : "⁰" # U2070
+<Ufe52> <Uffb1> : "¹" # Ub9
+<Ufe52> <Uffb2> : "²" # Ub2
+<Ufe52> <Uffb3> : "³" # Ub3
+<Ufe52> <Uffb4> : "⁴" # U2074
+<Ufe52> <Uffb5> : "⁵" # U2075
+<Ufe52> <Uffb6> : "⁶" # U2076
+<Ufe52> <Uffb7> : "⁷" # U2077
+<Ufe52> <Uffb8> : "⁸" # U2078
+<Ufe52> <Uffb9> : "⁹" # U2079
+<Ufe52> <Uffbd> : "⁼" # U207c
+<Ufe52> <Uff20> <U21> <U41> : "Ậ" # U1eac
+<Ufe52> <Uff20> <U21> <U45> : "Ệ" # U1ec6
+<Ufe52> <Uff20> <U21> <U4f> : "Ộ" # U1ed8
+<Ufe52> <Uff20> <U21> <U61> : "ậ" # U1ead
+<Ufe52> <Uff20> <U21> <U65> : "ệ" # U1ec7
+<Ufe52> <Uff20> <U21> <U6f> : "ộ" # U1ed9
+<Ufe52> <Uff20> <U53> <U4d> : "℠" # U2120
+<Ufe52> <Uff20> <U53> <U6d> : "℠" # U2120
+<Ufe52> <Uff20> <U54> <U4d> : "™" # U2122
+<Ufe52> <Uff20> <U54> <U6d> : "™" # U2122
+<Ufe52> <Uff20> <U5f> <U61> : "ª" # Uaa
+<Ufe52> <Uff20> <U5f> <U68> : "ʰ" # U2b0
+<Ufe52> <Uff20> <U5f> <U69> : "ⁱ" # U2071
+<Ufe52> <Uff20> <U5f> <U6a> : "ʲ" # U2b2
+<Ufe52> <Uff20> <U5f> <U6c> : "ˡ" # U2e1
+<Ufe52> <Uff20> <U5f> <U6e> : "ⁿ" # U207f
+<Ufe52> <Uff20> <U5f> <U6f> : "º" # Uba
+<Ufe52> <Uff20> <U5f> <U72> : "ʳ" # U2b3
+<Ufe52> <Uff20> <U5f> <U73> : "ˢ" # U2e2
+<Ufe52> <Uff20> <U5f> <U77> : "ʷ" # U2b7
+<Ufe52> <Uff20> <U5f> <U78> : "ˣ" # U2e3
+<Ufe52> <Uff20> <U5f> <U79> : "ʸ" # U2b8
+<Ufe52> <Uff20> <U5f> <U263> : "ˠ" # U2e0
+<Ufe52> <Uff20> <U5f> <U266> : "ʱ" # U2b1
+<Ufe52> <Uff20> <U5f> <U279> : "ʴ" # U2b4
+<Ufe52> <Uff20> <U5f> <U27b> : "ʵ" # U2b5
+<Ufe52> <Uff20> <U5f> <U281> : "ʶ" # U2b6
+<Ufe52> <Uff20> <U5f> <U295> : "ˤ" # U2e4
+<Ufe52> <Uff20> <U73> <U4d> : "℠" # U2120
+<Ufe52> <Uff20> <U73> <U6d> : "℠" # U2120
+<Ufe52> <Uff20> <U74> <U4d> : "™" # U2122
+<Ufe52> <Uff20> <U74> <U6d> : "™" # U2122
+<Ufe52> <Uff20> <Ubc6> <U61> : "ª" # Uaa
+<Ufe52> <Uff20> <Ubc6> <U68> : "ʰ" # U2b0
+<Ufe52> <Uff20> <Ubc6> <U69> : "ⁱ" # U2071
+<Ufe52> <Uff20> <Ubc6> <U6a> : "ʲ" # U2b2
+<Ufe52> <Uff20> <Ubc6> <U6c> : "ˡ" # U2e1
+<Ufe52> <Uff20> <Ubc6> <U6e> : "ⁿ" # U207f
+<Ufe52> <Uff20> <Ubc6> <U6f> : "º" # Uba
+<Ufe52> <Uff20> <Ubc6> <U72> : "ʳ" # U2b3
+<Ufe52> <Uff20> <Ubc6> <U73> : "ˢ" # U2e2
+<Ufe52> <Uff20> <Ubc6> <U77> : "ʷ" # U2b7
+<Ufe52> <Uff20> <Ubc6> <U78> : "ˣ" # U2e3
+<Ufe52> <Uff20> <Ubc6> <U79> : "ʸ" # U2b8
+<Ufe52> <Uff20> <Ubc6> <U263> : "ˠ" # U2e0
+<Ufe52> <Uff20> <Ubc6> <U266> : "ʱ" # U2b1
+<Ufe52> <Uff20> <Ubc6> <U279> : "ʴ" # U2b4
+<Ufe52> <Uff20> <Ubc6> <U27b> : "ʵ" # U2b5
+<Ufe52> <Uff20> <Ubc6> <U281> : "ʶ" # U2b6
+<Ufe52> <Uff20> <Ubc6> <U295> : "ˤ" # U2e4
+<Ufe53> <U20> : "~" # U7e
+<Ufe53> <U3c> : "≲" # U2272
+<Ufe53> <U3d> : "≃" # U2243
+<Ufe53> <U3e> : "≳" # U2273
+<Ufe53> <Ua0> : "̃" # U303
+<Ufe53> <Ud3> : "Ṍ" # U1e4c
+<Ufe53> <Ud6> : "Ṏ" # U1e4e
+<Ufe53> <Uda> : "Ṹ" # U1e78
+<Ufe53> <Uf3> : "ṍ" # U1e4d
+<Ufe53> <Uf6> : "ṏ" # U1e4f
+<Ufe53> <Ufa> : "ṹ" # U1e79
+<Ufe53> <U186> : "Ɔ̃"
+<Ufe53> <U18e> : "Ǝ̃"
+<Ufe53> <U190> : "Ɛ̃"
+<Ufe53> <U1dd> : "ǝ̃"
+<Ufe53> <U254> : "ɔ̃"
+<Ufe53> <U25b> : "ɛ̃"
+<Ufe53> <U3d2> : "Ȭ" # U22c
+<Ufe53> <U3f2> : "ȭ" # U22d
+<Ufe53> <U1f00> : "ἆ" # U1f06
+<Ufe53> <U1f01> : "ἇ" # U1f07
+<Ufe53> <U1f08> : "Ἆ" # U1f0e
+<Ufe53> <U1f09> : "Ἇ" # U1f0f
+<Ufe53> <U1f20> : "ἦ" # U1f26
+<Ufe53> <U1f21> : "ἧ" # U1f27
+<Ufe53> <U1f28> : "Ἦ" # U1f2e
+<Ufe53> <U1f29> : "Ἧ" # U1f2f
+<Ufe53> <U1f30> : "ἶ" # U1f36
+<Ufe53> <U1f31> : "ἷ" # U1f37
+<Ufe53> <U1f38> : "Ἶ" # U1f3e
+<Ufe53> <U1f39> : "Ἷ" # U1f3f
+<Ufe53> <U1f50> : "ὖ" # U1f56
+<Ufe53> <U1f51> : "ὗ" # U1f57
+<Ufe53> <U1f59> : "Ὗ" # U1f5f
+<Ufe53> <U1f60> : "ὦ" # U1f66
+<Ufe53> <U1f61> : "ὧ" # U1f67
+<Ufe53> <U1f68> : "Ὦ" # U1f6e
+<Ufe53> <U1f69> : "Ὧ" # U1f6f
+<Ufe53> <Ufe53> : "~" # U7e
+<Ufe53> <Uff20> <U22> <U7e9> : "ῗ" # U1fd7
+<Ufe53> <Uff20> <U22> <U7f5> : "ῧ" # U1fe7
+<Ufe53> <Uff20> <U28> <U7c1> : "Ἇ" # U1f0f
+<Ufe53> <Uff20> <U28> <U7c7> : "Ἧ" # U1f2f
+<Ufe53> <Uff20> <U28> <U7c9> : "Ἷ" # U1f3f
+<Ufe53> <Uff20> <U28> <U7d5> : "Ὗ" # U1f5f
+<Ufe53> <Uff20> <U28> <U7d9> : "Ὧ" # U1f6f
+<Ufe53> <Uff20> <U28> <U7e1> : "ἇ" # U1f07
+<Ufe53> <Uff20> <U28> <U7e7> : "ἧ" # U1f27
+<Ufe53> <Uff20> <U28> <U7e9> : "ἷ" # U1f37
+<Ufe53> <Uff20> <U28> <U7f5> : "ὗ" # U1f57
+<Ufe53> <Uff20> <U28> <U7f9> : "ὧ" # U1f67
+<Ufe53> <Uff20> <U29> <U7c1> : "Ἆ" # U1f0e
+<Ufe53> <Uff20> <U29> <U7c7> : "Ἦ" # U1f2e
+<Ufe53> <Uff20> <U29> <U7c9> : "Ἶ" # U1f3e
+<Ufe53> <Uff20> <U29> <U7d9> : "Ὦ" # U1f6e
+<Ufe53> <Uff20> <U29> <U7e1> : "ἆ" # U1f06
+<Ufe53> <Uff20> <U29> <U7e7> : "ἦ" # U1f26
+<Ufe53> <Uff20> <U29> <U7e9> : "ἶ" # U1f36
+<Ufe53> <Uff20> <U29> <U7f5> : "ὖ" # U1f56
+<Ufe53> <Uff20> <U29> <U7f9> : "ὦ" # U1f66
+<Ufe53> <Uff20> <U2b> <U4f> : "Ỡ" # U1ee0
+<Ufe53> <Uff20> <U2b> <U55> : "Ữ" # U1eee
+<Ufe53> <Uff20> <U2b> <U6f> : "ỡ" # U1ee1
+<Ufe53> <Uff20> <U2b> <U75> : "ữ" # U1eef
+<Ufe53> <Uff20> <U55> <U41> : "Ẵ" # U1eb4
+<Ufe53> <Uff20> <U55> <U61> : "ẵ" # U1eb5
+<Ufe53> <Uff20> <U5e> <U41> : "Ẫ" # U1eaa
+<Ufe53> <Uff20> <U5e> <U45> : "Ễ" # U1ec4
+<Ufe53> <Uff20> <U5e> <U4f> : "Ỗ" # U1ed6
+<Ufe53> <Uff20> <U5e> <U61> : "ẫ" # U1eab
+<Ufe53> <Uff20> <U5e> <U65> : "ễ" # U1ec5
+<Ufe53> <Uff20> <U5e> <U6f> : "ỗ" # U1ed7
+<Ufe53> <Uff20> <U62> <U41> : "Ẵ" # U1eb4
+<Ufe53> <Uff20> <U62> <U61> : "ẵ" # U1eb5
+<Ufe54> <U20> : "¯" # Uaf
+<Ufe54> <U56> : "Ǖ" # U1d5
+<Ufe54> <U76> : "ǖ" # U1d6
+<Ufe54> <Ua0> : "̄" # U304
+<Ufe54> <Uc8> : "Ḕ" # U1e14
+<Ufe54> <Uc9> : "Ḗ" # U1e16
+<Ufe54> <Ud2> : "Ṑ" # U1e50
+<Ufe54> <Ud3> : "Ṓ" # U1e52
+<Ufe54> <Ue8> : "ḕ" # U1e15
+<Ufe54> <Ue9> : "ḗ" # U1e17
+<Ufe54> <Uf2> : "ṑ" # U1e51
+<Ufe54> <Uf3> : "ṓ" # U1e53
+<Ufe54> <U186> : "Ɔ̄"
+<Ufe54> <U18e> : "Ǝ̄"
+<Ufe54> <U190> : "Ɛ̄"
+<Ufe54> <U196> : "Ɩ̄"
+<Ufe54> <U1b1> : "Ʊ̄"
+<Ufe54> <U1b2> : "Ʋ̄"
+<Ufe54> <U1dd> : "ǝ̄"
+<Ufe54> <U1ea> : "Ǭ" # U1ec
+<Ufe54> <U1eb> : "ǭ" # U1ed
+<Ufe54> <U226> : "Ǡ" # U1e0
+<Ufe54> <U227> : "ǡ" # U1e1
+<Ufe54> <U22e> : "Ȱ" # U230
+<Ufe54> <U22f> : "ȱ" # U231
+<Ufe54> <U254> : "ɔ̄"
+<Ufe54> <U25b> : "ɛ̄"
+<Ufe54> <U269> : "ɩ̄"
+<Ufe54> <U28a> : "ʊ̄"
+<Ufe54> <U28b> : "ʋ̄"
+<Ufe54> <U6c1> : "а̄"
+<Ufe54> <U6c5> : "е̄"
+<Ufe54> <U6cf> : "о̄"
+<Ufe54> <U6d2> : "р̄"
+<Ufe54> <U6e1> : "А̄"
+<Ufe54> <U6e5> : "Е̄"
+<Ufe54> <U6ef> : "О̄"
+<Ufe54> <U6f2> : "Р̄"
+<Ufe54> <U1e36> : "Ḹ" # U1e38
+<Ufe54> <U1e37> : "ḹ" # U1e39
+<Ufe54> <U1e5a> : "Ṝ" # U1e5c
+<Ufe54> <U1e5b> : "ṝ" # U1e5d
+<Ufe54> <Ufe54> : "¯" # Uaf
+<Ufe54> <Ufe57> <U55> : "Ǖ" # U1d5
+<Ufe54> <Ufe57> <U75> : "ǖ" # U1d6
+<Ufe54> <Ufe8c> <U41> : "Ᾱ" # U1fb9
+<Ufe54> <Ufe8c> <U49> : "Ῑ" # U1fd9
+<Ufe54> <Ufe8c> <U55> : "Ῡ" # U1fe9
+<Ufe54> <Ufe8c> <U61> : "ᾱ" # U1fb1
+<Ufe54> <Ufe8c> <U69> : "ῑ" # U1fd1
+<Ufe54> <Ufe8c> <U75> : "ῡ" # U1fe1
+<Ufe54> <Uff20> <U21> <U4c> : "Ḹ" # U1e38
+<Ufe54> <Uff20> <U21> <U52> : "Ṝ" # U1e5c
+<Ufe54> <Uff20> <U21> <U6c> : "ḹ" # U1e39
+<Ufe54> <Uff20> <U21> <U72> : "ṝ" # U1e5d
+<Ufe54> <Uff20> <U22> <U41> : "Ǟ" # U1de
+<Ufe54> <Uff20> <U22> <U4f> : "Ȫ" # U22a
+<Ufe54> <Uff20> <U22> <U55> : "Ǖ" # U1d5
+<Ufe54> <Uff20> <U22> <U61> : "ǟ" # U1df
+<Ufe54> <Uff20> <U22> <U6f> : "ȫ" # U22b
+<Ufe54> <Uff20> <U22> <U75> : "ǖ" # U1d6
+<Ufe54> <Uff20> <U2e> <U41> : "Ǡ" # U1e0
+<Ufe54> <Uff20> <U2e> <U4f> : "Ȱ" # U230
+<Ufe54> <Uff20> <U2e> <U61> : "ǡ" # U1e1
+<Ufe54> <Uff20> <U2e> <U6f> : "ȱ" # U231
+<Ufe54> <Uff20> <U3b> <U4f> : "Ǭ" # U1ec
+<Ufe54> <Uff20> <U3b> <U6f> : "ǭ" # U1ed
+<Ufe54> <Uff20> <U7e> <U4f> : "Ȭ" # U22c
+<Ufe54> <Uff20> <U7e> <U6f> : "ȭ" # U22d
+<Ufe55> <U20> : "˘" # U2d8
+<Ufe55> <Ua0> : "̆" # U306
+<Ufe55> <Uc0> : "Ằ" # U1eb0
+<Ufe55> <Uc1> : "Ắ" # U1eae
+<Ufe55> <Uc3> : "Ẵ" # U1eb4
+<Ufe55> <Ue0> : "ằ" # U1eb1
+<Ufe55> <Ue1> : "ắ" # U1eaf
+<Ufe55> <Ue3> : "ẵ" # U1eb5
+<Ufe55> <U228> : "Ḝ" # U1e1c
+<Ufe55> <U229> : "ḝ" # U1e1d
+<Ufe55> <U1ea0> : "Ặ" # U1eb6
+<Ufe55> <U1ea1> : "ặ" # U1eb7
+<Ufe55> <Ufe55> : "˘" # U2d8
+<Ufe55> <Uff20> <U21> <U41> : "Ặ" # U1eb6
+<Ufe55> <Uff20> <U21> <U61> : "ặ" # U1eb7
+<Ufe55> <Uff20> <U2c> <U45> : "Ḝ" # U1e1c
+<Ufe55> <Uff20> <U2c> <U65> : "ḝ" # U1e1d
+<Ufe55> <Uff20> <Ub8> <U45> : "Ḝ" # U1e1c
+<Ufe55> <Uff20> <Ub8> <U65> : "ḝ" # U1e1d
+<Ufe56> <U20> : "˙" # U2d9
+<Ufe56> <U4c> : "Ŀ" # U13f
+<Ufe56> <U69> : "ı" # U131
+<Ufe56> <U6a> : "ȷ" # U237
+<Ufe56> <U6c> : "ŀ" # U140
+<Ufe56> <Ua0> : "̇" # U307
+<Ufe56> <U17f> : "ẛ" # U1e9b
+<Ufe56> <U3c0> : "Ǡ" # U1e0
+<Ufe56> <U3d2> : "Ȱ" # U230
+<Ufe56> <U3e0> : "ǡ" # U1e1
+<Ufe56> <U3f2> : "ȱ" # U231
+<Ufe56> <U1e62> : "Ṩ" # U1e68
+<Ufe56> <U1e63> : "ṩ" # U1e69
+<Ufe56> <Ufe56> : "˙" # U2d9
+<Ufe56> <Ufe63> <U6a> : "ɟ" # U25f
+<Ufe56> <Uff20> <U21> <U53> : "Ṩ" # U1e68
+<Ufe56> <Uff20> <U21> <U73> : "ṩ" # U1e69
+<Ufe56> <Uff20> <U27> <U53> : "Ṥ" # U1e64
+<Ufe56> <Uff20> <U27> <U73> : "ṥ" # U1e65
+<Ufe56> <Uff20> <U63> <U53> : "Ṧ" # U1e66
+<Ufe56> <Uff20> <U63> <U73> : "ṧ" # U1e67
+<Ufe56> <Uff20> <U66> <U73> : "ẛ" # U1e9b
+<Ufe56> <Uff20> <Ub4> <U53> : "Ṥ" # U1e64
+<Ufe56> <Uff20> <Ub4> <U73> : "ṥ" # U1e65
+<Ufe57> <U20> : "\"" # U22
+<Ufe57> <U27> : "̈́" # U344
+<Ufe57> <Ua0> : "̈" # U308
+<Ufe57> <Ub4> : "̈́" # U344
+<Ufe57> <Ucd> : "Ḯ" # U1e2e
+<Ufe57> <Ud9> : "Ǜ" # U1db
+<Ufe57> <Uda> : "Ǘ" # U1d7
+<Ufe57> <Ued> : "ḯ" # U1e2f
+<Ufe57> <Uf9> : "ǜ" # U1dc
+<Ufe57> <Ufa> : "ǘ" # U1d8
+<Ufe57> <U1d3> : "Ǚ" # U1d9
+<Ufe57> <U1d4> : "ǚ" # U1da
+<Ufe57> <U3c0> : "Ǟ" # U1de
+<Ufe57> <U3d2> : "Ȫ" # U22a
+<Ufe57> <U3e0> : "ǟ" # U1df
+<Ufe57> <U3f2> : "ȫ" # U22b
+<Ufe57> <U4d8> : "Ӛ" # U4da
+<Ufe57> <U4d9> : "ӛ" # U4db
+<Ufe57> <U4e8> : "Ӫ" # U4ea
+<Ufe57> <U4e9> : "ӫ" # U4eb
+<Ufe57> <Ufe57> : "¨" # Ua8
+<Ufe57> <Ufe51> <U20> : "΅" # U385
+<Ufe57> <Ufe54> <U55> : "Ṻ" # U1e7a
+<Ufe57> <Ufe54> <U75> : "ṻ" # U1e7b
+<Ufe57> <Ufe6c> <U3d> : "⩷" # U2a77
+<Ufe57> <Uff20> <U5f> <U55> : "Ṻ" # U1e7a
+<Ufe57> <Uff20> <U5f> <U75> : "ṻ" # U1e7b
+<Ufe57> <Uff20> <U7e> <U4f> : "Ṏ" # U1e4e
+<Ufe57> <Uff20> <U7e> <U6f> : "ṏ" # U1e4f
+<Ufe57> <Uff20> <Uaf> <U55> : "Ṻ" # U1e7a
+<Ufe57> <Uff20> <Uaf> <U75> : "ṻ" # U1e7b
+<Ufe58> <U20> : "°" # Ub0
+<Ufe58> <Ua0> : "̊" # U30a
+<Ufe58> <Uc1> : "Ǻ" # U1fa
+<Ufe58> <Ue1> : "ǻ" # U1fb
+<Ufe58> <Ufe58> : "°" # Ub0
+<Ufe59> <U20> : "˝" # U2dd
+<Ufe59> <Ua0> : "̋" # U30b
+<Ufe59> <Ufe59> : "˝" # U2dd
+<Ufe5a> <U20> : "ˇ" # U2c7
+<Ufe5a> <U28> : "₍" # U208d
+<Ufe5a> <U29> : "₎" # U208e
+<Ufe5a> <U2b> : "₊" # U208a
+<Ufe5a> <U2d> : "₋" # U208b
+<Ufe5a> <U30> : "₀" # U2080
+<Ufe5a> <U31> : "₁" # U2081
+<Ufe5a> <U32> : "₂" # U2082
+<Ufe5a> <U33> : "₃" # U2083
+<Ufe5a> <U34> : "₄" # U2084
+<Ufe5a> <U35> : "₅" # U2085
+<Ufe5a> <U36> : "₆" # U2086
+<Ufe5a> <U37> : "₇" # U2087
+<Ufe5a> <U38> : "₈" # U2088
+<Ufe5a> <U39> : "₉" # U2089
+<Ufe5a> <U3d> : "₌" # U208c
+<Ufe5a> <U56> : "Ǚ" # U1d9
+<Ufe5a> <U76> : "ǚ" # U1da
+<Ufe5a> <Ua0> : "̌" # U30c
+<Ufe5a> <U186> : "Ɔ̌"
+<Ufe5a> <U18e> : "Ǝ̌"
+<Ufe5a> <U190> : "Ɛ̌"
+<Ufe5a> <U196> : "Ɩ̌"
+<Ufe5a> <U1b1> : "Ʊ̌"
+<Ufe5a> <U1b2> : "Ʋ̌"
+<Ufe5a> <U1dd> : "ǝ̌"
+<Ufe5a> <U1f2> : "Dž" # U1c5
+<Ufe5a> <U254> : "ɔ̌"
+<Ufe5a> <U25b> : "ɛ̌"
+<Ufe5a> <U269> : "ɩ̌"
+<Ufe5a> <U28a> : "ʊ̌"
+<Ufe5a> <U28b> : "ʋ̌"
+<Ufe5a> <Ufe5a> : "ˇ" # U2c7
+<Ufe5a> <Uff20> <U22> <U55> : "Ǚ" # U1d9
+<Ufe5a> <Uff20> <U22> <U75> : "ǚ" # U1da
+<Ufe5b> <U20> : "¸" # Ub8
+<Ufe5b> <Ua0> : "̧" # U327
+<Ufe5b> <Ua2> : "₵" # U20b5
+<Ufe5b> <U114> : "Ḝ" # U1e1c
+<Ufe5b> <U115> : "ḝ" # U1e1d
+<Ufe5b> <Ufe5b> : "¸" # Ub8
+<Ufe5b> <Ufe6f> <U43> : "₵" # U20b5
+<Ufe5b> <Ufe6f> <U63> : "₵" # U20b5
+<Ufe5c> <U20> : "˛" # U2db
+<Ufe5c> <Ua0> : "̨" # U328
+<Ufe5c> <Ufe5c> : "˛" # U2db
+<Ufe5d> <U20> : "ͺ" # U37a
+<Ufe5d> <U1f00> : "ᾀ" # U1f80
+<Ufe5d> <U1f01> : "ᾁ" # U1f81
+<Ufe5d> <U1f02> : "ᾂ" # U1f82
+<Ufe5d> <U1f03> : "ᾃ" # U1f83
+<Ufe5d> <U1f04> : "ᾄ" # U1f84
+<Ufe5d> <U1f05> : "ᾅ" # U1f85
+<Ufe5d> <U1f06> : "ᾆ" # U1f86
+<Ufe5d> <U1f07> : "ᾇ" # U1f87
+<Ufe5d> <U1f08> : "ᾈ" # U1f88
+<Ufe5d> <U1f09> : "ᾉ" # U1f89
+<Ufe5d> <U1f0a> : "ᾊ" # U1f8a
+<Ufe5d> <U1f0b> : "ᾋ" # U1f8b
+<Ufe5d> <U1f0c> : "ᾌ" # U1f8c
+<Ufe5d> <U1f0d> : "ᾍ" # U1f8d
+<Ufe5d> <U1f0e> : "ᾎ" # U1f8e
+<Ufe5d> <U1f0f> : "ᾏ" # U1f8f
+<Ufe5d> <U1f20> : "ᾐ" # U1f90
+<Ufe5d> <U1f21> : "ᾑ" # U1f91
+<Ufe5d> <U1f22> : "ᾒ" # U1f92
+<Ufe5d> <U1f23> : "ᾓ" # U1f93
+<Ufe5d> <U1f24> : "ᾔ" # U1f94
+<Ufe5d> <U1f25> : "ᾕ" # U1f95
+<Ufe5d> <U1f26> : "ᾖ" # U1f96
+<Ufe5d> <U1f27> : "ᾗ" # U1f97
+<Ufe5d> <U1f28> : "ᾘ" # U1f98
+<Ufe5d> <U1f29> : "ᾙ" # U1f99
+<Ufe5d> <U1f2a> : "ᾚ" # U1f9a
+<Ufe5d> <U1f2b> : "ᾛ" # U1f9b
+<Ufe5d> <U1f2c> : "ᾜ" # U1f9c
+<Ufe5d> <U1f2d> : "ᾝ" # U1f9d
+<Ufe5d> <U1f2e> : "ᾞ" # U1f9e
+<Ufe5d> <U1f2f> : "ᾟ" # U1f9f
+<Ufe5d> <U1f60> : "ᾠ" # U1fa0
+<Ufe5d> <U1f61> : "ᾡ" # U1fa1
+<Ufe5d> <U1f62> : "ᾢ" # U1fa2
+<Ufe5d> <U1f63> : "ᾣ" # U1fa3
+<Ufe5d> <U1f64> : "ᾤ" # U1fa4
+<Ufe5d> <U1f65> : "ᾥ" # U1fa5
+<Ufe5d> <U1f66> : "ᾦ" # U1fa6
+<Ufe5d> <U1f67> : "ᾧ" # U1fa7
+<Ufe5d> <U1f68> : "ᾨ" # U1fa8
+<Ufe5d> <U1f69> : "ᾩ" # U1fa9
+<Ufe5d> <U1f6a> : "ᾪ" # U1faa
+<Ufe5d> <U1f6b> : "ᾫ" # U1fab
+<Ufe5d> <U1f6c> : "ᾬ" # U1fac
+<Ufe5d> <U1f6d> : "ᾭ" # U1fad
+<Ufe5d> <U1f6e> : "ᾮ" # U1fae
+<Ufe5d> <U1f6f> : "ᾯ" # U1faf
+<Ufe5d> <U1f70> : "ᾲ" # U1fb2
+<Ufe5d> <U1f74> : "ῂ" # U1fc2
+<Ufe5d> <U1f7c> : "ῲ" # U1ff2
+<Ufe5d> <U1fb6> : "ᾷ" # U1fb7
+<Ufe5d> <U1fc6> : "ῇ" # U1fc7
+<Ufe5d> <U1ff6> : "ῷ" # U1ff7
+<Ufe5d> <Ufe5d> : "ͺ" # U37a
+<Ufe5d> <Ufe50> <U1f00> : "ᾂ" # U1f82
+<Ufe5d> <Ufe50> <U1f01> : "ᾃ" # U1f83
+<Ufe5d> <Ufe50> <U1f08> : "ᾊ" # U1f8a
+<Ufe5d> <Ufe50> <U1f09> : "ᾋ" # U1f8b
+<Ufe5d> <Ufe50> <U1f20> : "ᾒ" # U1f92
+<Ufe5d> <Ufe50> <U1f21> : "ᾓ" # U1f93
+<Ufe5d> <Ufe50> <U1f28> : "ᾚ" # U1f9a
+<Ufe5d> <Ufe50> <U1f29> : "ᾛ" # U1f9b
+<Ufe5d> <Ufe50> <U1f60> : "ᾢ" # U1fa2
+<Ufe5d> <Ufe50> <U1f61> : "ᾣ" # U1fa3
+<Ufe5d> <Ufe50> <U1f68> : "ᾪ" # U1faa
+<Ufe5d> <Ufe50> <U1f69> : "ᾫ" # U1fab
+<Ufe5d> <Ufe51> <U1f00> : "ᾄ" # U1f84
+<Ufe5d> <Ufe51> <U1f01> : "ᾅ" # U1f85
+<Ufe5d> <Ufe51> <U1f08> : "ᾌ" # U1f8c
+<Ufe5d> <Ufe51> <U1f09> : "ᾍ" # U1f8d
+<Ufe5d> <Ufe51> <U1f20> : "ᾔ" # U1f94
+<Ufe5d> <Ufe51> <U1f21> : "ᾕ" # U1f95
+<Ufe5d> <Ufe51> <U1f28> : "ᾜ" # U1f9c
+<Ufe5d> <Ufe51> <U1f29> : "ᾝ" # U1f9d
+<Ufe5d> <Ufe51> <U1f60> : "ᾤ" # U1fa4
+<Ufe5d> <Ufe51> <U1f61> : "ᾥ" # U1fa5
+<Ufe5d> <Ufe51> <U1f68> : "ᾬ" # U1fac
+<Ufe5d> <Ufe51> <U1f69> : "ᾭ" # U1fad
+<Ufe5d> <Ufe53> <U1f00> : "ᾆ" # U1f86
+<Ufe5d> <Ufe53> <U1f01> : "ᾇ" # U1f87
+<Ufe5d> <Ufe53> <U1f08> : "ᾎ" # U1f8e
+<Ufe5d> <Ufe53> <U1f09> : "ᾏ" # U1f8f
+<Ufe5d> <Ufe53> <U1f20> : "ᾖ" # U1f96
+<Ufe5d> <Ufe53> <U1f21> : "ᾗ" # U1f97
+<Ufe5d> <Ufe53> <U1f28> : "ᾞ" # U1f9e
+<Ufe5d> <Ufe53> <U1f29> : "ᾟ" # U1f9f
+<Ufe5d> <Ufe53> <U1f60> : "ᾦ" # U1fa6
+<Ufe5d> <Ufe53> <U1f61> : "ᾧ" # U1fa7
+<Ufe5d> <Ufe53> <U1f68> : "ᾮ" # U1fae
+<Ufe5d> <Ufe53> <U1f69> : "ᾯ" # U1faf
+<Ufe5d> <Ufe50> <Ufe64> <U7c1> : "ᾊ" # U1f8a
+<Ufe5d> <Ufe50> <Ufe64> <U7c7> : "ᾚ" # U1f9a
+<Ufe5d> <Ufe50> <Ufe64> <U7d9> : "ᾪ" # U1faa
+<Ufe5d> <Ufe50> <Ufe64> <U7e1> : "ᾂ" # U1f82
+<Ufe5d> <Ufe50> <Ufe64> <U7e7> : "ᾒ" # U1f92
+<Ufe5d> <Ufe50> <Ufe64> <U7f9> : "ᾢ" # U1fa2
+<Ufe5d> <Ufe50> <Ufe65> <U7c1> : "ᾋ" # U1f8b
+<Ufe5d> <Ufe50> <Ufe65> <U7c7> : "ᾛ" # U1f9b
+<Ufe5d> <Ufe50> <Ufe65> <U7d9> : "ᾫ" # U1fab
+<Ufe5d> <Ufe50> <Ufe65> <U7e1> : "ᾃ" # U1f83
+<Ufe5d> <Ufe50> <Ufe65> <U7e7> : "ᾓ" # U1f93
+<Ufe5d> <Ufe50> <Ufe65> <U7f9> : "ᾣ" # U1fa3
+<Ufe5d> <Ufe51> <Ufe64> <U7c1> : "ᾌ" # U1f8c
+<Ufe5d> <Ufe51> <Ufe64> <U7c7> : "ᾜ" # U1f9c
+<Ufe5d> <Ufe51> <Ufe64> <U7d9> : "ᾬ" # U1fac
+<Ufe5d> <Ufe51> <Ufe64> <U7e1> : "ᾄ" # U1f84
+<Ufe5d> <Ufe51> <Ufe64> <U7e7> : "ᾔ" # U1f94
+<Ufe5d> <Ufe51> <Ufe64> <U7f9> : "ᾤ" # U1fa4
+<Ufe5d> <Ufe51> <Ufe65> <U7c1> : "ᾍ" # U1f8d
+<Ufe5d> <Ufe51> <Ufe65> <U7c7> : "ᾝ" # U1f9d
+<Ufe5d> <Ufe51> <Ufe65> <U7d9> : "ᾭ" # U1fad
+<Ufe5d> <Ufe51> <Ufe65> <U7e1> : "ᾅ" # U1f85
+<Ufe5d> <Ufe51> <Ufe65> <U7e7> : "ᾕ" # U1f95
+<Ufe5d> <Ufe51> <Ufe65> <U7f9> : "ᾥ" # U1fa5
+<Ufe5d> <Ufe53> <Ufe64> <U7c1> : "ᾎ" # U1f8e
+<Ufe5d> <Ufe53> <Ufe64> <U7c7> : "ᾞ" # U1f9e
+<Ufe5d> <Ufe53> <Ufe64> <U7d9> : "ᾮ" # U1fae
+<Ufe5d> <Ufe53> <Ufe64> <U7e1> : "ᾆ" # U1f86
+<Ufe5d> <Ufe53> <Ufe64> <U7e7> : "ᾖ" # U1f96
+<Ufe5d> <Ufe53> <Ufe64> <U7f9> : "ᾦ" # U1fa6
+<Ufe5d> <Ufe53> <Ufe65> <U7c1> : "ᾏ" # U1f8f
+<Ufe5d> <Ufe53> <Ufe65> <U7c7> : "ᾟ" # U1f9f
+<Ufe5d> <Ufe53> <Ufe65> <U7d9> : "ᾯ" # U1faf
+<Ufe5d> <Ufe53> <Ufe65> <U7e1> : "ᾇ" # U1f87
+<Ufe5d> <Ufe53> <Ufe65> <U7e7> : "ᾗ" # U1f97
+<Ufe5d> <Ufe53> <Ufe65> <U7f9> : "ᾧ" # U1fa7
+<Ufe5d> <Uff20> <U27> <U7e1> : "ᾴ" # U1fb4
+<Ufe5d> <Uff20> <U27> <U7e7> : "ῄ" # U1fc4
+<Ufe5d> <Uff20> <U27> <U7f9> : "ῴ" # U1ff4
+<Ufe5d> <Uff20> <U27> <U1f00> : "ᾄ" # U1f84
+<Ufe5d> <Uff20> <U27> <U1f01> : "ᾅ" # U1f85
+<Ufe5d> <Uff20> <U27> <U1f08> : "ᾌ" # U1f8c
+<Ufe5d> <Uff20> <U27> <U1f09> : "ᾍ" # U1f8d
+<Ufe5d> <Uff20> <U27> <U1f20> : "ᾔ" # U1f94
+<Ufe5d> <Uff20> <U27> <U1f21> : "ᾕ" # U1f95
+<Ufe5d> <Uff20> <U27> <U1f28> : "ᾜ" # U1f9c
+<Ufe5d> <Uff20> <U27> <U1f29> : "ᾝ" # U1f9d
+<Ufe5d> <Uff20> <U27> <U1f60> : "ᾤ" # U1fa4
+<Ufe5d> <Uff20> <U27> <U1f61> : "ᾥ" # U1fa5
+<Ufe5d> <Uff20> <U27> <U1f68> : "ᾬ" # U1fac
+<Ufe5d> <Uff20> <U27> <U1f69> : "ᾭ" # U1fad
+<Ufe5d> <Uff20> <U28> <U7c1> : "ᾉ" # U1f89
+<Ufe5d> <Uff20> <U28> <U7c7> : "ᾙ" # U1f99
+<Ufe5d> <Uff20> <U28> <U7d9> : "ᾩ" # U1fa9
+<Ufe5d> <Uff20> <U28> <U7e1> : "ᾁ" # U1f81
+<Ufe5d> <Uff20> <U28> <U7e7> : "ᾑ" # U1f91
+<Ufe5d> <Uff20> <U28> <U7f9> : "ᾡ" # U1fa1
+<Ufe5d> <Uff20> <U29> <U7c1> : "ᾈ" # U1f88
+<Ufe5d> <Uff20> <U29> <U7c7> : "ᾘ" # U1f98
+<Ufe5d> <Uff20> <U29> <U7d9> : "ᾨ" # U1fa8
+<Ufe5d> <Uff20> <U29> <U7e1> : "ᾀ" # U1f80
+<Ufe5d> <Uff20> <U29> <U7e7> : "ᾐ" # U1f90
+<Ufe5d> <Uff20> <U29> <U7f9> : "ᾠ" # U1fa0
+<Ufe5d> <Uff20> <U60> <U7e1> : "ᾲ" # U1fb2
+<Ufe5d> <Uff20> <U60> <U7e7> : "ῂ" # U1fc2
+<Ufe5d> <Uff20> <U60> <U7f9> : "ῲ" # U1ff2
+<Ufe5d> <Uff20> <U60> <U1f00> : "ᾂ" # U1f82
+<Ufe5d> <Uff20> <U60> <U1f01> : "ᾃ" # U1f83
+<Ufe5d> <Uff20> <U60> <U1f08> : "ᾊ" # U1f8a
+<Ufe5d> <Uff20> <U60> <U1f09> : "ᾋ" # U1f8b
+<Ufe5d> <Uff20> <U60> <U1f20> : "ᾒ" # U1f92
+<Ufe5d> <Uff20> <U60> <U1f21> : "ᾓ" # U1f93
+<Ufe5d> <Uff20> <U60> <U1f28> : "ᾚ" # U1f9a
+<Ufe5d> <Uff20> <U60> <U1f29> : "ᾛ" # U1f9b
+<Ufe5d> <Uff20> <U60> <U1f60> : "ᾢ" # U1fa2
+<Ufe5d> <Uff20> <U60> <U1f61> : "ᾣ" # U1fa3
+<Ufe5d> <Uff20> <U60> <U1f68> : "ᾪ" # U1faa
+<Ufe5d> <Uff20> <U60> <U1f69> : "ᾫ" # U1fab
+<Ufe5d> <Uff20> <U7e> <U7e1> : "ᾷ" # U1fb7
+<Ufe5d> <Uff20> <U7e> <U7e7> : "ῇ" # U1fc7
+<Ufe5d> <Uff20> <U7e> <U7f9> : "ῷ" # U1ff7
+<Ufe5d> <Uff20> <U7e> <U1f00> : "ᾆ" # U1f86
+<Ufe5d> <Uff20> <U7e> <U1f01> : "ᾇ" # U1f87
+<Ufe5d> <Uff20> <U7e> <U1f08> : "ᾎ" # U1f8e
+<Ufe5d> <Uff20> <U7e> <U1f09> : "ᾏ" # U1f8f
+<Ufe5d> <Uff20> <U7e> <U1f20> : "ᾖ" # U1f96
+<Ufe5d> <Uff20> <U7e> <U1f21> : "ᾗ" # U1f97
+<Ufe5d> <Uff20> <U7e> <U1f28> : "ᾞ" # U1f9e
+<Ufe5d> <Uff20> <U7e> <U1f29> : "ᾟ" # U1f9f
+<Ufe5d> <Uff20> <U7e> <U1f60> : "ᾦ" # U1fa6
+<Ufe5d> <Uff20> <U7e> <U1f61> : "ᾧ" # U1fa7
+<Ufe5d> <Uff20> <U7e> <U1f68> : "ᾮ" # U1fae
+<Ufe5d> <Uff20> <U7e> <U1f69> : "ᾯ" # U1faf
+<Ufe5d> <Uff20> <Ub4> <U7e1> : "ᾴ" # U1fb4
+<Ufe5d> <Uff20> <Ub4> <U7e7> : "ῄ" # U1fc4
+<Ufe5d> <Uff20> <Ub4> <U7f9> : "ῴ" # U1ff4
+<Ufe5d> <Uff20> <Ub4> <U1f00> : "ᾄ" # U1f84
+<Ufe5d> <Uff20> <Ub4> <U1f01> : "ᾅ" # U1f85
+<Ufe5d> <Uff20> <Ub4> <U1f08> : "ᾌ" # U1f8c
+<Ufe5d> <Uff20> <Ub4> <U1f09> : "ᾍ" # U1f8d
+<Ufe5d> <Uff20> <Ub4> <U1f20> : "ᾔ" # U1f94
+<Ufe5d> <Uff20> <Ub4> <U1f21> : "ᾕ" # U1f95
+<Ufe5d> <Uff20> <Ub4> <U1f28> : "ᾜ" # U1f9c
+<Ufe5d> <Uff20> <Ub4> <U1f29> : "ᾝ" # U1f9d
+<Ufe5d> <Uff20> <Ub4> <U1f60> : "ᾤ" # U1fa4
+<Ufe5d> <Uff20> <Ub4> <U1f61> : "ᾥ" # U1fa5
+<Ufe5d> <Uff20> <Ub4> <U1f68> : "ᾬ" # U1fac
+<Ufe5d> <Uff20> <Ub4> <U1f69> : "ᾭ" # U1fad
+<Ufe5d> <Ufe50> <Uff20> <U28> <U7c1> : "ᾋ" # U1f8b
+<Ufe5d> <Ufe50> <Uff20> <U28> <U7c7> : "ᾛ" # U1f9b
+<Ufe5d> <Ufe50> <Uff20> <U28> <U7d9> : "ᾫ" # U1fab
+<Ufe5d> <Ufe50> <Uff20> <U28> <U7e1> : "ᾃ" # U1f83
+<Ufe5d> <Ufe50> <Uff20> <U28> <U7e7> : "ᾓ" # U1f93
+<Ufe5d> <Ufe50> <Uff20> <U28> <U7f9> : "ᾣ" # U1fa3
+<Ufe5d> <Ufe50> <Uff20> <U29> <U7c1> : "ᾊ" # U1f8a
+<Ufe5d> <Ufe50> <Uff20> <U29> <U7c7> : "ᾚ" # U1f9a
+<Ufe5d> <Ufe50> <Uff20> <U29> <U7d9> : "ᾪ" # U1faa
+<Ufe5d> <Ufe50> <Uff20> <U29> <U7e1> : "ᾂ" # U1f82
+<Ufe5d> <Ufe50> <Uff20> <U29> <U7e7> : "ᾒ" # U1f92
+<Ufe5d> <Ufe50> <Uff20> <U29> <U7f9> : "ᾢ" # U1fa2
+<Ufe5d> <Ufe51> <Uff20> <U28> <U7c1> : "ᾍ" # U1f8d
+<Ufe5d> <Ufe51> <Uff20> <U28> <U7c7> : "ᾝ" # U1f9d
+<Ufe5d> <Ufe51> <Uff20> <U28> <U7d9> : "ᾭ" # U1fad
+<Ufe5d> <Ufe51> <Uff20> <U28> <U7e1> : "ᾅ" # U1f85
+<Ufe5d> <Ufe51> <Uff20> <U28> <U7e7> : "ᾕ" # U1f95
+<Ufe5d> <Ufe51> <Uff20> <U28> <U7f9> : "ᾥ" # U1fa5
+<Ufe5d> <Ufe51> <Uff20> <U29> <U7c1> : "ᾌ" # U1f8c
+<Ufe5d> <Ufe51> <Uff20> <U29> <U7c7> : "ᾜ" # U1f9c
+<Ufe5d> <Ufe51> <Uff20> <U29> <U7d9> : "ᾬ" # U1fac
+<Ufe5d> <Ufe51> <Uff20> <U29> <U7e1> : "ᾄ" # U1f84
+<Ufe5d> <Ufe51> <Uff20> <U29> <U7e7> : "ᾔ" # U1f94
+<Ufe5d> <Ufe51> <Uff20> <U29> <U7f9> : "ᾤ" # U1fa4
+<Ufe5d> <Ufe53> <Uff20> <U28> <U7c1> : "ᾏ" # U1f8f
+<Ufe5d> <Ufe53> <Uff20> <U28> <U7c7> : "ᾟ" # U1f9f
+<Ufe5d> <Ufe53> <Uff20> <U28> <U7d9> : "ᾯ" # U1faf
+<Ufe5d> <Ufe53> <Uff20> <U28> <U7e1> : "ᾇ" # U1f87
+<Ufe5d> <Ufe53> <Uff20> <U28> <U7e7> : "ᾗ" # U1f97
+<Ufe5d> <Ufe53> <Uff20> <U28> <U7f9> : "ᾧ" # U1fa7
+<Ufe5d> <Ufe53> <Uff20> <U29> <U7c1> : "ᾎ" # U1f8e
+<Ufe5d> <Ufe53> <Uff20> <U29> <U7c7> : "ᾞ" # U1f9e
+<Ufe5d> <Ufe53> <Uff20> <U29> <U7d9> : "ᾮ" # U1fae
+<Ufe5d> <Ufe53> <Uff20> <U29> <U7e1> : "ᾆ" # U1f86
+<Ufe5d> <Ufe53> <Uff20> <U29> <U7e7> : "ᾖ" # U1f96
+<Ufe5d> <Ufe53> <Uff20> <U29> <U7f9> : "ᾦ" # U1fa6
+<Ufe5d> <Uff20> <U27> <U28> <U7c1> : "ᾍ" # U1f8d
+<Ufe5d> <Uff20> <U27> <U28> <U7c7> : "ᾝ" # U1f9d
+<Ufe5d> <Uff20> <U27> <U28> <U7d9> : "ᾭ" # U1fad
+<Ufe5d> <Uff20> <U27> <U28> <U7e1> : "ᾅ" # U1f85
+<Ufe5d> <Uff20> <U27> <U28> <U7e7> : "ᾕ" # U1f95
+<Ufe5d> <Uff20> <U27> <U28> <U7f9> : "ᾥ" # U1fa5
+<Ufe5d> <Uff20> <U27> <U29> <U7c1> : "ᾌ" # U1f8c
+<Ufe5d> <Uff20> <U27> <U29> <U7c7> : "ᾜ" # U1f9c
+<Ufe5d> <Uff20> <U27> <U29> <U7d9> : "ᾬ" # U1fac
+<Ufe5d> <Uff20> <U27> <U29> <U7e1> : "ᾄ" # U1f84
+<Ufe5d> <Uff20> <U27> <U29> <U7e7> : "ᾔ" # U1f94
+<Ufe5d> <Uff20> <U27> <U29> <U7f9> : "ᾤ" # U1fa4
+<Ufe5d> <Uff20> <U27> <Ufe64> <U7c1> : "ᾌ" # U1f8c
+<Ufe5d> <Uff20> <U27> <Ufe64> <U7c7> : "ᾜ" # U1f9c
+<Ufe5d> <Uff20> <U27> <Ufe64> <U7d9> : "ᾬ" # U1fac
+<Ufe5d> <Uff20> <U27> <Ufe64> <U7e1> : "ᾄ" # U1f84
+<Ufe5d> <Uff20> <U27> <Ufe64> <U7e7> : "ᾔ" # U1f94
+<Ufe5d> <Uff20> <U27> <Ufe64> <U7f9> : "ᾤ" # U1fa4
+<Ufe5d> <Uff20> <U27> <Ufe65> <U7c1> : "ᾍ" # U1f8d
+<Ufe5d> <Uff20> <U27> <Ufe65> <U7c7> : "ᾝ" # U1f9d
+<Ufe5d> <Uff20> <U27> <Ufe65> <U7d9> : "ᾭ" # U1fad
+<Ufe5d> <Uff20> <U27> <Ufe65> <U7e1> : "ᾅ" # U1f85
+<Ufe5d> <Uff20> <U27> <Ufe65> <U7e7> : "ᾕ" # U1f95
+<Ufe5d> <Uff20> <U27> <Ufe65> <U7f9> : "ᾥ" # U1fa5
+<Ufe5d> <Uff20> <U60> <U28> <U7c1> : "ᾋ" # U1f8b
+<Ufe5d> <Uff20> <U60> <U28> <U7c7> : "ᾛ" # U1f9b
+<Ufe5d> <Uff20> <U60> <U28> <U7d9> : "ᾫ" # U1fab
+<Ufe5d> <Uff20> <U60> <U28> <U7e1> : "ᾃ" # U1f83
+<Ufe5d> <Uff20> <U60> <U28> <U7e7> : "ᾓ" # U1f93
+<Ufe5d> <Uff20> <U60> <U28> <U7f9> : "ᾣ" # U1fa3
+<Ufe5d> <Uff20> <U60> <U29> <U7c1> : "ᾊ" # U1f8a
+<Ufe5d> <Uff20> <U60> <U29> <U7c7> : "ᾚ" # U1f9a
+<Ufe5d> <Uff20> <U60> <U29> <U7d9> : "ᾪ" # U1faa
+<Ufe5d> <Uff20> <U60> <U29> <U7e1> : "ᾂ" # U1f82
+<Ufe5d> <Uff20> <U60> <U29> <U7e7> : "ᾒ" # U1f92
+<Ufe5d> <Uff20> <U60> <U29> <U7f9> : "ᾢ" # U1fa2
+<Ufe5d> <Uff20> <U60> <Ufe64> <U7c1> : "ᾊ" # U1f8a
+<Ufe5d> <Uff20> <U60> <Ufe64> <U7c7> : "ᾚ" # U1f9a
+<Ufe5d> <Uff20> <U60> <Ufe64> <U7d9> : "ᾪ" # U1faa
+<Ufe5d> <Uff20> <U60> <Ufe64> <U7e1> : "ᾂ" # U1f82
+<Ufe5d> <Uff20> <U60> <Ufe64> <U7e7> : "ᾒ" # U1f92
+<Ufe5d> <Uff20> <U60> <Ufe64> <U7f9> : "ᾢ" # U1fa2
+<Ufe5d> <Uff20> <U60> <Ufe65> <U7c1> : "ᾋ" # U1f8b
+<Ufe5d> <Uff20> <U60> <Ufe65> <U7c7> : "ᾛ" # U1f9b
+<Ufe5d> <Uff20> <U60> <Ufe65> <U7d9> : "ᾫ" # U1fab
+<Ufe5d> <Uff20> <U60> <Ufe65> <U7e1> : "ᾃ" # U1f83
+<Ufe5d> <Uff20> <U60> <Ufe65> <U7e7> : "ᾓ" # U1f93
+<Ufe5d> <Uff20> <U60> <Ufe65> <U7f9> : "ᾣ" # U1fa3
+<Ufe5d> <Uff20> <U7e> <U28> <U7c1> : "ᾏ" # U1f8f
+<Ufe5d> <Uff20> <U7e> <U28> <U7c7> : "ᾟ" # U1f9f
+<Ufe5d> <Uff20> <U7e> <U28> <U7d9> : "ᾯ" # U1faf
+<Ufe5d> <Uff20> <U7e> <U28> <U7e1> : "ᾇ" # U1f87
+<Ufe5d> <Uff20> <U7e> <U28> <U7e7> : "ᾗ" # U1f97
+<Ufe5d> <Uff20> <U7e> <U28> <U7f9> : "ᾧ" # U1fa7
+<Ufe5d> <Uff20> <U7e> <U29> <U7c1> : "ᾎ" # U1f8e
+<Ufe5d> <Uff20> <U7e> <U29> <U7c7> : "ᾞ" # U1f9e
+<Ufe5d> <Uff20> <U7e> <U29> <U7d9> : "ᾮ" # U1fae
+<Ufe5d> <Uff20> <U7e> <U29> <U7e1> : "ᾆ" # U1f86
+<Ufe5d> <Uff20> <U7e> <U29> <U7e7> : "ᾖ" # U1f96
+<Ufe5d> <Uff20> <U7e> <U29> <U7f9> : "ᾦ" # U1fa6
+<Ufe5d> <Uff20> <U7e> <Ufe64> <U7c1> : "ᾎ" # U1f8e
+<Ufe5d> <Uff20> <U7e> <Ufe64> <U7c7> : "ᾞ" # U1f9e
+<Ufe5d> <Uff20> <U7e> <Ufe64> <U7d9> : "ᾮ" # U1fae
+<Ufe5d> <Uff20> <U7e> <Ufe64> <U7e1> : "ᾆ" # U1f86
+<Ufe5d> <Uff20> <U7e> <Ufe64> <U7e7> : "ᾖ" # U1f96
+<Ufe5d> <Uff20> <U7e> <Ufe64> <U7f9> : "ᾦ" # U1fa6
+<Ufe5d> <Uff20> <U7e> <Ufe65> <U7c1> : "ᾏ" # U1f8f
+<Ufe5d> <Uff20> <U7e> <Ufe65> <U7c7> : "ᾟ" # U1f9f
+<Ufe5d> <Uff20> <U7e> <Ufe65> <U7d9> : "ᾯ" # U1faf
+<Ufe5d> <Uff20> <U7e> <Ufe65> <U7e1> : "ᾇ" # U1f87
+<Ufe5d> <Uff20> <U7e> <Ufe65> <U7e7> : "ᾗ" # U1f97
+<Ufe5d> <Uff20> <U7e> <Ufe65> <U7f9> : "ᾧ" # U1fa7
+<Ufe5d> <Uff20> <Ub4> <U28> <U7c1> : "ᾍ" # U1f8d
+<Ufe5d> <Uff20> <Ub4> <U28> <U7c7> : "ᾝ" # U1f9d
+<Ufe5d> <Uff20> <Ub4> <U28> <U7d9> : "ᾭ" # U1fad
+<Ufe5d> <Uff20> <Ub4> <U28> <U7e1> : "ᾅ" # U1f85
+<Ufe5d> <Uff20> <Ub4> <U28> <U7e7> : "ᾕ" # U1f95
+<Ufe5d> <Uff20> <Ub4> <U28> <U7f9> : "ᾥ" # U1fa5
+<Ufe5d> <Uff20> <Ub4> <U29> <U7c1> : "ᾌ" # U1f8c
+<Ufe5d> <Uff20> <Ub4> <U29> <U7c7> : "ᾜ" # U1f9c
+<Ufe5d> <Uff20> <Ub4> <U29> <U7d9> : "ᾬ" # U1fac
+<Ufe5d> <Uff20> <Ub4> <U29> <U7e1> : "ᾄ" # U1f84
+<Ufe5d> <Uff20> <Ub4> <U29> <U7e7> : "ᾔ" # U1f94
+<Ufe5d> <Uff20> <Ub4> <U29> <U7f9> : "ᾤ" # U1fa4
+<Ufe5d> <Uff20> <Ub4> <Ufe64> <U7c1> : "ᾌ" # U1f8c
+<Ufe5d> <Uff20> <Ub4> <Ufe64> <U7c7> : "ᾜ" # U1f9c
+<Ufe5d> <Uff20> <Ub4> <Ufe64> <U7d9> : "ᾬ" # U1fac
+<Ufe5d> <Uff20> <Ub4> <Ufe64> <U7e1> : "ᾄ" # U1f84
+<Ufe5d> <Uff20> <Ub4> <Ufe64> <U7e7> : "ᾔ" # U1f94
+<Ufe5d> <Uff20> <Ub4> <Ufe64> <U7f9> : "ᾤ" # U1fa4
+<Ufe5d> <Uff20> <Ub4> <Ufe65> <U7c1> : "ᾍ" # U1f8d
+<Ufe5d> <Uff20> <Ub4> <Ufe65> <U7c7> : "ᾝ" # U1f9d
+<Ufe5d> <Uff20> <Ub4> <Ufe65> <U7d9> : "ᾭ" # U1fad
+<Ufe5d> <Uff20> <Ub4> <Ufe65> <U7e1> : "ᾅ" # U1f85
+<Ufe5d> <Uff20> <Ub4> <Ufe65> <U7e7> : "ᾕ" # U1f95
+<Ufe5d> <Uff20> <Ub4> <Ufe65> <U7f9> : "ᾥ" # U1fa5
+<Ufe5e> <U3046> : "ゔ" # U3094
+<Ufe5e> <U304b> : "が" # U304c
+<Ufe5e> <U304d> : "ぎ" # U304e
+<Ufe5e> <U304f> : "ぐ" # U3050
+<Ufe5e> <U3051> : "げ" # U3052
+<Ufe5e> <U3053> : "ご" # U3054
+<Ufe5e> <U3055> : "ざ" # U3056
+<Ufe5e> <U3057> : "じ" # U3058
+<Ufe5e> <U3059> : "ず" # U305a
+<Ufe5e> <U305b> : "ぜ" # U305c
+<Ufe5e> <U305d> : "ぞ" # U305e
+<Ufe5e> <U305f> : "だ" # U3060
+<Ufe5e> <U3061> : "ぢ" # U3062
+<Ufe5e> <U3064> : "づ" # U3065
+<Ufe5e> <U3066> : "で" # U3067
+<Ufe5e> <U3068> : "ど" # U3069
+<Ufe5e> <U306f> : "ば" # U3070
+<Ufe5e> <U3072> : "び" # U3073
+<Ufe5e> <U3075> : "ぶ" # U3076
+<Ufe5e> <U3078> : "べ" # U3079
+<Ufe5e> <U307b> : "ぼ" # U307c
+<Ufe5e> <U309d> : "ゞ" # U309e
+<Ufe5e> <U30f0> : "ヸ" # U30f8
+<Ufe5e> <U30f1> : "ヹ" # U30f9
+<Ufe5e> <U30fd> : "ヾ" # U30fe
+<Ufe5f> <U306f> : "ぱ" # U3071
+<Ufe5f> <U3072> : "ぴ" # U3074
+<Ufe5f> <U3075> : "ぷ" # U3077
+<Ufe5f> <U3078> : "ぺ" # U307a
+<Ufe5f> <U307b> : "ぽ" # U307d
+<Ufe60> <U20> : "̣" # U323
+<Ufe60> <U2b> : "⨥" # U2a25
+<Ufe60> <U2d> : "⨪" # U2a2a
+<Ufe60> <U3d> : "⩦" # U2a66
+<Ufe60> <Ua0> : "̣" # U323
+<Ufe60> <Ufe60> : "̣" # U323
+<Ufe60> <Uff20> <U2b> <U4f> : "Ợ" # U1ee2
+<Ufe60> <Uff20> <U2b> <U55> : "Ự" # U1ef0
+<Ufe60> <Uff20> <U2b> <U6f> : "ợ" # U1ee3
+<Ufe60> <Uff20> <U2b> <U75> : "ự" # U1ef1
+<Ufe61> <U20> : "̉" # U309
+<Ufe61> <U42> : "Ɓ" # U181
+<Ufe61> <U43> : "Ƈ" # U187
+<Ufe61> <U44> : "Ɗ" # U18a
+<Ufe61> <U46> : "Ƒ" # U191
+<Ufe61> <U47> : "Ɠ" # U193
+<Ufe61> <U4b> : "Ƙ" # U198
+<Ufe61> <U4d> : "Ɱ" # U2c6e
+<Ufe61> <U4e> : "Ɲ" # U19d
+<Ufe61> <U50> : "Ƥ" # U1a4
+<Ufe61> <U54> : "Ƭ" # U1ac
+<Ufe61> <U56> : "Ʋ" # U1b2
+<Ufe61> <U57> : "Ⱳ" # U2c72
+<Ufe61> <U5a> : "Ȥ" # U224
+<Ufe61> <U62> : "ɓ" # U253
+<Ufe61> <U63> : "ƈ" # U188
+<Ufe61> <U64> : "ɗ" # U257
+<Ufe61> <U66> : "ƒ" # U192
+<Ufe61> <U67> : "ɠ" # U260
+<Ufe61> <U68> : "ɦ" # U266
+<Ufe61> <U6b> : "ƙ" # U199
+<Ufe61> <U6d> : "ɱ" # U271
+<Ufe61> <U6e> : "ɲ" # U272
+<Ufe61> <U70> : "ƥ" # U1a5
+<Ufe61> <U71> : "ʠ" # U2a0
+<Ufe61> <U72> : "ɼ" # U27c
+<Ufe61> <U73> : "ʂ" # U282
+<Ufe61> <U74> : "ƭ" # U1ad
+<Ufe61> <U76> : "ʋ" # U28b
+<Ufe61> <U77> : "ⱳ" # U2c73
+<Ufe61> <U7a> : "ȥ" # U225
+<Ufe61> <Ua0> : "̉" # U309
+<Ufe61> <U256> : "ᶑ" # U1d91
+<Ufe61> <U25c> : "ɝ" # U25d
+<Ufe61> <U25f> : "ʄ" # U284
+<Ufe61> <U279> : "ɻ" # U27b
+<Ufe61> <Ufe61> : "̉" # U309
+<Ufe61> <Ufe8c> <U55> : "ϒ" # U3d2
+<Ufe61> <Uff20> <U2b> <U4f> : "Ở" # U1ede
+<Ufe61> <Uff20> <U2b> <U55> : "Ử" # U1eec
+<Ufe61> <Uff20> <U2b> <U6f> : "ở" # U1edf
+<Ufe61> <Uff20> <U2b> <U75> : "ử" # U1eed
+<Ufe61> <Uff20> <U55> <U41> : "Ẳ" # U1eb2
+<Ufe61> <Uff20> <U55> <U61> : "ẳ" # U1eb3
+<Ufe61> <Uff20> <U5e> <U41> : "Ẩ" # U1ea8
+<Ufe61> <Uff20> <U5e> <U45> : "Ể" # U1ec2
+<Ufe61> <Uff20> <U5e> <U4f> : "Ổ" # U1ed4
+<Ufe61> <Uff20> <U5e> <U61> : "ẩ" # U1ea9
+<Ufe61> <Uff20> <U5e> <U65> : "ể" # U1ec3
+<Ufe61> <Uff20> <U5e> <U6f> : "ổ" # U1ed5
+<Ufe61> <Uff20> <U62> <U41> : "Ẳ" # U1eb2
+<Ufe61> <Uff20> <U62> <U61> : "ẳ" # U1eb3
+<Ufe62> <U20> : "̛" # U31b
+<Ufe62> <Ua0> : "̛" # U31b
+<Ufe62> <Ufe62> : "̛" # U31b
+<Ufe63> <U20> : "/" # U2f
+<Ufe63> <U32> : "ƻ" # U1bb
+<Ufe63> <U3c> : "≮" # U226e
+<Ufe63> <U3d> : "≠" # U2260
+<Ufe63> <U3e> : "≯" # U226f
+<Ufe63> <U41> : "Ⱥ" # U23a
+<Ufe63> <U42> : "Ƀ" # U243
+<Ufe63> <U43> : "Ȼ" # U23b
+<Ufe63> <U44> : "Đ" # U110
+<Ufe63> <U45> : "Ɇ" # U246
+<Ufe63> <U47> : "Ǥ" # U1e4
+<Ufe63> <U48> : "Ħ" # U126
+<Ufe63> <U49> : "Ɨ" # U197
+<Ufe63> <U4a> : "Ɉ" # U248
+<Ufe63> <U4c> : "Ł" # U141
+<Ufe63> <U4f> : "Ø" # Ud8
+<Ufe63> <U50> : "Ᵽ" # U2c63
+<Ufe63> <U52> : "Ɍ" # U24c
+<Ufe63> <U54> : "Ŧ" # U166
+<Ufe63> <U55> : "Ʉ" # U244
+<Ufe63> <U59> : "Ɏ" # U24e
+<Ufe63> <U5a> : "Ƶ" # U1b5
+<Ufe63> <U61> : "ⱥ" # U2c65
+<Ufe63> <U62> : "ƀ" # U180
+<Ufe63> <U63> : "ȼ" # U23c
+<Ufe63> <U64> : "đ" # U111
+<Ufe63> <U65> : "ɇ" # U247
+<Ufe63> <U67> : "ǥ" # U1e5
+<Ufe63> <U68> : "ħ" # U127
+<Ufe63> <U69> : "ɨ" # U268
+<Ufe63> <U6a> : "ɉ" # U249
+<Ufe63> <U6c> : "ł" # U142
+<Ufe63> <U6f> : "ø" # Uf8
+<Ufe63> <U70> : "ᵽ" # U1d7d
+<Ufe63> <U72> : "ɍ" # U24d
+<Ufe63> <U74> : "ŧ" # U167
+<Ufe63> <U75> : "ʉ" # U289
+<Ufe63> <U79> : "ɏ" # U24f
+<Ufe63> <U7a> : "ƶ" # U1b6
+<Ufe63> <Ua0> : "̸" # U338
+<Ufe63> <Ud3> : "Ǿ" # U1fe
+<Ufe63> <Uf3> : "ǿ" # U1ff
+<Ufe63> <U237> : "ɟ" # U25f
+<Ufe63> <U269> : "ᵼ" # U1d7c
+<Ufe63> <U8bc> : "≰" # U2270
+<Ufe63> <U8be> : "≱" # U2271
+<Ufe63> <Ufe63> : "/" # U2f
+<Ufe63> <Ufe51> <U4f> : "Ǿ" # U1fe
+<Ufe63> <Ufe51> <U6f> : "ǿ" # U1ff
+<Ufe63> <Ufe56> <U6a> : "ɟ" # U25f
+<Ufe63> <Ufe8c> <U72> : "ϼ" # U3fc
+<Ufe66> <U474> : "Ѷ" # U476
+<Ufe66> <U475> : "ѷ" # U477
+<Ufe66> <U6c1> : "а̏"
+<Ufe66> <U6c5> : "е̏"
+<Ufe66> <U6c9> : "и̏"
+<Ufe66> <U6cf> : "о̏"
+<Ufe66> <U6d2> : "р̏"
+<Ufe66> <U6d5> : "у̏"
+<Ufe66> <U6e1> : "А̏"
+<Ufe66> <U6e5> : "Е̏"
+<Ufe66> <U6e9> : "И̏"
+<Ufe66> <U6ef> : "О̏"
+<Ufe66> <U6f2> : "Р̏"
+<Ufe66> <U6f5> : "У̏"
+<Ufe67> <U7c> : "⫰" # U2af0
+<Ufe6a> <U2b> : "⨦" # U2a26
+<Ufe6c> <Ufe57> <U3d> : "⩷" # U2a77
+<Ufe6d> <U41> : "Ȃ" # U202
+<Ufe6d> <U45> : "Ȇ" # U206
+<Ufe6d> <U49> : "Ȋ" # U20a
+<Ufe6d> <U4f> : "Ȏ" # U20e
+<Ufe6d> <U52> : "Ȓ" # U212
+<Ufe6d> <U55> : "Ȗ" # U216
+<Ufe6d> <U61> : "ȃ" # U203
+<Ufe6d> <U65> : "ȇ" # U207
+<Ufe6d> <U69> : "ȋ" # U20b
+<Ufe6d> <U6f> : "ȏ" # U20f
+<Ufe6d> <U72> : "ȓ" # U213
+<Ufe6d> <U75> : "ȗ" # U217
+<Ufe6d> <U6c1> : "а̑"
+<Ufe6d> <U6c5> : "е̑"
+<Ufe6d> <U6c9> : "и̑"
+<Ufe6d> <U6cf> : "о̑"
+<Ufe6d> <U6d2> : "р̑"
+<Ufe6d> <U6d5> : "у̑"
+<Ufe6d> <U6e1> : "А̑"
+<Ufe6d> <U6e5> : "Е̑"
+<Ufe6d> <U6e9> : "И̑"
+<Ufe6d> <U6ef> : "О̑"
+<Ufe6d> <U6f2> : "Р̑"
+<Ufe6d> <U6f5> : "У̑"
+<Ufe6e> <U20> : "," # U2c
+<Ufe6e> <Ua0> : "̦" # U326
+<Ufe6e> <Ufe6e> : "," # U2c
+<Ufe6f> <U20> : "¤" # Ua4
+<Ufe6f> <U41> : "₳" # U20b3
+<Ufe6f> <U42> : "₱" # U20b1
+<Ufe6f> <U43> : "₡" # U20a1
+<Ufe6f> <U44> : "₯" # U20af
+<Ufe6f> <U45> : "₠" # U20a0
+<Ufe6f> <U46> : "₣" # U20a3
+<Ufe6f> <U47> : "₲" # U20b2
+<Ufe6f> <U48> : "₴" # U20b4
+<Ufe6f> <U49> : "៛" # U17db
+<Ufe6f> <U4b> : "₭" # U20ad
+<Ufe6f> <U4c> : "₤" # U20a4
+<Ufe6f> <U4d> : "ℳ" # U2133
+<Ufe6f> <U4e> : "₦" # U20a6
+<Ufe6f> <U4f> : "૱" # Uaf1
+<Ufe6f> <U50> : "₧" # U20a7
+<Ufe6f> <U52> : "₨" # U20a8
+<Ufe6f> <U53> : "$" # U24
+<Ufe6f> <U54> : "₮" # U20ae
+<Ufe6f> <U55> : "圓" # U5713
+<Ufe6f> <U57> : "₩" # U20a9
+<Ufe6f> <U59> : "円" # U5186
+<Ufe6f> <U61> : "؋" # U60b
+<Ufe6f> <U62> : "฿" # Ue3f
+<Ufe6f> <U63> : "¢" # Ua2
+<Ufe6f> <U64> : "₫" # U20ab
+<Ufe6f> <U65> : "€" # U20ac
+<Ufe6f> <U66> : "ƒ" # U192
+<Ufe6f> <U67> : "₲" # U20b2
+<Ufe6f> <U68> : "₴" # U20b4
+<Ufe6f> <U69> : "﷼" # Ufdfc
+<Ufe6f> <U6b> : "₭" # U20ad
+<Ufe6f> <U6c> : "£" # Ua3
+<Ufe6f> <U6d> : "₥" # U20a5
+<Ufe6f> <U6e> : "₦" # U20a6
+<Ufe6f> <U6f> : "௹" # Ubf9
+<Ufe6f> <U70> : "₰" # U20b0
+<Ufe6f> <U72> : "₢" # U20a2
+<Ufe6f> <U73> : "₪" # U20aa
+<Ufe6f> <U74> : "৳" # U9f3
+<Ufe6f> <U75> : "元" # U5143
+<Ufe6f> <U77> : "₩" # U20a9
+<Ufe6f> <U79> : "¥" # Ua5
+<Ufe6f> <Ua0> : "¤" # Ua4
+<Ufe6f> <Uc7> : "₵" # U20b5
+<Ufe6f> <Ude> : "৲" # U9f2
+<Ufe6f> <Ue7> : "₵" # U20b5
+<Ufe6f> <Ufe> : "৲" # U9f2
+<Ufe6f> <Ufe6f> : "¤" # Ua4
+<Ufe6f> <Ufe5b> <U43> : "₵" # U20b5
+<Ufe6f> <Ufe5b> <U63> : "₵" # U20b5
+<Ufe8c> <U20> : "µ" # Ub5
+<Ufe8c> <U41> : "Α" # U391
+<Ufe8c> <U42> : "Β" # U392
+<Ufe8c> <U44> : "Δ" # U394
+<Ufe8c> <U45> : "Ε" # U395
+<Ufe8c> <U46> : "Φ" # U3a6
+<Ufe8c> <U47> : "Γ" # U393
+<Ufe8c> <U48> : "Η" # U397
+<Ufe8c> <U49> : "Ι" # U399
+<Ufe8c> <U4a> : "Θ" # U398
+<Ufe8c> <U4b> : "Κ" # U39a
+<Ufe8c> <U4c> : "Λ" # U39b
+<Ufe8c> <U4d> : "Μ" # U39c
+<Ufe8c> <U4e> : "Ν" # U39d
+<Ufe8c> <U4f> : "Ο" # U39f
+<Ufe8c> <U50> : "Π" # U3a0
+<Ufe8c> <U51> : "Χ" # U3a7
+<Ufe8c> <U52> : "Ρ" # U3a1
+<Ufe8c> <U53> : "Σ" # U3a3
+<Ufe8c> <U54> : "Τ" # U3a4
+<Ufe8c> <U55> : "Υ" # U3a5
+<Ufe8c> <U57> : "Ω" # U3a9
+<Ufe8c> <U58> : "Ξ" # U39e
+<Ufe8c> <U59> : "Ψ" # U3a8
+<Ufe8c> <U5a> : "Ζ" # U396
+<Ufe8c> <U61> : "α" # U3b1
+<Ufe8c> <U62> : "β" # U3b2
+<Ufe8c> <U64> : "δ" # U3b4
+<Ufe8c> <U65> : "ε" # U3b5
+<Ufe8c> <U66> : "φ" # U3c6
+<Ufe8c> <U67> : "γ" # U3b3
+<Ufe8c> <U68> : "η" # U3b7
+<Ufe8c> <U69> : "ι" # U3b9
+<Ufe8c> <U6a> : "θ" # U3b8
+<Ufe8c> <U6b> : "κ" # U3ba
+<Ufe8c> <U6c> : "λ" # U3bb
+<Ufe8c> <U6d> : "μ" # U3bc
+<Ufe8c> <U6e> : "ν" # U3bd
+<Ufe8c> <U6f> : "ο" # U3bf
+<Ufe8c> <U70> : "π" # U3c0
+<Ufe8c> <U71> : "χ" # U3c7
+<Ufe8c> <U72> : "ρ" # U3c1
+<Ufe8c> <U73> : "σ" # U3c3
+<Ufe8c> <U74> : "τ" # U3c4
+<Ufe8c> <U75> : "υ" # U3c5
+<Ufe8c> <U77> : "ω" # U3c9
+<Ufe8c> <U78> : "ξ" # U3be
+<Ufe8c> <U79> : "ψ" # U3c8
+<Ufe8c> <U7a> : "ζ" # U3b6
+<Ufe8c> <Ua0> : "µ" # Ub5
+<Ufe8c> <Ufe8c> : "µ" # Ub5
+<Ufe8c> <Ufe54> <U41> : "Ᾱ" # U1fb9
+<Ufe8c> <Ufe54> <U49> : "Ῑ" # U1fd9
+<Ufe8c> <Ufe54> <U55> : "Ῡ" # U1fe9
+<Ufe8c> <Ufe54> <U61> : "ᾱ" # U1fb1
+<Ufe8c> <Ufe54> <U69> : "ῑ" # U1fd1
+<Ufe8c> <Ufe54> <U75> : "ῡ" # U1fe1
+<Ufe8c> <Ufe61> <U55> : "ϒ" # U3d2
+<Ufe8c> <Ufe63> <U72> : "ϼ" # U3fc
+<Uff20> <U20> <U20> : " " # Ua0
+<Uff20> <U20> <U27> : "'" # U27
+<Uff20> <U20> <U28> : "˘" # U2d8
+<Uff20> <U20> <U2c> : "¸" # Ub8
+<Uff20> <U20> <U2d> : "~" # U7e
+<Uff20> <U20> <U2e> : " " # U2008
+<Uff20> <U20> <U3c> : "ˇ" # U2c7
+<Uff20> <U20> <U3e> : "^" # U5e
+<Uff20> <U20> <U5e> : "^" # U5e
+<Uff20> <U20> <U60> : "`" # U60
+<Uff20> <U20> <U7e> : "~" # U7e
+<Uff20> <U21> <U21> : "¡" # Ua1
+<Uff20> <U21> <U3f> : "‽" # U203d
+<Uff20> <U21> <U41> : "Ạ" # U1ea0
+<Uff20> <U21> <U42> : "Ḅ" # U1e04
+<Uff20> <U21> <U44> : "Ḍ" # U1e0c
+<Uff20> <U21> <U45> : "Ẹ" # U1eb8
+<Uff20> <U21> <U48> : "Ḥ" # U1e24
+<Uff20> <U21> <U49> : "Ị" # U1eca
+<Uff20> <U21> <U4b> : "Ḳ" # U1e32
+<Uff20> <U21> <U4c> : "Ḷ" # U1e36
+<Uff20> <U21> <U4d> : "Ṃ" # U1e42
+<Uff20> <U21> <U4e> : "Ṇ" # U1e46
+<Uff20> <U21> <U4f> : "Ọ" # U1ecc
+<Uff20> <U21> <U52> : "Ṛ" # U1e5a
+<Uff20> <U21> <U53> : "Ṣ" # U1e62
+<Uff20> <U21> <U54> : "Ṭ" # U1e6c
+<Uff20> <U21> <U55> : "Ụ" # U1ee4
+<Uff20> <U21> <U56> : "Ṿ" # U1e7e
+<Uff20> <U21> <U57> : "Ẉ" # U1e88
+<Uff20> <U21> <U59> : "Ỵ" # U1ef4
+<Uff20> <U21> <U5a> : "Ẓ" # U1e92
+<Uff20> <U21> <U5e> : "¦" # Ua6
+<Uff20> <U21> <U61> : "ạ" # U1ea1
+<Uff20> <U21> <U62> : "ḅ" # U1e05
+<Uff20> <U21> <U64> : "ḍ" # U1e0d
+<Uff20> <U21> <U65> : "ẹ" # U1eb9
+<Uff20> <U21> <U68> : "ḥ" # U1e25
+<Uff20> <U21> <U69> : "ị" # U1ecb
+<Uff20> <U21> <U6b> : "ḳ" # U1e33
+<Uff20> <U21> <U6c> : "ḷ" # U1e37
+<Uff20> <U21> <U6d> : "ṃ" # U1e43
+<Uff20> <U21> <U6e> : "ṇ" # U1e47
+<Uff20> <U21> <U6f> : "ọ" # U1ecd
+<Uff20> <U21> <U72> : "ṛ" # U1e5b
+<Uff20> <U21> <U73> : "ṣ" # U1e63
+<Uff20> <U21> <U74> : "ṭ" # U1e6d
+<Uff20> <U21> <U75> : "ụ" # U1ee5
+<Uff20> <U21> <U76> : "ṿ" # U1e7f
+<Uff20> <U21> <U77> : "ẉ" # U1e89
+<Uff20> <U21> <U79> : "ỵ" # U1ef5
+<Uff20> <U21> <U7a> : "ẓ" # U1e93
+<Uff20> <U22> <U22> : "¨" # Ua8
+<Uff20> <U22> <U27> : "̈́" # U344
+<Uff20> <U22> <U2c> : "„" # U201e
+<Uff20> <U22> <U3c> : "“" # U201c
+<Uff20> <U22> <U3e> : "”" # U201d
+<Uff20> <U22> <U41> : "Ä" # Uc4
+<Uff20> <U22> <U45> : "Ë" # Ucb
+<Uff20> <U22> <U48> : "Ḧ" # U1e26
+<Uff20> <U22> <U49> : "Ï" # Ucf
+<Uff20> <U22> <U4f> : "Ö" # Ud6
+<Uff20> <U22> <U55> : "Ü" # Udc
+<Uff20> <U22> <U57> : "Ẅ" # U1e84
+<Uff20> <U22> <U58> : "Ẍ" # U1e8c
+<Uff20> <U22> <U59> : "Ÿ" # U178
+<Uff20> <U22> <U61> : "ä" # Ue4
+<Uff20> <U22> <U65> : "ë" # Ueb
+<Uff20> <U22> <U68> : "ḧ" # U1e27
+<Uff20> <U22> <U69> : "ï" # Uef
+<Uff20> <U22> <U6f> : "ö" # Uf6
+<Uff20> <U22> <U74> : "ẗ" # U1e97
+<Uff20> <U22> <U75> : "ü" # Ufc
+<Uff20> <U22> <U77> : "ẅ" # U1e85
+<Uff20> <U22> <U78> : "ẍ" # U1e8d
+<Uff20> <U22> <U79> : "ÿ" # Uff
+<Uff20> <U22> <Ub4> : "̈́" # U344
+<Uff20> <U22> <Ud5> : "Ṏ" # U1e4e
+<Uff20> <U22> <Uf5> : "ṏ" # U1e4f
+<Uff20> <U22> <U3d2> : "ϔ" # U3d4
+<Uff20> <U22> <U3de> : "Ṻ" # U1e7a
+<Uff20> <U22> <U3fe> : "ṻ" # U1e7b
+<Uff20> <U22> <U4d8> : "Ӛ" # U4da
+<Uff20> <U22> <U4d9> : "ӛ" # U4db
+<Uff20> <U22> <U4e8> : "Ӫ" # U4ea
+<Uff20> <U22> <U4e9> : "ӫ" # U4eb
+<Uff20> <U22> <U6a6> : "ї" # U457
+<Uff20> <U22> <U6b6> : "Ї" # U407
+<Uff20> <U22> <U6c1> : "ӓ" # U4d3
+<Uff20> <U22> <U6c5> : "ё" # U451
+<Uff20> <U22> <U6c9> : "ӥ" # U4e5
+<Uff20> <U22> <U6cf> : "ӧ" # U4e7
+<Uff20> <U22> <U6d5> : "ӱ" # U4f1
+<Uff20> <U22> <U6d6> : "ӝ" # U4dd
+<Uff20> <U22> <U6d9> : "ӹ" # U4f9
+<Uff20> <U22> <U6da> : "ӟ" # U4df
+<Uff20> <U22> <U6dc> : "ӭ" # U4ed
+<Uff20> <U22> <U6de> : "ӵ" # U4f5
+<Uff20> <U22> <U6e1> : "Ӓ" # U4d2
+<Uff20> <U22> <U6e5> : "Ё" # U401
+<Uff20> <U22> <U6e9> : "Ӥ" # U4e4
+<Uff20> <U22> <U6ef> : "Ӧ" # U4e6
+<Uff20> <U22> <U6f5> : "Ӱ" # U4f0
+<Uff20> <U22> <U6f6> : "Ӝ" # U4dc
+<Uff20> <U22> <U6f9> : "Ӹ" # U4f8
+<Uff20> <U22> <U6fa> : "Ӟ" # U4de
+<Uff20> <U22> <U6fc> : "Ӭ" # U4ec
+<Uff20> <U22> <U6fe> : "Ӵ" # U4f4
+<Uff20> <U22> <U7c9> : "Ϊ" # U3aa
+<Uff20> <U22> <U7d5> : "Ϋ" # U3ab
+<Uff20> <U22> <U7e9> : "ϊ" # U3ca
+<Uff20> <U22> <U7f5> : "ϋ" # U3cb
+<Uff20> <U22> <Ufe51> : "̈́" # U344
+<Uff20> <U23> <U23> : "♯" # U266f
+<Uff20> <U23> <U45> : "♫" # U266b
+<Uff20> <U23> <U53> : "♬" # U266c
+<Uff20> <U23> <U62> : "♭" # U266d
+<Uff20> <U23> <U65> : "♪" # U266a
+<Uff20> <U23> <U66> : "♮" # U266e
+<Uff20> <U23> <U71> : "♩" # U2669
+<Uff20> <U25> <U6f> : "‰" # U2030
+<Uff20> <U27> <U20> : "'" # U27
+<Uff20> <U27> <U27> : "´" # Ub4
+<Uff20> <U27> <U2c> : "‚" # U201a
+<Uff20> <U27> <U3c> : "‘" # U2018
+<Uff20> <U27> <U3e> : "’" # U2019
+<Uff20> <U27> <U41> : "Á" # Uc1
+<Uff20> <U27> <U43> : "Ć" # U106
+<Uff20> <U27> <U45> : "É" # Uc9
+<Uff20> <U27> <U47> : "Ǵ" # U1f4
+<Uff20> <U27> <U49> : "Í" # Ucd
+<Uff20> <U27> <U4a> : "J́"
+<Uff20> <U27> <U4b> : "Ḱ" # U1e30
+<Uff20> <U27> <U4c> : "Ĺ" # U139
+<Uff20> <U27> <U4d> : "Ḿ" # U1e3e
+<Uff20> <U27> <U4e> : "Ń" # U143
+<Uff20> <U27> <U4f> : "Ó" # Ud3
+<Uff20> <U27> <U50> : "Ṕ" # U1e54
+<Uff20> <U27> <U52> : "Ŕ" # U154
+<Uff20> <U27> <U53> : "Ś" # U15a
+<Uff20> <U27> <U55> : "Ú" # Uda
+<Uff20> <U27> <U57> : "Ẃ" # U1e82
+<Uff20> <U27> <U59> : "Ý" # Udd
+<Uff20> <U27> <U5a> : "Ź" # U179
+<Uff20> <U27> <U61> : "á" # Ue1
+<Uff20> <U27> <U63> : "ć" # U107
+<Uff20> <U27> <U65> : "é" # Ue9
+<Uff20> <U27> <U67> : "ǵ" # U1f5
+<Uff20> <U27> <U69> : "í" # Ued
+<Uff20> <U27> <U6a> : "j́"
+<Uff20> <U27> <U6b> : "ḱ" # U1e31
+<Uff20> <U27> <U6c> : "ĺ" # U13a
+<Uff20> <U27> <U6d> : "ḿ" # U1e3f
+<Uff20> <U27> <U6e> : "ń" # U144
+<Uff20> <U27> <U6f> : "ó" # Uf3
+<Uff20> <U27> <U70> : "ṕ" # U1e55
+<Uff20> <U27> <U72> : "ŕ" # U155
+<Uff20> <U27> <U73> : "ś" # U15b
+<Uff20> <U27> <U75> : "ú" # Ufa
+<Uff20> <U27> <U77> : "ẃ" # U1e83
+<Uff20> <U27> <U79> : "ý" # Ufd
+<Uff20> <U27> <U7a> : "ź" # U17a
+<Uff20> <U27> <Uc2> : "Ấ" # U1ea4
+<Uff20> <U27> <Uc5> : "Ǻ" # U1fa
+<Uff20> <U27> <Uc6> : "Ǽ" # U1fc
+<Uff20> <U27> <Uc7> : "Ḉ" # U1e08
+<Uff20> <U27> <Uca> : "Ế" # U1ebe
+<Uff20> <U27> <Ucf> : "Ḯ" # U1e2e
+<Uff20> <U27> <Ud4> : "Ố" # U1ed0
+<Uff20> <U27> <Ud5> : "Ṍ" # U1e4c
+<Uff20> <U27> <Ud8> : "Ǿ" # U1fe
+<Uff20> <U27> <Udc> : "Ǘ" # U1d7
+<Uff20> <U27> <Ue2> : "ấ" # U1ea5
+<Uff20> <U27> <Ue5> : "ǻ" # U1fb
+<Uff20> <U27> <Ue6> : "ǽ" # U1fd
+<Uff20> <U27> <Ue7> : "ḉ" # U1e09
+<Uff20> <U27> <Uea> : "ế" # U1ebf
+<Uff20> <U27> <Uef> : "ḯ" # U1e2f
+<Uff20> <U27> <Uf4> : "ố" # U1ed1
+<Uff20> <U27> <Uf5> : "ṍ" # U1e4d
+<Uff20> <U27> <Uf8> : "ǿ" # U1ff
+<Uff20> <U27> <Ufc> : "ǘ" # U1d8
+<Uff20> <U27> <U1c3> : "Ắ" # U1eae
+<Uff20> <U27> <U1e3> : "ắ" # U1eaf
+<Uff20> <U27> <U3aa> : "Ḗ" # U1e16
+<Uff20> <U27> <U3ba> : "ḗ" # U1e17
+<Uff20> <U27> <U3d2> : "Ṓ" # U1e52
+<Uff20> <U27> <U3dd> : "Ṹ" # U1e78
+<Uff20> <U27> <U3f2> : "ṓ" # U1e53
+<Uff20> <U27> <U3fd> : "ṹ" # U1e79
+<Uff20> <U27> <U6c0> : "ю́"
+<Uff20> <U27> <U6c1> : "а́"
+<Uff20> <U27> <U6c5> : "е́"
+<Uff20> <U27> <U6c7> : "ѓ" # U453
+<Uff20> <U27> <U6c9> : "и́"
+<Uff20> <U27> <U6cb> : "ќ" # U45c
+<Uff20> <U27> <U6cf> : "о́"
+<Uff20> <U27> <U6d1> : "я́"
+<Uff20> <U27> <U6d2> : "р́"
+<Uff20> <U27> <U6d5> : "у́"
+<Uff20> <U27> <U6d9> : "ы́"
+<Uff20> <U27> <U6dc> : "э́"
+<Uff20> <U27> <U6e0> : "Ю́́"
+<Uff20> <U27> <U6e1> : "А́"
+<Uff20> <U27> <U6e5> : "Е́"
+<Uff20> <U27> <U6e7> : "Ѓ" # U403
+<Uff20> <U27> <U6e9> : "И́"
+<Uff20> <U27> <U6eb> : "Ќ" # U40c
+<Uff20> <U27> <U6ef> : "О́"
+<Uff20> <U27> <U6f1> : "Я́"
+<Uff20> <U27> <U6f2> : "Р́"
+<Uff20> <U27> <U6f5> : "У́"
+<Uff20> <U27> <U6f9> : "Ы́"
+<Uff20> <U27> <U6fc> : "Э́"
+<Uff20> <U27> <U7b5> : "ΐ" # U390
+<Uff20> <U27> <U7b9> : "ΰ" # U3b0
+<Uff20> <U27> <U7c1> : "Ά" # U386
+<Uff20> <U27> <U7c5> : "Έ" # U388
+<Uff20> <U27> <U7c7> : "Ή" # U389
+<Uff20> <U27> <U7c9> : "Ί" # U38a
+<Uff20> <U27> <U7cf> : "Ό" # U38c
+<Uff20> <U27> <U7d5> : "Ύ" # U38e
+<Uff20> <U27> <U7d9> : "Ώ" # U38f
+<Uff20> <U27> <U7e1> : "ά" # U3ac
+<Uff20> <U27> <U7e5> : "έ" # U3ad
+<Uff20> <U27> <U7e7> : "ή" # U3ae
+<Uff20> <U27> <U7e9> : "ί" # U3af
+<Uff20> <U27> <U7ef> : "ό" # U3cc
+<Uff20> <U27> <U7f5> : "ύ" # U3cd
+<Uff20> <U27> <U7f9> : "ώ" # U3ce
+<Uff20> <U27> <U1f00> : "ἄ" # U1f04
+<Uff20> <U27> <U1f01> : "ἅ" # U1f05
+<Uff20> <U27> <U1f08> : "Ἄ" # U1f0c
+<Uff20> <U27> <U1f09> : "Ἅ" # U1f0d
+<Uff20> <U27> <U1f10> : "ἔ" # U1f14
+<Uff20> <U27> <U1f11> : "ἕ" # U1f15
+<Uff20> <U27> <U1f18> : "Ἔ" # U1f1c
+<Uff20> <U27> <U1f19> : "Ἕ" # U1f1d
+<Uff20> <U27> <U1f20> : "ἤ" # U1f24
+<Uff20> <U27> <U1f21> : "ἥ" # U1f25
+<Uff20> <U27> <U1f28> : "Ἤ" # U1f2c
+<Uff20> <U27> <U1f29> : "Ἥ" # U1f2d
+<Uff20> <U27> <U1f30> : "ἴ" # U1f34
+<Uff20> <U27> <U1f31> : "ἵ" # U1f35
+<Uff20> <U27> <U1f38> : "Ἴ" # U1f3c
+<Uff20> <U27> <U1f39> : "Ἵ" # U1f3d
+<Uff20> <U27> <U1f40> : "ὄ" # U1f44
+<Uff20> <U27> <U1f41> : "ὅ" # U1f45
+<Uff20> <U27> <U1f48> : "Ὄ" # U1f4c
+<Uff20> <U27> <U1f49> : "Ὅ" # U1f4d
+<Uff20> <U27> <U1f50> : "ὔ" # U1f54
+<Uff20> <U27> <U1f51> : "ὕ" # U1f55
+<Uff20> <U27> <U1f59> : "Ὕ" # U1f5d
+<Uff20> <U27> <U1f60> : "ὤ" # U1f64
+<Uff20> <U27> <U1f61> : "ὥ" # U1f65
+<Uff20> <U27> <U1f68> : "Ὤ" # U1f6c
+<Uff20> <U27> <U1f69> : "Ὥ" # U1f6d
+<Uff20> <U27> <U2395> : "⍞" # U235e
+<Uff20> <U28> <U20> : "˘" # U2d8
+<Uff20> <U28> <U28> : "[" # U5b
+<Uff20> <U28> <U2d> : "{" # U7b
+<Uff20> <U28> <U7c1> : "Ἁ" # U1f09
+<Uff20> <U28> <U7c5> : "Ἑ" # U1f19
+<Uff20> <U28> <U7c7> : "Ἡ" # U1f29
+<Uff20> <U28> <U7c9> : "Ἱ" # U1f39
+<Uff20> <U28> <U7cf> : "Ὁ" # U1f49
+<Uff20> <U28> <U7d1> : "Ῥ" # U1fec
+<Uff20> <U28> <U7d5> : "Ὑ" # U1f59
+<Uff20> <U28> <U7d9> : "Ὡ" # U1f69
+<Uff20> <U28> <U7e1> : "ἁ" # U1f01
+<Uff20> <U28> <U7e5> : "ἑ" # U1f11
+<Uff20> <U28> <U7e7> : "ἡ" # U1f21
+<Uff20> <U28> <U7e9> : "ἱ" # U1f31
+<Uff20> <U28> <U7ef> : "ὁ" # U1f41
+<Uff20> <U28> <U7f1> : "ῥ" # U1fe5
+<Uff20> <U28> <U7f5> : "ὑ" # U1f51
+<Uff20> <U28> <U7f9> : "ὡ" # U1f61
+<Uff20> <U29> <U29> : "]" # U5d
+<Uff20> <U29> <U2d> : "}" # U7d
+<Uff20> <U29> <U7c1> : "Ἀ" # U1f08
+<Uff20> <U29> <U7c5> : "Ἐ" # U1f18
+<Uff20> <U29> <U7c7> : "Ἠ" # U1f28
+<Uff20> <U29> <U7c9> : "Ἰ" # U1f38
+<Uff20> <U29> <U7cf> : "Ὀ" # U1f48
+<Uff20> <U29> <U7d9> : "Ὠ" # U1f68
+<Uff20> <U29> <U7e1> : "ἀ" # U1f00
+<Uff20> <U29> <U7e5> : "ἐ" # U1f10
+<Uff20> <U29> <U7e7> : "ἠ" # U1f20
+<Uff20> <U29> <U7e9> : "ἰ" # U1f30
+<Uff20> <U29> <U7ef> : "ὀ" # U1f40
+<Uff20> <U29> <U7f1> : "ῤ" # U1fe4
+<Uff20> <U29> <U7f5> : "ὐ" # U1f50
+<Uff20> <U29> <U7f9> : "ὠ" # U1f60
+<Uff20> <U2a> <U30> : "°" # Ub0
+<Uff20> <U2a> <U41> : "Å" # Uc5
+<Uff20> <U2a> <U55> : "Ů" # U16e
+<Uff20> <U2a> <U61> : "å" # Ue5
+<Uff20> <U2a> <U75> : "ů" # U16f
+<Uff20> <U2a> <Ua8> : "⍣" # U2363
+<Uff20> <U2a> <U25cb> : "⍟" # U235f
+<Uff20> <U2b> <U2b> : "#" # U23
+<Uff20> <U2b> <U2d> : "±" # Ub1
+<Uff20> <U2b> <U4f> : "Ơ" # U1a0
+<Uff20> <U2b> <U55> : "Ư" # U1af
+<Uff20> <U2b> <U6f> : "ơ" # U1a1
+<Uff20> <U2b> <U75> : "ư" # U1b0
+<Uff20> <U2c> <U20> : "¸" # Ub8
+<Uff20> <U2c> <U22> : "„" # U201e
+<Uff20> <U2c> <U27> : "‚" # U201a
+<Uff20> <U2c> <U2c> : "¸" # Ub8
+<Uff20> <U2c> <U2d> : "¬" # Uac
+<Uff20> <U2c> <U41> : "Ą" # U104
+<Uff20> <U2c> <U43> : "Ç" # Uc7
+<Uff20> <U2c> <U44> : "Ḑ" # U1e10
+<Uff20> <U2c> <U45> : "Ę" # U118
+<Uff20> <U2c> <U47> : "Ģ" # U122
+<Uff20> <U2c> <U48> : "Ḩ" # U1e28
+<Uff20> <U2c> <U49> : "Į" # U12e
+<Uff20> <U2c> <U4b> : "Ķ" # U136
+<Uff20> <U2c> <U4c> : "Ļ" # U13b
+<Uff20> <U2c> <U4e> : "Ņ" # U145
+<Uff20> <U2c> <U4f> : "Ǫ" # U1ea
+<Uff20> <U2c> <U52> : "Ŗ" # U156
+<Uff20> <U2c> <U53> : "Ş" # U15e
+<Uff20> <U2c> <U54> : "Ţ" # U162
+<Uff20> <U2c> <U55> : "Ų" # U172
+<Uff20> <U2c> <U61> : "ą" # U105
+<Uff20> <U2c> <U63> : "ç" # Ue7
+<Uff20> <U2c> <U64> : "ḑ" # U1e11
+<Uff20> <U2c> <U65> : "ę" # U119
+<Uff20> <U2c> <U67> : "ģ" # U123
+<Uff20> <U2c> <U68> : "ḩ" # U1e29
+<Uff20> <U2c> <U69> : "į" # U12f
+<Uff20> <U2c> <U6b> : "ķ" # U137
+<Uff20> <U2c> <U6c> : "ļ" # U13c
+<Uff20> <U2c> <U6e> : "ņ" # U146
+<Uff20> <U2c> <U6f> : "ǫ" # U1eb
+<Uff20> <U2c> <U72> : "ŗ" # U157
+<Uff20> <U2c> <U73> : "ş" # U15f
+<Uff20> <U2c> <U74> : "ţ" # U163
+<Uff20> <U2c> <U75> : "ų" # U173
+<Uff20> <U2d> <U20> : "~" # U7e
+<Uff20> <U2d> <U28> : "{" # U7b
+<Uff20> <U2d> <U29> : "}" # U7d
+<Uff20> <U2d> <U2b> : "±" # Ub1
+<Uff20> <U2d> <U2c> : "¬" # Uac
+<Uff20> <U2d> <U2f> : "⌿" # U233f
+<Uff20> <U2d> <U3a> : "÷" # Uf7
+<Uff20> <U2d> <U3e> : "→" # U2192
+<Uff20> <U2d> <U41> : "Ā" # U100
+<Uff20> <U2d> <U44> : "Đ" # U110
+<Uff20> <U2d> <U45> : "Ē" # U112
+<Uff20> <U2d> <U49> : "Ī" # U12a
+<Uff20> <U2d> <U4c> : "£" # Ua3
+<Uff20> <U2d> <U4f> : "Ō" # U14c
+<Uff20> <U2d> <U55> : "Ū" # U16a
+<Uff20> <U2d> <U59> : "¥" # Ua5
+<Uff20> <U2d> <U5c> : "⍀" # U2340
+<Uff20> <U2d> <U5e> : "¯" # Uaf
+<Uff20> <U2d> <U61> : "ā" # U101
+<Uff20> <U2d> <U64> : "đ" # U111
+<Uff20> <U2d> <U65> : "ē" # U113
+<Uff20> <U2d> <U69> : "ī" # U12b
+<Uff20> <U2d> <U6c> : "£" # Ua3
+<Uff20> <U2d> <U6f> : "ō" # U14d
+<Uff20> <U2d> <U75> : "ū" # U16b
+<Uff20> <U2d> <U79> : "¥" # Ua5
+<Uff20> <U2d> <U2191> : "⍏" # U234f
+<Uff20> <U2d> <U2193> : "⍖" # U2356
+<Uff20> <U2d> <U25cb> : "⊖" # U2296
+<Uff20> <U2e> <U2d> : "·" # Ub7
+<Uff20> <U2e> <U2e> : "…" # U2026
+<Uff20> <U2e> <U3a> : "∵" # U2235
+<Uff20> <U2e> <U3c> : "‹" # U2039
+<Uff20> <U2e> <U3d> : "•" # U2022
+<Uff20> <U2e> <U3e> : "›" # U203a
+<Uff20> <U2e> <U41> : "Ȧ" # U226
+<Uff20> <U2e> <U42> : "Ḃ" # U1e02
+<Uff20> <U2e> <U43> : "Ċ" # U10a
+<Uff20> <U2e> <U44> : "Ḋ" # U1e0a
+<Uff20> <U2e> <U45> : "Ė" # U116
+<Uff20> <U2e> <U46> : "Ḟ" # U1e1e
+<Uff20> <U2e> <U47> : "Ġ" # U120
+<Uff20> <U2e> <U48> : "Ḣ" # U1e22
+<Uff20> <U2e> <U49> : "İ" # U130
+<Uff20> <U2e> <U4d> : "Ṁ" # U1e40
+<Uff20> <U2e> <U4e> : "Ṅ" # U1e44
+<Uff20> <U2e> <U4f> : "Ȯ" # U22e
+<Uff20> <U2e> <U50> : "Ṗ" # U1e56
+<Uff20> <U2e> <U52> : "Ṙ" # U1e58
+<Uff20> <U2e> <U53> : "Ṡ" # U1e60
+<Uff20> <U2e> <U54> : "Ṫ" # U1e6a
+<Uff20> <U2e> <U57> : "Ẇ" # U1e86
+<Uff20> <U2e> <U58> : "Ẋ" # U1e8a
+<Uff20> <U2e> <U59> : "Ẏ" # U1e8e
+<Uff20> <U2e> <U5a> : "Ż" # U17b
+<Uff20> <U2e> <U5e> : "·" # Ub7
+<Uff20> <U2e> <U61> : "ȧ" # U227
+<Uff20> <U2e> <U62> : "ḃ" # U1e03
+<Uff20> <U2e> <U63> : "ċ" # U10b
+<Uff20> <U2e> <U64> : "ḋ" # U1e0b
+<Uff20> <U2e> <U65> : "ė" # U117
+<Uff20> <U2e> <U66> : "ḟ" # U1e1f
+<Uff20> <U2e> <U67> : "ġ" # U121
+<Uff20> <U2e> <U68> : "ḣ" # U1e23
+<Uff20> <U2e> <U69> : "ı" # U131
+<Uff20> <U2e> <U6d> : "ṁ" # U1e41
+<Uff20> <U2e> <U6e> : "ṅ" # U1e45
+<Uff20> <U2e> <U6f> : "ȯ" # U22f
+<Uff20> <U2e> <U70> : "ṗ" # U1e57
+<Uff20> <U2e> <U72> : "ṙ" # U1e59
+<Uff20> <U2e> <U73> : "ṡ" # U1e61
+<Uff20> <U2e> <U74> : "ṫ" # U1e6b
+<Uff20> <U2e> <U77> : "ẇ" # U1e87
+<Uff20> <U2e> <U78> : "ẋ" # U1e8b
+<Uff20> <U2e> <U79> : "ẏ" # U1e8f
+<Uff20> <U2e> <U7a> : "ż" # U17c
+<Uff20> <U2e> <U17f> : "ẛ" # U1e9b
+<Uff20> <U2e> <U1a6> : "Ṥ" # U1e64
+<Uff20> <U2e> <U1a9> : "Ṧ" # U1e66
+<Uff20> <U2e> <U1b6> : "ṥ" # U1e65
+<Uff20> <U2e> <U1b9> : "ṧ" # U1e67
+<Uff20> <U2e> <U1e62> : "Ṩ" # U1e68
+<Uff20> <U2e> <U1e63> : "ṩ" # U1e69
+<Uff20> <U2e> <U25cb> : "⊙" # U2299
+<Uff20> <U2f> <U2d> : "⌿" # U233f
+<Uff20> <U2f> <U2f> : "\\" # U5c
+<Uff20> <U2f> <U3c> : "\\" # U5c
+<Uff20> <U2f> <U3d> : "≠" # U2260
+<Uff20> <U2f> <U43> : "₡" # U20a1
+<Uff20> <U2f> <U44> : "Đ" # U110
+<Uff20> <U2f> <U47> : "Ǥ" # U1e4
+<Uff20> <U2f> <U48> : "Ħ" # U126
+<Uff20> <U2f> <U49> : "Ɨ" # U197
+<Uff20> <U2f> <U4c> : "Ł" # U141
+<Uff20> <U2f> <U4f> : "Ø" # Ud8
+<Uff20> <U2f> <U54> : "Ŧ" # U166
+<Uff20> <U2f> <U5a> : "Ƶ" # U1b5
+<Uff20> <U2f> <U5e> : "|" # U7c
+<Uff20> <U2f> <U62> : "ƀ" # U180
+<Uff20> <U2f> <U63> : "¢" # Ua2
+<Uff20> <U2f> <U64> : "đ" # U111
+<Uff20> <U2f> <U67> : "ǥ" # U1e5
+<Uff20> <U2f> <U68> : "ħ" # U127
+<Uff20> <U2f> <U69> : "ɨ" # U268
+<Uff20> <U2f> <U6c> : "ł" # U142
+<Uff20> <U2f> <U6d> : "₥" # U20a5
+<Uff20> <U2f> <U6f> : "ø" # Uf8
+<Uff20> <U2f> <U74> : "ŧ" # U167
+<Uff20> <U2f> <U75> : "µ" # Ub5
+<Uff20> <U2f> <U76> : "√" # U221a
+<Uff20> <U2f> <U7a> : "ƶ" # U1b6
+<Uff20> <U2f> <U294> : "ʡ" # U2a1
+<Uff20> <U2f> <U4ae> : "Ұ" # U4b0
+<Uff20> <U2f> <U4af> : "ұ" # U4b1
+<Uff20> <U2f> <U6c7> : "ғ" # U493
+<Uff20> <U2f> <U6cb> : "ҟ" # U49f
+<Uff20> <U2f> <U6e7> : "Ғ" # U492
+<Uff20> <U2f> <U6eb> : "Ҟ" # U49e
+<Uff20> <U2f> <U8fb> : "↚" # U219a
+<Uff20> <U2f> <U8fd> : "↛" # U219b
+<Uff20> <U2f> <U2194> : "↮" # U21ae
+<Uff20> <U2f> <U2395> : "⍁" # U2341
+<Uff20> <U30> <U2a> : "°" # Ub0
+<Uff20> <U30> <U33> : "↉" # U2189
+<Uff20> <U30> <U7e> : "⍬" # U236c
+<Uff20> <U31> <U32> : "½" # Ubd
+<Uff20> <U31> <U33> : "⅓" # U2153
+<Uff20> <U31> <U34> : "¼" # Ubc
+<Uff20> <U31> <U35> : "⅕" # U2155
+<Uff20> <U31> <U36> : "⅙" # U2159
+<Uff20> <U31> <U37> : "⅐" # U2150
+<Uff20> <U31> <U38> : "⅛" # U215b
+<Uff20> <U31> <U39> : "⅑" # U2151
+<Uff20> <U31> <U5e> : "¹" # Ub9
+<Uff20> <U32> <U33> : "⅔" # U2154
+<Uff20> <U32> <U35> : "⅖" # U2156
+<Uff20> <U32> <U5e> : "²" # Ub2
+<Uff20> <U33> <U34> : "¾" # Ube
+<Uff20> <U33> <U35> : "⅗" # U2157
+<Uff20> <U33> <U38> : "⅜" # U215c
+<Uff20> <U33> <U5e> : "³" # Ub3
+<Uff20> <U34> <U35> : "⅘" # U2158
+<Uff20> <U35> <U36> : "⅚" # U215a
+<Uff20> <U35> <U38> : "⅝" # U215d
+<Uff20> <U37> <U38> : "⅞" # U215e
+<Uff20> <U38> <U38> : "∞" # U221e
+<Uff20> <U3a> <U28> : "☹" # U2639
+<Uff20> <U3a> <U29> : "☺" # U263a
+<Uff20> <U3a> <U2d> : "÷" # Uf7
+<Uff20> <U3a> <U2e> : "∴" # U2234
+<Uff20> <U3a> <U2395> : "⍠" # U2360
+<Uff20> <U3b> <U41> : "Ą" # U104
+<Uff20> <U3b> <U45> : "Ę" # U118
+<Uff20> <U3b> <U49> : "Į" # U12e
+<Uff20> <U3b> <U4f> : "Ǫ" # U1ea
+<Uff20> <U3b> <U53> : "Ș" # U218
+<Uff20> <U3b> <U54> : "Ț" # U21a
+<Uff20> <U3b> <U55> : "Ų" # U172
+<Uff20> <U3b> <U5f> : "⍮" # U236e
+<Uff20> <U3b> <U61> : "ą" # U105
+<Uff20> <U3b> <U65> : "ę" # U119
+<Uff20> <U3b> <U69> : "į" # U12f
+<Uff20> <U3b> <U6f> : "ǫ" # U1eb
+<Uff20> <U3b> <U73> : "ș" # U219
+<Uff20> <U3b> <U74> : "ț" # U21b
+<Uff20> <U3b> <U75> : "ų" # U173
+<Uff20> <U3c> <U20> : "ˇ" # U2c7
+<Uff20> <U3c> <U22> : "“" # U201c
+<Uff20> <U3c> <U27> : "‘" # U2018
+<Uff20> <U3c> <U2d> : "←" # U2190
+<Uff20> <U3c> <U2f> : "\\" # U5c
+<Uff20> <U3c> <U33> : "♥" # U2665
+<Uff20> <U3c> <U3c> : "«" # Uab
+<Uff20> <U3c> <U3d> : "≤" # U2264
+<Uff20> <U3c> <U3e> : "⋄" # U22c4
+<Uff20> <U3c> <U43> : "Č" # U10c
+<Uff20> <U3c> <U44> : "Ď" # U10e
+<Uff20> <U3c> <U45> : "Ě" # U11a
+<Uff20> <U3c> <U4c> : "Ľ" # U13d
+<Uff20> <U3c> <U4e> : "Ň" # U147
+<Uff20> <U3c> <U52> : "Ř" # U158
+<Uff20> <U3c> <U53> : "Š" # U160
+<Uff20> <U3c> <U54> : "Ť" # U164
+<Uff20> <U3c> <U5a> : "Ž" # U17d
+<Uff20> <U3c> <U5f> : "≤" # U2264
+<Uff20> <U3c> <U63> : "č" # U10d
+<Uff20> <U3c> <U64> : "ď" # U10f
+<Uff20> <U3c> <U65> : "ě" # U11b
+<Uff20> <U3c> <U6c> : "ľ" # U13e
+<Uff20> <U3c> <U6e> : "ň" # U148
+<Uff20> <U3c> <U72> : "ř" # U159
+<Uff20> <U3c> <U73> : "š" # U161
+<Uff20> <U3c> <U74> : "ť" # U165
+<Uff20> <U3c> <U7a> : "ž" # U17e
+<Uff20> <U3c> <U338> : "≮" # U226e
+<Uff20> <U3c> <U2395> : "⍃" # U2343
+<Uff20> <U3d> <U2f> : "≠" # U2260
+<Uff20> <U3d> <U3e> : "⇒" # U21d2
+<Uff20> <U3d> <U43> : "€" # U20ac
+<Uff20> <U3d> <U45> : "€" # U20ac
+<Uff20> <U3d> <U4c> : "₤" # U20a4
+<Uff20> <U3d> <U4e> : "₦" # U20a6
+<Uff20> <U3d> <U4f> : "Ő" # U150
+<Uff20> <U3d> <U50> : "₽" # U20bd
+<Uff20> <U3d> <U52> : "₹" # U20b9
+<Uff20> <U3d> <U55> : "Ű" # U170
+<Uff20> <U3d> <U57> : "₩" # U20a9
+<Uff20> <U3d> <U59> : "¥" # Ua5
+<Uff20> <U3d> <U5f> : "≡" # U2261
+<Uff20> <U3d> <U63> : "€" # U20ac
+<Uff20> <U3d> <U64> : "₫" # U20ab
+<Uff20> <U3d> <U65> : "€" # U20ac
+<Uff20> <U3d> <U6f> : "ő" # U151
+<Uff20> <U3d> <U70> : "₽" # U20bd
+<Uff20> <U3d> <U72> : "₹" # U20b9
+<Uff20> <U3d> <U75> : "ű" # U171
+<Uff20> <U3d> <U79> : "¥" # Ua5
+<Uff20> <U3d> <U338> : "≠" # U2260
+<Uff20> <U3d> <U6d5> : "ӳ" # U4f3
+<Uff20> <U3d> <U6da> : "₽" # U20bd
+<Uff20> <U3d> <U6e5> : "€" # U20ac
+<Uff20> <U3d> <U6f3> : "€" # U20ac
+<Uff20> <U3d> <U6f5> : "Ӳ" # U4f2
+<Uff20> <U3d> <U6fa> : "₽" # U20bd
+<Uff20> <U3d> <U2395> : "⌸" # U2338
+<Uff20> <U3e> <U20> : "^" # U5e
+<Uff20> <U3e> <U22> : "”" # U201d
+<Uff20> <U3e> <U27> : "’" # U2019
+<Uff20> <U3e> <U3c> : "⋄" # U22c4
+<Uff20> <U3e> <U3d> : "≥" # U2265
+<Uff20> <U3e> <U3e> : "»" # Ubb
+<Uff20> <U3e> <U41> : "Â" # Uc2
+<Uff20> <U3e> <U45> : "Ê" # Uca
+<Uff20> <U3e> <U49> : "Î" # Uce
+<Uff20> <U3e> <U4f> : "Ô" # Ud4
+<Uff20> <U3e> <U55> : "Û" # Udb
+<Uff20> <U3e> <U5f> : "≥" # U2265
+<Uff20> <U3e> <U61> : "â" # Ue2
+<Uff20> <U3e> <U65> : "ê" # Uea
+<Uff20> <U3e> <U69> : "î" # Uee
+<Uff20> <U3e> <U6f> : "ô" # Uf4
+<Uff20> <U3e> <U75> : "û" # Ufb
+<Uff20> <U3e> <Ua8> : "⍩" # U2369
+<Uff20> <U3e> <U338> : "≯" # U226f
+<Uff20> <U3e> <U2395> : "⍄" # U2344
+<Uff20> <U3f> <U21> : "⸘" # U2e18
+<Uff20> <U3f> <U3f> : "¿" # Ubf
+<Uff20> <U3f> <U41> : "Ả" # U1ea2
+<Uff20> <U3f> <U45> : "Ẻ" # U1eba
+<Uff20> <U3f> <U49> : "Ỉ" # U1ec8
+<Uff20> <U3f> <U4f> : "Ỏ" # U1ece
+<Uff20> <U3f> <U55> : "Ủ" # U1ee6
+<Uff20> <U3f> <U59> : "Ỷ" # U1ef6
+<Uff20> <U3f> <U61> : "ả" # U1ea3
+<Uff20> <U3f> <U65> : "ẻ" # U1ebb
+<Uff20> <U3f> <U69> : "ỉ" # U1ec9
+<Uff20> <U3f> <U6f> : "ỏ" # U1ecf
+<Uff20> <U3f> <U75> : "ủ" # U1ee7
+<Uff20> <U3f> <U79> : "ỷ" # U1ef7
+<Uff20> <U3f> <Uc2> : "Ẩ" # U1ea8
+<Uff20> <U3f> <Uca> : "Ể" # U1ec2
+<Uff20> <U3f> <Ud4> : "Ổ" # U1ed4
+<Uff20> <U3f> <Ue2> : "ẩ" # U1ea9
+<Uff20> <U3f> <Uea> : "ể" # U1ec3
+<Uff20> <U3f> <Uf4> : "ổ" # U1ed5
+<Uff20> <U3f> <U1c3> : "Ẳ" # U1eb2
+<Uff20> <U3f> <U1e3> : "ẳ" # U1eb3
+<Uff20> <U3f> <U2395> : "⍰" # U2370
+<Uff20> <U41> <U22> : "Ä" # Uc4
+<Uff20> <U41> <U27> : "Á" # Uc1
+<Uff20> <U41> <U28> : "Ă" # U102
+<Uff20> <U41> <U2a> : "Å" # Uc5
+<Uff20> <U41> <U2c> : "Ą" # U104
+<Uff20> <U41> <U2d> : "Ā" # U100
+<Uff20> <U41> <U3b> : "Ą" # U104
+<Uff20> <U41> <U3e> : "Â" # Uc2
+<Uff20> <U41> <U41> : "Å" # Uc5
+<Uff20> <U41> <U45> : "Æ" # Uc6
+<Uff20> <U41> <U54> : "@" # U40
+<Uff20> <U41> <U5e> : "Â" # Uc2
+<Uff20> <U41> <U5f> : "Ā" # U100
+<Uff20> <U41> <U60> : "À" # Uc0
+<Uff20> <U41> <U7e> : "Ã" # Uc3
+<Uff20> <U41> <Ua8> : "Ä" # Uc4
+<Uff20> <U41> <Ub4> : "Á" # Uc1
+<Uff20> <U42> <U2e> : "Ḃ" # U1e02
+<Uff20> <U43> <U27> : "Ć" # U106
+<Uff20> <U43> <U2c> : "Ç" # Uc7
+<Uff20> <U43> <U2e> : "Ċ" # U10a
+<Uff20> <U43> <U2f> : "₡" # U20a1
+<Uff20> <U43> <U3c> : "Č" # U10c
+<Uff20> <U43> <U3d> : "€" # U20ac
+<Uff20> <U43> <U45> : "₠" # U20a0
+<Uff20> <U43> <U4f> : "©" # Ua9
+<Uff20> <U43> <U6f> : "©" # Ua9
+<Uff20> <U43> <U72> : "₢" # U20a2
+<Uff20> <U43> <U7c> : "¢" # Ua2
+<Uff20> <U44> <U2c> : "Ḑ" # U1e10
+<Uff20> <U44> <U2d> : "Đ" # U110
+<Uff20> <U44> <U2e> : "Ḋ" # U1e0a
+<Uff20> <U44> <U3c> : "Ď" # U10e
+<Uff20> <U44> <U48> : "Ð" # Ud0
+<Uff20> <U45> <U22> : "Ë" # Ucb
+<Uff20> <U45> <U27> : "É" # Uc9
+<Uff20> <U45> <U2c> : "Ę" # U118
+<Uff20> <U45> <U2d> : "Ē" # U112
+<Uff20> <U45> <U2e> : "Ė" # U116
+<Uff20> <U45> <U3b> : "Ę" # U118
+<Uff20> <U45> <U3c> : "Ě" # U11a
+<Uff20> <U45> <U3d> : "€" # U20ac
+<Uff20> <U45> <U3e> : "Ê" # Uca
+<Uff20> <U45> <U5e> : "Ê" # Uca
+<Uff20> <U45> <U5f> : "Ē" # U112
+<Uff20> <U45> <U60> : "È" # Uc8
+<Uff20> <U45> <Ua8> : "Ë" # Ucb
+<Uff20> <U45> <Ub4> : "É" # Uc9
+<Uff20> <U46> <U2e> : "Ḟ" # U1e1e
+<Uff20> <U46> <U55> : "🖕" # U1f595
+<Uff20> <U46> <U69> : "ffi" # Ufb03
+<Uff20> <U46> <U6c> : "ffl" # Ufb04
+<Uff20> <U46> <U72> : "₣" # U20a3
+<Uff20> <U47> <U28> : "Ğ" # U11e
+<Uff20> <U47> <U2c> : "Ģ" # U122
+<Uff20> <U47> <U2e> : "Ġ" # U120
+<Uff20> <U47> <U54> : ">" # U3e
+<Uff20> <U47> <U55> : "Ğ" # U11e
+<Uff20> <U47> <U1a2> : "Ğ" # U11e
+<Uff20> <U48> <U2c> : "Ḩ" # U1e28
+<Uff20> <U49> <U22> : "Ï" # Ucf
+<Uff20> <U49> <U27> : "Í" # Ucd
+<Uff20> <U49> <U2c> : "Į" # U12e
+<Uff20> <U49> <U2d> : "Ī" # U12a
+<Uff20> <U49> <U2e> : "İ" # U130
+<Uff20> <U49> <U3b> : "Į" # U12e
+<Uff20> <U49> <U3e> : "Î" # Uce
+<Uff20> <U49> <U4a> : "IJ" # U132
+<Uff20> <U49> <U5e> : "Î" # Uce
+<Uff20> <U49> <U5f> : "Ī" # U12a
+<Uff20> <U49> <U60> : "Ì" # Ucc
+<Uff20> <U49> <U6a> : "IJ" # U132
+<Uff20> <U49> <U7e> : "Ĩ" # U128
+<Uff20> <U49> <Ua8> : "Ï" # Ucf
+<Uff20> <U49> <Ub4> : "Í" # Ucd
+<Uff20> <U4a> <U27> : "J́"
+<Uff20> <U4a> <Ub4> : "J́"
+<Uff20> <U4b> <U2c> : "Ķ" # U136
+<Uff20> <U4c> <U27> : "Ĺ" # U139
+<Uff20> <U4c> <U2c> : "Ļ" # U13b
+<Uff20> <U4c> <U2d> : "£" # Ua3
+<Uff20> <U4c> <U2f> : "Ł" # U141
+<Uff20> <U4c> <U3c> : "Ľ" # U13d
+<Uff20> <U4c> <U3d> : "₤" # U20a4
+<Uff20> <U4c> <U54> : "<" # U3c
+<Uff20> <U4c> <U56> : "|" # U7c
+<Uff20> <U4d> <U2e> : "Ṁ" # U1e40
+<Uff20> <U4e> <U27> : "Ń" # U143
+<Uff20> <U4e> <U2c> : "Ņ" # U145
+<Uff20> <U4e> <U3c> : "Ň" # U147
+<Uff20> <U4e> <U3d> : "₦" # U20a6
+<Uff20> <U4e> <U47> : "Ŋ" # U14a
+<Uff20> <U4e> <U4f> : "№" # U2116
+<Uff20> <U4e> <U6f> : "№" # U2116
+<Uff20> <U4e> <U7e> : "Ñ" # Ud1
+<Uff20> <U4f> <U22> : "Ö" # Ud6
+<Uff20> <U4f> <U27> : "Ó" # Ud3
+<Uff20> <U4f> <U2c> : "Ǫ" # U1ea
+<Uff20> <U4f> <U2d> : "Ō" # U14c
+<Uff20> <U4f> <U2f> : "Ø" # Ud8
+<Uff20> <U4f> <U3b> : "Ǫ" # U1ea
+<Uff20> <U4f> <U3e> : "Ô" # Ud4
+<Uff20> <U4f> <U41> : "Ⓐ" # U24b6
+<Uff20> <U4f> <U43> : "©" # Ua9
+<Uff20> <U4f> <U45> : "Œ" # U152
+<Uff20> <U4f> <U52> : "®" # Uae
+<Uff20> <U4f> <U53> : "§" # Ua7
+<Uff20> <U4f> <U58> : "¤" # Ua4
+<Uff20> <U4f> <U5e> : "Ô" # Ud4
+<Uff20> <U4f> <U5f> : "Ō" # U14c
+<Uff20> <U4f> <U60> : "Ò" # Ud2
+<Uff20> <U4f> <U63> : "©" # Ua9
+<Uff20> <U4f> <U72> : "®" # Uae
+<Uff20> <U4f> <U78> : "¤" # Ua4
+<Uff20> <U4f> <U7e> : "Õ" # Ud5
+<Uff20> <U4f> <Ua8> : "Ö" # Ud6
+<Uff20> <U4f> <Ub4> : "Ó" # Ud3
+<Uff20> <U50> <U21> : "¶" # Ub6
+<Uff20> <U50> <U2e> : "Ṗ" # U1e56
+<Uff20> <U50> <U3d> : "₽" # U20bd
+<Uff20> <U50> <U50> : "¶" # Ub6
+<Uff20> <U50> <U74> : "₧" # U20a7
+<Uff20> <U52> <U27> : "Ŕ" # U154
+<Uff20> <U52> <U2c> : "Ŗ" # U156
+<Uff20> <U52> <U3c> : "Ř" # U158
+<Uff20> <U52> <U3d> : "₹" # U20b9
+<Uff20> <U52> <U4f> : "®" # Uae
+<Uff20> <U52> <U6f> : "®" # Uae
+<Uff20> <U52> <U73> : "₨" # U20a8
+<Uff20> <U53> <U21> : "§" # Ua7
+<Uff20> <U53> <U27> : "Ś" # U15a
+<Uff20> <U53> <U2c> : "Ş" # U15e
+<Uff20> <U53> <U2e> : "Ṡ" # U1e60
+<Uff20> <U53> <U3b> : "Ș" # U218
+<Uff20> <U53> <U3c> : "Š" # U160
+<Uff20> <U53> <U4d> : "℠" # U2120
+<Uff20> <U53> <U4f> : "§" # Ua7
+<Uff20> <U53> <U53> : "ẞ" # U1e9e
+<Uff20> <U53> <U6d> : "℠" # U2120
+<Uff20> <U54> <U2c> : "Ţ" # U162
+<Uff20> <U54> <U2d> : "Ŧ" # U166
+<Uff20> <U54> <U2e> : "Ṫ" # U1e6a
+<Uff20> <U54> <U2f> : "Ŧ" # U166
+<Uff20> <U54> <U3b> : "Ț" # U21a
+<Uff20> <U54> <U3c> : "Ť" # U164
+<Uff20> <U54> <U48> : "Þ" # Ude
+<Uff20> <U54> <U4d> : "™" # U2122
+<Uff20> <U54> <U6d> : "™" # U2122
+<Uff20> <U55> <U22> : "Ü" # Udc
+<Uff20> <U55> <U27> : "Ú" # Uda
+<Uff20> <U55> <U2a> : "Ů" # U16e
+<Uff20> <U55> <U2c> : "Ų" # U172
+<Uff20> <U55> <U2d> : "Ū" # U16a
+<Uff20> <U55> <U3b> : "Ų" # U172
+<Uff20> <U55> <U3e> : "Û" # Udb
+<Uff20> <U55> <U41> : "Ă" # U102
+<Uff20> <U55> <U45> : "Ĕ" # U114
+<Uff20> <U55> <U47> : "Ğ" # U11e
+<Uff20> <U55> <U49> : "Ĭ" # U12c
+<Uff20> <U55> <U4f> : "Ŏ" # U14e
+<Uff20> <U55> <U55> : "Ŭ" # U16c
+<Uff20> <U55> <U5e> : "Û" # Udb
+<Uff20> <U55> <U5f> : "Ū" # U16a
+<Uff20> <U55> <U60> : "Ù" # Ud9
+<Uff20> <U55> <U61> : "ă" # U103
+<Uff20> <U55> <U65> : "ĕ" # U115
+<Uff20> <U55> <U67> : "ğ" # U11f
+<Uff20> <U55> <U69> : "ĭ" # U12d
+<Uff20> <U55> <U6f> : "ŏ" # U14f
+<Uff20> <U55> <U75> : "ŭ" # U16d
+<Uff20> <U55> <U7e> : "Ũ" # U168
+<Uff20> <U55> <Ua8> : "Ü" # Udc
+<Uff20> <U55> <Ub4> : "Ú" # Uda
+<Uff20> <U55> <U228> : "Ḝ" # U1e1c
+<Uff20> <U55> <U229> : "ḝ" # U1e1d
+<Uff20> <U55> <U6c1> : "ӑ" # U4d1
+<Uff20> <U55> <U6c5> : "ӗ" # U4d7
+<Uff20> <U55> <U6c9> : "й" # U439
+<Uff20> <U55> <U6d5> : "ў" # U45e
+<Uff20> <U55> <U6d6> : "ӂ" # U4c2
+<Uff20> <U55> <U6e1> : "Ӑ" # U4d0
+<Uff20> <U55> <U6e5> : "Ӗ" # U4d6
+<Uff20> <U55> <U6e9> : "Й" # U419
+<Uff20> <U55> <U6f5> : "Ў" # U40e
+<Uff20> <U55> <U6f6> : "Ӂ" # U4c1
+<Uff20> <U55> <U7c1> : "Ᾰ" # U1fb8
+<Uff20> <U55> <U7c9> : "Ῐ" # U1fd8
+<Uff20> <U55> <U7d5> : "Ῠ" # U1fe8
+<Uff20> <U55> <U7e1> : "ᾰ" # U1fb0
+<Uff20> <U55> <U7e9> : "ῐ" # U1fd0
+<Uff20> <U55> <U7f5> : "ῠ" # U1fe0
+<Uff20> <U55> <U1ea0> : "Ặ" # U1eb6
+<Uff20> <U55> <U1ea1> : "ặ" # U1eb7
+<Uff20> <U56> <U4c> : "|" # U7c
+<Uff20> <U57> <U3d> : "₩" # U20a9
+<Uff20> <U57> <U5e> : "Ŵ" # U174
+<Uff20> <U58> <U4f> : "¤" # Ua4
+<Uff20> <U58> <U6f> : "¤" # Ua4
+<Uff20> <U59> <U22> : "Ÿ" # U178
+<Uff20> <U59> <U27> : "Ý" # Udd
+<Uff20> <U59> <U2d> : "¥" # Ua5
+<Uff20> <U59> <U3d> : "¥" # Ua5
+<Uff20> <U59> <U5e> : "Ŷ" # U176
+<Uff20> <U59> <Ua8> : "Ÿ" # U178
+<Uff20> <U59> <Ub4> : "Ý" # Udd
+<Uff20> <U5a> <U27> : "Ź" # U179
+<Uff20> <U5a> <U2e> : "Ż" # U17b
+<Uff20> <U5a> <U3c> : "Ž" # U17d
+<Uff20> <U5b> <U5d> : "⌷" # U2337
+<Uff20> <U5c> <U2d> : "⍀" # U2340
+<Uff20> <U5c> <U2395> : "⍂" # U2342
+<Uff20> <U5c> <U25cb> : "⍉" # U2349
+<Uff20> <U5d> <U5b> : "⌷" # U2337
+<Uff20> <U5e> <U20> : "^" # U5e
+<Uff20> <U5e> <U28> : "⁽" # U207d
+<Uff20> <U5e> <U29> : "⁾" # U207e
+<Uff20> <U5e> <U2b> : "⁺" # U207a
+<Uff20> <U5e> <U2d> : "¯" # Uaf
+<Uff20> <U5e> <U2e> : "·" # Ub7
+<Uff20> <U5e> <U2f> : "|" # U7c
+<Uff20> <U5e> <U30> : "⁰" # U2070
+<Uff20> <U5e> <U31> : "¹" # Ub9
+<Uff20> <U5e> <U32> : "²" # Ub2
+<Uff20> <U5e> <U33> : "³" # Ub3
+<Uff20> <U5e> <U34> : "⁴" # U2074
+<Uff20> <U5e> <U35> : "⁵" # U2075
+<Uff20> <U5e> <U36> : "⁶" # U2076
+<Uff20> <U5e> <U37> : "⁷" # U2077
+<Uff20> <U5e> <U38> : "⁸" # U2078
+<Uff20> <U5e> <U39> : "⁹" # U2079
+<Uff20> <U5e> <U3d> : "⁼" # U207c
+<Uff20> <U5e> <U41> : "Â" # Uc2
+<Uff20> <U5e> <U43> : "Ĉ" # U108
+<Uff20> <U5e> <U45> : "Ê" # Uca
+<Uff20> <U5e> <U47> : "Ĝ" # U11c
+<Uff20> <U5e> <U48> : "Ĥ" # U124
+<Uff20> <U5e> <U49> : "Î" # Uce
+<Uff20> <U5e> <U4a> : "Ĵ" # U134
+<Uff20> <U5e> <U4f> : "Ô" # Ud4
+<Uff20> <U5e> <U53> : "Ŝ" # U15c
+<Uff20> <U5e> <U55> : "Û" # Udb
+<Uff20> <U5e> <U57> : "Ŵ" # U174
+<Uff20> <U5e> <U59> : "Ŷ" # U176
+<Uff20> <U5e> <U5a> : "Ẑ" # U1e90
+<Uff20> <U5e> <U61> : "â" # Ue2
+<Uff20> <U5e> <U63> : "ĉ" # U109
+<Uff20> <U5e> <U65> : "ê" # Uea
+<Uff20> <U5e> <U67> : "ĝ" # U11d
+<Uff20> <U5e> <U68> : "ĥ" # U125
+<Uff20> <U5e> <U69> : "î" # Uee
+<Uff20> <U5e> <U6a> : "ĵ" # U135
+<Uff20> <U5e> <U6f> : "ô" # Uf4
+<Uff20> <U5e> <U73> : "ŝ" # U15d
+<Uff20> <U5e> <U75> : "û" # Ufb
+<Uff20> <U5e> <U77> : "ŵ" # U175
+<Uff20> <U5e> <U79> : "ŷ" # U177
+<Uff20> <U5e> <U7a> : "ẑ" # U1e91
+<Uff20> <U5e> <U7c> : "↑" # U2191
+<Uff20> <U5e> <U6c1> : "а̂"
+<Uff20> <U5e> <U6c5> : "е̂"
+<Uff20> <U5e> <U6c9> : "и̂"
+<Uff20> <U5e> <U6cf> : "о̂"
+<Uff20> <U5e> <U6d2> : "р̂"
+<Uff20> <U5e> <U6d5> : "у̂"
+<Uff20> <U5e> <U6e1> : "А̂"
+<Uff20> <U5e> <U6e5> : "Е̂"
+<Uff20> <U5e> <U6e9> : "И̂"
+<Uff20> <U5e> <U6ef> : "О̂"
+<Uff20> <U5e> <U6f2> : "Р̂"
+<Uff20> <U5e> <U6f5> : "У̂"
+<Uff20> <U5e> <U1ea0> : "Ậ" # U1eac
+<Uff20> <U5e> <U1ea1> : "ậ" # U1ead
+<Uff20> <U5e> <U1eb8> : "Ệ" # U1ec6
+<Uff20> <U5e> <U1eb9> : "ệ" # U1ec7
+<Uff20> <U5e> <U1ecc> : "Ộ" # U1ed8
+<Uff20> <U5e> <U1ecd> : "ộ" # U1ed9
+<Uff20> <U5e> <U2212> : "⁻" # U207b
+<Uff20> <U5e> <U4e00> : "㆒" # U3192
+<Uff20> <U5e> <U4e01> : "㆜" # U319c
+<Uff20> <U5e> <U4e09> : "㆔" # U3194
+<Uff20> <U5e> <U4e0a> : "㆖" # U3196
+<Uff20> <U5e> <U4e0b> : "㆘" # U3198
+<Uff20> <U5e> <U4e19> : "㆛" # U319b
+<Uff20> <U5e> <U4e2d> : "㆗" # U3197
+<Uff20> <U5e> <U4e59> : "㆚" # U319a
+<Uff20> <U5e> <U4e8c> : "㆓" # U3193
+<Uff20> <U5e> <U4eba> : "㆟" # U319f
+<Uff20> <U5e> <U56db> : "㆕" # U3195
+<Uff20> <U5e> <U5730> : "㆞" # U319e
+<Uff20> <U5e> <U5929> : "㆝" # U319d
+<Uff20> <U5e> <U7532> : "㆙" # U3199
+<Uff20> <U5e> <Uff80> : "²" # Ub2
+<Uff20> <U5e> <Uffab> : "⁺" # U207a
+<Uff20> <U5e> <Uffb0> : "⁰" # U2070
+<Uff20> <U5e> <Uffb1> : "¹" # Ub9
+<Uff20> <U5e> <Uffb2> : "²" # Ub2
+<Uff20> <U5e> <Uffb3> : "³" # Ub3
+<Uff20> <U5e> <Uffb4> : "⁴" # U2074
+<Uff20> <U5e> <Uffb5> : "⁵" # U2075
+<Uff20> <U5e> <Uffb6> : "⁶" # U2076
+<Uff20> <U5e> <Uffb7> : "⁷" # U2077
+<Uff20> <U5e> <Uffb8> : "⁸" # U2078
+<Uff20> <U5e> <Uffb9> : "⁹" # U2079
+<Uff20> <U5e> <Uffbd> : "⁼" # U207c
+<Uff20> <U5f> <U27> : "⍘" # U2358
+<Uff20> <U5f> <U28> : "₍" # U208d
+<Uff20> <U5f> <U29> : "₎" # U208e
+<Uff20> <U5f> <U2b> : "₊" # U208a
+<Uff20> <U5f> <U30> : "₀" # U2080
+<Uff20> <U5f> <U31> : "₁" # U2081
+<Uff20> <U5f> <U32> : "₂" # U2082
+<Uff20> <U5f> <U33> : "₃" # U2083
+<Uff20> <U5f> <U34> : "₄" # U2084
+<Uff20> <U5f> <U35> : "₅" # U2085
+<Uff20> <U5f> <U36> : "₆" # U2086
+<Uff20> <U5f> <U37> : "₇" # U2087
+<Uff20> <U5f> <U38> : "₈" # U2088
+<Uff20> <U5f> <U39> : "₉" # U2089
+<Uff20> <U5f> <U3c> : "≤" # U2264
+<Uff20> <U5f> <U3d> : "₌" # U208c
+<Uff20> <U5f> <U3e> : "≥" # U2265
+<Uff20> <U5f> <U41> : "Ā" # U100
+<Uff20> <U5f> <U45> : "Ē" # U112
+<Uff20> <U5f> <U47> : "Ḡ" # U1e20
+<Uff20> <U5f> <U49> : "Ī" # U12a
+<Uff20> <U5f> <U4f> : "Ō" # U14c
+<Uff20> <U5f> <U55> : "Ū" # U16a
+<Uff20> <U5f> <U59> : "Ȳ" # U232
+<Uff20> <U5f> <U5e> : "¯" # Uaf
+<Uff20> <U5f> <U5f> : "¯" # Uaf
+<Uff20> <U5f> <U61> : "ā" # U101
+<Uff20> <U5f> <U65> : "ē" # U113
+<Uff20> <U5f> <U67> : "ḡ" # U1e21
+<Uff20> <U5f> <U69> : "ī" # U12b
+<Uff20> <U5f> <U6f> : "ō" # U14d
+<Uff20> <U5f> <U75> : "ū" # U16b
+<Uff20> <U5f> <U79> : "ȳ" # U233
+<Uff20> <U5f> <Uc4> : "Ǟ" # U1de
+<Uff20> <U5f> <Uc6> : "Ǣ" # U1e2
+<Uff20> <U5f> <Ud5> : "Ȭ" # U22c
+<Uff20> <U5f> <Ud6> : "Ȫ" # U22a
+<Uff20> <U5f> <Udc> : "Ǖ" # U1d5
+<Uff20> <U5f> <Ue4> : "ǟ" # U1df
+<Uff20> <U5f> <Ue6> : "ǣ" # U1e3
+<Uff20> <U5f> <Uf5> : "ȭ" # U22d
+<Uff20> <U5f> <Uf6> : "ȫ" # U22b
+<Uff20> <U5f> <Ufc> : "ǖ" # U1d6
+<Uff20> <U5f> <U1ea> : "Ǭ" # U1ec
+<Uff20> <U5f> <U1eb> : "ǭ" # U1ed
+<Uff20> <U5f> <U226> : "Ǡ" # U1e0
+<Uff20> <U5f> <U227> : "ǡ" # U1e1
+<Uff20> <U5f> <U22e> : "Ȱ" # U230
+<Uff20> <U5f> <U22f> : "ȱ" # U231
+<Uff20> <U5f> <U6c1> : "а̄"
+<Uff20> <U5f> <U6c5> : "е̄"
+<Uff20> <U5f> <U6c9> : "ӣ" # U4e3
+<Uff20> <U5f> <U6cf> : "о̄"
+<Uff20> <U5f> <U6d2> : "р̄"
+<Uff20> <U5f> <U6d5> : "ӯ" # U4ef
+<Uff20> <U5f> <U6e1> : "А̄"
+<Uff20> <U5f> <U6e5> : "Е̄"
+<Uff20> <U5f> <U6e9> : "Ӣ" # U4e2
+<Uff20> <U5f> <U6ef> : "О̄"
+<Uff20> <U5f> <U6f2> : "Р̄"
+<Uff20> <U5f> <U6f5> : "Ӯ" # U4ee
+<Uff20> <U5f> <U7c1> : "Ᾱ" # U1fb9
+<Uff20> <U5f> <U7c9> : "Ῑ" # U1fd9
+<Uff20> <U5f> <U7d5> : "Ῡ" # U1fe9
+<Uff20> <U5f> <U7e1> : "ᾱ" # U1fb1
+<Uff20> <U5f> <U7e9> : "ῑ" # U1fd1
+<Uff20> <U5f> <U7f5> : "ῡ" # U1fe1
+<Uff20> <U5f> <U1e36> : "Ḹ" # U1e38
+<Uff20> <U5f> <U1e37> : "ḹ" # U1e39
+<Uff20> <U5f> <U1e5a> : "Ṝ" # U1e5c
+<Uff20> <U5f> <U1e5b> : "ṝ" # U1e5d
+<Uff20> <U5f> <U2206> : "⍙" # U2359
+<Uff20> <U5f> <U220a> : "⍷" # U2377
+<Uff20> <U5f> <U2212> : "₋" # U208b
+<Uff20> <U5f> <U2218> : "⍛" # U235b
+<Uff20> <U5f> <U2260> : "≢" # U2262
+<Uff20> <U5f> <U2282> : "⊆" # U2286
+<Uff20> <U5f> <U2283> : "⊇" # U2287
+<Uff20> <U5f> <U22a5> : "⍊" # U234a
+<Uff20> <U5f> <U22c4> : "⍚" # U235a
+<Uff20> <U5f> <U2373> : "⍸" # U2378
+<Uff20> <U5f> <U2375> : "⍹" # U2379
+<Uff20> <U5f> <U237a> : "⍶" # U2376
+<Uff20> <U5f> <U25cb> : "⍜" # U235c
+<Uff20> <U5f> <Uff80> : "₂" # U2082
+<Uff20> <U5f> <Uffab> : "₊" # U208a
+<Uff20> <U5f> <Uffb0> : "₀" # U2080
+<Uff20> <U5f> <Uffb1> : "₁" # U2081
+<Uff20> <U5f> <Uffb2> : "₂" # U2082
+<Uff20> <U5f> <Uffb3> : "₃" # U2083
+<Uff20> <U5f> <Uffb4> : "₄" # U2084
+<Uff20> <U5f> <Uffb5> : "₅" # U2085
+<Uff20> <U5f> <Uffb6> : "₆" # U2086
+<Uff20> <U5f> <Uffb7> : "₇" # U2087
+<Uff20> <U5f> <Uffb8> : "₈" # U2088
+<Uff20> <U5f> <Uffb9> : "₉" # U2089
+<Uff20> <U5f> <Uffbd> : "₌" # U208c
+<Uff20> <U60> <U20> : "`" # U60
+<Uff20> <U60> <U41> : "À" # Uc0
+<Uff20> <U60> <U45> : "È" # Uc8
+<Uff20> <U60> <U49> : "Ì" # Ucc
+<Uff20> <U60> <U4e> : "Ǹ" # U1f8
+<Uff20> <U60> <U4f> : "Ò" # Ud2
+<Uff20> <U60> <U55> : "Ù" # Ud9
+<Uff20> <U60> <U57> : "Ẁ" # U1e80
+<Uff20> <U60> <U59> : "Ỳ" # U1ef2
+<Uff20> <U60> <U61> : "à" # Ue0
+<Uff20> <U60> <U65> : "è" # Ue8
+<Uff20> <U60> <U69> : "ì" # Uec
+<Uff20> <U60> <U6e> : "ǹ" # U1f9
+<Uff20> <U60> <U6f> : "ò" # Uf2
+<Uff20> <U60> <U75> : "ù" # Uf9
+<Uff20> <U60> <U77> : "ẁ" # U1e81
+<Uff20> <U60> <U79> : "ỳ" # U1ef3
+<Uff20> <U60> <Uc2> : "Ầ" # U1ea6
+<Uff20> <U60> <Uca> : "Ề" # U1ec0
+<Uff20> <U60> <Ud4> : "Ồ" # U1ed2
+<Uff20> <U60> <Udc> : "Ǜ" # U1db
+<Uff20> <U60> <Ue2> : "ầ" # U1ea7
+<Uff20> <U60> <Uea> : "ề" # U1ec1
+<Uff20> <U60> <Uf4> : "ồ" # U1ed3
+<Uff20> <U60> <Ufc> : "ǜ" # U1dc
+<Uff20> <U60> <U1c3> : "Ằ" # U1eb0
+<Uff20> <U60> <U1e3> : "ằ" # U1eb1
+<Uff20> <U60> <U3aa> : "Ḕ" # U1e14
+<Uff20> <U60> <U3ba> : "ḕ" # U1e15
+<Uff20> <U60> <U3d2> : "Ṑ" # U1e50
+<Uff20> <U60> <U3f2> : "ṑ" # U1e51
+<Uff20> <U60> <U6c1> : "а̀"
+<Uff20> <U60> <U6c5> : "ѐ" # U450
+<Uff20> <U60> <U6c9> : "ѝ" # U45d
+<Uff20> <U60> <U6cf> : "о̀"
+<Uff20> <U60> <U6d2> : "р̀"
+<Uff20> <U60> <U6d5> : "у̀"
+<Uff20> <U60> <U6e1> : "А̀"
+<Uff20> <U60> <U6e5> : "Ѐ" # U400
+<Uff20> <U60> <U6e9> : "Ѝ" # U40d
+<Uff20> <U60> <U6ef> : "О̀"
+<Uff20> <U60> <U6f2> : "Р̀"
+<Uff20> <U60> <U6f5> : "У̀"
+<Uff20> <U60> <U7b5> : "ῒ" # U1fd2
+<Uff20> <U60> <U7b9> : "ῢ" # U1fe2
+<Uff20> <U60> <U7c1> : "Ὰ" # U1fba
+<Uff20> <U60> <U7c5> : "Ὲ" # U1fc8
+<Uff20> <U60> <U7c7> : "Ὴ" # U1fca
+<Uff20> <U60> <U7c9> : "Ὶ" # U1fda
+<Uff20> <U60> <U7cf> : "Ὸ" # U1ff8
+<Uff20> <U60> <U7d5> : "Ὺ" # U1fea
+<Uff20> <U60> <U7d9> : "Ὼ" # U1ffa
+<Uff20> <U60> <U7e1> : "ὰ" # U1f70
+<Uff20> <U60> <U7e5> : "ὲ" # U1f72
+<Uff20> <U60> <U7e7> : "ὴ" # U1f74
+<Uff20> <U60> <U7e9> : "ὶ" # U1f76
+<Uff20> <U60> <U7ef> : "ὸ" # U1f78
+<Uff20> <U60> <U7f5> : "ὺ" # U1f7a
+<Uff20> <U60> <U7f9> : "ὼ" # U1f7c
+<Uff20> <U60> <U1f00> : "ἂ" # U1f02
+<Uff20> <U60> <U1f01> : "ἃ" # U1f03
+<Uff20> <U60> <U1f08> : "Ἂ" # U1f0a
+<Uff20> <U60> <U1f09> : "Ἃ" # U1f0b
+<Uff20> <U60> <U1f10> : "ἒ" # U1f12
+<Uff20> <U60> <U1f11> : "ἓ" # U1f13
+<Uff20> <U60> <U1f18> : "Ἒ" # U1f1a
+<Uff20> <U60> <U1f19> : "Ἓ" # U1f1b
+<Uff20> <U60> <U1f20> : "ἢ" # U1f22
+<Uff20> <U60> <U1f21> : "ἣ" # U1f23
+<Uff20> <U60> <U1f28> : "Ἢ" # U1f2a
+<Uff20> <U60> <U1f29> : "Ἣ" # U1f2b
+<Uff20> <U60> <U1f30> : "ἲ" # U1f32
+<Uff20> <U60> <U1f31> : "ἳ" # U1f33
+<Uff20> <U60> <U1f38> : "Ἲ" # U1f3a
+<Uff20> <U60> <U1f39> : "Ἳ" # U1f3b
+<Uff20> <U60> <U1f40> : "ὂ" # U1f42
+<Uff20> <U60> <U1f41> : "ὃ" # U1f43
+<Uff20> <U60> <U1f48> : "Ὂ" # U1f4a
+<Uff20> <U60> <U1f49> : "Ὃ" # U1f4b
+<Uff20> <U60> <U1f50> : "ὒ" # U1f52
+<Uff20> <U60> <U1f51> : "ὓ" # U1f53
+<Uff20> <U60> <U1f59> : "Ὓ" # U1f5b
+<Uff20> <U60> <U1f60> : "ὢ" # U1f62
+<Uff20> <U60> <U1f61> : "ὣ" # U1f63
+<Uff20> <U60> <U1f68> : "Ὢ" # U1f6a
+<Uff20> <U60> <U1f69> : "Ὣ" # U1f6b
+<Uff20> <U61> <U22> : "ä" # Ue4
+<Uff20> <U61> <U27> : "á" # Ue1
+<Uff20> <U61> <U28> : "ă" # U103
+<Uff20> <U61> <U2a> : "å" # Ue5
+<Uff20> <U61> <U2c> : "ą" # U105
+<Uff20> <U61> <U2d> : "ā" # U101
+<Uff20> <U61> <U3b> : "ą" # U105
+<Uff20> <U61> <U3e> : "â" # Ue2
+<Uff20> <U61> <U5e> : "â" # Ue2
+<Uff20> <U61> <U5f> : "ā" # U101
+<Uff20> <U61> <U60> : "à" # Ue0
+<Uff20> <U61> <U61> : "å" # Ue5
+<Uff20> <U61> <U65> : "æ" # Ue6
+<Uff20> <U61> <U7e> : "ã" # Ue3
+<Uff20> <U61> <Ua8> : "ä" # Ue4
+<Uff20> <U61> <Ub4> : "á" # Ue1
+<Uff20> <U62> <U2e> : "ḃ" # U1e03
+<Uff20> <U62> <U41> : "Ă" # U102
+<Uff20> <U62> <U45> : "Ĕ" # U114
+<Uff20> <U62> <U47> : "Ğ" # U11e
+<Uff20> <U62> <U49> : "Ĭ" # U12c
+<Uff20> <U62> <U4f> : "Ŏ" # U14e
+<Uff20> <U62> <U55> : "Ŭ" # U16c
+<Uff20> <U62> <U61> : "ă" # U103
+<Uff20> <U62> <U65> : "ĕ" # U115
+<Uff20> <U62> <U67> : "ğ" # U11f
+<Uff20> <U62> <U69> : "ĭ" # U12d
+<Uff20> <U62> <U6f> : "ŏ" # U14f
+<Uff20> <U62> <U75> : "ŭ" # U16d
+<Uff20> <U62> <U228> : "Ḝ" # U1e1c
+<Uff20> <U62> <U229> : "ḝ" # U1e1d
+<Uff20> <U62> <U6c1> : "ӑ" # U4d1
+<Uff20> <U62> <U6c5> : "ӗ" # U4d7
+<Uff20> <U62> <U6c9> : "й" # U439
+<Uff20> <U62> <U6d5> : "ў" # U45e
+<Uff20> <U62> <U6d6> : "ӂ" # U4c2
+<Uff20> <U62> <U6e1> : "Ӑ" # U4d0
+<Uff20> <U62> <U6e5> : "Ӗ" # U4d6
+<Uff20> <U62> <U6e9> : "Й" # U419
+<Uff20> <U62> <U6f5> : "Ў" # U40e
+<Uff20> <U62> <U6f6> : "Ӂ" # U4c1
+<Uff20> <U62> <U7c1> : "Ᾰ" # U1fb8
+<Uff20> <U62> <U7c9> : "Ῐ" # U1fd8
+<Uff20> <U62> <U7d5> : "Ῠ" # U1fe8
+<Uff20> <U62> <U7e1> : "ᾰ" # U1fb0
+<Uff20> <U62> <U7e9> : "ῐ" # U1fd0
+<Uff20> <U62> <U7f5> : "ῠ" # U1fe0
+<Uff20> <U62> <U1ea0> : "Ặ" # U1eb6
+<Uff20> <U62> <U1ea1> : "ặ" # U1eb7
+<Uff20> <U63> <U27> : "ć" # U107
+<Uff20> <U63> <U2c> : "ç" # Ue7
+<Uff20> <U63> <U2e> : "ċ" # U10b
+<Uff20> <U63> <U2f> : "¢" # Ua2
+<Uff20> <U63> <U3c> : "č" # U10d
+<Uff20> <U63> <U3d> : "€" # U20ac
+<Uff20> <U63> <U41> : "Ǎ" # U1cd
+<Uff20> <U63> <U43> : "Č" # U10c
+<Uff20> <U63> <U44> : "Ď" # U10e
+<Uff20> <U63> <U45> : "Ě" # U11a
+<Uff20> <U63> <U47> : "Ǧ" # U1e6
+<Uff20> <U63> <U48> : "Ȟ" # U21e
+<Uff20> <U63> <U49> : "Ǐ" # U1cf
+<Uff20> <U63> <U4b> : "Ǩ" # U1e8
+<Uff20> <U63> <U4c> : "Ľ" # U13d
+<Uff20> <U63> <U4e> : "Ň" # U147
+<Uff20> <U63> <U4f> : "Ǒ" # U1d1
+<Uff20> <U63> <U52> : "Ř" # U158
+<Uff20> <U63> <U53> : "Š" # U160
+<Uff20> <U63> <U54> : "Ť" # U164
+<Uff20> <U63> <U55> : "Ǔ" # U1d3
+<Uff20> <U63> <U5a> : "Ž" # U17d
+<Uff20> <U63> <U61> : "ǎ" # U1ce
+<Uff20> <U63> <U63> : "č" # U10d
+<Uff20> <U63> <U64> : "ď" # U10f
+<Uff20> <U63> <U65> : "ě" # U11b
+<Uff20> <U63> <U67> : "ǧ" # U1e7
+<Uff20> <U63> <U68> : "ȟ" # U21f
+<Uff20> <U63> <U69> : "ǐ" # U1d0
+<Uff20> <U63> <U6a> : "ǰ" # U1f0
+<Uff20> <U63> <U6b> : "ǩ" # U1e9
+<Uff20> <U63> <U6c> : "ľ" # U13e
+<Uff20> <U63> <U6e> : "ň" # U148
+<Uff20> <U63> <U6f> : "ǒ" # U1d2
+<Uff20> <U63> <U72> : "ř" # U159
+<Uff20> <U63> <U73> : "š" # U161
+<Uff20> <U63> <U74> : "ť" # U165
+<Uff20> <U63> <U75> : "ǔ" # U1d4
+<Uff20> <U63> <U7a> : "ž" # U17e
+<Uff20> <U63> <U7c> : "¢" # Ua2
+<Uff20> <U63> <Udc> : "Ǚ" # U1d9
+<Uff20> <U63> <Ufc> : "ǚ" # U1da
+<Uff20> <U64> <U2c> : "ḑ" # U1e11
+<Uff20> <U64> <U2d> : "đ" # U111
+<Uff20> <U64> <U2e> : "ḋ" # U1e0b
+<Uff20> <U64> <U3c> : "ď" # U10f
+<Uff20> <U64> <U3d> : "₫" # U20ab
+<Uff20> <U64> <U68> : "ð" # Uf0
+<Uff20> <U64> <U69> : "⌀" # U2300
+<Uff20> <U65> <U22> : "ë" # Ueb
+<Uff20> <U65> <U27> : "é" # Ue9
+<Uff20> <U65> <U2c> : "ę" # U119
+<Uff20> <U65> <U2d> : "ē" # U113
+<Uff20> <U65> <U2e> : "ė" # U117
+<Uff20> <U65> <U3b> : "ę" # U119
+<Uff20> <U65> <U3c> : "ě" # U11b
+<Uff20> <U65> <U3d> : "€" # U20ac
+<Uff20> <U65> <U3e> : "ê" # Uea
+<Uff20> <U65> <U5e> : "ê" # Uea
+<Uff20> <U65> <U5f> : "ē" # U113
+<Uff20> <U65> <U60> : "è" # Ue8
+<Uff20> <U65> <U65> : "ə" # U259
+<Uff20> <U65> <Ua8> : "ë" # Ueb
+<Uff20> <U65> <Ub4> : "é" # Ue9
+<Uff20> <U66> <U2e> : "ḟ" # U1e1f
+<Uff20> <U66> <U53> : "ſ" # U17f
+<Uff20> <U66> <U66> : "ff" # Ufb00
+<Uff20> <U66> <U69> : "fi" # Ufb01
+<Uff20> <U66> <U6c> : "fl" # Ufb02
+<Uff20> <U66> <U73> : "ſ" # U17f
+<Uff20> <U67> <U28> : "ğ" # U11f
+<Uff20> <U67> <U2c> : "ģ" # U123
+<Uff20> <U67> <U2e> : "ġ" # U121
+<Uff20> <U67> <U55> : "ğ" # U11f
+<Uff20> <U67> <U74> : ">" # U3e
+<Uff20> <U67> <U1a2> : "ğ" # U11f
+<Uff20> <U68> <U2c> : "ḩ" # U1e29
+<Uff20> <U69> <U22> : "ï" # Uef
+<Uff20> <U69> <U27> : "í" # Ued
+<Uff20> <U69> <U2c> : "į" # U12f
+<Uff20> <U69> <U2d> : "ī" # U12b
+<Uff20> <U69> <U2e> : "ı" # U131
+<Uff20> <U69> <U3b> : "į" # U12f
+<Uff20> <U69> <U3e> : "î" # Uee
+<Uff20> <U69> <U5e> : "î" # Uee
+<Uff20> <U69> <U5f> : "ī" # U12b
+<Uff20> <U69> <U60> : "ì" # Uec
+<Uff20> <U69> <U6a> : "ij" # U133
+<Uff20> <U69> <U7e> : "ĩ" # U129
+<Uff20> <U69> <Ua8> : "ï" # Uef
+<Uff20> <U69> <Ub4> : "í" # Ued
+<Uff20> <U6a> <U27> : "j́"
+<Uff20> <U6a> <Ub4> : "j́"
+<Uff20> <U6b> <U2c> : "ķ" # U137
+<Uff20> <U6b> <U6b> : "ĸ" # U138
+<Uff20> <U6c> <U27> : "ĺ" # U13a
+<Uff20> <U6c> <U2c> : "ļ" # U13c
+<Uff20> <U6c> <U2d> : "£" # Ua3
+<Uff20> <U6c> <U2f> : "ł" # U142
+<Uff20> <U6c> <U3c> : "ľ" # U13e
+<Uff20> <U6c> <U74> : "<" # U3c
+<Uff20> <U6c> <U76> : "|" # U7c
+<Uff20> <U6d> <U2e> : "ṁ" # U1e41
+<Uff20> <U6d> <U2f> : "₥" # U20a5
+<Uff20> <U6d> <U75> : "µ" # Ub5
+<Uff20> <U6e> <U27> : "ń" # U144
+<Uff20> <U6e> <U2c> : "ņ" # U146
+<Uff20> <U6e> <U3c> : "ň" # U148
+<Uff20> <U6e> <U67> : "ŋ" # U14b
+<Uff20> <U6e> <U7e> : "ñ" # Uf1
+<Uff20> <U6f> <U22> : "ö" # Uf6
+<Uff20> <U6f> <U27> : "ó" # Uf3
+<Uff20> <U6f> <U2c> : "ǫ" # U1eb
+<Uff20> <U6f> <U2d> : "ō" # U14d
+<Uff20> <U6f> <U2f> : "ø" # Uf8
+<Uff20> <U6f> <U3b> : "ǫ" # U1eb
+<Uff20> <U6f> <U3e> : "ô" # Uf4
+<Uff20> <U6f> <U41> : "Å" # Uc5
+<Uff20> <U6f> <U43> : "©" # Ua9
+<Uff20> <U6f> <U52> : "®" # Uae
+<Uff20> <U6f> <U55> : "Ů" # U16e
+<Uff20> <U6f> <U58> : "¤" # Ua4
+<Uff20> <U6f> <U5e> : "ô" # Uf4
+<Uff20> <U6f> <U5f> : "ō" # U14d
+<Uff20> <U6f> <U60> : "ò" # Uf2
+<Uff20> <U6f> <U61> : "å" # Ue5
+<Uff20> <U6f> <U63> : "©" # Ua9
+<Uff20> <U6f> <U65> : "œ" # U153
+<Uff20> <U6f> <U6f> : "°" # Ub0
+<Uff20> <U6f> <U72> : "®" # Uae
+<Uff20> <U6f> <U73> : "§" # Ua7
+<Uff20> <U6f> <U75> : "ů" # U16f
+<Uff20> <U6f> <U77> : "ẘ" # U1e98
+<Uff20> <U6f> <U78> : "¤" # Ua4
+<Uff20> <U6f> <U79> : "ẙ" # U1e99
+<Uff20> <U6f> <U7e> : "õ" # Uf5
+<Uff20> <U6f> <Ua8> : "ö" # Uf6
+<Uff20> <U6f> <Ub4> : "ó" # Uf3
+<Uff20> <U70> <U21> : "¶" # Ub6
+<Uff20> <U70> <U2e> : "ṗ" # U1e57
+<Uff20> <U70> <U3d> : "₽" # U20bd
+<Uff20> <U72> <U27> : "ŕ" # U155
+<Uff20> <U72> <U2c> : "ŗ" # U157
+<Uff20> <U72> <U3c> : "ř" # U159
+<Uff20> <U72> <U3d> : "₹" # U20b9
+<Uff20> <U73> <U21> : "§" # Ua7
+<Uff20> <U73> <U27> : "ś" # U15b
+<Uff20> <U73> <U2c> : "ş" # U15f
+<Uff20> <U73> <U2e> : "ṡ" # U1e61
+<Uff20> <U73> <U3b> : "ș" # U219
+<Uff20> <U73> <U3c> : "š" # U161
+<Uff20> <U73> <U4d> : "℠" # U2120
+<Uff20> <U73> <U6d> : "℠" # U2120
+<Uff20> <U73> <U6f> : "§" # Ua7
+<Uff20> <U73> <U73> : "ß" # Udf
+<Uff20> <U73> <Ub8> : "ş" # U15f
+<Uff20> <U74> <U2c> : "ţ" # U163
+<Uff20> <U74> <U2d> : "ŧ" # U167
+<Uff20> <U74> <U2e> : "ṫ" # U1e6b
+<Uff20> <U74> <U2f> : "ŧ" # U167
+<Uff20> <U74> <U3b> : "ț" # U21b
+<Uff20> <U74> <U3c> : "ť" # U165
+<Uff20> <U74> <U4d> : "™" # U2122
+<Uff20> <U74> <U68> : "þ" # Ufe
+<Uff20> <U74> <U6d> : "™" # U2122
+<Uff20> <U75> <U22> : "ü" # Ufc
+<Uff20> <U75> <U27> : "ú" # Ufa
+<Uff20> <U75> <U2a> : "ů" # U16f
+<Uff20> <U75> <U2c> : "ų" # U173
+<Uff20> <U75> <U2d> : "ū" # U16b
+<Uff20> <U75> <U2f> : "µ" # Ub5
+<Uff20> <U75> <U3b> : "ų" # U173
+<Uff20> <U75> <U3e> : "û" # Ufb
+<Uff20> <U75> <U41> : "Ă" # U102
+<Uff20> <U75> <U55> : "Ŭ" # U16c
+<Uff20> <U75> <U5e> : "û" # Ufb
+<Uff20> <U75> <U5f> : "ū" # U16b
+<Uff20> <U75> <U60> : "ù" # Uf9
+<Uff20> <U75> <U61> : "ă" # U103
+<Uff20> <U75> <U75> : "ŭ" # U16d
+<Uff20> <U75> <U7e> : "ũ" # U169
+<Uff20> <U75> <Ua8> : "ü" # Ufc
+<Uff20> <U75> <Ub4> : "ú" # Ufa
+<Uff20> <U76> <U2f> : "√" # U221a
+<Uff20> <U76> <U41> : "Ǎ" # U1cd
+<Uff20> <U76> <U43> : "Č" # U10c
+<Uff20> <U76> <U44> : "Ď" # U10e
+<Uff20> <U76> <U45> : "Ě" # U11a
+<Uff20> <U76> <U47> : "Ǧ" # U1e6
+<Uff20> <U76> <U48> : "Ȟ" # U21e
+<Uff20> <U76> <U49> : "Ǐ" # U1cf
+<Uff20> <U76> <U4b> : "Ǩ" # U1e8
+<Uff20> <U76> <U4e> : "Ň" # U147
+<Uff20> <U76> <U4f> : "Ǒ" # U1d1
+<Uff20> <U76> <U52> : "Ř" # U158
+<Uff20> <U76> <U53> : "Š" # U160
+<Uff20> <U76> <U54> : "Ť" # U164
+<Uff20> <U76> <U55> : "Ǔ" # U1d3
+<Uff20> <U76> <U5a> : "Ž" # U17d
+<Uff20> <U76> <U61> : "ǎ" # U1ce
+<Uff20> <U76> <U63> : "č" # U10d
+<Uff20> <U76> <U64> : "ď" # U10f
+<Uff20> <U76> <U65> : "ě" # U11b
+<Uff20> <U76> <U67> : "ǧ" # U1e7
+<Uff20> <U76> <U68> : "ȟ" # U21f
+<Uff20> <U76> <U69> : "ǐ" # U1d0
+<Uff20> <U76> <U6a> : "ǰ" # U1f0
+<Uff20> <U76> <U6b> : "ǩ" # U1e9
+<Uff20> <U76> <U6c> : "|" # U7c
+<Uff20> <U76> <U6e> : "ň" # U148
+<Uff20> <U76> <U6f> : "ǒ" # U1d2
+<Uff20> <U76> <U72> : "ř" # U159
+<Uff20> <U76> <U73> : "š" # U161
+<Uff20> <U76> <U74> : "ť" # U165
+<Uff20> <U76> <U75> : "ǔ" # U1d4
+<Uff20> <U76> <U7a> : "ž" # U17e
+<Uff20> <U76> <U7c> : "↓" # U2193
+<Uff20> <U77> <U5e> : "ŵ" # U175
+<Uff20> <U78> <U4f> : "¤" # Ua4
+<Uff20> <U78> <U6f> : "¤" # Ua4
+<Uff20> <U78> <U78> : "×" # Ud7
+<Uff20> <U79> <U22> : "ÿ" # Uff
+<Uff20> <U79> <U27> : "ý" # Ufd
+<Uff20> <U79> <U2d> : "¥" # Ua5
+<Uff20> <U79> <U3d> : "¥" # Ua5
+<Uff20> <U79> <U5e> : "ŷ" # U177
+<Uff20> <U79> <Ua8> : "ÿ" # Uff
+<Uff20> <U79> <Ub4> : "ý" # Ufd
+<Uff20> <U7a> <U27> : "ź" # U17a
+<Uff20> <U7a> <U2e> : "ż" # U17c
+<Uff20> <U7a> <U3c> : "ž" # U17e
+<Uff20> <U7b> <U7d> : "∅" # U2205
+<Uff20> <U7c> <U43> : "¢" # Ua2
+<Uff20> <U7c> <U5e> : "↑" # U2191
+<Uff20> <U7c> <U63> : "¢" # Ua2
+<Uff20> <U7c> <U76> : "↓" # U2193
+<Uff20> <U7c> <U7e> : "⍭" # U236d
+<Uff20> <U7c> <U2190> : "⍅" # U2345
+<Uff20> <U7c> <U2192> : "⍆" # U2346
+<Uff20> <U7c> <U2206> : "⍋" # U234b
+<Uff20> <U7c> <U2207> : "⍒" # U2352
+<Uff20> <U7c> <U222a> : "⍦" # U2366
+<Uff20> <U7c> <U2282> : "⍧" # U2367
+<Uff20> <U7c> <U25cb> : "⌽" # U233d
+<Uff20> <U7e> <U20> : "~" # U7e
+<Uff20> <U7e> <U30> : "⍬" # U236c
+<Uff20> <U7e> <U41> : "Ã" # Uc3
+<Uff20> <U7e> <U45> : "Ẽ" # U1ebc
+<Uff20> <U7e> <U49> : "Ĩ" # U128
+<Uff20> <U7e> <U4e> : "Ñ" # Ud1
+<Uff20> <U7e> <U4f> : "Õ" # Ud5
+<Uff20> <U7e> <U55> : "Ũ" # U168
+<Uff20> <U7e> <U56> : "Ṽ" # U1e7c
+<Uff20> <U7e> <U59> : "Ỹ" # U1ef8
+<Uff20> <U7e> <U61> : "ã" # Ue3
+<Uff20> <U7e> <U65> : "ẽ" # U1ebd
+<Uff20> <U7e> <U69> : "ĩ" # U129
+<Uff20> <U7e> <U6e> : "ñ" # Uf1
+<Uff20> <U7e> <U6f> : "õ" # Uf5
+<Uff20> <U7e> <U75> : "ũ" # U169
+<Uff20> <U7e> <U76> : "ṽ" # U1e7d
+<Uff20> <U7e> <U79> : "ỹ" # U1ef9
+<Uff20> <U7e> <U7c> : "⍭" # U236d
+<Uff20> <U7e> <U7e> : "≈" # U2248
+<Uff20> <U7e> <Ua8> : "⍨" # U2368
+<Uff20> <U7e> <Uc2> : "Ẫ" # U1eaa
+<Uff20> <U7e> <Uca> : "Ễ" # U1ec4
+<Uff20> <U7e> <Ud4> : "Ỗ" # U1ed6
+<Uff20> <U7e> <Ue2> : "ẫ" # U1eab
+<Uff20> <U7e> <Uea> : "ễ" # U1ec5
+<Uff20> <U7e> <Uf4> : "ỗ" # U1ed7
+<Uff20> <U7e> <U1c3> : "Ẵ" # U1eb4
+<Uff20> <U7e> <U1e3> : "ẵ" # U1eb5
+<Uff20> <U7e> <U7b5> : "ῗ" # U1fd7
+<Uff20> <U7e> <U7b9> : "ῧ" # U1fe7
+<Uff20> <U7e> <U7e1> : "ᾶ" # U1fb6
+<Uff20> <U7e> <U7e7> : "ῆ" # U1fc6
+<Uff20> <U7e> <U7e9> : "ῖ" # U1fd6
+<Uff20> <U7e> <U7f5> : "ῦ" # U1fe6
+<Uff20> <U7e> <U7f9> : "ῶ" # U1ff6
+<Uff20> <U7e> <U1f00> : "ἆ" # U1f06
+<Uff20> <U7e> <U1f01> : "ἇ" # U1f07
+<Uff20> <U7e> <U1f08> : "Ἆ" # U1f0e
+<Uff20> <U7e> <U1f09> : "Ἇ" # U1f0f
+<Uff20> <U7e> <U1f20> : "ἦ" # U1f26
+<Uff20> <U7e> <U1f21> : "ἧ" # U1f27
+<Uff20> <U7e> <U1f28> : "Ἦ" # U1f2e
+<Uff20> <U7e> <U1f29> : "Ἧ" # U1f2f
+<Uff20> <U7e> <U1f30> : "ἶ" # U1f36
+<Uff20> <U7e> <U1f31> : "ἷ" # U1f37
+<Uff20> <U7e> <U1f38> : "Ἶ" # U1f3e
+<Uff20> <U7e> <U1f39> : "Ἷ" # U1f3f
+<Uff20> <U7e> <U1f50> : "ὖ" # U1f56
+<Uff20> <U7e> <U1f51> : "ὗ" # U1f57
+<Uff20> <U7e> <U1f59> : "Ὗ" # U1f5f
+<Uff20> <U7e> <U1f60> : "ὦ" # U1f66
+<Uff20> <U7e> <U1f61> : "ὧ" # U1f67
+<Uff20> <U7e> <U1f68> : "Ὦ" # U1f6e
+<Uff20> <U7e> <U1f69> : "Ὧ" # U1f6f
+<Uff20> <U7e> <U2207> : "⍫" # U236b
+<Uff20> <U7e> <U2227> : "⍲" # U2372
+<Uff20> <U7e> <U2228> : "⍱" # U2371
+<Uff20> <Ua8> <U27> : "΅" # U385
+<Uff20> <Ua8> <U2a> : "⍣" # U2363
+<Uff20> <Ua8> <U3e> : "⍩" # U2369
+<Uff20> <Ua8> <U41> : "Ä" # Uc4
+<Uff20> <Ua8> <U45> : "Ë" # Ucb
+<Uff20> <Ua8> <U49> : "Ï" # Ucf
+<Uff20> <Ua8> <U4f> : "Ö" # Ud6
+<Uff20> <Ua8> <U55> : "Ü" # Udc
+<Uff20> <Ua8> <U59> : "Ÿ" # U178
+<Uff20> <Ua8> <U60> : "῭" # U1fed
+<Uff20> <Ua8> <U61> : "ä" # Ue4
+<Uff20> <Ua8> <U65> : "ë" # Ueb
+<Uff20> <Ua8> <U69> : "ï" # Uef
+<Uff20> <Ua8> <U6f> : "ö" # Uf6
+<Uff20> <Ua8> <U75> : "ü" # Ufc
+<Uff20> <Ua8> <U79> : "ÿ" # Uff
+<Uff20> <Ua8> <U7e> : "῁" # U1fc1
+<Uff20> <Ua8> <Ub4> : "΅" # U385
+<Uff20> <Ua8> <U2207> : "⍢" # U2362
+<Uff20> <Ua8> <U2218> : "⍤" # U2364
+<Uff20> <Ua8> <U22a4> : "⍡" # U2361
+<Uff20> <Ua8> <U25cb> : "⍥" # U2365
+<Uff20> <Ua8> <Ufe50> : "῭" # U1fed
+<Uff20> <Ua8> <Ufe51> : "΅" # U385
+<Uff20> <Ua8> <Ufe53> : "῁" # U1fc1
+<Uff20> <Uaf> <U41> : "Ā" # U100
+<Uff20> <Uaf> <U45> : "Ē" # U112
+<Uff20> <Uaf> <U47> : "Ḡ" # U1e20
+<Uff20> <Uaf> <U49> : "Ī" # U12a
+<Uff20> <Uaf> <U4f> : "Ō" # U14c
+<Uff20> <Uaf> <U55> : "Ū" # U16a
+<Uff20> <Uaf> <U59> : "Ȳ" # U232
+<Uff20> <Uaf> <U61> : "ā" # U101
+<Uff20> <Uaf> <U65> : "ē" # U113
+<Uff20> <Uaf> <U67> : "ḡ" # U1e21
+<Uff20> <Uaf> <U69> : "ī" # U12b
+<Uff20> <Uaf> <U6f> : "ō" # U14d
+<Uff20> <Uaf> <U75> : "ū" # U16b
+<Uff20> <Uaf> <U79> : "ȳ" # U233
+<Uff20> <Uaf> <Uc4> : "Ǟ" # U1de
+<Uff20> <Uaf> <Uc6> : "Ǣ" # U1e2
+<Uff20> <Uaf> <Ud5> : "Ȭ" # U22c
+<Uff20> <Uaf> <Ud6> : "Ȫ" # U22a
+<Uff20> <Uaf> <Udc> : "Ǖ" # U1d5
+<Uff20> <Uaf> <Ue4> : "ǟ" # U1df
+<Uff20> <Uaf> <Ue6> : "ǣ" # U1e3
+<Uff20> <Uaf> <Uf5> : "ȭ" # U22d
+<Uff20> <Uaf> <Uf6> : "ȫ" # U22b
+<Uff20> <Uaf> <Ufc> : "ǖ" # U1d6
+<Uff20> <Uaf> <U1ea> : "Ǭ" # U1ec
+<Uff20> <Uaf> <U1eb> : "ǭ" # U1ed
+<Uff20> <Uaf> <U226> : "Ǡ" # U1e0
+<Uff20> <Uaf> <U227> : "ǡ" # U1e1
+<Uff20> <Uaf> <U22e> : "Ȱ" # U230
+<Uff20> <Uaf> <U22f> : "ȱ" # U231
+<Uff20> <Uaf> <U6c1> : "а̄"
+<Uff20> <Uaf> <U6c5> : "е̄"
+<Uff20> <Uaf> <U6c9> : "ӣ" # U4e3
+<Uff20> <Uaf> <U6cf> : "о̄"
+<Uff20> <Uaf> <U6d2> : "р̄"
+<Uff20> <Uaf> <U6d5> : "ӯ" # U4ef
+<Uff20> <Uaf> <U6e1> : "А̄"
+<Uff20> <Uaf> <U6e5> : "Е̄"
+<Uff20> <Uaf> <U6e9> : "Ӣ" # U4e2
+<Uff20> <Uaf> <U6ef> : "О̄"
+<Uff20> <Uaf> <U6f2> : "Р̄"
+<Uff20> <Uaf> <U6f5> : "Ӯ" # U4ee
+<Uff20> <Uaf> <U7c1> : "Ᾱ" # U1fb9
+<Uff20> <Uaf> <U7c9> : "Ῑ" # U1fd9
+<Uff20> <Uaf> <U7d5> : "Ῡ" # U1fe9
+<Uff20> <Uaf> <U7e1> : "ᾱ" # U1fb1
+<Uff20> <Uaf> <U7e9> : "ῑ" # U1fd1
+<Uff20> <Uaf> <U7f5> : "ῡ" # U1fe1
+<Uff20> <Uaf> <U1e36> : "Ḹ" # U1e38
+<Uff20> <Uaf> <U1e37> : "ḹ" # U1e39
+<Uff20> <Uaf> <U1e5a> : "Ṝ" # U1e5c
+<Uff20> <Uaf> <U1e5b> : "ṝ" # U1e5d
+<Uff20> <Uaf> <U22a4> : "⍑" # U2351
+<Uff20> <Ub4> <U41> : "Á" # Uc1
+<Uff20> <Ub4> <U43> : "Ć" # U106
+<Uff20> <Ub4> <U45> : "É" # Uc9
+<Uff20> <Ub4> <U47> : "Ǵ" # U1f4
+<Uff20> <Ub4> <U49> : "Í" # Ucd
+<Uff20> <Ub4> <U4a> : "J́"
+<Uff20> <Ub4> <U4b> : "Ḱ" # U1e30
+<Uff20> <Ub4> <U4c> : "Ĺ" # U139
+<Uff20> <Ub4> <U4d> : "Ḿ" # U1e3e
+<Uff20> <Ub4> <U4e> : "Ń" # U143
+<Uff20> <Ub4> <U4f> : "Ó" # Ud3
+<Uff20> <Ub4> <U50> : "Ṕ" # U1e54
+<Uff20> <Ub4> <U52> : "Ŕ" # U154
+<Uff20> <Ub4> <U53> : "Ś" # U15a
+<Uff20> <Ub4> <U55> : "Ú" # Uda
+<Uff20> <Ub4> <U57> : "Ẃ" # U1e82
+<Uff20> <Ub4> <U59> : "Ý" # Udd
+<Uff20> <Ub4> <U5a> : "Ź" # U179
+<Uff20> <Ub4> <U61> : "á" # Ue1
+<Uff20> <Ub4> <U63> : "ć" # U107
+<Uff20> <Ub4> <U65> : "é" # Ue9
+<Uff20> <Ub4> <U67> : "ǵ" # U1f5
+<Uff20> <Ub4> <U69> : "í" # Ued
+<Uff20> <Ub4> <U6a> : "j́"
+<Uff20> <Ub4> <U6b> : "ḱ" # U1e31
+<Uff20> <Ub4> <U6c> : "ĺ" # U13a
+<Uff20> <Ub4> <U6d> : "ḿ" # U1e3f
+<Uff20> <Ub4> <U6e> : "ń" # U144
+<Uff20> <Ub4> <U6f> : "ó" # Uf3
+<Uff20> <Ub4> <U70> : "ṕ" # U1e55
+<Uff20> <Ub4> <U72> : "ŕ" # U155
+<Uff20> <Ub4> <U73> : "ś" # U15b
+<Uff20> <Ub4> <U75> : "ú" # Ufa
+<Uff20> <Ub4> <U77> : "ẃ" # U1e83
+<Uff20> <Ub4> <U79> : "ý" # Ufd
+<Uff20> <Ub4> <U7a> : "ź" # U17a
+<Uff20> <Ub4> <Uc2> : "Ấ" # U1ea4
+<Uff20> <Ub4> <Uc5> : "Ǻ" # U1fa
+<Uff20> <Ub4> <Uc6> : "Ǽ" # U1fc
+<Uff20> <Ub4> <Uc7> : "Ḉ" # U1e08
+<Uff20> <Ub4> <Uca> : "Ế" # U1ebe
+<Uff20> <Ub4> <Ucf> : "Ḯ" # U1e2e
+<Uff20> <Ub4> <Ud4> : "Ố" # U1ed0
+<Uff20> <Ub4> <Ud5> : "Ṍ" # U1e4c
+<Uff20> <Ub4> <Ud8> : "Ǿ" # U1fe
+<Uff20> <Ub4> <Udc> : "Ǘ" # U1d7
+<Uff20> <Ub4> <Ue2> : "ấ" # U1ea5
+<Uff20> <Ub4> <Ue5> : "ǻ" # U1fb
+<Uff20> <Ub4> <Ue6> : "ǽ" # U1fd
+<Uff20> <Ub4> <Ue7> : "ḉ" # U1e09
+<Uff20> <Ub4> <Uea> : "ế" # U1ebf
+<Uff20> <Ub4> <Uef> : "ḯ" # U1e2f
+<Uff20> <Ub4> <Uf4> : "ố" # U1ed1
+<Uff20> <Ub4> <Uf5> : "ṍ" # U1e4d
+<Uff20> <Ub4> <Uf8> : "ǿ" # U1ff
+<Uff20> <Ub4> <Ufc> : "ǘ" # U1d8
+<Uff20> <Ub4> <U1c3> : "Ắ" # U1eae
+<Uff20> <Ub4> <U1e3> : "ắ" # U1eaf
+<Uff20> <Ub4> <U3aa> : "Ḗ" # U1e16
+<Uff20> <Ub4> <U3ba> : "ḗ" # U1e17
+<Uff20> <Ub4> <U3d2> : "Ṓ" # U1e52
+<Uff20> <Ub4> <U3dd> : "Ṹ" # U1e78
+<Uff20> <Ub4> <U3f2> : "ṓ" # U1e53
+<Uff20> <Ub4> <U3fd> : "ṹ" # U1e79
+<Uff20> <Ub4> <U6c0> : "ю́"
+<Uff20> <Ub4> <U6c1> : "а́"
+<Uff20> <Ub4> <U6c5> : "е́"
+<Uff20> <Ub4> <U6c7> : "ѓ" # U453
+<Uff20> <Ub4> <U6c9> : "и́"
+<Uff20> <Ub4> <U6cb> : "ќ" # U45c
+<Uff20> <Ub4> <U6cf> : "о́"
+<Uff20> <Ub4> <U6d1> : "я́"
+<Uff20> <Ub4> <U6d2> : "р́"
+<Uff20> <Ub4> <U6d5> : "у́"
+<Uff20> <Ub4> <U6d9> : "ы́"
+<Uff20> <Ub4> <U6dc> : "э́"
+<Uff20> <Ub4> <U6e0> : "Ю́́"
+<Uff20> <Ub4> <U6e1> : "А́"
+<Uff20> <Ub4> <U6e5> : "Е́"
+<Uff20> <Ub4> <U6e7> : "Ѓ" # U403
+<Uff20> <Ub4> <U6e9> : "И́"
+<Uff20> <Ub4> <U6eb> : "Ќ" # U40c
+<Uff20> <Ub4> <U6ef> : "О́"
+<Uff20> <Ub4> <U6f1> : "Я́"
+<Uff20> <Ub4> <U6f2> : "Р́"
+<Uff20> <Ub4> <U6f5> : "У́"
+<Uff20> <Ub4> <U6f9> : "Ы́"
+<Uff20> <Ub4> <U6fc> : "Э́"
+<Uff20> <Ub4> <U7b5> : "ΐ" # U390
+<Uff20> <Ub4> <U7b9> : "ΰ" # U3b0
+<Uff20> <Ub4> <U7c1> : "Ά" # U386
+<Uff20> <Ub4> <U7c5> : "Έ" # U388
+<Uff20> <Ub4> <U7c7> : "Ή" # U389
+<Uff20> <Ub4> <U7c9> : "Ί" # U38a
+<Uff20> <Ub4> <U7cf> : "Ό" # U38c
+<Uff20> <Ub4> <U7d5> : "Ύ" # U38e
+<Uff20> <Ub4> <U7d9> : "Ώ" # U38f
+<Uff20> <Ub4> <U7e1> : "ά" # U3ac
+<Uff20> <Ub4> <U7e5> : "έ" # U3ad
+<Uff20> <Ub4> <U7e7> : "ή" # U3ae
+<Uff20> <Ub4> <U7e9> : "ί" # U3af
+<Uff20> <Ub4> <U7ef> : "ό" # U3cc
+<Uff20> <Ub4> <U7f5> : "ύ" # U3cd
+<Uff20> <Ub4> <U7f9> : "ώ" # U3ce
+<Uff20> <Ub4> <U1f00> : "ἄ" # U1f04
+<Uff20> <Ub4> <U1f01> : "ἅ" # U1f05
+<Uff20> <Ub4> <U1f08> : "Ἄ" # U1f0c
+<Uff20> <Ub4> <U1f09> : "Ἅ" # U1f0d
+<Uff20> <Ub4> <U1f10> : "ἔ" # U1f14
+<Uff20> <Ub4> <U1f11> : "ἕ" # U1f15
+<Uff20> <Ub4> <U1f18> : "Ἔ" # U1f1c
+<Uff20> <Ub4> <U1f19> : "Ἕ" # U1f1d
+<Uff20> <Ub4> <U1f20> : "ἤ" # U1f24
+<Uff20> <Ub4> <U1f21> : "ἥ" # U1f25
+<Uff20> <Ub4> <U1f28> : "Ἤ" # U1f2c
+<Uff20> <Ub4> <U1f29> : "Ἥ" # U1f2d
+<Uff20> <Ub4> <U1f30> : "ἴ" # U1f34
+<Uff20> <Ub4> <U1f31> : "ἵ" # U1f35
+<Uff20> <Ub4> <U1f38> : "Ἴ" # U1f3c
+<Uff20> <Ub4> <U1f39> : "Ἵ" # U1f3d
+<Uff20> <Ub4> <U1f40> : "ὄ" # U1f44
+<Uff20> <Ub4> <U1f41> : "ὅ" # U1f45
+<Uff20> <Ub4> <U1f48> : "Ὄ" # U1f4c
+<Uff20> <Ub4> <U1f49> : "Ὅ" # U1f4d
+<Uff20> <Ub4> <U1f50> : "ὔ" # U1f54
+<Uff20> <Ub4> <U1f51> : "ὕ" # U1f55
+<Uff20> <Ub4> <U1f59> : "Ὕ" # U1f5d
+<Uff20> <Ub4> <U1f60> : "ὤ" # U1f64
+<Uff20> <Ub4> <U1f61> : "ὥ" # U1f65
+<Uff20> <Ub4> <U1f68> : "Ὤ" # U1f6c
+<Uff20> <Ub4> <U1f69> : "Ὥ" # U1f6d
+<Uff20> <Ub8> <U43> : "Ç" # Uc7
+<Uff20> <Ub8> <U44> : "Ḑ" # U1e10
+<Uff20> <Ub8> <U45> : "Ȩ" # U228
+<Uff20> <Ub8> <U47> : "Ģ" # U122
+<Uff20> <Ub8> <U48> : "Ḩ" # U1e28
+<Uff20> <Ub8> <U4b> : "Ķ" # U136
+<Uff20> <Ub8> <U4c> : "Ļ" # U13b
+<Uff20> <Ub8> <U4e> : "Ņ" # U145
+<Uff20> <Ub8> <U52> : "Ŗ" # U156
+<Uff20> <Ub8> <U53> : "Ş" # U15e
+<Uff20> <Ub8> <U54> : "Ţ" # U162
+<Uff20> <Ub8> <U63> : "ç" # Ue7
+<Uff20> <Ub8> <U64> : "ḑ" # U1e11
+<Uff20> <Ub8> <U65> : "ȩ" # U229
+<Uff20> <Ub8> <U67> : "ģ" # U123
+<Uff20> <Ub8> <U68> : "ḩ" # U1e29
+<Uff20> <Ub8> <U6b> : "ķ" # U137
+<Uff20> <Ub8> <U6c> : "ļ" # U13c
+<Uff20> <Ub8> <U6e> : "ņ" # U146
+<Uff20> <Ub8> <U72> : "ŗ" # U157
+<Uff20> <Ub8> <U73> : "ş" # U15f
+<Uff20> <Ub8> <U74> : "ţ" # U163
+<Uff20> <Uf7> <U2395> : "⌹" # U2339
+<Uff20> <U1a2> <U47> : "Ğ" # U11e
+<Uff20> <U1a2> <U67> : "ğ" # U11f
+<Uff20> <U5b4> <Uce9> : "יִ" # Ufb1d
+<Uff20> <U5b7> <U5f2> : "ײַ" # Ufb1f
+<Uff20> <U5b7> <Uce0> : "אַ" # Ufb2e
+<Uff20> <U5b8> <Uce0> : "אָ" # Ufb2f
+<Uff20> <U5b9> <Uce5> : "וֹ" # Ufb4b
+<Uff20> <U5bc> <Uce0> : "אּ" # Ufb30
+<Uff20> <U5bc> <Uce1> : "בּ" # Ufb31
+<Uff20> <U5bc> <Uce2> : "גּ" # Ufb32
+<Uff20> <U5bc> <Uce3> : "דּ" # Ufb33
+<Uff20> <U5bc> <Uce4> : "הּ" # Ufb34
+<Uff20> <U5bc> <Uce5> : "וּ" # Ufb35
+<Uff20> <U5bc> <Uce6> : "זּ" # Ufb36
+<Uff20> <U5bc> <Uce8> : "טּ" # Ufb38
+<Uff20> <U5bc> <Uce9> : "יּ" # Ufb39
+<Uff20> <U5bc> <Ucea> : "ךּ" # Ufb3a
+<Uff20> <U5bc> <Uceb> : "כּ" # Ufb3b
+<Uff20> <U5bc> <Ucec> : "לּ" # Ufb3c
+<Uff20> <U5bc> <Ucee> : "מּ" # Ufb3e
+<Uff20> <U5bc> <Ucf0> : "נּ" # Ufb40
+<Uff20> <U5bc> <Ucf1> : "סּ" # Ufb41
+<Uff20> <U5bc> <Ucf3> : "ףּ" # Ufb43
+<Uff20> <U5bc> <Ucf4> : "פּ" # Ufb44
+<Uff20> <U5bc> <Ucf6> : "צּ" # Ufb46
+<Uff20> <U5bc> <Ucf7> : "קּ" # Ufb47
+<Uff20> <U5bc> <Ucf8> : "רּ" # Ufb48
+<Uff20> <U5bc> <Ucf9> : "שּ" # Ufb49
+<Uff20> <U5bc> <Ucfa> : "תּ" # Ufb4a
+<Uff20> <U5bf> <Uce1> : "בֿ" # Ufb4c
+<Uff20> <U5bf> <Uceb> : "כֿ" # Ufb4d
+<Uff20> <U5bf> <Ucf4> : "פֿ" # Ufb4e
+<Uff20> <U5c1> <Ucf9> : "שׁ" # Ufb2a
+<Uff20> <U5c1> <Ufb49> : "שּׁ" # Ufb2c
+<Uff20> <U5c2> <Ucf9> : "שׂ" # Ufb2b
+<Uff20> <U5c2> <Ufb49> : "שּׂ" # Ufb2d
+<Uff20> <U653> <U5c7> : "آ" # U622
+<Uff20> <U654> <U5c7> : "أ" # U623
+<Uff20> <U654> <U5e8> : "ؤ" # U624
+<Uff20> <U654> <U5ea> : "ئ" # U626
+<Uff20> <U654> <U6c1> : "ۂ" # U6c2
+<Uff20> <U654> <U6d2> : "ۓ" # U6d3
+<Uff20> <U654> <U6d5> : "ۀ" # U6c0
+<Uff20> <U655> <U5c7> : "إ" # U625
+<Uff20> <U6d0> <U6c1> : "§" # Ua7
+<Uff20> <U6da> <U3d> : "₽" # U20bd
+<Uff20> <U6e5> <U3d> : "€" # U20ac
+<Uff20> <U6ee> <U6cf> : "№" # U2116
+<Uff20> <U6ee> <U6ef> : "№" # U2116
+<Uff20> <U6f3> <U3d> : "€" # U20ac
+<Uff20> <U6fa> <U3d> : "₽" # U20bd
+<Uff20> <U7c1> <U27> : "Ά" # U386
+<Uff20> <U7c5> <U27> : "Έ" # U388
+<Uff20> <U7c7> <U27> : "Ή" # U389
+<Uff20> <U7c9> <U22> : "Ϊ" # U3aa
+<Uff20> <U7c9> <U27> : "Ί" # U38a
+<Uff20> <U7cf> <U27> : "Ό" # U38c
+<Uff20> <U7d5> <U22> : "Ϋ" # U3ab
+<Uff20> <U7d5> <U27> : "Ύ" # U38e
+<Uff20> <U7d9> <U27> : "Ώ" # U38f
+<Uff20> <U7e1> <U27> : "ά" # U3ac
+<Uff20> <U7e5> <U27> : "έ" # U3ad
+<Uff20> <U7e7> <U27> : "ή" # U3ae
+<Uff20> <U7e9> <U22> : "ϊ" # U3ca
+<Uff20> <U7e9> <U7b1> : "ᾴ" # U1fb4
+<Uff20> <U7e9> <U7b3> : "ῄ" # U1fc4
+<Uff20> <U7e9> <U7bb> : "ῴ" # U1ff4
+<Uff20> <U7e9> <U7c1> : "ᾼ" # U1fbc
+<Uff20> <U7e9> <U7c7> : "ῌ" # U1fcc
+<Uff20> <U7e9> <U7d9> : "ῼ" # U1ffc
+<Uff20> <U7e9> <U7e1> : "ᾳ" # U1fb3
+<Uff20> <U7e9> <U7e7> : "ῃ" # U1fc3
+<Uff20> <U7e9> <U7f9> : "ῳ" # U1ff3
+<Uff20> <U7e9> <U1f00> : "ᾀ" # U1f80
+<Uff20> <U7e9> <U1f01> : "ᾁ" # U1f81
+<Uff20> <U7e9> <U1f02> : "ᾂ" # U1f82
+<Uff20> <U7e9> <U1f03> : "ᾃ" # U1f83
+<Uff20> <U7e9> <U1f04> : "ᾄ" # U1f84
+<Uff20> <U7e9> <U1f05> : "ᾅ" # U1f85
+<Uff20> <U7e9> <U1f06> : "ᾆ" # U1f86
+<Uff20> <U7e9> <U1f07> : "ᾇ" # U1f87
+<Uff20> <U7e9> <U1f08> : "ᾈ" # U1f88
+<Uff20> <U7e9> <U1f09> : "ᾉ" # U1f89
+<Uff20> <U7e9> <U1f0a> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <U1f0b> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <U1f0c> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <U1f0d> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <U1f0e> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <U1f0f> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <U1f20> : "ᾐ" # U1f90
+<Uff20> <U7e9> <U1f21> : "ᾑ" # U1f91
+<Uff20> <U7e9> <U1f22> : "ᾒ" # U1f92
+<Uff20> <U7e9> <U1f23> : "ᾓ" # U1f93
+<Uff20> <U7e9> <U1f24> : "ᾔ" # U1f94
+<Uff20> <U7e9> <U1f25> : "ᾕ" # U1f95
+<Uff20> <U7e9> <U1f26> : "ᾖ" # U1f96
+<Uff20> <U7e9> <U1f27> : "ᾗ" # U1f97
+<Uff20> <U7e9> <U1f28> : "ᾘ" # U1f98
+<Uff20> <U7e9> <U1f29> : "ᾙ" # U1f99
+<Uff20> <U7e9> <U1f2a> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <U1f2b> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <U1f2c> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <U1f2d> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <U1f2e> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <U1f2f> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <U1f60> : "ᾠ" # U1fa0
+<Uff20> <U7e9> <U1f61> : "ᾡ" # U1fa1
+<Uff20> <U7e9> <U1f62> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <U1f63> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <U1f64> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <U1f65> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <U1f66> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <U1f67> : "ᾧ" # U1fa7
+<Uff20> <U7e9> <U1f68> : "ᾨ" # U1fa8
+<Uff20> <U7e9> <U1f69> : "ᾩ" # U1fa9
+<Uff20> <U7e9> <U1f6a> : "ᾪ" # U1faa
+<Uff20> <U7e9> <U1f6b> : "ᾫ" # U1fab
+<Uff20> <U7e9> <U1f6c> : "ᾬ" # U1fac
+<Uff20> <U7e9> <U1f6d> : "ᾭ" # U1fad
+<Uff20> <U7e9> <U1f6e> : "ᾮ" # U1fae
+<Uff20> <U7e9> <U1f6f> : "ᾯ" # U1faf
+<Uff20> <U7e9> <U1f70> : "ᾲ" # U1fb2
+<Uff20> <U7e9> <U1f74> : "ῂ" # U1fc2
+<Uff20> <U7e9> <U1f7c> : "ῲ" # U1ff2
+<Uff20> <U7e9> <U1fb6> : "ᾷ" # U1fb7
+<Uff20> <U7e9> <U1fc6> : "ῇ" # U1fc7
+<Uff20> <U7e9> <U1ff6> : "ῷ" # U1ff7
+<Uff20> <U7ef> <U27> : "ό" # U3cc
+<Uff20> <U7f5> <U22> : "ϋ" # U3cb
+<Uff20> <U7f5> <U27> : "ύ" # U3cd
+<Uff20> <U7f9> <U27> : "ώ" # U3ce
+<Uff20> <U8bc> <U338> : "≰" # U2270
+<Uff20> <U8be> <U338> : "≱" # U2271
+<Uff20> <U8c8> <U338> : "≇" # U2247
+<Uff20> <U8cf> <U338> : "≢" # U2262
+<Uff20> <U8da> <U338> : "⊄" # U2284
+<Uff20> <U8db> <U338> : "⊅" # U2285
+<Uff20> <U93c> <U915> : "क़" # U958
+<Uff20> <U93c> <U916> : "ख़" # U959
+<Uff20> <U93c> <U917> : "ग़" # U95a
+<Uff20> <U93c> <U91c> : "ज़" # U95b
+<Uff20> <U93c> <U921> : "ड़" # U95c
+<Uff20> <U93c> <U922> : "ढ़" # U95d
+<Uff20> <U93c> <U928> : "ऩ" # U929
+<Uff20> <U93c> <U92b> : "फ़" # U95e
+<Uff20> <U93c> <U92f> : "य़" # U95f
+<Uff20> <U93c> <U930> : "ऱ" # U931
+<Uff20> <U93c> <U933> : "ऴ" # U934
+<Uff20> <U9bc> <U9a1> : "ড়" # U9dc
+<Uff20> <U9bc> <U9a2> : "ঢ়" # U9dd
+<Uff20> <U9bc> <U9af> : "য়" # U9df
+<Uff20> <U9c7> <U9be> : "ো" # U9cb
+<Uff20> <U9c7> <U9d7> : "ৌ" # U9cc
+<Uff20> <Ua3c> <Ua16> : "ਖ਼" # Ua59
+<Uff20> <Ua3c> <Ua17> : "ਗ਼" # Ua5a
+<Uff20> <Ua3c> <Ua1c> : "ਜ਼" # Ua5b
+<Uff20> <Ua3c> <Ua2b> : "ਫ਼" # Ua5e
+<Uff20> <Ua3c> <Ua32> : "ਲ਼" # Ua33
+<Uff20> <Ua3c> <Ua38> : "ਸ਼" # Ua36
+<Uff20> <Ub3c> <Ub21> : "ଡ଼" # Ub5c
+<Uff20> <Ub3c> <Ub22> : "ଢ଼" # Ub5d
+<Uff20> <Ub47> <Ub3e> : "ୋ" # Ub4b
+<Uff20> <Ub47> <Ub56> : "ୈ" # Ub48
+<Uff20> <Ub47> <Ub57> : "ୌ" # Ub4c
+<Uff20> <Uba3> <U338> : "≮" # U226e
+<Uff20> <Uba6> <U338> : "≯" # U226f
+<Uff20> <Ubc6> <U28> : "₍" # U208d
+<Uff20> <Ubc6> <U29> : "₎" # U208e
+<Uff20> <Ubc6> <U2b> : "₊" # U208a
+<Uff20> <Ubc6> <U30> : "₀" # U2080
+<Uff20> <Ubc6> <U31> : "₁" # U2081
+<Uff20> <Ubc6> <U32> : "₂" # U2082
+<Uff20> <Ubc6> <U33> : "₃" # U2083
+<Uff20> <Ubc6> <U34> : "₄" # U2084
+<Uff20> <Ubc6> <U35> : "₅" # U2085
+<Uff20> <Ubc6> <U36> : "₆" # U2086
+<Uff20> <Ubc6> <U37> : "₇" # U2087
+<Uff20> <Ubc6> <U38> : "₈" # U2088
+<Uff20> <Ubc6> <U39> : "₉" # U2089
+<Uff20> <Ubc6> <U3d> : "₌" # U208c
+<Uff20> <Ubc6> <Ubbe> : "ொ" # Ubca
+<Uff20> <Ubc6> <Ubd7> : "ௌ" # Ubcc
+<Uff20> <Ubc6> <U2212> : "₋" # U208b
+<Uff20> <Ubc6> <Uff80> : "₂" # U2082
+<Uff20> <Ubc6> <Uffab> : "₊" # U208a
+<Uff20> <Ubc6> <Uffb0> : "₀" # U2080
+<Uff20> <Ubc6> <Uffb1> : "₁" # U2081
+<Uff20> <Ubc6> <Uffb2> : "₂" # U2082
+<Uff20> <Ubc6> <Uffb3> : "₃" # U2083
+<Uff20> <Ubc6> <Uffb4> : "₄" # U2084
+<Uff20> <Ubc6> <Uffb5> : "₅" # U2085
+<Uff20> <Ubc6> <Uffb6> : "₆" # U2086
+<Uff20> <Ubc6> <Uffb7> : "₇" # U2087
+<Uff20> <Ubc6> <Uffb8> : "₈" # U2088
+<Uff20> <Ubc6> <Uffb9> : "₉" # U2089
+<Uff20> <Ubc6> <Uffbd> : "₌" # U208c
+<Uff20> <Ubc7> <Ubbe> : "ோ" # Ubcb
+<Uff20> <Ubd7> <Ub92> : "ஔ" # Ub94
+<Uff20> <Ubd8> <U338> : "⊅" # U2285
+<Uff20> <Ubda> <U338> : "⊄" # U2284
+<Uff20> <Ubfc> <U338> : "⊬" # U22ac
+<Uff20> <Uc46> <Uc56> : "ై" # Uc48
+<Uff20> <Ucbf> <Ucd5> : "ೀ" # Ucc0
+<Uff20> <Ucc6> <Ucc2> : "ೊ" # Ucca
+<Uff20> <Ucc6> <Ucd5> : "ೇ" # Ucc7
+<Uff20> <Ucc6> <Ucd6> : "ೈ" # Ucc8
+<Uff20> <Ucca> <Ucd5> : "ೋ" # Uccb
+<Uff20> <Ud46> <Ud3e> : "ൊ" # Ud4a
+<Uff20> <Ud46> <Ud57> : "ൌ" # Ud4c
+<Uff20> <Ud47> <Ud3e> : "ോ" # Ud4b
+<Uff20> <Udd9> <Udca> : "ේ" # Udda
+<Uff20> <Udd9> <Udcf> : "ො" # Uddc
+<Uff20> <Udd9> <Uddf> : "ෞ" # Udde
+<Uff20> <Uddc> <Udca> : "ෝ" # Uddd
+<Uff20> <Uf71> <Uf72> : "ཱི" # Uf73
+<Uff20> <Uf71> <Uf74> : "ཱུ" # Uf75
+<Uff20> <Uf71> <Uf80> : "ཱྀ" # Uf81
+<Uff20> <Uf90> <Ufb5> : "ྐྵ" # Ufb9
+<Uff20> <Uf92> <Ufb7> : "ྒྷ" # Uf93
+<Uff20> <Uf9c> <Ufb7> : "ྜྷ" # Uf9d
+<Uff20> <Ufa1> <Ufb7> : "ྡྷ" # Ufa2
+<Uff20> <Ufa6> <Ufb7> : "ྦྷ" # Ufa7
+<Uff20> <Ufab> <Ufb7> : "ྫྷ" # Ufac
+<Uff20> <Ufb2> <Uf80> : "ྲྀ" # Uf76
+<Uff20> <Ufb3> <Uf80> : "ླྀ" # Uf78
+<Uff20> <Ufb5> <Uf40> : "ཀྵ" # Uf69
+<Uff20> <Ufb7> <Uf42> : "གྷ" # Uf43
+<Uff20> <Ufb7> <Uf4c> : "ཌྷ" # Uf4d
+<Uff20> <Ufb7> <Uf51> : "དྷ" # Uf52
+<Uff20> <Ufb7> <Uf56> : "བྷ" # Uf57
+<Uff20> <Ufb7> <Uf5b> : "ཛྷ" # Uf5c
+<Uff20> <U102e> <U1025> : "ဦ" # U1026
+<Uff20> <U1100> <U1100> : "ᄁ" # U1101
+<Uff20> <U1102> <U1100> : "ᄓ" # U1113
+<Uff20> <U1102> <U1102> : "ᄔ" # U1114
+<Uff20> <U1102> <U1103> : "ᄕ" # U1115
+<Uff20> <U1102> <U1107> : "ᄖ" # U1116
+<Uff20> <U1103> <U1100> : "ᄗ" # U1117
+<Uff20> <U1103> <U1103> : "ᄄ" # U1104
+<Uff20> <U1105> <U1102> : "ᄘ" # U1118
+<Uff20> <U1105> <U1105> : "ᄙ" # U1119
+<Uff20> <U1105> <U110b> : "ᄛ" # U111b
+<Uff20> <U1105> <U1112> : "ᄚ" # U111a
+<Uff20> <U1106> <U1107> : "ᄜ" # U111c
+<Uff20> <U1106> <U110b> : "ᄝ" # U111d
+<Uff20> <U1107> <U1100> : "ᄞ" # U111e
+<Uff20> <U1107> <U1102> : "ᄟ" # U111f
+<Uff20> <U1107> <U1103> : "ᄠ" # U1120
+<Uff20> <U1107> <U1107> : "ᄈ" # U1108
+<Uff20> <U1107> <U1109> : "ᄡ" # U1121
+<Uff20> <U1107> <U110a> : "ᄥ" # U1125
+<Uff20> <U1107> <U110b> : "ᄫ" # U112b
+<Uff20> <U1107> <U110c> : "ᄧ" # U1127
+<Uff20> <U1107> <U110e> : "ᄨ" # U1128
+<Uff20> <U1107> <U1110> : "ᄩ" # U1129
+<Uff20> <U1107> <U1111> : "ᄪ" # U112a
+<Uff20> <U1107> <U112b> : "ᄬ" # U112c
+<Uff20> <U1107> <U112d> : "ᄢ" # U1122
+<Uff20> <U1107> <U112f> : "ᄣ" # U1123
+<Uff20> <U1107> <U1132> : "ᄤ" # U1124
+<Uff20> <U1107> <U1136> : "ᄦ" # U1126
+<Uff20> <U1108> <U110b> : "ᄬ" # U112c
+<Uff20> <U1109> <U1100> : "ᄭ" # U112d
+<Uff20> <U1109> <U1102> : "ᄮ" # U112e
+<Uff20> <U1109> <U1103> : "ᄯ" # U112f
+<Uff20> <U1109> <U1105> : "ᄰ" # U1130
+<Uff20> <U1109> <U1106> : "ᄱ" # U1131
+<Uff20> <U1109> <U1107> : "ᄲ" # U1132
+<Uff20> <U1109> <U1109> : "ᄊ" # U110a
+<Uff20> <U1109> <U110a> : "ᄴ" # U1134
+<Uff20> <U1109> <U110b> : "ᄵ" # U1135
+<Uff20> <U1109> <U110c> : "ᄶ" # U1136
+<Uff20> <U1109> <U110e> : "ᄷ" # U1137
+<Uff20> <U1109> <U110f> : "ᄸ" # U1138
+<Uff20> <U1109> <U1110> : "ᄹ" # U1139
+<Uff20> <U1109> <U1111> : "ᄺ" # U113a
+<Uff20> <U1109> <U1112> : "ᄻ" # U113b
+<Uff20> <U1109> <U111e> : "ᄳ" # U1133
+<Uff20> <U110a> <U1109> : "ᄴ" # U1134
+<Uff20> <U110b> <U1100> : "ᅁ" # U1141
+<Uff20> <U110b> <U1103> : "ᅂ" # U1142
+<Uff20> <U110b> <U1106> : "ᅃ" # U1143
+<Uff20> <U110b> <U1107> : "ᅄ" # U1144
+<Uff20> <U110b> <U1109> : "ᅅ" # U1145
+<Uff20> <U110b> <U110b> : "ᅇ" # U1147
+<Uff20> <U110b> <U110c> : "ᅈ" # U1148
+<Uff20> <U110b> <U110e> : "ᅉ" # U1149
+<Uff20> <U110b> <U1110> : "ᅊ" # U114a
+<Uff20> <U110b> <U1111> : "ᅋ" # U114b
+<Uff20> <U110b> <U1140> : "ᅆ" # U1146
+<Uff20> <U110c> <U110b> : "ᅍ" # U114d
+<Uff20> <U110c> <U110c> : "ᄍ" # U110d
+<Uff20> <U110e> <U110f> : "ᅒ" # U1152
+<Uff20> <U110e> <U1112> : "ᅓ" # U1153
+<Uff20> <U1111> <U1107> : "ᅖ" # U1156
+<Uff20> <U1111> <U110b> : "ᅗ" # U1157
+<Uff20> <U1112> <U1112> : "ᅘ" # U1158
+<Uff20> <U1121> <U1100> : "ᄢ" # U1122
+<Uff20> <U1121> <U1103> : "ᄣ" # U1123
+<Uff20> <U1121> <U1107> : "ᄤ" # U1124
+<Uff20> <U1121> <U1109> : "ᄥ" # U1125
+<Uff20> <U1121> <U110c> : "ᄦ" # U1126
+<Uff20> <U1132> <U1100> : "ᄳ" # U1133
+<Uff20> <U113c> <U113c> : "ᄽ" # U113d
+<Uff20> <U113e> <U113e> : "ᄿ" # U113f
+<Uff20> <U114e> <U114e> : "ᅏ" # U114f
+<Uff20> <U1150> <U1150> : "ᅑ" # U1151
+<Uff20> <U1161> <U1169> : "ᅶ" # U1176
+<Uff20> <U1161> <U116e> : "ᅷ" # U1177
+<Uff20> <U1161> <U1175> : "ᅢ" # U1162
+<Uff20> <U1163> <U1169> : "ᅸ" # U1178
+<Uff20> <U1163> <U116d> : "ᅹ" # U1179
+<Uff20> <U1163> <U1175> : "ᅤ" # U1164
+<Uff20> <U1165> <U1169> : "ᅺ" # U117a
+<Uff20> <U1165> <U116e> : "ᅻ" # U117b
+<Uff20> <U1165> <U1173> : "ᅼ" # U117c
+<Uff20> <U1165> <U1175> : "ᅦ" # U1166
+<Uff20> <U1167> <U1169> : "ᅽ" # U117d
+<Uff20> <U1167> <U116e> : "ᅾ" # U117e
+<Uff20> <U1167> <U1175> : "ᅨ" # U1168
+<Uff20> <U1169> <U1161> : "ᅪ" # U116a
+<Uff20> <U1169> <U1162> : "ᅫ" # U116b
+<Uff20> <U1169> <U1165> : "ᅿ" # U117f
+<Uff20> <U1169> <U1166> : "ᆀ" # U1180
+<Uff20> <U1169> <U1168> : "ᆁ" # U1181
+<Uff20> <U1169> <U1169> : "ᆂ" # U1182
+<Uff20> <U1169> <U116e> : "ᆃ" # U1183
+<Uff20> <U1169> <U1175> : "ᅬ" # U116c
+<Uff20> <U116a> <U1175> : "ᅫ" # U116b
+<Uff20> <U116d> <U1163> : "ᆄ" # U1184
+<Uff20> <U116d> <U1164> : "ᆅ" # U1185
+<Uff20> <U116d> <U1167> : "ᆆ" # U1186
+<Uff20> <U116d> <U1169> : "ᆇ" # U1187
+<Uff20> <U116d> <U1175> : "ᆈ" # U1188
+<Uff20> <U116e> <U1161> : "ᆉ" # U1189
+<Uff20> <U116e> <U1162> : "ᆊ" # U118a
+<Uff20> <U116e> <U1165> : "ᅯ" # U116f
+<Uff20> <U116e> <U1166> : "ᅰ" # U1170
+<Uff20> <U116e> <U1168> : "ᆌ" # U118c
+<Uff20> <U116e> <U116e> : "ᆍ" # U118d
+<Uff20> <U116e> <U1175> : "ᅱ" # U1171
+<Uff20> <U116e> <U117c> : "ᆋ" # U118b
+<Uff20> <U116f> <U1173> : "ᆋ" # U118b
+<Uff20> <U116f> <U1175> : "ᅰ" # U1170
+<Uff20> <U1172> <U1161> : "ᆎ" # U118e
+<Uff20> <U1172> <U1165> : "ᆏ" # U118f
+<Uff20> <U1172> <U1166> : "ᆐ" # U1190
+<Uff20> <U1172> <U1167> : "ᆑ" # U1191
+<Uff20> <U1172> <U1168> : "ᆒ" # U1192
+<Uff20> <U1172> <U116e> : "ᆓ" # U1193
+<Uff20> <U1172> <U1175> : "ᆔ" # U1194
+<Uff20> <U1173> <U116e> : "ᆕ" # U1195
+<Uff20> <U1173> <U1173> : "ᆖ" # U1196
+<Uff20> <U1173> <U1175> : "ᅴ" # U1174
+<Uff20> <U1174> <U116e> : "ᆗ" # U1197
+<Uff20> <U1175> <U1161> : "ᆘ" # U1198
+<Uff20> <U1175> <U1163> : "ᆙ" # U1199
+<Uff20> <U1175> <U1169> : "ᆚ" # U119a
+<Uff20> <U1175> <U116e> : "ᆛ" # U119b
+<Uff20> <U1175> <U1173> : "ᆜ" # U119c
+<Uff20> <U1175> <U119e> : "ᆝ" # U119d
+<Uff20> <U119e> <U1165> : "ᆟ" # U119f
+<Uff20> <U119e> <U116e> : "ᆠ" # U11a0
+<Uff20> <U119e> <U1175> : "ᆡ" # U11a1
+<Uff20> <U119e> <U119e> : "ᆢ" # U11a2
+<Uff20> <U11a8> <U11a8> : "ᆩ" # U11a9
+<Uff20> <U11a8> <U11af> : "ᇃ" # U11c3
+<Uff20> <U11a8> <U11ba> : "ᆪ" # U11aa
+<Uff20> <U11a8> <U11e7> : "ᇄ" # U11c4
+<Uff20> <U11aa> <U11a8> : "ᇄ" # U11c4
+<Uff20> <U11ab> <U11a8> : "ᇅ" # U11c5
+<Uff20> <U11ab> <U11ae> : "ᇆ" # U11c6
+<Uff20> <U11ab> <U11ba> : "ᇇ" # U11c7
+<Uff20> <U11ab> <U11bd> : "ᆬ" # U11ac
+<Uff20> <U11ab> <U11c0> : "ᇉ" # U11c9
+<Uff20> <U11ab> <U11c2> : "ᆭ" # U11ad
+<Uff20> <U11ab> <U11eb> : "ᇈ" # U11c8
+<Uff20> <U11ae> <U11a8> : "ᇊ" # U11ca
+<Uff20> <U11ae> <U11af> : "ᇋ" # U11cb
+<Uff20> <U11af> <U11a8> : "ᆰ" # U11b0
+<Uff20> <U11af> <U11aa> : "ᇌ" # U11cc
+<Uff20> <U11af> <U11ab> : "ᇍ" # U11cd
+<Uff20> <U11af> <U11ae> : "ᇎ" # U11ce
+<Uff20> <U11af> <U11af> : "ᇐ" # U11d0
+<Uff20> <U11af> <U11b7> : "ᆱ" # U11b1
+<Uff20> <U11af> <U11b8> : "ᆲ" # U11b2
+<Uff20> <U11af> <U11b9> : "ᇓ" # U11d3
+<Uff20> <U11af> <U11ba> : "ᆳ" # U11b3
+<Uff20> <U11af> <U11bb> : "ᇖ" # U11d6
+<Uff20> <U11af> <U11bf> : "ᇘ" # U11d8
+<Uff20> <U11af> <U11c0> : "ᆴ" # U11b4
+<Uff20> <U11af> <U11c1> : "ᆵ" # U11b5
+<Uff20> <U11af> <U11c2> : "ᆶ" # U11b6
+<Uff20> <U11af> <U11da> : "ᇑ" # U11d1
+<Uff20> <U11af> <U11dd> : "ᇒ" # U11d2
+<Uff20> <U11af> <U11e5> : "ᇔ" # U11d4
+<Uff20> <U11af> <U11e6> : "ᇕ" # U11d5
+<Uff20> <U11af> <U11eb> : "ᇗ" # U11d7
+<Uff20> <U11af> <U11f9> : "ᇙ" # U11d9
+<Uff20> <U11b0> <U11ba> : "ᇌ" # U11cc
+<Uff20> <U11b1> <U11a8> : "ᇑ" # U11d1
+<Uff20> <U11b1> <U11ba> : "ᇒ" # U11d2
+<Uff20> <U11b2> <U11ba> : "ᇓ" # U11d3
+<Uff20> <U11b2> <U11bc> : "ᇕ" # U11d5
+<Uff20> <U11b2> <U11c2> : "ᇔ" # U11d4
+<Uff20> <U11b3> <U11ba> : "ᇖ" # U11d6
+<Uff20> <U11b7> <U11a8> : "ᇚ" # U11da
+<Uff20> <U11b7> <U11af> : "ᇛ" # U11db
+<Uff20> <U11b7> <U11b8> : "ᇜ" # U11dc
+<Uff20> <U11b7> <U11ba> : "ᇝ" # U11dd
+<Uff20> <U11b7> <U11bb> : "ᇞ" # U11de
+<Uff20> <U11b7> <U11bc> : "ᇢ" # U11e2
+<Uff20> <U11b7> <U11be> : "ᇠ" # U11e0
+<Uff20> <U11b7> <U11c2> : "ᇡ" # U11e1
+<Uff20> <U11b7> <U11eb> : "ᇟ" # U11df
+<Uff20> <U11b8> <U11af> : "ᇣ" # U11e3
+<Uff20> <U11b8> <U11ba> : "ᆹ" # U11b9
+<Uff20> <U11b8> <U11bc> : "ᇦ" # U11e6
+<Uff20> <U11b8> <U11c1> : "ᇤ" # U11e4
+<Uff20> <U11b8> <U11c2> : "ᇥ" # U11e5
+<Uff20> <U11ba> <U11a8> : "ᇧ" # U11e7
+<Uff20> <U11ba> <U11ae> : "ᇨ" # U11e8
+<Uff20> <U11ba> <U11af> : "ᇩ" # U11e9
+<Uff20> <U11ba> <U11b8> : "ᇪ" # U11ea
+<Uff20> <U11ba> <U11ba> : "ᆻ" # U11bb
+<Uff20> <U11bc> <U11a8> : "ᇬ" # U11ec
+<Uff20> <U11bc> <U11a9> : "ᇭ" # U11ed
+<Uff20> <U11bc> <U11bc> : "ᇮ" # U11ee
+<Uff20> <U11bc> <U11bf> : "ᇯ" # U11ef
+<Uff20> <U11c1> <U11b8> : "ᇳ" # U11f3
+<Uff20> <U11c1> <U11bc> : "ᇴ" # U11f4
+<Uff20> <U11c2> <U11ab> : "ᇵ" # U11f5
+<Uff20> <U11c2> <U11af> : "ᇶ" # U11f6
+<Uff20> <U11c2> <U11b7> : "ᇷ" # U11f7
+<Uff20> <U11c2> <U11b8> : "ᇸ" # U11f8
+<Uff20> <U11ce> <U11c2> : "ᇏ" # U11cf
+<Uff20> <U11dd> <U11ba> : "ᇞ" # U11de
+<Uff20> <U11ec> <U11a8> : "ᇭ" # U11ed
+<Uff20> <U11f0> <U11ba> : "ᇱ" # U11f1
+<Uff20> <U11f0> <U11eb> : "ᇲ" # U11f2
+<Uff20> <U1fbf> <U27> : "῎" # U1fce
+<Uff20> <U1fbf> <U60> : "῍" # U1fcd
+<Uff20> <U1fbf> <U7e> : "῏" # U1fcf
+<Uff20> <U1fbf> <Ub4> : "῎" # U1fce
+<Uff20> <U1fbf> <Ufe50> : "῍" # U1fcd
+<Uff20> <U1fbf> <Ufe51> : "῎" # U1fce
+<Uff20> <U1fbf> <Ufe53> : "῏" # U1fcf
+<Uff20> <U1ffe> <U27> : "῞" # U1fde
+<Uff20> <U1ffe> <U60> : "῝" # U1fdd
+<Uff20> <U1ffe> <U7e> : "῟" # U1fdf
+<Uff20> <U1ffe> <Ub4> : "῞" # U1fde
+<Uff20> <U1ffe> <Ufe50> : "῝" # U1fdd
+<Uff20> <U1ffe> <Ufe51> : "῞" # U1fde
+<Uff20> <U1ffe> <Ufe53> : "῟" # U1fdf
+<Uff20> <U2190> <U7c> : "⍅" # U2345
+<Uff20> <U2190> <U2395> : "⍇" # U2347
+<Uff20> <U2191> <U2d> : "⍏" # U234f
+<Uff20> <U2191> <U2395> : "⍐" # U2350
+<Uff20> <U2192> <U7c> : "⍆" # U2346
+<Uff20> <U2192> <U2395> : "⍈" # U2348
+<Uff20> <U2193> <U2d> : "⍖" # U2356
+<Uff20> <U2193> <U2395> : "⍗" # U2357
+<Uff20> <U2203> <U338> : "∄" # U2204
+<Uff20> <U2206> <U5f> : "⍙" # U2359
+<Uff20> <U2206> <U7c> : "⍋" # U234b
+<Uff20> <U2206> <U2395> : "⍍" # U234d
+<Uff20> <U2207> <U7c> : "⍒" # U2352
+<Uff20> <U2207> <U7e> : "⍫" # U236b
+<Uff20> <U2207> <Ua8> : "⍢" # U2362
+<Uff20> <U2207> <U2395> : "⍔" # U2354
+<Uff20> <U2208> <U338> : "∉" # U2209
+<Uff20> <U220a> <U5f> : "⍷" # U2377
+<Uff20> <U220b> <U338> : "∌" # U220c
+<Uff20> <U2218> <U5f> : "⍛" # U235b
+<Uff20> <U2218> <Ua8> : "⍤" # U2364
+<Uff20> <U2218> <U2229> : "⍝" # U235d
+<Uff20> <U2218> <U22a4> : "⍕" # U2355
+<Uff20> <U2218> <U22a5> : "⍎" # U234e
+<Uff20> <U2218> <U2395> : "⌻" # U233b
+<Uff20> <U2218> <U25cb> : "⌾" # U233e
+<Uff20> <U2223> <U338> : "∤" # U2224
+<Uff20> <U2225> <U338> : "∦" # U2226
+<Uff20> <U2227> <U7e> : "⍲" # U2372
+<Uff20> <U2227> <U2228> : "⋄" # U22c4
+<Uff20> <U2227> <U2395> : "⍓" # U2353
+<Uff20> <U2228> <U7e> : "⍱" # U2371
+<Uff20> <U2228> <U2227> : "⋄" # U22c4
+<Uff20> <U2228> <U2395> : "⍌" # U234c
+<Uff20> <U2229> <U2218> : "⍝" # U235d
+<Uff20> <U222a> <U7c> : "⍦" # U2366
+<Uff20> <U223c> <U338> : "≁" # U2241
+<Uff20> <U2243> <U338> : "≄" # U2244
+<Uff20> <U2248> <U338> : "≉" # U2249
+<Uff20> <U224d> <U338> : "≭" # U226d
+<Uff20> <U2260> <U5f> : "≢" # U2262
+<Uff20> <U2260> <U2395> : "⍯" # U236f
+<Uff20> <U2272> <U338> : "≴" # U2274
+<Uff20> <U2273> <U338> : "≵" # U2275
+<Uff20> <U2276> <U338> : "≸" # U2278
+<Uff20> <U2277> <U338> : "≹" # U2279
+<Uff20> <U227a> <U338> : "⊀" # U2280
+<Uff20> <U227b> <U338> : "⊁" # U2281
+<Uff20> <U227c> <U338> : "⋠" # U22e0
+<Uff20> <U227d> <U338> : "⋡" # U22e1
+<Uff20> <U2282> <U5f> : "⊆" # U2286
+<Uff20> <U2282> <U7c> : "⍧" # U2367
+<Uff20> <U2283> <U5f> : "⊇" # U2287
+<Uff20> <U2286> <U338> : "⊈" # U2288
+<Uff20> <U2287> <U338> : "⊉" # U2289
+<Uff20> <U2291> <U338> : "⋢" # U22e2
+<Uff20> <U2292> <U338> : "⋣" # U22e3
+<Uff20> <U22a4> <Ua8> : "⍡" # U2361
+<Uff20> <U22a4> <Uaf> : "⍑" # U2351
+<Uff20> <U22a4> <U2218> : "⍕" # U2355
+<Uff20> <U22a4> <U22a5> : "⌶" # U2336
+<Uff20> <U22a5> <U5f> : "⍊" # U234a
+<Uff20> <U22a5> <U2218> : "⍎" # U234e
+<Uff20> <U22a5> <U22a4> : "⌶" # U2336
+<Uff20> <U22a8> <U338> : "⊭" # U22ad
+<Uff20> <U22a9> <U338> : "⊮" # U22ae
+<Uff20> <U22ab> <U338> : "⊯" # U22af
+<Uff20> <U22b2> <U338> : "⋪" # U22ea
+<Uff20> <U22b3> <U338> : "⋫" # U22eb
+<Uff20> <U22b4> <U338> : "⋬" # U22ec
+<Uff20> <U22b5> <U338> : "⋭" # U22ed
+<Uff20> <U22c4> <U5f> : "⍚" # U235a
+<Uff20> <U22c4> <U2395> : "⌺" # U233a
+<Uff20> <U2373> <U5f> : "⍸" # U2378
+<Uff20> <U2375> <U5f> : "⍹" # U2379
+<Uff20> <U237a> <U5f> : "⍶" # U2376
+<Uff20> <U2395> <U27> : "⍞" # U235e
+<Uff20> <U2395> <U2f> : "⍁" # U2341
+<Uff20> <U2395> <U3a> : "⍠" # U2360
+<Uff20> <U2395> <U3c> : "⍃" # U2343
+<Uff20> <U2395> <U3d> : "⌸" # U2338
+<Uff20> <U2395> <U3e> : "⍄" # U2344
+<Uff20> <U2395> <U3f> : "⍰" # U2370
+<Uff20> <U2395> <U5c> : "⍂" # U2342
+<Uff20> <U2395> <Uf7> : "⌹" # U2339
+<Uff20> <U2395> <U2190> : "⍇" # U2347
+<Uff20> <U2395> <U2191> : "⍐" # U2350
+<Uff20> <U2395> <U2192> : "⍈" # U2348
+<Uff20> <U2395> <U2193> : "⍗" # U2357
+<Uff20> <U2395> <U2206> : "⍍" # U234d
+<Uff20> <U2395> <U2207> : "⍔" # U2354
+<Uff20> <U2395> <U2218> : "⌻" # U233b
+<Uff20> <U2395> <U2227> : "⍓" # U2353
+<Uff20> <U2395> <U2228> : "⍌" # U234c
+<Uff20> <U2395> <U2260> : "⍯" # U236f
+<Uff20> <U2395> <U22c4> : "⌺" # U233a
+<Uff20> <U2395> <U25cb> : "⌼" # U233c
+<Uff20> <U25cb> <U2a> : "⍟" # U235f
+<Uff20> <U25cb> <U2d> : "⊖" # U2296
+<Uff20> <U25cb> <U2e> : "⊙" # U2299
+<Uff20> <U25cb> <U5c> : "⍉" # U2349
+<Uff20> <U25cb> <U5f> : "⍜" # U235c
+<Uff20> <U25cb> <U7c> : "⌽" # U233d
+<Uff20> <U25cb> <Ua8> : "⍥" # U2365
+<Uff20> <U25cb> <U2218> : "⌾" # U233e
+<Uff20> <U25cb> <U2395> : "⌼" # U233c
+<Uff20> <U2add> <U338> : "⫝̸" # U2adc
+<Uff20> <Uffaf> <U44> : "Đ" # U110
+<Uff20> <Uffaf> <U47> : "Ǥ" # U1e4
+<Uff20> <Uffaf> <U48> : "Ħ" # U126
+<Uff20> <Uffaf> <U49> : "Ɨ" # U197
+<Uff20> <Uffaf> <U4c> : "Ł" # U141
+<Uff20> <Uffaf> <U4f> : "Ø" # Ud8
+<Uff20> <Uffaf> <U54> : "Ŧ" # U166
+<Uff20> <Uffaf> <U5a> : "Ƶ" # U1b5
+<Uff20> <Uffaf> <U62> : "ƀ" # U180
+<Uff20> <Uffaf> <U64> : "đ" # U111
+<Uff20> <Uffaf> <U67> : "ǥ" # U1e5
+<Uff20> <Uffaf> <U68> : "ħ" # U127
+<Uff20> <Uffaf> <U69> : "ɨ" # U268
+<Uff20> <Uffaf> <U6c> : "ł" # U142
+<Uff20> <Uffaf> <U6f> : "ø" # Uf8
+<Uff20> <Uffaf> <U74> : "ŧ" # U167
+<Uff20> <Uffaf> <U7a> : "ƶ" # U1b6
+<Uff20> <Uffaf> <U294> : "ʡ" # U2a1
+<Uff20> <Uffaf> <U4ae> : "Ұ" # U4b0
+<Uff20> <Uffaf> <U4af> : "ұ" # U4b1
+<Uff20> <Uffaf> <U6c7> : "ғ" # U493
+<Uff20> <Uffaf> <U6cb> : "ҟ" # U49f
+<Uff20> <Uffaf> <U6e7> : "Ғ" # U492
+<Uff20> <Uffaf> <U6eb> : "Ҟ" # U49e
+<Uff20> <Uffaf> <U8fb> : "↚" # U219a
+<Uff20> <Uffaf> <U8fd> : "↛" # U219b
+<Uff20> <Uffaf> <U2194> : "↮" # U21ae
+<Uff20> <Uffbd> <U338> : "≠" # U2260
+<Uff20> <U21> <U2b> <U4f> : "Ợ" # U1ee2
+<Uff20> <U21> <U2b> <U55> : "Ự" # U1ef0
+<Uff20> <U21> <U2b> <U6f> : "ợ" # U1ee3
+<Uff20> <U21> <U2b> <U75> : "ự" # U1ef1
+<Uff20> <U21> <Ufe62> <U4f> : "Ợ" # U1ee2
+<Uff20> <U21> <Ufe62> <U55> : "Ự" # U1ef0
+<Uff20> <U21> <Ufe62> <U6f> : "ợ" # U1ee3
+<Uff20> <U21> <Ufe62> <U75> : "ự" # U1ef1
+<Uff20> <U22> <U5f> <U55> : "Ṻ" # U1e7a
+<Uff20> <U22> <U5f> <U75> : "ṻ" # U1e7b
+<Uff20> <U22> <U7e> <U4f> : "Ṏ" # U1e4e
+<Uff20> <U22> <U7e> <U6f> : "ṏ" # U1e4f
+<Uff20> <U22> <Uaf> <U55> : "Ṻ" # U1e7a
+<Uff20> <U22> <Uaf> <U75> : "ṻ" # U1e7b
+<Uff20> <U22> <Ufe53> <U4f> : "Ṏ" # U1e4e
+<Uff20> <U22> <Ufe53> <U6f> : "ṏ" # U1e4f
+<Uff20> <U22> <Ufe54> <U55> : "Ṻ" # U1e7a
+<Uff20> <U22> <Ufe54> <U75> : "ṻ" # U1e7b
+<Uff20> <U27> <U22> <U20> : "΅" # U385
+<Uff20> <U27> <U22> <U49> : "Ḯ" # U1e2e
+<Uff20> <U27> <U22> <U55> : "Ǘ" # U1d7
+<Uff20> <U27> <U22> <U69> : "ḯ" # U1e2f
+<Uff20> <U27> <U22> <U75> : "ǘ" # U1d8
+<Uff20> <U27> <U22> <U7e9> : "ΐ" # U390
+<Uff20> <U27> <U22> <U7f5> : "ΰ" # U3b0
+<Uff20> <U27> <U28> <U7c1> : "Ἅ" # U1f0d
+<Uff20> <U27> <U28> <U7c5> : "Ἕ" # U1f1d
+<Uff20> <U27> <U28> <U7c7> : "Ἥ" # U1f2d
+<Uff20> <U27> <U28> <U7c9> : "Ἵ" # U1f3d
+<Uff20> <U27> <U28> <U7cf> : "Ὅ" # U1f4d
+<Uff20> <U27> <U28> <U7d5> : "Ὕ" # U1f5d
+<Uff20> <U27> <U28> <U7d9> : "Ὥ" # U1f6d
+<Uff20> <U27> <U28> <U7e1> : "ἅ" # U1f05
+<Uff20> <U27> <U28> <U7e5> : "ἕ" # U1f15
+<Uff20> <U27> <U28> <U7e7> : "ἥ" # U1f25
+<Uff20> <U27> <U28> <U7e9> : "ἵ" # U1f35
+<Uff20> <U27> <U28> <U7ef> : "ὅ" # U1f45
+<Uff20> <U27> <U28> <U7f5> : "ὕ" # U1f55
+<Uff20> <U27> <U28> <U7f9> : "ὥ" # U1f65
+<Uff20> <U27> <U29> <U7c1> : "Ἄ" # U1f0c
+<Uff20> <U27> <U29> <U7c5> : "Ἔ" # U1f1c
+<Uff20> <U27> <U29> <U7c7> : "Ἤ" # U1f2c
+<Uff20> <U27> <U29> <U7c9> : "Ἴ" # U1f3c
+<Uff20> <U27> <U29> <U7cf> : "Ὄ" # U1f4c
+<Uff20> <U27> <U29> <U7d9> : "Ὤ" # U1f6c
+<Uff20> <U27> <U29> <U7e1> : "ἄ" # U1f04
+<Uff20> <U27> <U29> <U7e5> : "ἔ" # U1f14
+<Uff20> <U27> <U29> <U7e7> : "ἤ" # U1f24
+<Uff20> <U27> <U29> <U7e9> : "ἴ" # U1f34
+<Uff20> <U27> <U29> <U7ef> : "ὄ" # U1f44
+<Uff20> <U27> <U29> <U7f5> : "ὔ" # U1f54
+<Uff20> <U27> <U29> <U7f9> : "ὤ" # U1f64
+<Uff20> <U27> <U2b> <U4f> : "Ớ" # U1eda
+<Uff20> <U27> <U2b> <U55> : "Ứ" # U1ee8
+<Uff20> <U27> <U2b> <U6f> : "ớ" # U1edb
+<Uff20> <U27> <U2b> <U75> : "ứ" # U1ee9
+<Uff20> <U27> <U2f> <U4f> : "Ǿ" # U1fe
+<Uff20> <U27> <U2f> <U6f> : "ǿ" # U1ff
+<Uff20> <U27> <U5e> <U41> : "Ấ" # U1ea4
+<Uff20> <U27> <U5e> <U45> : "Ế" # U1ebe
+<Uff20> <U27> <U5e> <U4f> : "Ố" # U1ed0
+<Uff20> <U27> <U5e> <U61> : "ấ" # U1ea5
+<Uff20> <U27> <U5e> <U65> : "ế" # U1ebf
+<Uff20> <U27> <U5e> <U6f> : "ố" # U1ed1
+<Uff20> <U27> <U5f> <U45> : "Ḗ" # U1e16
+<Uff20> <U27> <U5f> <U4f> : "Ṓ" # U1e52
+<Uff20> <U27> <U5f> <U65> : "ḗ" # U1e17
+<Uff20> <U27> <U5f> <U6f> : "ṓ" # U1e53
+<Uff20> <U27> <U62> <U41> : "Ắ" # U1eae
+<Uff20> <U27> <U62> <U61> : "ắ" # U1eaf
+<Uff20> <U27> <U7e> <U4f> : "Ṍ" # U1e4c
+<Uff20> <U27> <U7e> <U55> : "Ṹ" # U1e78
+<Uff20> <U27> <U7e> <U6f> : "ṍ" # U1e4d
+<Uff20> <U27> <U7e> <U75> : "ṹ" # U1e79
+<Uff20> <U27> <Uaf> <U45> : "Ḗ" # U1e16
+<Uff20> <U27> <Uaf> <U4f> : "Ṓ" # U1e52
+<Uff20> <U27> <Uaf> <U65> : "ḗ" # U1e17
+<Uff20> <U27> <Uaf> <U6f> : "ṓ" # U1e53
+<Uff20> <U27> <Ub8> <U43> : "Ḉ" # U1e08
+<Uff20> <U27> <Ub8> <U63> : "ḉ" # U1e09
+<Uff20> <U27> <Ufe52> <U41> : "Ấ" # U1ea4
+<Uff20> <U27> <Ufe52> <U45> : "Ế" # U1ebe
+<Uff20> <U27> <Ufe52> <U4f> : "Ố" # U1ed0
+<Uff20> <U27> <Ufe52> <U61> : "ấ" # U1ea5
+<Uff20> <U27> <Ufe52> <U65> : "ế" # U1ebf
+<Uff20> <U27> <Ufe52> <U6f> : "ố" # U1ed1
+<Uff20> <U27> <Ufe53> <U4f> : "Ṍ" # U1e4c
+<Uff20> <U27> <Ufe53> <U55> : "Ṹ" # U1e78
+<Uff20> <U27> <Ufe53> <U6f> : "ṍ" # U1e4d
+<Uff20> <U27> <Ufe53> <U75> : "ṹ" # U1e79
+<Uff20> <U27> <Ufe54> <U45> : "Ḗ" # U1e16
+<Uff20> <U27> <Ufe54> <U4f> : "Ṓ" # U1e52
+<Uff20> <U27> <Ufe54> <U65> : "ḗ" # U1e17
+<Uff20> <U27> <Ufe54> <U6f> : "ṓ" # U1e53
+<Uff20> <U27> <Ufe55> <U41> : "Ắ" # U1eae
+<Uff20> <U27> <Ufe55> <U61> : "ắ" # U1eaf
+<Uff20> <U27> <Ufe57> <U49> : "Ḯ" # U1e2e
+<Uff20> <U27> <Ufe57> <U55> : "Ǘ" # U1d7
+<Uff20> <U27> <Ufe57> <U69> : "ḯ" # U1e2f
+<Uff20> <U27> <Ufe57> <U75> : "ǘ" # U1d8
+<Uff20> <U27> <Ufe57> <U7e9> : "ΐ" # U390
+<Uff20> <U27> <Ufe57> <U7f5> : "ΰ" # U3b0
+<Uff20> <U27> <Ufe58> <U41> : "Ǻ" # U1fa
+<Uff20> <U27> <Ufe58> <U61> : "ǻ" # U1fb
+<Uff20> <U27> <Ufe5b> <U43> : "Ḉ" # U1e08
+<Uff20> <U27> <Ufe5b> <U63> : "ḉ" # U1e09
+<Uff20> <U27> <Ufe62> <U4f> : "Ớ" # U1eda
+<Uff20> <U27> <Ufe62> <U55> : "Ứ" # U1ee8
+<Uff20> <U27> <Ufe62> <U6f> : "ớ" # U1edb
+<Uff20> <U27> <Ufe62> <U75> : "ứ" # U1ee9
+<Uff20> <U27> <Ufe64> <U7c1> : "Ἄ" # U1f0c
+<Uff20> <U27> <Ufe64> <U7c5> : "Ἔ" # U1f1c
+<Uff20> <U27> <Ufe64> <U7c7> : "Ἤ" # U1f2c
+<Uff20> <U27> <Ufe64> <U7c9> : "Ἴ" # U1f3c
+<Uff20> <U27> <Ufe64> <U7cf> : "Ὄ" # U1f4c
+<Uff20> <U27> <Ufe64> <U7d9> : "Ὤ" # U1f6c
+<Uff20> <U27> <Ufe64> <U7e1> : "ἄ" # U1f04
+<Uff20> <U27> <Ufe64> <U7e5> : "ἔ" # U1f14
+<Uff20> <U27> <Ufe64> <U7e7> : "ἤ" # U1f24
+<Uff20> <U27> <Ufe64> <U7e9> : "ἴ" # U1f34
+<Uff20> <U27> <Ufe64> <U7ef> : "ὄ" # U1f44
+<Uff20> <U27> <Ufe64> <U7f5> : "ὔ" # U1f54
+<Uff20> <U27> <Ufe64> <U7f9> : "ὤ" # U1f64
+<Uff20> <U27> <Ufe65> <U7c1> : "Ἅ" # U1f0d
+<Uff20> <U27> <Ufe65> <U7c5> : "Ἕ" # U1f1d
+<Uff20> <U27> <Ufe65> <U7c7> : "Ἥ" # U1f2d
+<Uff20> <U27> <Ufe65> <U7c9> : "Ἵ" # U1f3d
+<Uff20> <U27> <Ufe65> <U7cf> : "Ὅ" # U1f4d
+<Uff20> <U27> <Ufe65> <U7d5> : "Ὕ" # U1f5d
+<Uff20> <U27> <Ufe65> <U7d9> : "Ὥ" # U1f6d
+<Uff20> <U27> <Ufe65> <U7e1> : "ἅ" # U1f05
+<Uff20> <U27> <Ufe65> <U7e5> : "ἕ" # U1f15
+<Uff20> <U27> <Ufe65> <U7e7> : "ἥ" # U1f25
+<Uff20> <U27> <Ufe65> <U7e9> : "ἵ" # U1f35
+<Uff20> <U27> <Ufe65> <U7ef> : "ὅ" # U1f45
+<Uff20> <U27> <Ufe65> <U7f5> : "ὕ" # U1f55
+<Uff20> <U27> <Ufe65> <U7f9> : "ὥ" # U1f65
+<Uff20> <U27> <Uffaf> <U4f> : "Ǿ" # U1fe
+<Uff20> <U27> <Uffaf> <U6f> : "ǿ" # U1ff
+<Uff20> <U28> <U30> <U29> : "⓪" # U24ea
+<Uff20> <U28> <U31> <U29> : "①" # U2460
+<Uff20> <U28> <U32> <U29> : "②" # U2461
+<Uff20> <U28> <U33> <U29> : "③" # U2462
+<Uff20> <U28> <U34> <U29> : "④" # U2463
+<Uff20> <U28> <U35> <U29> : "⑤" # U2464
+<Uff20> <U28> <U36> <U29> : "⑥" # U2465
+<Uff20> <U28> <U37> <U29> : "⑦" # U2466
+<Uff20> <U28> <U38> <U29> : "⑧" # U2467
+<Uff20> <U28> <U39> <U29> : "⑨" # U2468
+<Uff20> <U28> <U41> <U29> : "Ⓐ" # U24b6
+<Uff20> <U28> <U42> <U29> : "Ⓑ" # U24b7
+<Uff20> <U28> <U43> <U29> : "Ⓒ" # U24b8
+<Uff20> <U28> <U44> <U29> : "Ⓓ" # U24b9
+<Uff20> <U28> <U45> <U29> : "Ⓔ" # U24ba
+<Uff20> <U28> <U46> <U29> : "Ⓕ" # U24bb
+<Uff20> <U28> <U47> <U29> : "Ⓖ" # U24bc
+<Uff20> <U28> <U48> <U29> : "Ⓗ" # U24bd
+<Uff20> <U28> <U49> <U29> : "Ⓘ" # U24be
+<Uff20> <U28> <U4a> <U29> : "Ⓙ" # U24bf
+<Uff20> <U28> <U4b> <U29> : "Ⓚ" # U24c0
+<Uff20> <U28> <U4c> <U29> : "Ⓛ" # U24c1
+<Uff20> <U28> <U4d> <U29> : "Ⓜ" # U24c2
+<Uff20> <U28> <U4e> <U29> : "Ⓝ" # U24c3
+<Uff20> <U28> <U4f> <U29> : "Ⓞ" # U24c4
+<Uff20> <U28> <U50> <U29> : "Ⓟ" # U24c5
+<Uff20> <U28> <U51> <U29> : "Ⓠ" # U24c6
+<Uff20> <U28> <U52> <U29> : "Ⓡ" # U24c7
+<Uff20> <U28> <U53> <U29> : "Ⓢ" # U24c8
+<Uff20> <U28> <U54> <U29> : "Ⓣ" # U24c9
+<Uff20> <U28> <U55> <U29> : "Ⓤ" # U24ca
+<Uff20> <U28> <U56> <U29> : "Ⓥ" # U24cb
+<Uff20> <U28> <U57> <U29> : "Ⓦ" # U24cc
+<Uff20> <U28> <U58> <U29> : "Ⓧ" # U24cd
+<Uff20> <U28> <U59> <U29> : "Ⓨ" # U24ce
+<Uff20> <U28> <U5a> <U29> : "Ⓩ" # U24cf
+<Uff20> <U28> <U61> <U29> : "ⓐ" # U24d0
+<Uff20> <U28> <U62> <U29> : "ⓑ" # U24d1
+<Uff20> <U28> <U63> <U29> : "ⓒ" # U24d2
+<Uff20> <U28> <U64> <U29> : "ⓓ" # U24d3
+<Uff20> <U28> <U65> <U29> : "ⓔ" # U24d4
+<Uff20> <U28> <U66> <U29> : "ⓕ" # U24d5
+<Uff20> <U28> <U67> <U29> : "ⓖ" # U24d6
+<Uff20> <U28> <U68> <U29> : "ⓗ" # U24d7
+<Uff20> <U28> <U69> <U29> : "ⓘ" # U24d8
+<Uff20> <U28> <U6a> <U29> : "ⓙ" # U24d9
+<Uff20> <U28> <U6b> <U29> : "ⓚ" # U24da
+<Uff20> <U28> <U6c> <U29> : "ⓛ" # U24db
+<Uff20> <U28> <U6d> <U29> : "ⓜ" # U24dc
+<Uff20> <U28> <U6e> <U29> : "ⓝ" # U24dd
+<Uff20> <U28> <U6f> <U29> : "ⓞ" # U24de
+<Uff20> <U28> <U70> <U29> : "ⓟ" # U24df
+<Uff20> <U28> <U71> <U29> : "ⓠ" # U24e0
+<Uff20> <U28> <U72> <U29> : "ⓡ" # U24e1
+<Uff20> <U28> <U73> <U29> : "ⓢ" # U24e2
+<Uff20> <U28> <U74> <U29> : "ⓣ" # U24e3
+<Uff20> <U28> <U75> <U29> : "ⓤ" # U24e4
+<Uff20> <U28> <U76> <U29> : "ⓥ" # U24e5
+<Uff20> <U28> <U77> <U29> : "ⓦ" # U24e6
+<Uff20> <U28> <U78> <U29> : "ⓧ" # U24e7
+<Uff20> <U28> <U79> <U29> : "ⓨ" # U24e8
+<Uff20> <U28> <U7a> <U29> : "ⓩ" # U24e9
+<Uff20> <U28> <U4a6> <U29> : "㋾" # U32fe
+<Uff20> <U28> <U4b1> <U29> : "㋐" # U32d0
+<Uff20> <U28> <U4b2> <U29> : "㋑" # U32d1
+<Uff20> <U28> <U4b3> <U29> : "㋒" # U32d2
+<Uff20> <U28> <U4b4> <U29> : "㋓" # U32d3
+<Uff20> <U28> <U4b5> <U29> : "㋔" # U32d4
+<Uff20> <U28> <U4b6> <U29> : "㋕" # U32d5
+<Uff20> <U28> <U4b7> <U29> : "㋖" # U32d6
+<Uff20> <U28> <U4b8> <U29> : "㋗" # U32d7
+<Uff20> <U28> <U4b9> <U29> : "㋘" # U32d8
+<Uff20> <U28> <U4ba> <U29> : "㋙" # U32d9
+<Uff20> <U28> <U4bb> <U29> : "㋚" # U32da
+<Uff20> <U28> <U4bc> <U29> : "㋛" # U32db
+<Uff20> <U28> <U4bd> <U29> : "㋜" # U32dc
+<Uff20> <U28> <U4be> <U29> : "㋝" # U32dd
+<Uff20> <U28> <U4bf> <U29> : "㋞" # U32de
+<Uff20> <U28> <U4c0> <U29> : "㋟" # U32df
+<Uff20> <U28> <U4c1> <U29> : "㋠" # U32e0
+<Uff20> <U28> <U4c2> <U29> : "㋡" # U32e1
+<Uff20> <U28> <U4c3> <U29> : "㋢" # U32e2
+<Uff20> <U28> <U4c4> <U29> : "㋣" # U32e3
+<Uff20> <U28> <U4c5> <U29> : "㋤" # U32e4
+<Uff20> <U28> <U4c6> <U29> : "㋥" # U32e5
+<Uff20> <U28> <U4c7> <U29> : "㋦" # U32e6
+<Uff20> <U28> <U4c8> <U29> : "㋧" # U32e7
+<Uff20> <U28> <U4c9> <U29> : "㋨" # U32e8
+<Uff20> <U28> <U4ca> <U29> : "㋩" # U32e9
+<Uff20> <U28> <U4cb> <U29> : "㋪" # U32ea
+<Uff20> <U28> <U4cc> <U29> : "㋫" # U32eb
+<Uff20> <U28> <U4cd> <U29> : "㋬" # U32ec
+<Uff20> <U28> <U4ce> <U29> : "㋭" # U32ed
+<Uff20> <U28> <U4cf> <U29> : "㋮" # U32ee
+<Uff20> <U28> <U4d0> <U29> : "㋯" # U32ef
+<Uff20> <U28> <U4d1> <U29> : "㋰" # U32f0
+<Uff20> <U28> <U4d2> <U29> : "㋱" # U32f1
+<Uff20> <U28> <U4d3> <U29> : "㋲" # U32f2
+<Uff20> <U28> <U4d4> <U29> : "㋳" # U32f3
+<Uff20> <U28> <U4d5> <U29> : "㋴" # U32f4
+<Uff20> <U28> <U4d6> <U29> : "㋵" # U32f5
+<Uff20> <U28> <U4d7> <U29> : "㋶" # U32f6
+<Uff20> <U28> <U4d8> <U29> : "㋷" # U32f7
+<Uff20> <U28> <U4d9> <U29> : "㋸" # U32f8
+<Uff20> <U28> <U4da> <U29> : "㋹" # U32f9
+<Uff20> <U28> <U4db> <U29> : "㋺" # U32fa
+<Uff20> <U28> <U4dc> <U29> : "㋻" # U32fb
+<Uff20> <U28> <U1100> <U29> : "㉠" # U3260
+<Uff20> <U28> <U1102> <U29> : "㉡" # U3261
+<Uff20> <U28> <U1103> <U29> : "㉢" # U3262
+<Uff20> <U28> <U1105> <U29> : "㉣" # U3263
+<Uff20> <U28> <U1106> <U29> : "㉤" # U3264
+<Uff20> <U28> <U1107> <U29> : "㉥" # U3265
+<Uff20> <U28> <U1109> <U29> : "㉦" # U3266
+<Uff20> <U28> <U110b> <U29> : "㉧" # U3267
+<Uff20> <U28> <U110c> <U29> : "㉨" # U3268
+<Uff20> <U28> <U110e> <U29> : "㉩" # U3269
+<Uff20> <U28> <U110f> <U29> : "㉪" # U326a
+<Uff20> <U28> <U1110> <U29> : "㉫" # U326b
+<Uff20> <U28> <U1111> <U29> : "㉬" # U326c
+<Uff20> <U28> <U1112> <U29> : "㉭" # U326d
+<Uff20> <U28> <U30f0> <U29> : "㋼" # U32fc
+<Uff20> <U28> <U30f1> <U29> : "㋽" # U32fd
+<Uff20> <U28> <U4e00> <U29> : "㊀" # U3280
+<Uff20> <U28> <U4e03> <U29> : "㊆" # U3286
+<Uff20> <U28> <U4e09> <U29> : "㊂" # U3282
+<Uff20> <U28> <U4e0a> <U29> : "㊤" # U32a4
+<Uff20> <U28> <U4e0b> <U29> : "㊦" # U32a6
+<Uff20> <U28> <U4e2d> <U29> : "㊥" # U32a5
+<Uff20> <U28> <U4e5d> <U29> : "㊈" # U3288
+<Uff20> <U28> <U4e8c> <U29> : "㊁" # U3281
+<Uff20> <U28> <U4e94> <U29> : "㊄" # U3284
+<Uff20> <U28> <U4f01> <U29> : "㊭" # U32ad
+<Uff20> <U28> <U4f11> <U29> : "㊡" # U32a1
+<Uff20> <U28> <U512a> <U29> : "㊝" # U329d
+<Uff20> <U28> <U516b> <U29> : "㊇" # U3287
+<Uff20> <U28> <U516d> <U29> : "㊅" # U3285
+<Uff20> <U28> <U5199> <U29> : "㊢" # U32a2
+<Uff20> <U28> <U52b4> <U29> : "㊘" # U3298
+<Uff20> <U28> <U533b> <U29> : "㊩" # U32a9
+<Uff20> <U28> <U5341> <U29> : "㊉" # U3289
+<Uff20> <U28> <U5354> <U29> : "㊯" # U32af
+<Uff20> <U28> <U5370> <U29> : "㊞" # U329e
+<Uff20> <U28> <U53f3> <U29> : "㊨" # U32a8
+<Uff20> <U28> <U540d> <U29> : "㊔" # U3294
+<Uff20> <U28> <U56db> <U29> : "㊃" # U3283
+<Uff20> <U28> <U571f> <U29> : "㊏" # U328f
+<Uff20> <U28> <U591c> <U29> : "㊰" # U32b0
+<Uff20> <U28> <U5973> <U29> : "㊛" # U329b
+<Uff20> <U28> <U5b66> <U29> : "㊫" # U32ab
+<Uff20> <U28> <U5b97> <U29> : "㊪" # U32aa
+<Uff20> <U28> <U5de6> <U29> : "㊧" # U32a7
+<Uff20> <U28> <U65e5> <U29> : "㊐" # U3290
+<Uff20> <U28> <U6708> <U29> : "㊊" # U328a
+<Uff20> <U28> <U6709> <U29> : "㊒" # U3292
+<Uff20> <U28> <U6728> <U29> : "㊍" # U328d
+<Uff20> <U28> <U682a> <U29> : "㊑" # U3291
+<Uff20> <U28> <U6b63> <U29> : "㊣" # U32a3
+<Uff20> <U28> <U6c34> <U29> : "㊌" # U328c
+<Uff20> <U28> <U6ce8> <U29> : "㊟" # U329f
+<Uff20> <U28> <U706b> <U29> : "㊋" # U328b
+<Uff20> <U28> <U7279> <U29> : "㊕" # U3295
+<Uff20> <U28> <U7537> <U29> : "㊚" # U329a
+<Uff20> <U28> <U76e3> <U29> : "㊬" # U32ac
+<Uff20> <U28> <U793e> <U29> : "㊓" # U3293
+<Uff20> <U28> <U795d> <U29> : "㊗" # U3297
+<Uff20> <U28> <U79d8> <U29> : "㊙" # U3299
+<Uff20> <U28> <U8ca1> <U29> : "㊖" # U3296
+<Uff20> <U28> <U8cc7> <U29> : "㊮" # U32ae
+<Uff20> <U28> <U9069> <U29> : "㊜" # U329c
+<Uff20> <U28> <U91d1> <U29> : "㊎" # U328e
+<Uff20> <U28> <U9805> <U29> : "㊠" # U32a0
+<Uff20> <U28> <Uff80> <U29> : "②" # U2461
+<Uff20> <U28> <Uffb0> <U29> : "⓪" # U24ea
+<Uff20> <U28> <Uffb1> <U29> : "①" # U2460
+<Uff20> <U28> <Uffb2> <U29> : "②" # U2461
+<Uff20> <U28> <Uffb3> <U29> : "③" # U2462
+<Uff20> <U28> <Uffb4> <U29> : "④" # U2463
+<Uff20> <U28> <Uffb5> <U29> : "⑤" # U2464
+<Uff20> <U28> <Uffb6> <U29> : "⑥" # U2465
+<Uff20> <U28> <Uffb7> <U29> : "⑦" # U2466
+<Uff20> <U28> <Uffb8> <U29> : "⑧" # U2467
+<Uff20> <U28> <Uffb9> <U29> : "⑨" # U2468
+<Uff20> <U2a> <U27> <U41> : "Ǻ" # U1fa
+<Uff20> <U2a> <U27> <U61> : "ǻ" # U1fb
+<Uff20> <U2d> <U2d> <U20> : "\0\2\5\5" # Uad
+<Uff20> <U2d> <U2d> <U2d> : "—" # U2014
+<Uff20> <U2d> <U2d> <U2e> : "–" # U2013
+<Uff20> <U2e> <U21> <U53> : "Ṩ" # U1e68
+<Uff20> <U2e> <U21> <U73> : "ṩ" # U1e69
+<Uff20> <U2e> <U27> <U53> : "Ṥ" # U1e64
+<Uff20> <U2e> <U27> <U73> : "ṥ" # U1e65
+<Uff20> <U2e> <Ub4> <U53> : "Ṥ" # U1e64
+<Uff20> <U2e> <Ub4> <U73> : "ṥ" # U1e65
+<Uff20> <U2e> <Ufe51> <U53> : "Ṥ" # U1e64
+<Uff20> <U2e> <Ufe51> <U73> : "ṥ" # U1e65
+<Uff20> <U2e> <Ufe5a> <U53> : "Ṧ" # U1e66
+<Uff20> <U2e> <Ufe5a> <U73> : "ṧ" # U1e67
+<Uff20> <U2e> <Ufe60> <U53> : "Ṩ" # U1e68
+<Uff20> <U2e> <Ufe60> <U73> : "ṩ" # U1e69
+<Uff20> <U31> <U31> <U30> : "⅒" # U2152
+<Uff20> <U3f> <U2b> <U4f> : "Ở" # U1ede
+<Uff20> <U3f> <U2b> <U55> : "Ử" # U1eec
+<Uff20> <U3f> <U2b> <U6f> : "ở" # U1edf
+<Uff20> <U3f> <U2b> <U75> : "ử" # U1eed
+<Uff20> <U3f> <U5e> <U41> : "Ẩ" # U1ea8
+<Uff20> <U3f> <U5e> <U45> : "Ể" # U1ec2
+<Uff20> <U3f> <U5e> <U4f> : "Ổ" # U1ed4
+<Uff20> <U3f> <U5e> <U61> : "ẩ" # U1ea9
+<Uff20> <U3f> <U5e> <U65> : "ể" # U1ec3
+<Uff20> <U3f> <U5e> <U6f> : "ổ" # U1ed5
+<Uff20> <U3f> <U62> <U41> : "Ẳ" # U1eb2
+<Uff20> <U3f> <U62> <U61> : "ẳ" # U1eb3
+<Uff20> <U3f> <Ufe52> <U41> : "Ẩ" # U1ea8
+<Uff20> <U3f> <Ufe52> <U45> : "Ể" # U1ec2
+<Uff20> <U3f> <Ufe52> <U4f> : "Ổ" # U1ed4
+<Uff20> <U3f> <Ufe52> <U61> : "ẩ" # U1ea9
+<Uff20> <U3f> <Ufe52> <U65> : "ể" # U1ec3
+<Uff20> <U3f> <Ufe52> <U6f> : "ổ" # U1ed5
+<Uff20> <U3f> <Ufe55> <U41> : "Ẳ" # U1eb2
+<Uff20> <U3f> <Ufe55> <U61> : "ẳ" # U1eb3
+<Uff20> <U3f> <Ufe62> <U4f> : "Ở" # U1ede
+<Uff20> <U3f> <Ufe62> <U55> : "Ử" # U1eec
+<Uff20> <U3f> <Ufe62> <U6f> : "ở" # U1edf
+<Uff20> <U3f> <Ufe62> <U75> : "ử" # U1eed
+<Uff20> <U55> <U21> <U41> : "Ặ" # U1eb6
+<Uff20> <U55> <U21> <U61> : "ặ" # U1eb7
+<Uff20> <U55> <Ub8> <U45> : "Ḝ" # U1e1c
+<Uff20> <U55> <Ub8> <U65> : "ḝ" # U1e1d
+<Uff20> <U55> <Ufe5b> <U45> : "Ḝ" # U1e1c
+<Uff20> <U55> <Ufe5b> <U65> : "ḝ" # U1e1d
+<Uff20> <U55> <Ufe60> <U41> : "Ặ" # U1eb6
+<Uff20> <U55> <Ufe60> <U61> : "ặ" # U1eb7
+<Uff20> <U5c> <U6f> <U2f> : "🙌" # U1f64c
+<Uff20> <U5e> <U21> <U41> : "Ậ" # U1eac
+<Uff20> <U5e> <U21> <U45> : "Ệ" # U1ec6
+<Uff20> <U5e> <U21> <U4f> : "Ộ" # U1ed8
+<Uff20> <U5e> <U21> <U61> : "ậ" # U1ead
+<Uff20> <U5e> <U21> <U65> : "ệ" # U1ec7
+<Uff20> <U5e> <U21> <U6f> : "ộ" # U1ed9
+<Uff20> <U5e> <U5f> <U61> : "ª" # Uaa
+<Uff20> <U5e> <U5f> <U68> : "ʰ" # U2b0
+<Uff20> <U5e> <U5f> <U69> : "ⁱ" # U2071
+<Uff20> <U5e> <U5f> <U6a> : "ʲ" # U2b2
+<Uff20> <U5e> <U5f> <U6c> : "ˡ" # U2e1
+<Uff20> <U5e> <U5f> <U6e> : "ⁿ" # U207f
+<Uff20> <U5e> <U5f> <U6f> : "º" # Uba
+<Uff20> <U5e> <U5f> <U72> : "ʳ" # U2b3
+<Uff20> <U5e> <U5f> <U73> : "ˢ" # U2e2
+<Uff20> <U5e> <U5f> <U77> : "ʷ" # U2b7
+<Uff20> <U5e> <U5f> <U78> : "ˣ" # U2e3
+<Uff20> <U5e> <U5f> <U79> : "ʸ" # U2b8
+<Uff20> <U5e> <U5f> <U263> : "ˠ" # U2e0
+<Uff20> <U5e> <U5f> <U266> : "ʱ" # U2b1
+<Uff20> <U5e> <U5f> <U279> : "ʴ" # U2b4
+<Uff20> <U5e> <U5f> <U27b> : "ʵ" # U2b5
+<Uff20> <U5e> <U5f> <U281> : "ʶ" # U2b6
+<Uff20> <U5e> <U5f> <U295> : "ˤ" # U2e4
+<Uff20> <U5e> <Ubc6> <U61> : "ª" # Uaa
+<Uff20> <U5e> <Ubc6> <U68> : "ʰ" # U2b0
+<Uff20> <U5e> <Ubc6> <U69> : "ⁱ" # U2071
+<Uff20> <U5e> <Ubc6> <U6a> : "ʲ" # U2b2
+<Uff20> <U5e> <Ubc6> <U6c> : "ˡ" # U2e1
+<Uff20> <U5e> <Ubc6> <U6e> : "ⁿ" # U207f
+<Uff20> <U5e> <Ubc6> <U6f> : "º" # Uba
+<Uff20> <U5e> <Ubc6> <U72> : "ʳ" # U2b3
+<Uff20> <U5e> <Ubc6> <U73> : "ˢ" # U2e2
+<Uff20> <U5e> <Ubc6> <U77> : "ʷ" # U2b7
+<Uff20> <U5e> <Ubc6> <U78> : "ˣ" # U2e3
+<Uff20> <U5e> <Ubc6> <U79> : "ʸ" # U2b8
+<Uff20> <U5e> <Ubc6> <U263> : "ˠ" # U2e0
+<Uff20> <U5e> <Ubc6> <U266> : "ʱ" # U2b1
+<Uff20> <U5e> <Ubc6> <U279> : "ʴ" # U2b4
+<Uff20> <U5e> <Ubc6> <U27b> : "ʵ" # U2b5
+<Uff20> <U5e> <Ubc6> <U281> : "ʶ" # U2b6
+<Uff20> <U5e> <Ubc6> <U295> : "ˤ" # U2e4
+<Uff20> <U5e> <Ufe60> <U41> : "Ậ" # U1eac
+<Uff20> <U5e> <Ufe60> <U45> : "Ệ" # U1ec6
+<Uff20> <U5e> <Ufe60> <U4f> : "Ộ" # U1ed8
+<Uff20> <U5e> <Ufe60> <U61> : "ậ" # U1ead
+<Uff20> <U5e> <Ufe60> <U65> : "ệ" # U1ec7
+<Uff20> <U5e> <Ufe60> <U6f> : "ộ" # U1ed9
+<Uff20> <U5f> <U21> <U4c> : "Ḹ" # U1e38
+<Uff20> <U5f> <U21> <U52> : "Ṝ" # U1e5c
+<Uff20> <U5f> <U21> <U6c> : "ḹ" # U1e39
+<Uff20> <U5f> <U21> <U72> : "ṝ" # U1e5d
+<Uff20> <U5f> <U22> <U41> : "Ǟ" # U1de
+<Uff20> <U5f> <U22> <U4f> : "Ȫ" # U22a
+<Uff20> <U5f> <U22> <U55> : "Ǖ" # U1d5
+<Uff20> <U5f> <U22> <U61> : "ǟ" # U1df
+<Uff20> <U5f> <U22> <U6f> : "ȫ" # U22b
+<Uff20> <U5f> <U22> <U75> : "ǖ" # U1d6
+<Uff20> <U5f> <U2e> <U41> : "Ǡ" # U1e0
+<Uff20> <U5f> <U2e> <U4f> : "Ȱ" # U230
+<Uff20> <U5f> <U2e> <U61> : "ǡ" # U1e1
+<Uff20> <U5f> <U2e> <U6f> : "ȱ" # U231
+<Uff20> <U5f> <U3b> <U4f> : "Ǭ" # U1ec
+<Uff20> <U5f> <U3b> <U6f> : "ǭ" # U1ed
+<Uff20> <U5f> <U7e> <U4f> : "Ȭ" # U22c
+<Uff20> <U5f> <U7e> <U6f> : "ȭ" # U22d
+<Uff20> <U5f> <Ufe53> <U4f> : "Ȭ" # U22c
+<Uff20> <U5f> <Ufe53> <U6f> : "ȭ" # U22d
+<Uff20> <U5f> <Ufe56> <U41> : "Ǡ" # U1e0
+<Uff20> <U5f> <Ufe56> <U4f> : "Ȱ" # U230
+<Uff20> <U5f> <Ufe56> <U61> : "ǡ" # U1e1
+<Uff20> <U5f> <Ufe56> <U6f> : "ȱ" # U231
+<Uff20> <U5f> <Ufe57> <U41> : "Ǟ" # U1de
+<Uff20> <U5f> <Ufe57> <U4f> : "Ȫ" # U22a
+<Uff20> <U5f> <Ufe57> <U55> : "Ǖ" # U1d5
+<Uff20> <U5f> <Ufe57> <U61> : "ǟ" # U1df
+<Uff20> <U5f> <Ufe57> <U6f> : "ȫ" # U22b
+<Uff20> <U5f> <Ufe57> <U75> : "ǖ" # U1d6
+<Uff20> <U5f> <Ufe5c> <U4f> : "Ǭ" # U1ec
+<Uff20> <U5f> <Ufe5c> <U6f> : "ǭ" # U1ed
+<Uff20> <U5f> <Ufe60> <U4c> : "Ḹ" # U1e38
+<Uff20> <U5f> <Ufe60> <U52> : "Ṝ" # U1e5c
+<Uff20> <U5f> <Ufe60> <U6c> : "ḹ" # U1e39
+<Uff20> <U5f> <Ufe60> <U72> : "ṝ" # U1e5d
+<Uff20> <U60> <U22> <U55> : "Ǜ" # U1db
+<Uff20> <U60> <U22> <U75> : "ǜ" # U1dc
+<Uff20> <U60> <U22> <U7e9> : "ῒ" # U1fd2
+<Uff20> <U60> <U22> <U7f5> : "ῢ" # U1fe2
+<Uff20> <U60> <U28> <U7c1> : "Ἃ" # U1f0b
+<Uff20> <U60> <U28> <U7c5> : "Ἓ" # U1f1b
+<Uff20> <U60> <U28> <U7c7> : "Ἣ" # U1f2b
+<Uff20> <U60> <U28> <U7c9> : "Ἳ" # U1f3b
+<Uff20> <U60> <U28> <U7cf> : "Ὃ" # U1f4b
+<Uff20> <U60> <U28> <U7d5> : "Ὓ" # U1f5b
+<Uff20> <U60> <U28> <U7d9> : "Ὣ" # U1f6b
+<Uff20> <U60> <U28> <U7e1> : "ἃ" # U1f03
+<Uff20> <U60> <U28> <U7e5> : "ἓ" # U1f13
+<Uff20> <U60> <U28> <U7e7> : "ἣ" # U1f23
+<Uff20> <U60> <U28> <U7e9> : "ἳ" # U1f33
+<Uff20> <U60> <U28> <U7ef> : "ὃ" # U1f43
+<Uff20> <U60> <U28> <U7f5> : "ὓ" # U1f53
+<Uff20> <U60> <U28> <U7f9> : "ὣ" # U1f63
+<Uff20> <U60> <U29> <U7c1> : "Ἂ" # U1f0a
+<Uff20> <U60> <U29> <U7c5> : "Ἒ" # U1f1a
+<Uff20> <U60> <U29> <U7c7> : "Ἢ" # U1f2a
+<Uff20> <U60> <U29> <U7c9> : "Ἲ" # U1f3a
+<Uff20> <U60> <U29> <U7cf> : "Ὂ" # U1f4a
+<Uff20> <U60> <U29> <U7d9> : "Ὢ" # U1f6a
+<Uff20> <U60> <U29> <U7e1> : "ἂ" # U1f02
+<Uff20> <U60> <U29> <U7e5> : "ἒ" # U1f12
+<Uff20> <U60> <U29> <U7e7> : "ἢ" # U1f22
+<Uff20> <U60> <U29> <U7e9> : "ἲ" # U1f32
+<Uff20> <U60> <U29> <U7ef> : "ὂ" # U1f42
+<Uff20> <U60> <U29> <U7f5> : "ὒ" # U1f52
+<Uff20> <U60> <U29> <U7f9> : "ὢ" # U1f62
+<Uff20> <U60> <U2b> <U4f> : "Ờ" # U1edc
+<Uff20> <U60> <U2b> <U55> : "Ừ" # U1eea
+<Uff20> <U60> <U2b> <U6f> : "ờ" # U1edd
+<Uff20> <U60> <U2b> <U75> : "ừ" # U1eeb
+<Uff20> <U60> <U5e> <U41> : "Ầ" # U1ea6
+<Uff20> <U60> <U5e> <U45> : "Ề" # U1ec0
+<Uff20> <U60> <U5e> <U4f> : "Ồ" # U1ed2
+<Uff20> <U60> <U5e> <U61> : "ầ" # U1ea7
+<Uff20> <U60> <U5e> <U65> : "ề" # U1ec1
+<Uff20> <U60> <U5e> <U6f> : "ồ" # U1ed3
+<Uff20> <U60> <U5f> <U45> : "Ḕ" # U1e14
+<Uff20> <U60> <U5f> <U4f> : "Ṑ" # U1e50
+<Uff20> <U60> <U5f> <U65> : "ḕ" # U1e15
+<Uff20> <U60> <U5f> <U6f> : "ṑ" # U1e51
+<Uff20> <U60> <U60> <U6c1> : "а̏"
+<Uff20> <U60> <U60> <U6c5> : "е̏"
+<Uff20> <U60> <U60> <U6c9> : "и̏"
+<Uff20> <U60> <U60> <U6cf> : "о̏"
+<Uff20> <U60> <U60> <U6d2> : "р̏"
+<Uff20> <U60> <U60> <U6d5> : "у̏"
+<Uff20> <U60> <U60> <U6e1> : "А̏"
+<Uff20> <U60> <U60> <U6e5> : "Е̏"
+<Uff20> <U60> <U60> <U6e9> : "И̏"
+<Uff20> <U60> <U60> <U6ef> : "О̏"
+<Uff20> <U60> <U60> <U6f2> : "Р̏"
+<Uff20> <U60> <U60> <U6f5> : "У̏"
+<Uff20> <U60> <U62> <U41> : "Ằ" # U1eb0
+<Uff20> <U60> <U62> <U61> : "ằ" # U1eb1
+<Uff20> <U60> <Uaf> <U45> : "Ḕ" # U1e14
+<Uff20> <U60> <Uaf> <U4f> : "Ṑ" # U1e50
+<Uff20> <U60> <Uaf> <U65> : "ḕ" # U1e15
+<Uff20> <U60> <Uaf> <U6f> : "ṑ" # U1e51
+<Uff20> <U60> <Ufe52> <U41> : "Ầ" # U1ea6
+<Uff20> <U60> <Ufe52> <U45> : "Ề" # U1ec0
+<Uff20> <U60> <Ufe52> <U4f> : "Ồ" # U1ed2
+<Uff20> <U60> <Ufe52> <U61> : "ầ" # U1ea7
+<Uff20> <U60> <Ufe52> <U65> : "ề" # U1ec1
+<Uff20> <U60> <Ufe52> <U6f> : "ồ" # U1ed3
+<Uff20> <U60> <Ufe54> <U45> : "Ḕ" # U1e14
+<Uff20> <U60> <Ufe54> <U4f> : "Ṑ" # U1e50
+<Uff20> <U60> <Ufe54> <U65> : "ḕ" # U1e15
+<Uff20> <U60> <Ufe54> <U6f> : "ṑ" # U1e51
+<Uff20> <U60> <Ufe55> <U41> : "Ằ" # U1eb0
+<Uff20> <U60> <Ufe55> <U61> : "ằ" # U1eb1
+<Uff20> <U60> <Ufe57> <U55> : "Ǜ" # U1db
+<Uff20> <U60> <Ufe57> <U75> : "ǜ" # U1dc
+<Uff20> <U60> <Ufe57> <U7e9> : "ῒ" # U1fd2
+<Uff20> <U60> <Ufe57> <U7f5> : "ῢ" # U1fe2
+<Uff20> <U60> <Ufe62> <U4f> : "Ờ" # U1edc
+<Uff20> <U60> <Ufe62> <U55> : "Ừ" # U1eea
+<Uff20> <U60> <Ufe62> <U6f> : "ờ" # U1edd
+<Uff20> <U60> <Ufe62> <U75> : "ừ" # U1eeb
+<Uff20> <U60> <Ufe64> <U7c1> : "Ἂ" # U1f0a
+<Uff20> <U60> <Ufe64> <U7c5> : "Ἒ" # U1f1a
+<Uff20> <U60> <Ufe64> <U7c7> : "Ἢ" # U1f2a
+<Uff20> <U60> <Ufe64> <U7c9> : "Ἲ" # U1f3a
+<Uff20> <U60> <Ufe64> <U7cf> : "Ὂ" # U1f4a
+<Uff20> <U60> <Ufe64> <U7d9> : "Ὢ" # U1f6a
+<Uff20> <U60> <Ufe64> <U7e1> : "ἂ" # U1f02
+<Uff20> <U60> <Ufe64> <U7e5> : "ἒ" # U1f12
+<Uff20> <U60> <Ufe64> <U7e7> : "ἢ" # U1f22
+<Uff20> <U60> <Ufe64> <U7e9> : "ἲ" # U1f32
+<Uff20> <U60> <Ufe64> <U7ef> : "ὂ" # U1f42
+<Uff20> <U60> <Ufe64> <U7f5> : "ὒ" # U1f52
+<Uff20> <U60> <Ufe64> <U7f9> : "ὢ" # U1f62
+<Uff20> <U60> <Ufe65> <U7c1> : "Ἃ" # U1f0b
+<Uff20> <U60> <Ufe65> <U7c5> : "Ἓ" # U1f1b
+<Uff20> <U60> <Ufe65> <U7c7> : "Ἣ" # U1f2b
+<Uff20> <U60> <Ufe65> <U7c9> : "Ἳ" # U1f3b
+<Uff20> <U60> <Ufe65> <U7cf> : "Ὃ" # U1f4b
+<Uff20> <U60> <Ufe65> <U7d5> : "Ὓ" # U1f5b
+<Uff20> <U60> <Ufe65> <U7d9> : "Ὣ" # U1f6b
+<Uff20> <U60> <Ufe65> <U7e1> : "ἃ" # U1f03
+<Uff20> <U60> <Ufe65> <U7e5> : "ἓ" # U1f13
+<Uff20> <U60> <Ufe65> <U7e7> : "ἣ" # U1f23
+<Uff20> <U60> <Ufe65> <U7e9> : "ἳ" # U1f33
+<Uff20> <U60> <Ufe65> <U7ef> : "ὃ" # U1f43
+<Uff20> <U60> <Ufe65> <U7f5> : "ὓ" # U1f53
+<Uff20> <U60> <Ufe65> <U7f9> : "ὣ" # U1f63
+<Uff20> <U62> <U21> <U41> : "Ặ" # U1eb6
+<Uff20> <U62> <U21> <U61> : "ặ" # U1eb7
+<Uff20> <U62> <U2c> <U45> : "Ḝ" # U1e1c
+<Uff20> <U62> <U2c> <U65> : "ḝ" # U1e1d
+<Uff20> <U62> <Ub8> <U45> : "Ḝ" # U1e1c
+<Uff20> <U62> <Ub8> <U65> : "ḝ" # U1e1d
+<Uff20> <U62> <Ufe5b> <U45> : "Ḝ" # U1e1c
+<Uff20> <U62> <Ufe5b> <U65> : "ḝ" # U1e1d
+<Uff20> <U62> <Ufe60> <U41> : "Ặ" # U1eb6
+<Uff20> <U62> <Ufe60> <U61> : "ặ" # U1eb7
+<Uff20> <U63> <U22> <U55> : "Ǚ" # U1d9
+<Uff20> <U63> <U22> <U75> : "ǚ" # U1da
+<Uff20> <U63> <Ufe57> <U55> : "Ǚ" # U1d9
+<Uff20> <U63> <Ufe57> <U75> : "ǚ" # U1da
+<Uff20> <U70> <U6f> <U6f> : "💩" # U1f4a9
+<Uff20> <U7e> <U22> <U7e9> : "ῗ" # U1fd7
+<Uff20> <U7e> <U22> <U7f5> : "ῧ" # U1fe7
+<Uff20> <U7e> <U28> <U7c1> : "Ἇ" # U1f0f
+<Uff20> <U7e> <U28> <U7c7> : "Ἧ" # U1f2f
+<Uff20> <U7e> <U28> <U7c9> : "Ἷ" # U1f3f
+<Uff20> <U7e> <U28> <U7d5> : "Ὗ" # U1f5f
+<Uff20> <U7e> <U28> <U7d9> : "Ὧ" # U1f6f
+<Uff20> <U7e> <U28> <U7e1> : "ἇ" # U1f07
+<Uff20> <U7e> <U28> <U7e7> : "ἧ" # U1f27
+<Uff20> <U7e> <U28> <U7e9> : "ἷ" # U1f37
+<Uff20> <U7e> <U28> <U7f5> : "ὗ" # U1f57
+<Uff20> <U7e> <U28> <U7f9> : "ὧ" # U1f67
+<Uff20> <U7e> <U29> <U7c1> : "Ἆ" # U1f0e
+<Uff20> <U7e> <U29> <U7c7> : "Ἦ" # U1f2e
+<Uff20> <U7e> <U29> <U7c9> : "Ἶ" # U1f3e
+<Uff20> <U7e> <U29> <U7d9> : "Ὦ" # U1f6e
+<Uff20> <U7e> <U29> <U7e1> : "ἆ" # U1f06
+<Uff20> <U7e> <U29> <U7e7> : "ἦ" # U1f26
+<Uff20> <U7e> <U29> <U7e9> : "ἶ" # U1f36
+<Uff20> <U7e> <U29> <U7f5> : "ὖ" # U1f56
+<Uff20> <U7e> <U29> <U7f9> : "ὦ" # U1f66
+<Uff20> <U7e> <U2b> <U4f> : "Ỡ" # U1ee0
+<Uff20> <U7e> <U2b> <U55> : "Ữ" # U1eee
+<Uff20> <U7e> <U2b> <U6f> : "ỡ" # U1ee1
+<Uff20> <U7e> <U2b> <U75> : "ữ" # U1eef
+<Uff20> <U7e> <U5e> <U41> : "Ẫ" # U1eaa
+<Uff20> <U7e> <U5e> <U45> : "Ễ" # U1ec4
+<Uff20> <U7e> <U5e> <U4f> : "Ỗ" # U1ed6
+<Uff20> <U7e> <U5e> <U61> : "ẫ" # U1eab
+<Uff20> <U7e> <U5e> <U65> : "ễ" # U1ec5
+<Uff20> <U7e> <U5e> <U6f> : "ỗ" # U1ed7
+<Uff20> <U7e> <U62> <U41> : "Ẵ" # U1eb4
+<Uff20> <U7e> <U62> <U61> : "ẵ" # U1eb5
+<Uff20> <U7e> <Ufe52> <U41> : "Ẫ" # U1eaa
+<Uff20> <U7e> <Ufe52> <U45> : "Ễ" # U1ec4
+<Uff20> <U7e> <Ufe52> <U4f> : "Ỗ" # U1ed6
+<Uff20> <U7e> <Ufe52> <U61> : "ẫ" # U1eab
+<Uff20> <U7e> <Ufe52> <U65> : "ễ" # U1ec5
+<Uff20> <U7e> <Ufe52> <U6f> : "ỗ" # U1ed7
+<Uff20> <U7e> <Ufe55> <U41> : "Ẵ" # U1eb4
+<Uff20> <U7e> <Ufe55> <U61> : "ẵ" # U1eb5
+<Uff20> <U7e> <Ufe57> <U7e9> : "ῗ" # U1fd7
+<Uff20> <U7e> <Ufe57> <U7f5> : "ῧ" # U1fe7
+<Uff20> <U7e> <Ufe62> <U4f> : "Ỡ" # U1ee0
+<Uff20> <U7e> <Ufe62> <U55> : "Ữ" # U1eee
+<Uff20> <U7e> <Ufe62> <U6f> : "ỡ" # U1ee1
+<Uff20> <U7e> <Ufe62> <U75> : "ữ" # U1eef
+<Uff20> <U7e> <Ufe64> <U7c1> : "Ἆ" # U1f0e
+<Uff20> <U7e> <Ufe64> <U7c7> : "Ἦ" # U1f2e
+<Uff20> <U7e> <Ufe64> <U7c9> : "Ἶ" # U1f3e
+<Uff20> <U7e> <Ufe64> <U7d9> : "Ὦ" # U1f6e
+<Uff20> <U7e> <Ufe64> <U7e1> : "ἆ" # U1f06
+<Uff20> <U7e> <Ufe64> <U7e7> : "ἦ" # U1f26
+<Uff20> <U7e> <Ufe64> <U7e9> : "ἶ" # U1f36
+<Uff20> <U7e> <Ufe64> <U7f5> : "ὖ" # U1f56
+<Uff20> <U7e> <Ufe64> <U7f9> : "ὦ" # U1f66
+<Uff20> <U7e> <Ufe65> <U7c1> : "Ἇ" # U1f0f
+<Uff20> <U7e> <Ufe65> <U7c7> : "Ἧ" # U1f2f
+<Uff20> <U7e> <Ufe65> <U7c9> : "Ἷ" # U1f3f
+<Uff20> <U7e> <Ufe65> <U7d5> : "Ὗ" # U1f5f
+<Uff20> <U7e> <Ufe65> <U7d9> : "Ὧ" # U1f6f
+<Uff20> <U7e> <Ufe65> <U7e1> : "ἇ" # U1f07
+<Uff20> <U7e> <Ufe65> <U7e7> : "ἧ" # U1f27
+<Uff20> <U7e> <Ufe65> <U7e9> : "ἷ" # U1f37
+<Uff20> <U7e> <Ufe65> <U7f5> : "ὗ" # U1f57
+<Uff20> <U7e> <Ufe65> <U7f9> : "ὧ" # U1f67
+<Uff20> <Uaf> <U21> <U4c> : "Ḹ" # U1e38
+<Uff20> <Uaf> <U21> <U52> : "Ṝ" # U1e5c
+<Uff20> <Uaf> <U21> <U6c> : "ḹ" # U1e39
+<Uff20> <Uaf> <U21> <U72> : "ṝ" # U1e5d
+<Uff20> <Uaf> <U22> <U41> : "Ǟ" # U1de
+<Uff20> <Uaf> <U22> <U4f> : "Ȫ" # U22a
+<Uff20> <Uaf> <U22> <U55> : "Ǖ" # U1d5
+<Uff20> <Uaf> <U22> <U61> : "ǟ" # U1df
+<Uff20> <Uaf> <U22> <U6f> : "ȫ" # U22b
+<Uff20> <Uaf> <U22> <U75> : "ǖ" # U1d6
+<Uff20> <Uaf> <U2e> <U41> : "Ǡ" # U1e0
+<Uff20> <Uaf> <U2e> <U4f> : "Ȱ" # U230
+<Uff20> <Uaf> <U2e> <U61> : "ǡ" # U1e1
+<Uff20> <Uaf> <U2e> <U6f> : "ȱ" # U231
+<Uff20> <Uaf> <U3b> <U4f> : "Ǭ" # U1ec
+<Uff20> <Uaf> <U3b> <U6f> : "ǭ" # U1ed
+<Uff20> <Uaf> <U7e> <U4f> : "Ȭ" # U22c
+<Uff20> <Uaf> <U7e> <U6f> : "ȭ" # U22d
+<Uff20> <Uaf> <Ufe53> <U4f> : "Ȭ" # U22c
+<Uff20> <Uaf> <Ufe53> <U6f> : "ȭ" # U22d
+<Uff20> <Uaf> <Ufe56> <U41> : "Ǡ" # U1e0
+<Uff20> <Uaf> <Ufe56> <U4f> : "Ȱ" # U230
+<Uff20> <Uaf> <Ufe56> <U61> : "ǡ" # U1e1
+<Uff20> <Uaf> <Ufe56> <U6f> : "ȱ" # U231
+<Uff20> <Uaf> <Ufe57> <U41> : "Ǟ" # U1de
+<Uff20> <Uaf> <Ufe57> <U4f> : "Ȫ" # U22a
+<Uff20> <Uaf> <Ufe57> <U55> : "Ǖ" # U1d5
+<Uff20> <Uaf> <Ufe57> <U61> : "ǟ" # U1df
+<Uff20> <Uaf> <Ufe57> <U6f> : "ȫ" # U22b
+<Uff20> <Uaf> <Ufe57> <U75> : "ǖ" # U1d6
+<Uff20> <Uaf> <Ufe5c> <U4f> : "Ǭ" # U1ec
+<Uff20> <Uaf> <Ufe5c> <U6f> : "ǭ" # U1ed
+<Uff20> <Uaf> <Ufe60> <U4c> : "Ḹ" # U1e38
+<Uff20> <Uaf> <Ufe60> <U52> : "Ṝ" # U1e5c
+<Uff20> <Uaf> <Ufe60> <U6c> : "ḹ" # U1e39
+<Uff20> <Uaf> <Ufe60> <U72> : "ṝ" # U1e5d
+<Uff20> <Ub4> <U22> <U49> : "Ḯ" # U1e2e
+<Uff20> <Ub4> <U22> <U55> : "Ǘ" # U1d7
+<Uff20> <Ub4> <U22> <U69> : "ḯ" # U1e2f
+<Uff20> <Ub4> <U22> <U75> : "ǘ" # U1d8
+<Uff20> <Ub4> <U22> <U7e9> : "ΐ" # U390
+<Uff20> <Ub4> <U22> <U7f5> : "ΰ" # U3b0
+<Uff20> <Ub4> <U28> <U7c1> : "Ἅ" # U1f0d
+<Uff20> <Ub4> <U28> <U7c5> : "Ἕ" # U1f1d
+<Uff20> <Ub4> <U28> <U7c7> : "Ἥ" # U1f2d
+<Uff20> <Ub4> <U28> <U7c9> : "Ἵ" # U1f3d
+<Uff20> <Ub4> <U28> <U7cf> : "Ὅ" # U1f4d
+<Uff20> <Ub4> <U28> <U7d5> : "Ὕ" # U1f5d
+<Uff20> <Ub4> <U28> <U7d9> : "Ὥ" # U1f6d
+<Uff20> <Ub4> <U28> <U7e1> : "ἅ" # U1f05
+<Uff20> <Ub4> <U28> <U7e5> : "ἕ" # U1f15
+<Uff20> <Ub4> <U28> <U7e7> : "ἥ" # U1f25
+<Uff20> <Ub4> <U28> <U7e9> : "ἵ" # U1f35
+<Uff20> <Ub4> <U28> <U7ef> : "ὅ" # U1f45
+<Uff20> <Ub4> <U28> <U7f5> : "ὕ" # U1f55
+<Uff20> <Ub4> <U28> <U7f9> : "ὥ" # U1f65
+<Uff20> <Ub4> <U29> <U7c1> : "Ἄ" # U1f0c
+<Uff20> <Ub4> <U29> <U7c5> : "Ἔ" # U1f1c
+<Uff20> <Ub4> <U29> <U7c7> : "Ἤ" # U1f2c
+<Uff20> <Ub4> <U29> <U7c9> : "Ἴ" # U1f3c
+<Uff20> <Ub4> <U29> <U7cf> : "Ὄ" # U1f4c
+<Uff20> <Ub4> <U29> <U7d9> : "Ὤ" # U1f6c
+<Uff20> <Ub4> <U29> <U7e1> : "ἄ" # U1f04
+<Uff20> <Ub4> <U29> <U7e5> : "ἔ" # U1f14
+<Uff20> <Ub4> <U29> <U7e7> : "ἤ" # U1f24
+<Uff20> <Ub4> <U29> <U7e9> : "ἴ" # U1f34
+<Uff20> <Ub4> <U29> <U7ef> : "ὄ" # U1f44
+<Uff20> <Ub4> <U29> <U7f5> : "ὔ" # U1f54
+<Uff20> <Ub4> <U29> <U7f9> : "ὤ" # U1f64
+<Uff20> <Ub4> <U2b> <U4f> : "Ớ" # U1eda
+<Uff20> <Ub4> <U2b> <U55> : "Ứ" # U1ee8
+<Uff20> <Ub4> <U2b> <U6f> : "ớ" # U1edb
+<Uff20> <Ub4> <U2b> <U75> : "ứ" # U1ee9
+<Uff20> <Ub4> <U2c> <U43> : "Ḉ" # U1e08
+<Uff20> <Ub4> <U2c> <U63> : "ḉ" # U1e09
+<Uff20> <Ub4> <U2f> <U4f> : "Ǿ" # U1fe
+<Uff20> <Ub4> <U2f> <U6f> : "ǿ" # U1ff
+<Uff20> <Ub4> <U5e> <U41> : "Ấ" # U1ea4
+<Uff20> <Ub4> <U5e> <U45> : "Ế" # U1ebe
+<Uff20> <Ub4> <U5e> <U4f> : "Ố" # U1ed0
+<Uff20> <Ub4> <U5e> <U61> : "ấ" # U1ea5
+<Uff20> <Ub4> <U5e> <U65> : "ế" # U1ebf
+<Uff20> <Ub4> <U5e> <U6f> : "ố" # U1ed1
+<Uff20> <Ub4> <U5f> <U45> : "Ḗ" # U1e16
+<Uff20> <Ub4> <U5f> <U4f> : "Ṓ" # U1e52
+<Uff20> <Ub4> <U5f> <U65> : "ḗ" # U1e17
+<Uff20> <Ub4> <U5f> <U6f> : "ṓ" # U1e53
+<Uff20> <Ub4> <U62> <U41> : "Ắ" # U1eae
+<Uff20> <Ub4> <U62> <U61> : "ắ" # U1eaf
+<Uff20> <Ub4> <U7e> <U4f> : "Ṍ" # U1e4c
+<Uff20> <Ub4> <U7e> <U55> : "Ṹ" # U1e78
+<Uff20> <Ub4> <U7e> <U6f> : "ṍ" # U1e4d
+<Uff20> <Ub4> <U7e> <U75> : "ṹ" # U1e79
+<Uff20> <Ub4> <Uaf> <U45> : "Ḗ" # U1e16
+<Uff20> <Ub4> <Uaf> <U4f> : "Ṓ" # U1e52
+<Uff20> <Ub4> <Uaf> <U65> : "ḗ" # U1e17
+<Uff20> <Ub4> <Uaf> <U6f> : "ṓ" # U1e53
+<Uff20> <Ub4> <Ub8> <U43> : "Ḉ" # U1e08
+<Uff20> <Ub4> <Ub8> <U63> : "ḉ" # U1e09
+<Uff20> <Ub4> <Ufe52> <U41> : "Ấ" # U1ea4
+<Uff20> <Ub4> <Ufe52> <U45> : "Ế" # U1ebe
+<Uff20> <Ub4> <Ufe52> <U4f> : "Ố" # U1ed0
+<Uff20> <Ub4> <Ufe52> <U61> : "ấ" # U1ea5
+<Uff20> <Ub4> <Ufe52> <U65> : "ế" # U1ebf
+<Uff20> <Ub4> <Ufe52> <U6f> : "ố" # U1ed1
+<Uff20> <Ub4> <Ufe53> <U4f> : "Ṍ" # U1e4c
+<Uff20> <Ub4> <Ufe53> <U55> : "Ṹ" # U1e78
+<Uff20> <Ub4> <Ufe53> <U6f> : "ṍ" # U1e4d
+<Uff20> <Ub4> <Ufe53> <U75> : "ṹ" # U1e79
+<Uff20> <Ub4> <Ufe54> <U45> : "Ḗ" # U1e16
+<Uff20> <Ub4> <Ufe54> <U4f> : "Ṓ" # U1e52
+<Uff20> <Ub4> <Ufe54> <U65> : "ḗ" # U1e17
+<Uff20> <Ub4> <Ufe54> <U6f> : "ṓ" # U1e53
+<Uff20> <Ub4> <Ufe55> <U41> : "Ắ" # U1eae
+<Uff20> <Ub4> <Ufe55> <U61> : "ắ" # U1eaf
+<Uff20> <Ub4> <Ufe57> <U49> : "Ḯ" # U1e2e
+<Uff20> <Ub4> <Ufe57> <U55> : "Ǘ" # U1d7
+<Uff20> <Ub4> <Ufe57> <U69> : "ḯ" # U1e2f
+<Uff20> <Ub4> <Ufe57> <U75> : "ǘ" # U1d8
+<Uff20> <Ub4> <Ufe57> <U7e9> : "ΐ" # U390
+<Uff20> <Ub4> <Ufe57> <U7f5> : "ΰ" # U3b0
+<Uff20> <Ub4> <Ufe58> <U41> : "Ǻ" # U1fa
+<Uff20> <Ub4> <Ufe58> <U61> : "ǻ" # U1fb
+<Uff20> <Ub4> <Ufe5b> <U43> : "Ḉ" # U1e08
+<Uff20> <Ub4> <Ufe5b> <U63> : "ḉ" # U1e09
+<Uff20> <Ub4> <Ufe62> <U4f> : "Ớ" # U1eda
+<Uff20> <Ub4> <Ufe62> <U55> : "Ứ" # U1ee8
+<Uff20> <Ub4> <Ufe62> <U6f> : "ớ" # U1edb
+<Uff20> <Ub4> <Ufe62> <U75> : "ứ" # U1ee9
+<Uff20> <Ub4> <Ufe64> <U7c1> : "Ἄ" # U1f0c
+<Uff20> <Ub4> <Ufe64> <U7c5> : "Ἔ" # U1f1c
+<Uff20> <Ub4> <Ufe64> <U7c7> : "Ἤ" # U1f2c
+<Uff20> <Ub4> <Ufe64> <U7c9> : "Ἴ" # U1f3c
+<Uff20> <Ub4> <Ufe64> <U7cf> : "Ὄ" # U1f4c
+<Uff20> <Ub4> <Ufe64> <U7d9> : "Ὤ" # U1f6c
+<Uff20> <Ub4> <Ufe64> <U7e1> : "ἄ" # U1f04
+<Uff20> <Ub4> <Ufe64> <U7e5> : "ἔ" # U1f14
+<Uff20> <Ub4> <Ufe64> <U7e7> : "ἤ" # U1f24
+<Uff20> <Ub4> <Ufe64> <U7e9> : "ἴ" # U1f34
+<Uff20> <Ub4> <Ufe64> <U7ef> : "ὄ" # U1f44
+<Uff20> <Ub4> <Ufe64> <U7f5> : "ὔ" # U1f54
+<Uff20> <Ub4> <Ufe64> <U7f9> : "ὤ" # U1f64
+<Uff20> <Ub4> <Ufe65> <U7c1> : "Ἅ" # U1f0d
+<Uff20> <Ub4> <Ufe65> <U7c5> : "Ἕ" # U1f1d
+<Uff20> <Ub4> <Ufe65> <U7c7> : "Ἥ" # U1f2d
+<Uff20> <Ub4> <Ufe65> <U7c9> : "Ἵ" # U1f3d
+<Uff20> <Ub4> <Ufe65> <U7cf> : "Ὅ" # U1f4d
+<Uff20> <Ub4> <Ufe65> <U7d5> : "Ὕ" # U1f5d
+<Uff20> <Ub4> <Ufe65> <U7d9> : "Ὥ" # U1f6d
+<Uff20> <Ub4> <Ufe65> <U7e1> : "ἅ" # U1f05
+<Uff20> <Ub4> <Ufe65> <U7e5> : "ἕ" # U1f15
+<Uff20> <Ub4> <Ufe65> <U7e7> : "ἥ" # U1f25
+<Uff20> <Ub4> <Ufe65> <U7e9> : "ἵ" # U1f35
+<Uff20> <Ub4> <Ufe65> <U7ef> : "ὅ" # U1f45
+<Uff20> <Ub4> <Ufe65> <U7f5> : "ὕ" # U1f55
+<Uff20> <Ub4> <Ufe65> <U7f9> : "ὥ" # U1f65
+<Uff20> <Ub4> <Uffaf> <U4f> : "Ǿ" # U1fe
+<Uff20> <Ub4> <Uffaf> <U6f> : "ǿ" # U1ff
+<Uff20> <U5c1> <U5bc> <Ucf9> : "שּׁ" # Ufb2c
+<Uff20> <U5c2> <U5bc> <Ucf9> : "שּׂ" # Ufb2d
+<Uff20> <U7e9> <U27> <U7e1> : "ᾴ" # U1fb4
+<Uff20> <U7e9> <U27> <U7e7> : "ῄ" # U1fc4
+<Uff20> <U7e9> <U27> <U7f9> : "ῴ" # U1ff4
+<Uff20> <U7e9> <U27> <U1f00> : "ᾄ" # U1f84
+<Uff20> <U7e9> <U27> <U1f01> : "ᾅ" # U1f85
+<Uff20> <U7e9> <U27> <U1f08> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <U27> <U1f09> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <U27> <U1f20> : "ᾔ" # U1f94
+<Uff20> <U7e9> <U27> <U1f21> : "ᾕ" # U1f95
+<Uff20> <U7e9> <U27> <U1f28> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <U27> <U1f29> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <U27> <U1f60> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <U27> <U1f61> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <U27> <U1f68> : "ᾬ" # U1fac
+<Uff20> <U7e9> <U27> <U1f69> : "ᾭ" # U1fad
+<Uff20> <U7e9> <U28> <U7c1> : "ᾉ" # U1f89
+<Uff20> <U7e9> <U28> <U7c7> : "ᾙ" # U1f99
+<Uff20> <U7e9> <U28> <U7d9> : "ᾩ" # U1fa9
+<Uff20> <U7e9> <U28> <U7e1> : "ᾁ" # U1f81
+<Uff20> <U7e9> <U28> <U7e7> : "ᾑ" # U1f91
+<Uff20> <U7e9> <U28> <U7f9> : "ᾡ" # U1fa1
+<Uff20> <U7e9> <U29> <U7c1> : "ᾈ" # U1f88
+<Uff20> <U7e9> <U29> <U7c7> : "ᾘ" # U1f98
+<Uff20> <U7e9> <U29> <U7d9> : "ᾨ" # U1fa8
+<Uff20> <U7e9> <U29> <U7e1> : "ᾀ" # U1f80
+<Uff20> <U7e9> <U29> <U7e7> : "ᾐ" # U1f90
+<Uff20> <U7e9> <U29> <U7f9> : "ᾠ" # U1fa0
+<Uff20> <U7e9> <U60> <U7e1> : "ᾲ" # U1fb2
+<Uff20> <U7e9> <U60> <U7e7> : "ῂ" # U1fc2
+<Uff20> <U7e9> <U60> <U7f9> : "ῲ" # U1ff2
+<Uff20> <U7e9> <U60> <U1f00> : "ᾂ" # U1f82
+<Uff20> <U7e9> <U60> <U1f01> : "ᾃ" # U1f83
+<Uff20> <U7e9> <U60> <U1f08> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <U60> <U1f09> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <U60> <U1f20> : "ᾒ" # U1f92
+<Uff20> <U7e9> <U60> <U1f21> : "ᾓ" # U1f93
+<Uff20> <U7e9> <U60> <U1f28> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <U60> <U1f29> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <U60> <U1f60> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <U60> <U1f61> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <U60> <U1f68> : "ᾪ" # U1faa
+<Uff20> <U7e9> <U60> <U1f69> : "ᾫ" # U1fab
+<Uff20> <U7e9> <U7e> <U7e1> : "ᾷ" # U1fb7
+<Uff20> <U7e9> <U7e> <U7e7> : "ῇ" # U1fc7
+<Uff20> <U7e9> <U7e> <U7f9> : "ῷ" # U1ff7
+<Uff20> <U7e9> <U7e> <U1f00> : "ᾆ" # U1f86
+<Uff20> <U7e9> <U7e> <U1f01> : "ᾇ" # U1f87
+<Uff20> <U7e9> <U7e> <U1f08> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <U7e> <U1f09> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <U7e> <U1f20> : "ᾖ" # U1f96
+<Uff20> <U7e9> <U7e> <U1f21> : "ᾗ" # U1f97
+<Uff20> <U7e9> <U7e> <U1f28> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <U7e> <U1f29> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <U7e> <U1f60> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <U7e> <U1f61> : "ᾧ" # U1fa7
+<Uff20> <U7e9> <U7e> <U1f68> : "ᾮ" # U1fae
+<Uff20> <U7e9> <U7e> <U1f69> : "ᾯ" # U1faf
+<Uff20> <U7e9> <Ub4> <U7e1> : "ᾴ" # U1fb4
+<Uff20> <U7e9> <Ub4> <U7e7> : "ῄ" # U1fc4
+<Uff20> <U7e9> <Ub4> <U7f9> : "ῴ" # U1ff4
+<Uff20> <U7e9> <Ub4> <U1f00> : "ᾄ" # U1f84
+<Uff20> <U7e9> <Ub4> <U1f01> : "ᾅ" # U1f85
+<Uff20> <U7e9> <Ub4> <U1f08> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <Ub4> <U1f09> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <Ub4> <U1f20> : "ᾔ" # U1f94
+<Uff20> <U7e9> <Ub4> <U1f21> : "ᾕ" # U1f95
+<Uff20> <U7e9> <Ub4> <U1f28> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <Ub4> <U1f29> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <Ub4> <U1f60> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <Ub4> <U1f61> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <Ub4> <U1f68> : "ᾬ" # U1fac
+<Uff20> <U7e9> <Ub4> <U1f69> : "ᾭ" # U1fad
+<Uff20> <U7e9> <Ufe50> <U7e1> : "ᾲ" # U1fb2
+<Uff20> <U7e9> <Ufe50> <U7e7> : "ῂ" # U1fc2
+<Uff20> <U7e9> <Ufe50> <U7f9> : "ῲ" # U1ff2
+<Uff20> <U7e9> <Ufe50> <U1f00> : "ᾂ" # U1f82
+<Uff20> <U7e9> <Ufe50> <U1f01> : "ᾃ" # U1f83
+<Uff20> <U7e9> <Ufe50> <U1f08> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <Ufe50> <U1f09> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <Ufe50> <U1f20> : "ᾒ" # U1f92
+<Uff20> <U7e9> <Ufe50> <U1f21> : "ᾓ" # U1f93
+<Uff20> <U7e9> <Ufe50> <U1f28> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <Ufe50> <U1f29> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <Ufe50> <U1f60> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <Ufe50> <U1f61> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <Ufe50> <U1f68> : "ᾪ" # U1faa
+<Uff20> <U7e9> <Ufe50> <U1f69> : "ᾫ" # U1fab
+<Uff20> <U7e9> <Ufe51> <U7e1> : "ᾴ" # U1fb4
+<Uff20> <U7e9> <Ufe51> <U7e7> : "ῄ" # U1fc4
+<Uff20> <U7e9> <Ufe51> <U7f9> : "ῴ" # U1ff4
+<Uff20> <U7e9> <Ufe51> <U1f00> : "ᾄ" # U1f84
+<Uff20> <U7e9> <Ufe51> <U1f01> : "ᾅ" # U1f85
+<Uff20> <U7e9> <Ufe51> <U1f08> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <Ufe51> <U1f09> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <Ufe51> <U1f20> : "ᾔ" # U1f94
+<Uff20> <U7e9> <Ufe51> <U1f21> : "ᾕ" # U1f95
+<Uff20> <U7e9> <Ufe51> <U1f28> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <Ufe51> <U1f29> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <Ufe51> <U1f60> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <Ufe51> <U1f61> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <Ufe51> <U1f68> : "ᾬ" # U1fac
+<Uff20> <U7e9> <Ufe51> <U1f69> : "ᾭ" # U1fad
+<Uff20> <U7e9> <Ufe53> <U7e1> : "ᾷ" # U1fb7
+<Uff20> <U7e9> <Ufe53> <U7e7> : "ῇ" # U1fc7
+<Uff20> <U7e9> <Ufe53> <U7f9> : "ῷ" # U1ff7
+<Uff20> <U7e9> <Ufe53> <U1f00> : "ᾆ" # U1f86
+<Uff20> <U7e9> <Ufe53> <U1f01> : "ᾇ" # U1f87
+<Uff20> <U7e9> <Ufe53> <U1f08> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <Ufe53> <U1f09> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <Ufe53> <U1f20> : "ᾖ" # U1f96
+<Uff20> <U7e9> <Ufe53> <U1f21> : "ᾗ" # U1f97
+<Uff20> <U7e9> <Ufe53> <U1f28> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <Ufe53> <U1f29> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <Ufe53> <U1f60> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <Ufe53> <U1f61> : "ᾧ" # U1fa7
+<Uff20> <U7e9> <Ufe53> <U1f68> : "ᾮ" # U1fae
+<Uff20> <U7e9> <Ufe53> <U1f69> : "ᾯ" # U1faf
+<Uff20> <U7e9> <Ufe64> <U7c1> : "ᾈ" # U1f88
+<Uff20> <U7e9> <Ufe64> <U7c7> : "ᾘ" # U1f98
+<Uff20> <U7e9> <Ufe64> <U7d9> : "ᾨ" # U1fa8
+<Uff20> <U7e9> <Ufe64> <U7e1> : "ᾀ" # U1f80
+<Uff20> <U7e9> <Ufe64> <U7e7> : "ᾐ" # U1f90
+<Uff20> <U7e9> <Ufe64> <U7f9> : "ᾠ" # U1fa0
+<Uff20> <U7e9> <Ufe65> <U7c1> : "ᾉ" # U1f89
+<Uff20> <U7e9> <Ufe65> <U7c7> : "ᾙ" # U1f99
+<Uff20> <U7e9> <Ufe65> <U7d9> : "ᾩ" # U1fa9
+<Uff20> <U7e9> <Ufe65> <U7e1> : "ᾁ" # U1f81
+<Uff20> <U7e9> <Ufe65> <U7e7> : "ᾑ" # U1f91
+<Uff20> <U7e9> <Ufe65> <U7f9> : "ᾡ" # U1fa1
+<Uff20> <Ufe56> <U66> <U73> : "ẛ" # U1e9b
+<Uff20> <U28> <U31> <U30> <U29> : "⑩" # U2469
+<Uff20> <U28> <U31> <U31> <U29> : "⑪" # U246a
+<Uff20> <U28> <U31> <U32> <U29> : "⑫" # U246b
+<Uff20> <U28> <U31> <U33> <U29> : "⑬" # U246c
+<Uff20> <U28> <U31> <U34> <U29> : "⑭" # U246d
+<Uff20> <U28> <U31> <U35> <U29> : "⑮" # U246e
+<Uff20> <U28> <U31> <U36> <U29> : "⑯" # U246f
+<Uff20> <U28> <U31> <U37> <U29> : "⑰" # U2470
+<Uff20> <U28> <U31> <U38> <U29> : "⑱" # U2471
+<Uff20> <U28> <U31> <U39> <U29> : "⑲" # U2472
+<Uff20> <U28> <U31> <Uff80> <U29> : "⑫" # U246b
+<Uff20> <U28> <U31> <Uffb0> <U29> : "⑩" # U2469
+<Uff20> <U28> <U31> <Uffb1> <U29> : "⑪" # U246a
+<Uff20> <U28> <U31> <Uffb2> <U29> : "⑫" # U246b
+<Uff20> <U28> <U31> <Uffb3> <U29> : "⑬" # U246c
+<Uff20> <U28> <U31> <Uffb4> <U29> : "⑭" # U246d
+<Uff20> <U28> <U31> <Uffb5> <U29> : "⑮" # U246e
+<Uff20> <U28> <U31> <Uffb6> <U29> : "⑯" # U246f
+<Uff20> <U28> <U31> <Uffb7> <U29> : "⑰" # U2470
+<Uff20> <U28> <U31> <Uffb8> <U29> : "⑱" # U2471
+<Uff20> <U28> <U31> <Uffb9> <U29> : "⑲" # U2472
+<Uff20> <U28> <U32> <U30> <U29> : "⑳" # U2473
+<Uff20> <U28> <U32> <U31> <U29> : "㉑" # U3251
+<Uff20> <U28> <U32> <U32> <U29> : "㉒" # U3252
+<Uff20> <U28> <U32> <U33> <U29> : "㉓" # U3253
+<Uff20> <U28> <U32> <U34> <U29> : "㉔" # U3254
+<Uff20> <U28> <U32> <U35> <U29> : "㉕" # U3255
+<Uff20> <U28> <U32> <U36> <U29> : "㉖" # U3256
+<Uff20> <U28> <U32> <U37> <U29> : "㉗" # U3257
+<Uff20> <U28> <U32> <U38> <U29> : "㉘" # U3258
+<Uff20> <U28> <U32> <U39> <U29> : "㉙" # U3259
+<Uff20> <U28> <U32> <Uff80> <U29> : "㉒" # U3252
+<Uff20> <U28> <U32> <Uffb0> <U29> : "⑳" # U2473
+<Uff20> <U28> <U32> <Uffb1> <U29> : "㉑" # U3251
+<Uff20> <U28> <U32> <Uffb2> <U29> : "㉒" # U3252
+<Uff20> <U28> <U32> <Uffb3> <U29> : "㉓" # U3253
+<Uff20> <U28> <U32> <Uffb4> <U29> : "㉔" # U3254
+<Uff20> <U28> <U32> <Uffb5> <U29> : "㉕" # U3255
+<Uff20> <U28> <U32> <Uffb6> <U29> : "㉖" # U3256
+<Uff20> <U28> <U32> <Uffb7> <U29> : "㉗" # U3257
+<Uff20> <U28> <U32> <Uffb8> <U29> : "㉘" # U3258
+<Uff20> <U28> <U32> <Uffb9> <U29> : "㉙" # U3259
+<Uff20> <U28> <U33> <U30> <U29> : "㉚" # U325a
+<Uff20> <U28> <U33> <U31> <U29> : "㉛" # U325b
+<Uff20> <U28> <U33> <U32> <U29> : "㉜" # U325c
+<Uff20> <U28> <U33> <U33> <U29> : "㉝" # U325d
+<Uff20> <U28> <U33> <U34> <U29> : "㉞" # U325e
+<Uff20> <U28> <U33> <U35> <U29> : "㉟" # U325f
+<Uff20> <U28> <U33> <U36> <U29> : "㊱" # U32b1
+<Uff20> <U28> <U33> <U37> <U29> : "㊲" # U32b2
+<Uff20> <U28> <U33> <U38> <U29> : "㊳" # U32b3
+<Uff20> <U28> <U33> <U39> <U29> : "㊴" # U32b4
+<Uff20> <U28> <U33> <Uff80> <U29> : "㉜" # U325c
+<Uff20> <U28> <U33> <Uffb0> <U29> : "㉚" # U325a
+<Uff20> <U28> <U33> <Uffb1> <U29> : "㉛" # U325b
+<Uff20> <U28> <U33> <Uffb2> <U29> : "㉜" # U325c
+<Uff20> <U28> <U33> <Uffb3> <U29> : "㉝" # U325d
+<Uff20> <U28> <U33> <Uffb4> <U29> : "㉞" # U325e
+<Uff20> <U28> <U33> <Uffb5> <U29> : "㉟" # U325f
+<Uff20> <U28> <U33> <Uffb6> <U29> : "㊱" # U32b1
+<Uff20> <U28> <U33> <Uffb7> <U29> : "㊲" # U32b2
+<Uff20> <U28> <U33> <Uffb8> <U29> : "㊳" # U32b3
+<Uff20> <U28> <U33> <Uffb9> <U29> : "㊴" # U32b4
+<Uff20> <U28> <U34> <U30> <U29> : "㊵" # U32b5
+<Uff20> <U28> <U34> <U31> <U29> : "㊶" # U32b6
+<Uff20> <U28> <U34> <U32> <U29> : "㊷" # U32b7
+<Uff20> <U28> <U34> <U33> <U29> : "㊸" # U32b8
+<Uff20> <U28> <U34> <U34> <U29> : "㊹" # U32b9
+<Uff20> <U28> <U34> <U35> <U29> : "㊺" # U32ba
+<Uff20> <U28> <U34> <U36> <U29> : "㊻" # U32bb
+<Uff20> <U28> <U34> <U37> <U29> : "㊼" # U32bc
+<Uff20> <U28> <U34> <U38> <U29> : "㊽" # U32bd
+<Uff20> <U28> <U34> <U39> <U29> : "㊾" # U32be
+<Uff20> <U28> <U34> <Uff80> <U29> : "㊷" # U32b7
+<Uff20> <U28> <U34> <Uffb0> <U29> : "㊵" # U32b5
+<Uff20> <U28> <U34> <Uffb1> <U29> : "㊶" # U32b6
+<Uff20> <U28> <U34> <Uffb2> <U29> : "㊷" # U32b7
+<Uff20> <U28> <U34> <Uffb3> <U29> : "㊸" # U32b8
+<Uff20> <U28> <U34> <Uffb4> <U29> : "㊹" # U32b9
+<Uff20> <U28> <U34> <Uffb5> <U29> : "㊺" # U32ba
+<Uff20> <U28> <U34> <Uffb6> <U29> : "㊻" # U32bb
+<Uff20> <U28> <U34> <Uffb7> <U29> : "㊼" # U32bc
+<Uff20> <U28> <U34> <Uffb8> <U29> : "㊽" # U32bd
+<Uff20> <U28> <U34> <Uffb9> <U29> : "㊾" # U32be
+<Uff20> <U28> <U35> <U30> <U29> : "㊿" # U32bf
+<Uff20> <U28> <U35> <Uffb0> <U29> : "㊿" # U32bf
+<Uff20> <U28> <U1100> <U1161> <U29> : "㉮" # U326e
+<Uff20> <U28> <U1102> <U1161> <U29> : "㉯" # U326f
+<Uff20> <U28> <U1103> <U1161> <U29> : "㉰" # U3270
+<Uff20> <U28> <U1105> <U1161> <U29> : "㉱" # U3271
+<Uff20> <U28> <U1106> <U1161> <U29> : "㉲" # U3272
+<Uff20> <U28> <U1107> <U1161> <U29> : "㉳" # U3273
+<Uff20> <U28> <U1109> <U1161> <U29> : "㉴" # U3274
+<Uff20> <U28> <U110b> <U1161> <U29> : "㉵" # U3275
+<Uff20> <U28> <U110c> <U1161> <U29> : "㉶" # U3276
+<Uff20> <U28> <U110e> <U1161> <U29> : "㉷" # U3277
+<Uff20> <U28> <U110f> <U1161> <U29> : "㉸" # U3278
+<Uff20> <U28> <U1110> <U1161> <U29> : "㉹" # U3279
+<Uff20> <U28> <U1111> <U1161> <U29> : "㉺" # U327a
+<Uff20> <U28> <U1112> <U1161> <U29> : "㉻" # U327b
+<Uff20> <U28> <Uff80> <U30> <U29> : "⑳" # U2473
+<Uff20> <U28> <Uff80> <U31> <U29> : "㉑" # U3251
+<Uff20> <U28> <Uff80> <U32> <U29> : "㉒" # U3252
+<Uff20> <U28> <Uff80> <U33> <U29> : "㉓" # U3253
+<Uff20> <U28> <Uff80> <U34> <U29> : "㉔" # U3254
+<Uff20> <U28> <Uff80> <U35> <U29> : "㉕" # U3255
+<Uff20> <U28> <Uff80> <U36> <U29> : "㉖" # U3256
+<Uff20> <U28> <Uff80> <U37> <U29> : "㉗" # U3257
+<Uff20> <U28> <Uff80> <U38> <U29> : "㉘" # U3258
+<Uff20> <U28> <Uff80> <U39> <U29> : "㉙" # U3259
+<Uff20> <U28> <Uff80> <Uff80> <U29> : "㉒" # U3252
+<Uff20> <U28> <Uff80> <Uffb0> <U29> : "⑳" # U2473
+<Uff20> <U28> <Uff80> <Uffb1> <U29> : "㉑" # U3251
+<Uff20> <U28> <Uff80> <Uffb2> <U29> : "㉒" # U3252
+<Uff20> <U28> <Uff80> <Uffb3> <U29> : "㉓" # U3253
+<Uff20> <U28> <Uff80> <Uffb4> <U29> : "㉔" # U3254
+<Uff20> <U28> <Uff80> <Uffb5> <U29> : "㉕" # U3255
+<Uff20> <U28> <Uff80> <Uffb6> <U29> : "㉖" # U3256
+<Uff20> <U28> <Uff80> <Uffb7> <U29> : "㉗" # U3257
+<Uff20> <U28> <Uff80> <Uffb8> <U29> : "㉘" # U3258
+<Uff20> <U28> <Uff80> <Uffb9> <U29> : "㉙" # U3259
+<Uff20> <U28> <Uffb1> <U30> <U29> : "⑩" # U2469
+<Uff20> <U28> <Uffb1> <U31> <U29> : "⑪" # U246a
+<Uff20> <U28> <Uffb1> <U32> <U29> : "⑫" # U246b
+<Uff20> <U28> <Uffb1> <U33> <U29> : "⑬" # U246c
+<Uff20> <U28> <Uffb1> <U34> <U29> : "⑭" # U246d
+<Uff20> <U28> <Uffb1> <U35> <U29> : "⑮" # U246e
+<Uff20> <U28> <Uffb1> <U36> <U29> : "⑯" # U246f
+<Uff20> <U28> <Uffb1> <U37> <U29> : "⑰" # U2470
+<Uff20> <U28> <Uffb1> <U38> <U29> : "⑱" # U2471
+<Uff20> <U28> <Uffb1> <U39> <U29> : "⑲" # U2472
+<Uff20> <U28> <Uffb1> <Uff80> <U29> : "⑫" # U246b
+<Uff20> <U28> <Uffb1> <Uffb0> <U29> : "⑩" # U2469
+<Uff20> <U28> <Uffb1> <Uffb1> <U29> : "⑪" # U246a
+<Uff20> <U28> <Uffb1> <Uffb2> <U29> : "⑫" # U246b
+<Uff20> <U28> <Uffb1> <Uffb3> <U29> : "⑬" # U246c
+<Uff20> <U28> <Uffb1> <Uffb4> <U29> : "⑭" # U246d
+<Uff20> <U28> <Uffb1> <Uffb5> <U29> : "⑮" # U246e
+<Uff20> <U28> <Uffb1> <Uffb6> <U29> : "⑯" # U246f
+<Uff20> <U28> <Uffb1> <Uffb7> <U29> : "⑰" # U2470
+<Uff20> <U28> <Uffb1> <Uffb8> <U29> : "⑱" # U2471
+<Uff20> <U28> <Uffb1> <Uffb9> <U29> : "⑲" # U2472
+<Uff20> <U28> <Uffb2> <U30> <U29> : "⑳" # U2473
+<Uff20> <U28> <Uffb2> <U31> <U29> : "㉑" # U3251
+<Uff20> <U28> <Uffb2> <U32> <U29> : "㉒" # U3252
+<Uff20> <U28> <Uffb2> <U33> <U29> : "㉓" # U3253
+<Uff20> <U28> <Uffb2> <U34> <U29> : "㉔" # U3254
+<Uff20> <U28> <Uffb2> <U35> <U29> : "㉕" # U3255
+<Uff20> <U28> <Uffb2> <U36> <U29> : "㉖" # U3256
+<Uff20> <U28> <Uffb2> <U37> <U29> : "㉗" # U3257
+<Uff20> <U28> <Uffb2> <U38> <U29> : "㉘" # U3258
+<Uff20> <U28> <Uffb2> <U39> <U29> : "㉙" # U3259
+<Uff20> <U28> <Uffb2> <Uff80> <U29> : "㉒" # U3252
+<Uff20> <U28> <Uffb2> <Uffb0> <U29> : "⑳" # U2473
+<Uff20> <U28> <Uffb2> <Uffb1> <U29> : "㉑" # U3251
+<Uff20> <U28> <Uffb2> <Uffb2> <U29> : "㉒" # U3252
+<Uff20> <U28> <Uffb2> <Uffb3> <U29> : "㉓" # U3253
+<Uff20> <U28> <Uffb2> <Uffb4> <U29> : "㉔" # U3254
+<Uff20> <U28> <Uffb2> <Uffb5> <U29> : "㉕" # U3255
+<Uff20> <U28> <Uffb2> <Uffb6> <U29> : "㉖" # U3256
+<Uff20> <U28> <Uffb2> <Uffb7> <U29> : "㉗" # U3257
+<Uff20> <U28> <Uffb2> <Uffb8> <U29> : "㉘" # U3258
+<Uff20> <U28> <Uffb2> <Uffb9> <U29> : "㉙" # U3259
+<Uff20> <U28> <Uffb3> <U30> <U29> : "㉚" # U325a
+<Uff20> <U28> <Uffb3> <U31> <U29> : "㉛" # U325b
+<Uff20> <U28> <Uffb3> <U32> <U29> : "㉜" # U325c
+<Uff20> <U28> <Uffb3> <U33> <U29> : "㉝" # U325d
+<Uff20> <U28> <Uffb3> <U34> <U29> : "㉞" # U325e
+<Uff20> <U28> <Uffb3> <U35> <U29> : "㉟" # U325f
+<Uff20> <U28> <Uffb3> <U36> <U29> : "㊱" # U32b1
+<Uff20> <U28> <Uffb3> <U37> <U29> : "㊲" # U32b2
+<Uff20> <U28> <Uffb3> <U38> <U29> : "㊳" # U32b3
+<Uff20> <U28> <Uffb3> <U39> <U29> : "㊴" # U32b4
+<Uff20> <U28> <Uffb3> <Uff80> <U29> : "㉜" # U325c
+<Uff20> <U28> <Uffb3> <Uffb0> <U29> : "㉚" # U325a
+<Uff20> <U28> <Uffb3> <Uffb1> <U29> : "㉛" # U325b
+<Uff20> <U28> <Uffb3> <Uffb2> <U29> : "㉜" # U325c
+<Uff20> <U28> <Uffb3> <Uffb3> <U29> : "㉝" # U325d
+<Uff20> <U28> <Uffb3> <Uffb4> <U29> : "㉞" # U325e
+<Uff20> <U28> <Uffb3> <Uffb5> <U29> : "㉟" # U325f
+<Uff20> <U28> <Uffb3> <Uffb6> <U29> : "㊱" # U32b1
+<Uff20> <U28> <Uffb3> <Uffb7> <U29> : "㊲" # U32b2
+<Uff20> <U28> <Uffb3> <Uffb8> <U29> : "㊳" # U32b3
+<Uff20> <U28> <Uffb3> <Uffb9> <U29> : "㊴" # U32b4
+<Uff20> <U28> <Uffb4> <U30> <U29> : "㊵" # U32b5
+<Uff20> <U28> <Uffb4> <U31> <U29> : "㊶" # U32b6
+<Uff20> <U28> <Uffb4> <U32> <U29> : "㊷" # U32b7
+<Uff20> <U28> <Uffb4> <U33> <U29> : "㊸" # U32b8
+<Uff20> <U28> <Uffb4> <U34> <U29> : "㊹" # U32b9
+<Uff20> <U28> <Uffb4> <U35> <U29> : "㊺" # U32ba
+<Uff20> <U28> <Uffb4> <U36> <U29> : "㊻" # U32bb
+<Uff20> <U28> <Uffb4> <U37> <U29> : "㊼" # U32bc
+<Uff20> <U28> <Uffb4> <U38> <U29> : "㊽" # U32bd
+<Uff20> <U28> <Uffb4> <U39> <U29> : "㊾" # U32be
+<Uff20> <U28> <Uffb4> <Uff80> <U29> : "㊷" # U32b7
+<Uff20> <U28> <Uffb4> <Uffb0> <U29> : "㊵" # U32b5
+<Uff20> <U28> <Uffb4> <Uffb1> <U29> : "㊶" # U32b6
+<Uff20> <U28> <Uffb4> <Uffb2> <U29> : "㊷" # U32b7
+<Uff20> <U28> <Uffb4> <Uffb3> <U29> : "㊸" # U32b8
+<Uff20> <U28> <Uffb4> <Uffb4> <U29> : "㊹" # U32b9
+<Uff20> <U28> <Uffb4> <Uffb5> <U29> : "㊺" # U32ba
+<Uff20> <U28> <Uffb4> <Uffb6> <U29> : "㊻" # U32bb
+<Uff20> <U28> <Uffb4> <Uffb7> <U29> : "㊼" # U32bc
+<Uff20> <U28> <Uffb4> <Uffb8> <U29> : "㊽" # U32bd
+<Uff20> <U28> <Uffb4> <Uffb9> <U29> : "㊾" # U32be
+<Uff20> <U28> <Uffb5> <U30> <U29> : "㊿" # U32bf
+<Uff20> <U28> <Uffb5> <Uffb0> <U29> : "㊿" # U32bf
+<Uff20> <U43> <U43> <U43> <U50> : "☭" # U262d
+<Uff20> <U4c> <U4c> <U41> <U50> : "🖖" # U1f596
+<Uff20> <U55> <U20> <U2c> <U45> : "Ḝ" # U1e1c
+<Uff20> <U55> <U20> <U2c> <U65> : "ḝ" # U1e1d
+<Uff20> <U7e9> <U27> <U28> <U7c1> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <U27> <U28> <U7c7> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <U27> <U28> <U7d9> : "ᾭ" # U1fad
+<Uff20> <U7e9> <U27> <U28> <U7e1> : "ᾅ" # U1f85
+<Uff20> <U7e9> <U27> <U28> <U7e7> : "ᾕ" # U1f95
+<Uff20> <U7e9> <U27> <U28> <U7f9> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <U27> <U29> <U7c1> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <U27> <U29> <U7c7> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <U27> <U29> <U7d9> : "ᾬ" # U1fac
+<Uff20> <U7e9> <U27> <U29> <U7e1> : "ᾄ" # U1f84
+<Uff20> <U7e9> <U27> <U29> <U7e7> : "ᾔ" # U1f94
+<Uff20> <U7e9> <U27> <U29> <U7f9> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <U27> <Ufe64> <U7c1> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <U27> <Ufe64> <U7c7> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <U27> <Ufe64> <U7d9> : "ᾬ" # U1fac
+<Uff20> <U7e9> <U27> <Ufe64> <U7e1> : "ᾄ" # U1f84
+<Uff20> <U7e9> <U27> <Ufe64> <U7e7> : "ᾔ" # U1f94
+<Uff20> <U7e9> <U27> <Ufe64> <U7f9> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <U27> <Ufe65> <U7c1> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <U27> <Ufe65> <U7c7> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <U27> <Ufe65> <U7d9> : "ᾭ" # U1fad
+<Uff20> <U7e9> <U27> <Ufe65> <U7e1> : "ᾅ" # U1f85
+<Uff20> <U7e9> <U27> <Ufe65> <U7e7> : "ᾕ" # U1f95
+<Uff20> <U7e9> <U27> <Ufe65> <U7f9> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <U60> <U28> <U7c1> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <U60> <U28> <U7c7> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <U60> <U28> <U7d9> : "ᾫ" # U1fab
+<Uff20> <U7e9> <U60> <U28> <U7e1> : "ᾃ" # U1f83
+<Uff20> <U7e9> <U60> <U28> <U7e7> : "ᾓ" # U1f93
+<Uff20> <U7e9> <U60> <U28> <U7f9> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <U60> <U29> <U7c1> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <U60> <U29> <U7c7> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <U60> <U29> <U7d9> : "ᾪ" # U1faa
+<Uff20> <U7e9> <U60> <U29> <U7e1> : "ᾂ" # U1f82
+<Uff20> <U7e9> <U60> <U29> <U7e7> : "ᾒ" # U1f92
+<Uff20> <U7e9> <U60> <U29> <U7f9> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <U60> <Ufe64> <U7c1> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <U60> <Ufe64> <U7c7> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <U60> <Ufe64> <U7d9> : "ᾪ" # U1faa
+<Uff20> <U7e9> <U60> <Ufe64> <U7e1> : "ᾂ" # U1f82
+<Uff20> <U7e9> <U60> <Ufe64> <U7e7> : "ᾒ" # U1f92
+<Uff20> <U7e9> <U60> <Ufe64> <U7f9> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <U60> <Ufe65> <U7c1> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <U60> <Ufe65> <U7c7> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <U60> <Ufe65> <U7d9> : "ᾫ" # U1fab
+<Uff20> <U7e9> <U60> <Ufe65> <U7e1> : "ᾃ" # U1f83
+<Uff20> <U7e9> <U60> <Ufe65> <U7e7> : "ᾓ" # U1f93
+<Uff20> <U7e9> <U60> <Ufe65> <U7f9> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <U7e> <U28> <U7c1> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <U7e> <U28> <U7c7> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <U7e> <U28> <U7d9> : "ᾯ" # U1faf
+<Uff20> <U7e9> <U7e> <U28> <U7e1> : "ᾇ" # U1f87
+<Uff20> <U7e9> <U7e> <U28> <U7e7> : "ᾗ" # U1f97
+<Uff20> <U7e9> <U7e> <U28> <U7f9> : "ᾧ" # U1fa7
+<Uff20> <U7e9> <U7e> <U29> <U7c1> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <U7e> <U29> <U7c7> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <U7e> <U29> <U7d9> : "ᾮ" # U1fae
+<Uff20> <U7e9> <U7e> <U29> <U7e1> : "ᾆ" # U1f86
+<Uff20> <U7e9> <U7e> <U29> <U7e7> : "ᾖ" # U1f96
+<Uff20> <U7e9> <U7e> <U29> <U7f9> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <U7e> <Ufe64> <U7c1> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <U7e> <Ufe64> <U7c7> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <U7e> <Ufe64> <U7d9> : "ᾮ" # U1fae
+<Uff20> <U7e9> <U7e> <Ufe64> <U7e1> : "ᾆ" # U1f86
+<Uff20> <U7e9> <U7e> <Ufe64> <U7e7> : "ᾖ" # U1f96
+<Uff20> <U7e9> <U7e> <Ufe64> <U7f9> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <U7e> <Ufe65> <U7c1> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <U7e> <Ufe65> <U7c7> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <U7e> <Ufe65> <U7d9> : "ᾯ" # U1faf
+<Uff20> <U7e9> <U7e> <Ufe65> <U7e1> : "ᾇ" # U1f87
+<Uff20> <U7e9> <U7e> <Ufe65> <U7e7> : "ᾗ" # U1f97
+<Uff20> <U7e9> <U7e> <Ufe65> <U7f9> : "ᾧ" # U1fa7
+<Uff20> <U7e9> <Ub4> <U28> <U7c1> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <Ub4> <U28> <U7c7> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <Ub4> <U28> <U7d9> : "ᾭ" # U1fad
+<Uff20> <U7e9> <Ub4> <U28> <U7e1> : "ᾅ" # U1f85
+<Uff20> <U7e9> <Ub4> <U28> <U7e7> : "ᾕ" # U1f95
+<Uff20> <U7e9> <Ub4> <U28> <U7f9> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <Ub4> <U29> <U7c1> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <Ub4> <U29> <U7c7> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <Ub4> <U29> <U7d9> : "ᾬ" # U1fac
+<Uff20> <U7e9> <Ub4> <U29> <U7e1> : "ᾄ" # U1f84
+<Uff20> <U7e9> <Ub4> <U29> <U7e7> : "ᾔ" # U1f94
+<Uff20> <U7e9> <Ub4> <U29> <U7f9> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <Ub4> <Ufe64> <U7c1> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <Ub4> <Ufe64> <U7c7> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <Ub4> <Ufe64> <U7d9> : "ᾬ" # U1fac
+<Uff20> <U7e9> <Ub4> <Ufe64> <U7e1> : "ᾄ" # U1f84
+<Uff20> <U7e9> <Ub4> <Ufe64> <U7e7> : "ᾔ" # U1f94
+<Uff20> <U7e9> <Ub4> <Ufe64> <U7f9> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <Ub4> <Ufe65> <U7c1> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <Ub4> <Ufe65> <U7c7> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <Ub4> <Ufe65> <U7d9> : "ᾭ" # U1fad
+<Uff20> <U7e9> <Ub4> <Ufe65> <U7e1> : "ᾅ" # U1f85
+<Uff20> <U7e9> <Ub4> <Ufe65> <U7e7> : "ᾕ" # U1f95
+<Uff20> <U7e9> <Ub4> <Ufe65> <U7f9> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <Ufe50> <U28> <U7c1> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <Ufe50> <U28> <U7c7> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <Ufe50> <U28> <U7d9> : "ᾫ" # U1fab
+<Uff20> <U7e9> <Ufe50> <U28> <U7e1> : "ᾃ" # U1f83
+<Uff20> <U7e9> <Ufe50> <U28> <U7e7> : "ᾓ" # U1f93
+<Uff20> <U7e9> <Ufe50> <U28> <U7f9> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <Ufe50> <U29> <U7c1> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <Ufe50> <U29> <U7c7> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <Ufe50> <U29> <U7d9> : "ᾪ" # U1faa
+<Uff20> <U7e9> <Ufe50> <U29> <U7e1> : "ᾂ" # U1f82
+<Uff20> <U7e9> <Ufe50> <U29> <U7e7> : "ᾒ" # U1f92
+<Uff20> <U7e9> <Ufe50> <U29> <U7f9> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <Ufe50> <Ufe64> <U7c1> : "ᾊ" # U1f8a
+<Uff20> <U7e9> <Ufe50> <Ufe64> <U7c7> : "ᾚ" # U1f9a
+<Uff20> <U7e9> <Ufe50> <Ufe64> <U7d9> : "ᾪ" # U1faa
+<Uff20> <U7e9> <Ufe50> <Ufe64> <U7e1> : "ᾂ" # U1f82
+<Uff20> <U7e9> <Ufe50> <Ufe64> <U7e7> : "ᾒ" # U1f92
+<Uff20> <U7e9> <Ufe50> <Ufe64> <U7f9> : "ᾢ" # U1fa2
+<Uff20> <U7e9> <Ufe50> <Ufe65> <U7c1> : "ᾋ" # U1f8b
+<Uff20> <U7e9> <Ufe50> <Ufe65> <U7c7> : "ᾛ" # U1f9b
+<Uff20> <U7e9> <Ufe50> <Ufe65> <U7d9> : "ᾫ" # U1fab
+<Uff20> <U7e9> <Ufe50> <Ufe65> <U7e1> : "ᾃ" # U1f83
+<Uff20> <U7e9> <Ufe50> <Ufe65> <U7e7> : "ᾓ" # U1f93
+<Uff20> <U7e9> <Ufe50> <Ufe65> <U7f9> : "ᾣ" # U1fa3
+<Uff20> <U7e9> <Ufe51> <U28> <U7c1> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <Ufe51> <U28> <U7c7> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <Ufe51> <U28> <U7d9> : "ᾭ" # U1fad
+<Uff20> <U7e9> <Ufe51> <U28> <U7e1> : "ᾅ" # U1f85
+<Uff20> <U7e9> <Ufe51> <U28> <U7e7> : "ᾕ" # U1f95
+<Uff20> <U7e9> <Ufe51> <U28> <U7f9> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <Ufe51> <U29> <U7c1> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <Ufe51> <U29> <U7c7> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <Ufe51> <U29> <U7d9> : "ᾬ" # U1fac
+<Uff20> <U7e9> <Ufe51> <U29> <U7e1> : "ᾄ" # U1f84
+<Uff20> <U7e9> <Ufe51> <U29> <U7e7> : "ᾔ" # U1f94
+<Uff20> <U7e9> <Ufe51> <U29> <U7f9> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <Ufe51> <Ufe64> <U7c1> : "ᾌ" # U1f8c
+<Uff20> <U7e9> <Ufe51> <Ufe64> <U7c7> : "ᾜ" # U1f9c
+<Uff20> <U7e9> <Ufe51> <Ufe64> <U7d9> : "ᾬ" # U1fac
+<Uff20> <U7e9> <Ufe51> <Ufe64> <U7e1> : "ᾄ" # U1f84
+<Uff20> <U7e9> <Ufe51> <Ufe64> <U7e7> : "ᾔ" # U1f94
+<Uff20> <U7e9> <Ufe51> <Ufe64> <U7f9> : "ᾤ" # U1fa4
+<Uff20> <U7e9> <Ufe51> <Ufe65> <U7c1> : "ᾍ" # U1f8d
+<Uff20> <U7e9> <Ufe51> <Ufe65> <U7c7> : "ᾝ" # U1f9d
+<Uff20> <U7e9> <Ufe51> <Ufe65> <U7d9> : "ᾭ" # U1fad
+<Uff20> <U7e9> <Ufe51> <Ufe65> <U7e1> : "ᾅ" # U1f85
+<Uff20> <U7e9> <Ufe51> <Ufe65> <U7e7> : "ᾕ" # U1f95
+<Uff20> <U7e9> <Ufe51> <Ufe65> <U7f9> : "ᾥ" # U1fa5
+<Uff20> <U7e9> <Ufe53> <U28> <U7c1> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <Ufe53> <U28> <U7c7> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <Ufe53> <U28> <U7d9> : "ᾯ" # U1faf
+<Uff20> <U7e9> <Ufe53> <U28> <U7e1> : "ᾇ" # U1f87
+<Uff20> <U7e9> <Ufe53> <U28> <U7e7> : "ᾗ" # U1f97
+<Uff20> <U7e9> <Ufe53> <U28> <U7f9> : "ᾧ" # U1fa7
+<Uff20> <U7e9> <Ufe53> <U29> <U7c1> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <Ufe53> <U29> <U7c7> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <Ufe53> <U29> <U7d9> : "ᾮ" # U1fae
+<Uff20> <U7e9> <Ufe53> <U29> <U7e1> : "ᾆ" # U1f86
+<Uff20> <U7e9> <Ufe53> <U29> <U7e7> : "ᾖ" # U1f96
+<Uff20> <U7e9> <Ufe53> <U29> <U7f9> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <Ufe53> <Ufe64> <U7c1> : "ᾎ" # U1f8e
+<Uff20> <U7e9> <Ufe53> <Ufe64> <U7c7> : "ᾞ" # U1f9e
+<Uff20> <U7e9> <Ufe53> <Ufe64> <U7d9> : "ᾮ" # U1fae
+<Uff20> <U7e9> <Ufe53> <Ufe64> <U7e1> : "ᾆ" # U1f86
+<Uff20> <U7e9> <Ufe53> <Ufe64> <U7e7> : "ᾖ" # U1f96
+<Uff20> <U7e9> <Ufe53> <Ufe64> <U7f9> : "ᾦ" # U1fa6
+<Uff20> <U7e9> <Ufe53> <Ufe65> <U7c1> : "ᾏ" # U1f8f
+<Uff20> <U7e9> <Ufe53> <Ufe65> <U7c7> : "ᾟ" # U1f9f
+<Uff20> <U7e9> <Ufe53> <Ufe65> <U7d9> : "ᾯ" # U1faf
+<Uff20> <U7e9> <Ufe53> <Ufe65> <U7e1> : "ᾇ" # U1f87
+<Uff20> <U7e9> <Ufe53> <Ufe65> <U7e7> : "ᾗ" # U1f97
+<Uff20> <U7e9> <Ufe53> <Ufe65> <U7f9> : "ᾧ" # U1fa7
diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c
index ea17e7a6a0..1a77e5bc93 100644
--- a/testsuite/gtk/composetable.c
+++ b/testsuite/gtk/composetable.c
@@ -1,6 +1,8 @@
#include <gtk/gtk.h>
#include <locale.h>
+#include <glib/gstdio.h>
+
#include "../gtk/gtkcomposetable.h"
#include "../gtk/gtkimcontextsimpleseqs.h"
#include "testsuite/testutils.h"
@@ -33,43 +35,45 @@ append_escaped (GString *str,
}
}
-static char *
-gtk_compose_table_print (GtkComposeTable *table)
+static void
+print_sequence (gunichar *sequence,
+ int len,
+ const char *value,
+ gpointer data)
{
- int i, j;
- guint16 *seq;
- GString *str;
+ GString *str = data;
- str = g_string_new ("");
+ for (int j = 0; j < len; j++)
+ g_string_append_printf (str, "<U%x> ", sequence[j]);
- g_string_append_printf (str, "# n_seqs: %d\n# max_seq_len: %d\n",
- table->n_seqs,
- table->max_seq_len);
+ g_string_append (str, ": \"");
+ append_escaped (str, value);
+ g_string_append (str, "\"");
- for (i = 0, seq = table->data; i < table->n_seqs; i++, seq += table->max_seq_len + 2)
+ if (g_utf8_strlen (value, -1) == 1)
{
- gunichar value;
- char buf[8] = { 0 };
+ gunichar ch = g_utf8_get_char (value);
+ g_string_append_printf (str, " # U%x", ch);
+ }
- for (j = 0; j < table->max_seq_len; j++)
- g_string_append_printf (str, "<U%x> ", seq[j]);
+ g_string_append_c (str, '\n');
+}
- value = (seq[table->max_seq_len] << 16) | seq[table->max_seq_len + 1];
- if ((value & (1 << 31)) != 0)
- {
- const char *out = &table->char_data[value & ~(1 << 31)];
+static char *
+gtk_compose_table_print (GtkComposeTable *table)
+{
+ GString *str;
- g_string_append (str, ": \"");
- append_escaped (str, out);
- g_string_append (str, "\"\n");
- }
- else
- {
- g_unichar_to_utf8 (value, buf);
- g_string_append_printf (str, ": \"%s\" # U%x\n", buf, value);
- }
+ str = g_string_new ("");
- }
+ g_string_append_printf (str, "# n_sequences: %d\n# max_seq_len: %d\n# n_index_size: %d\n# data_size: %d\n# n_chars: %d\n",
+ table->n_sequences,
+ table->max_seq_len,
+ table->n_index_size,
+ table->data_size,
+ table->n_chars);
+
+ gtk_compose_table_foreach (table, print_sequence, str);
return g_string_free (str, FALSE);
}
@@ -77,12 +81,10 @@ gtk_compose_table_print (GtkComposeTable *table)
static void
generate_output (const char *file)
{
- GSList *tables = NULL;
GtkComposeTable *table;
char *output;
- tables = gtk_compose_table_list_add_file (tables, file);
- table = tables->data;
+ table = gtk_compose_table_parse (file, NULL);
output = gtk_compose_table_print (table);
g_print ("%s", output);
@@ -92,7 +94,6 @@ static void
compose_table_compare (gconstpointer data)
{
const char *basename = data;
- GSList *tables = NULL;
GtkComposeTable *table;
char *file;
char *expected;
@@ -100,16 +101,12 @@ compose_table_compare (gconstpointer data)
char *diff;
GError *error = NULL;
- file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", basename, NULL);
+ file = g_test_build_filename (G_TEST_DIST, "compose", basename, NULL);
expected = g_strconcat (file, ".expected", NULL);
- tables = gtk_compose_table_list_add_file (tables, file);
-
- g_assert_true (g_slist_length (tables) == 1);
-
- table = tables->data;
-
+ table = gtk_compose_table_parse (file, NULL);
output = gtk_compose_table_print (table);
+
diff = diff_with_file (expected, output, -1, &error);
g_assert_no_error (error);
@@ -124,11 +121,54 @@ compose_table_compare (gconstpointer data)
g_free (expected);
}
+static void
+compose_table_cycle (void)
+{
+ if (g_test_subprocess ())
+ {
+ char *file;
+ GtkComposeTable *table;
+
+ file = g_test_build_filename (G_TEST_DIST, "compose", "cycle", NULL);
+
+ table = gtk_compose_table_parse (file, NULL);
+ g_assert_nonnull (table);
+ g_free (file);
+
+ return;
+ }
+
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_stderr ("*include cycle detected*");
+ g_test_trap_assert_failed ();
+}
+
+static void
+compose_table_nofile (void)
+{
+ if (g_test_subprocess ())
+ {
+ char *file;
+ GtkComposeTable *table;
+
+ file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "nofile", NULL);
+
+ table = gtk_compose_table_parse (file, NULL);
+ g_assert_nonnull (table);
+ g_free (file);
+
+ return;
+ }
+
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_stderr ("*No such file or directory*");
+ g_test_trap_assert_failed ();
+}
+
/* Check matching against a small table */
static void
compose_table_match (void)
{
- GSList *tables = NULL;
GtkComposeTable *table;
char *file;
guint16 buffer[8] = { 0, };
@@ -139,11 +179,7 @@ compose_table_match (void)
file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "match", NULL);
- tables = gtk_compose_table_list_add_file (tables, file);
-
- g_assert_true (g_slist_length (tables) == 1);
-
- table = tables->data;
+ table = gtk_compose_table_parse (file, NULL);
buffer[0] = GDK_KEY_Multi_key;
buffer[1] = 0;
@@ -197,39 +233,38 @@ compose_table_match (void)
g_free (file);
}
+extern const GtkComposeTable builtin_compose_table;
+
/* just check some random sequences */
static void
-compose_table_match_compact (void)
+compose_table_match_builtin (void)
{
- const GtkComposeTableCompact table = {
- gtk_compose_seqs_compact,
- 5,
- 30,
- 6
- };
+ const GtkComposeTable *table = &builtin_compose_table;
guint16 buffer[8] = { 0, };
gboolean finish, match, ret;
- gunichar ch;
+ GString *s;
buffer[0] = GDK_KEY_Multi_key;
buffer[1] = 0;
- ret = gtk_compose_table_compact_check (&table, buffer, 1, &finish, &match, &ch);
+ s = g_string_new ("");
+
+ ret = gtk_compose_table_check (table, buffer, 1, &finish, &match, s);
g_assert_true (ret);
g_assert_false (finish);
g_assert_false (match);
- g_assert_true (ch == 0);
+ g_assert_true (s->len == 0);
buffer[0] = GDK_KEY_a;
buffer[1] = GDK_KEY_b;
buffer[2] = GDK_KEY_c;
buffer[3] = 0;
- ret = gtk_compose_table_compact_check (&table, buffer, 3, &finish, &match, &ch);
+ ret = gtk_compose_table_check (table, buffer, 3, &finish, &match, s);
g_assert_false (ret);
g_assert_false (finish);
g_assert_false (match);
- g_assert_true (ch == 0);
+ g_assert_true (s->len == 0);
buffer[0] = GDK_KEY_Multi_key;
buffer[1] = GDK_KEY_parenleft;
@@ -237,31 +272,37 @@ compose_table_match_compact (void)
buffer[3] = GDK_KEY_parenright;
buffer[4] = 0;
- ret = gtk_compose_table_compact_check (&table, buffer, 4, &finish, &match, &ch);
+ ret = gtk_compose_table_check (table, buffer, 4, &finish, &match, s);
g_assert_true (ret);
g_assert_true (finish);
g_assert_true (match);
- g_assert_true (ch == 0x24d9); /* CIRCLED LATIN SMALL LETTER J */
+ g_assert_cmpstr (s->str, ==, "ⓙ"); /* CIRCLED LATIN SMALL LETTER J */
buffer[0] = GDK_KEY_dead_acute;
buffer[1] = GDK_KEY_space;
buffer[2] = 0;
- ret = gtk_compose_table_compact_check (&table, buffer, 2, &finish, &match, &ch);
+ g_string_set_size (s, 0);
+
+ ret = gtk_compose_table_check (table, buffer, 2, &finish, &match, s);
g_assert_true (ret);
g_assert_true (finish);
g_assert_true (match);
- g_assert_true (ch == 0x27);
+ g_assert_cmpstr (s->str, ==, "'");
buffer[0] = GDK_KEY_dead_acute;
buffer[1] = GDK_KEY_dead_acute;
buffer[2] = 0;
- ret = gtk_compose_table_compact_check (&table, buffer, 2, &finish, &match, &ch);
+ g_string_set_size (s, 0);
+
+ ret = gtk_compose_table_check (table, buffer, 2, &finish, &match, s);
g_assert_true (ret);
g_assert_true (finish);
g_assert_true (match);
- g_assert_true (ch == 0xb4);
+ g_assert_cmpstr (s->str, ==, "´");
+
+ g_string_free (s, TRUE);
}
static void
@@ -349,15 +390,16 @@ match_algorithmic (void)
int
main (int argc, char *argv[])
{
- char *dir;
-
- dir = g_dir_make_tmp ("composetableXXXXXX", NULL);
- g_setenv ("XDG_CACHE_HOME", dir, TRUE);
- g_free (dir);
-
if (argc == 3 && strcmp (argv[1], "--generate") == 0)
{
- setlocale (LC_ALL, "");
+ gtk_disable_setlocale();
+ setlocale (LC_ALL, "en_US.UTF-8");
+
+ gtk_init ();
+
+ /* Ensure that the builtin table is initialized */
+ GtkIMContext *ctx = gtk_im_context_simple_new ();
+ g_object_unref (ctx);
generate_output (argv[2]);
return 0;
@@ -365,6 +407,10 @@ main (int argc, char *argv[])
gtk_test_init (&argc, &argv, NULL);
+ /* Ensure that the builtin table is initialized */
+ GtkIMContext *ctx = gtk_im_context_simple_new ();
+ g_object_unref (ctx);
+
g_test_add_data_func ("/compose-table/basic", "basic", compose_table_compare);
g_test_add_data_func ("/compose-table/long", "long", compose_table_compare);
g_test_add_data_func ("/compose-table/octal", "octal", compose_table_compare);
@@ -372,8 +418,12 @@ main (int argc, char *argv[])
g_test_add_data_func ("/compose-table/codepoint", "codepoint", compose_table_compare);
g_test_add_data_func ("/compose-table/multi", "multi", compose_table_compare);
g_test_add_data_func ("/compose-table/strings", "strings", compose_table_compare);
+ g_test_add_data_func ("/compose-table/include", "include", compose_table_compare);
+ g_test_add_data_func ("/compose-table/system", "system", compose_table_compare);
+ g_test_add_func ("/compose-table/include-cycle", compose_table_cycle);
+ g_test_add_func ("/compose-table/include-nofile", compose_table_nofile);
g_test_add_func ("/compose-table/match", compose_table_match);
- g_test_add_func ("/compose-table/match-compact", compose_table_match_compact);
+ g_test_add_func ("/compose-table/match-builtin", compose_table_match_builtin);
g_test_add_func ("/compose-table/match-algorithmic", match_algorithmic);
return g_test_run ();